Küsimus:
Milliseid kujundusmustreid saan kasutada kasutaja sisendi ja kuva värskendamise haldamiseks?
Cybergibbons
2014-03-01 15:46:44 UTC
view on stackexchange narkive permalink

Olen kasutanud piisavalt sisseehitatud mikrokontrolleritega tooteid ja reageerimata kasutajaliideseid, et teada saada, et see võib toodet valmistada või lõhkuda. Isegi väike viivitus või viivitus nupuvajutuste ja ekraani värskendamise vahel või nupuvajutuste eiramine või topeltarvestus võib olla äärmiselt pettumust valmistav.

Milliseid kujundusmustreid saab kasutaja sisendiga toime tulla (nuppudelt) ) ja värskendate kuvasid neid probleeme tekitamata?

Ma kasutan praegu järgmist tüüpi mustrit (see on lihtsustatud minimaalseks):

  #include <Bounce.h> #define GREEN_LED 6 // Rohelise valgusdioodi nööpnõel # defineeri BUTTON_PIN 15 // Nööpnupp - kasutab välist allavajutamist nii aktiivseks kõrge # define DISPLAY_REFRESH_INT 100 // Mitu MS kuvavärskenduste vahelBounce button = Bounce (BUTTON_PIN, 5); // Nupu Loetud ja ekraani vahelise signaali edastamiseks updateBool ledState = false; // Kasutatakse viimase ekraani värskenduse pikendamise jälgimiseksUpdate = 0; void setup () {pinMode (GREEN_LED, OUTPUT); pinMode (BUTTON_PIN, INPUT);} void loop () {// Loe nupu olekut, kui (button.update ()) {if (button.risingEdge ()) {ledState =! ledState; }} // Värskendage kuva regulaarselt, kui (millis () - displayUpdate > DISPLAY_REFRESH_INT) {displayUpdate = millis (); digitalWrite (GREEN_LED, ledState); }}  

Milliseid võimalusi veel on? Kas nuppude lugemiseks tasub kunagi kasutada tihvtivahetuse katkestusi (kui me ei kaalu aku kasutusaega!)?

Neli vastused:
#1
+6
Peter Bloomfield
2014-03-01 17:50:10 UTC
view on stackexchange narkive permalink

Vastus sõltub täpselt sellest, kuidas visand on mõeldud kasutaja interaktsioonile reageerimiseks.

Välised katkestused
Kui interaktsioon sõltub tõusule väga täpselt reageerimisest või sisendsündmuse langev serv (nagu teie näites), siis võib võimaluse korral olla väline katkestus.

See on eriti oluline, kui sisendsündmus võib olla lühem kui kõne kestusele loop () . Kui see juhtub, võivad järjestikused katsed sisendi küsitlemiseks oleku muutusest täiesti ilma jääda. On üsna haruldane, et kasutaja sisendsündmus on siiski nii lühike, välja arvatud juhul, kui loop () on üsna aeglane.

Väline riistvara, et abi saada, nt omades sisendit, mis lukustub, kuni mikrokontroller selle loeb ja lähtestab.

Valimissageduse parandamine
Välised katkestused pole sageli võimalikud (nt kuna kiip toetab ainult piiratud arv) või on need antud rakenduse jaoks lihtsalt üle jõu käivad / ebavajalikud.

Nendel juhtudel võib küsitluse kasutamisel siiski olla võimalik ajastuse täpsust parandada. Üheks võimaluseks on jaotada põhisilmu kõik erinevad osad eraldi funktsioonideks. Igal järjestikusel loop () iteratsioonil kutsub see järgmise funktsiooni ja murrab siis esimesena. Kõigi nende funktsioonide vahel saab see nuppu küsitleda. Siin on lihtne näide:

  unsigned int g_section = 0; void setup () {} void pollButton () {//...}void runSection0 () {//...}void runSection1 () {//...}void runSection2 () {//...}void loop () {// Polli nuppu igal läbimisel: pollButton (); // Käivitage põhikoodi järgmine jaotis: switch (g_section) {case 0: runSection0 (); murda; juhtum 1: runSection1 (); murda; juhtum 2: runSection2 (); murda; } // Järgmisel iteratsioonil käivitage järgmine jaotis: if (++ g_section > 2) g_section = 0;}  

Selle lähenemisviisi üks oluline probleem on see, et nende funktsioonide runSectionX () jaoks on väga keeruline panna sama täitmisaeg. Selle tulemusel võidakse nuppu ühest kordusest erinevalt küsitleda. Kui see on siiski piisavalt kiire, siis ei tohiks see olla liiga suur probleem.

Ekraani värskendus
Ekraani värskendamine on kahjuks sageli üsna aeglane, võrreldes paljude teistega toimingud. See tähendab, et peate olema üsna ettevaatlik seal, kus seda teete. Katkematu teeninduse rutiin ei sobi sageli, kuna see võib teie visandisse lisada muid ajastusprobleeme.

Realistlikult peate seda tegema põhisilmus. Kui peate selle absoluutselt kiiresti käivitama, siis saab selle lisada ülaltoodud kiirema küsitluse näitesse - st värskendada ekraani igal iteratsioonil, sama mis küsitlus. Osaliste värskenduste vältimiseks peate olema ettevaatlik.

See on muide suurepärane vastus. Täpselt sellist vastust, mida sait vajab.
#2
+2
Chris K
2014-03-06 07:17:51 UTC
view on stackexchange narkive permalink

Programmi juhtimiseks tegin ühe oma projekti jaoks menüükäsitluse raamistiku ja jagasin allikat Githubis. Pange tähele, et see on mõeldud chipKIT-i jaoks, kuid menüükäitluskood on üldine. Pärast oma kolmanda või neljanda tohutu if-else-if ja switchi struktuuri loomist otsustasin, et peab olema parem viis. Krediit staatiliste menüüstruktuuride allikale.

Kasutan nupu kontrollimiseks lihtsalt peatükki.

I tahan öelda, et esimene samm on saada TFT. Kui proovite seda, ei lähe te enam kunagi tagasi. Mulle meeldib eriti Adafruit 1,8 "TFT koos juhtkangiga. Arduinos on piisavalt aeglased, et ma ei mäleta, et hoolitseksin kasutaja sisendi tühistamise eest.

Mulle meeldib see, kuidas olete seda teinud - see on arusaadav, puhas ja väga väikese suurusega. Olin vaadanud raamatukogu (MenuBackend) kasutamist, kuid uutele programmeerijatele (tagasihelistusi kasutades) on sellest raske aru saada ja see ei saa PROGMEMis istuda.
Ma leian, et sageli pole vaja tühistamist, kuid mõned lülitid näivad olevat palju lärmakamad kui teised. Püstised, servale kinnitatud puutetundlikud lülitid näivad kaugelt kõige halvemad, võib-olla seetõttu, et vajutamise asemel kasutavad kasutajad neid sageli edasi. Aruandlus on nii lihtne, et ma teen seda peaaegu alati.
Vabandust kõigi küsimuste pärast - miks just TFT? Töötan praegu 128x64 LCD-ga, millel on palju eeliseid (peamiselt füüsiliselt suur). Ka odav.
@Cybergibbons ah, ei näinud mingit kuva mainimist. See, mis mulle meeldib, on valmis kilp, piisavalt odav ja saate asju teha värvidega. Siin on minu viimase projekti koostamisaruanne: http://forums.adafruit.com/viewtopic.php?f=22&t=44710&p=223543#p223543
#3
+1
JRobert
2014-03-03 05:19:02 UTC
view on stackexchange narkive permalink

Saate küsitluse asemel katkestada, kui saate riistvara nuppudest tagasi põrgata. Vastasel korral võtate palju rohkem katkestusi, kui oli nupuvajutusi, ja peate need ikkagi tarkvaras tagasi võtma.

Kuid esmase küsimusena võib olekumasinate kogu olla vähemalt kasulik kasutajaliidese jaoks ja annab teile suurema osa mitme ülesande kasutamisest ilma vajaliku am / t kernelita. võib kahjuks olla piiratud mäluseadmetes, sest

tehnika võib olla eriti kasulik nendes väikestes seadmetes, kuid RAM-i rangete piirangute jaoks, mis muudab teie riigi-masina andmete jagamise välgu vahel keeruliseks ja RAM, sobivaks.

#4
  0
neu-rah
2017-03-04 01:56:11 UTC
view on stackexchange narkive permalink

Kuna Chris K, olen rakendanud ka staatilist menüükogu, kus on palju erinevaid väljundvalikuid, näiteks jadavärvid, LCD, TFT jne. Olen alustanud seda sõprade projekti abistamiseks ja jagan ka seda avatud lähtekoodiga inimestele, kellel on sarnaste probleemide korral loodetavasti see kasulik.

https://github.com/neu-rah/ArduinoMenu



See küsimus ja vastus tõlgiti automaatselt inglise keelest.Algne sisu on saadaval stackexchange-is, mida täname cc by-sa 3.0-litsentsi eest, mille all seda levitatakse.
Loading...