Kysymys:
Mitä suunnittelumalleja voin käyttää käyttäjän syötteiden ja näytön päivittämisen käsittelemiseen?
Cybergibbons
2014-03-01 15:46:44 UTC
view on stackexchange narkive permalink

Olen käyttänyt tarpeeksi tuotteita, joissa on upotettuja mikro-ohjaimia ja reagoimattomia käyttöliittymiä tietääkseen, että se voi tehdä tuotteen tai rikkoa sen. Jopa pieni viive tai viive napin painallusten ja näytön päivityksen välillä tai napin painallusten huomiotta jättäminen tai kaksinkertainen laskeminen voi olla erittäin turhauttavaa.

Mitä suunnittelumalleja voidaan käyttää käyttäjän syötteen käsittelemiseen (painikkeista) ) ja päivitän näyttöjä aiheuttamatta näitä ongelmia?

Käytän tällä hetkellä seuraavanlaista mallia (tämä on yksinkertaistettu minimiin asti):

  #include <Bounce.h> #define GREEN_LED 6 // Tappi vihreälle LEDille # määritä BUTTON_PIN 15 // Tappi painikkeelle - käyttää ulkoista alasvetoa niin aktiivisena korkea # define DISPLAY_REFRESH_INT 100 // Kuinka monta MS: tä näytön päivitysten välillä Pomppupainike = Palautus (BUTTON_PIN, 5); // Signalointi painikkeen lukemisen ja näytön välillä päivityskoko ledState = false; // Käytetään viimeisen näytön päivityspituisen näytön seurantaanUpdate = 0; void setup () {pinMode (GREEN_LED, OUTPUT); pinMode (BUTTON_PIN, INPUT);} void loop () {// Lue painikkeen tila if (button.update ()) {if (button.risingEdge ()) {ledState =! ledState; }} // Päivitä näyttö säännöllisesti, jos (millis () - displayUpdate > DISPLAY_REFRESH_INT) {displayUpdate = millis (); digitalWrite (GREEN_LED, ledState); }}  

Mitä muita vaihtoehtoja on? Onko kannattaa koskaan käyttää nastanvaihtokatkoksia painikkeiden lukemiseen (jos emme harkitse akun kestoa!).

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

Vastaus riippuu siitä, kuinka luonnoksen on tarkoitus vastata käyttäjän vuorovaikutukseen.

Ulkoiset keskeytykset
Jos vuorovaikutus riippuu reagoinnista erittäin tarkasti nousuun tai syötetapahtuman lasku (kuten esimerkissäsi), ulkoinen keskeytys voi olla tapa edetä, jos mahdollista.

Tämä on erityisen tärkeää, jos syötetapahtuma voi olla lyhyempi kuin puhelun kesto loop () . Jos näin tapahtuu, peräkkäiset yritykset kysyä tuloa voivat jättää tilamuutoksen kokonaan väliin. On melko harvinaista, että käyttäjän syötetapahtuma on kuitenkin niin lyhyt, ellei loop () ole melko hidas suorittaa.

Ulkoinen laitteisto saa apua, vaikka esim. ottamalla sisääntulo, joka lukittuu, kunnes mikrokontrolleri lukee ja nollaa sen.

Äänestystaajuuden parantaminen
Ulkoiset keskeytykset eivät usein ole mahdollisia (esim. koska siru tukee vain rajoitettu määrä), tai ne ovat yksinkertaisesti ylimitoitettuja / tarpeettomia tietylle sovellukselle.

Tällöin voi silti olla mahdollista parantaa ajoituksen tarkkuutta käytettäessä kyselyä. Yksi vaihtoehto on jakaa kaikki pääpiirin eri osat erillisiin toimintoihin. Jokaisella peräkkäisellä loop () -toiminnolla se kutsuu seuraavaa funktiota ja kiertyy sitten ensimmäisenä. Jokaisen toiminnon välissä se voi kysellä painiketta. Tässä on yksinkertainen esimerkki:

  unsigned int g_section = 0; void setup () {} void pollButton () {//...}void runSection0 () {//...}void runSection1 () {//...}void runSection2 () {//...}void loop () {// Napsauta painiketta jokaisella passilla: pollButton (); // Suorita seuraava pääkoodin osa: switch (g_section) {tapaus 0: runSection0 (); tauko; tapaus 1: runSection1 (); tauko; tapaus 2: runSection2 (); tauko; } // Suorita seuraava iterointi seuraavalla osalla: if (++ g_section > 2) g_section = 0;}  

Yksi tärkeä lähestymistapa on, että on erittäin vaikeaa saada jokainen näistä runSectionX () -toiminnoista viemään sama suoritusaika. Tämä voi johtaa siihen, että painiketta kysytään epäyhtenäisesti yhdestä iteraatiosta toiseen. Jos se on kuitenkin tarpeeksi nopea, sen ei pitäisi olla liian suuri ongelma.

Näytön päivitys
Näytön päivittäminen on valitettavasti usein melko hidasta verrattuna moniin muihin. toimintaan. Tämä tarkoittaa, että sinun on oltava varovainen missä teet sen. Keskeytetyn palvelurutiinin sisältä ei usein sovi, koska se voisi tuoda piirustukseesi muita ajoitusongelmia.

Realistisesti sinun on tehtävä se pääpiirissä. Jos sinun on kuitenkin suoritettava se nopeasti, se voidaan sisällyttää yllä antamaani nopeamman kyselyn esimerkkiin - eli päivittää näyttö jokaisella iteraatiolla, sama kuin kysely. Sinun on kuitenkin oltava varovainen välttääksesi osittaisia ​​päivityksiä.

Tämä on muuten loistava vastaus. Juuri sellainen vastaus, jota sivusto tarvitsee.
#2
+2
Chris K
2014-03-06 07:17:51 UTC
view on stackexchange narkive permalink

Ohjelman hallintaa varten tein jotain valikkojen käsittelystä yhdelle projektilleni ja jaoin lähteen Githubissa. Huomaa, että tämä on tarkoitettu chipKIT: lle, mutta valikkokäsittelykoodi on yleinen. Kun olen rakentanut kolmannen tai neljännen valtavan if-else-if ja switch -rakenteen, päätin, että on oltava parempi tapa. Kiitos staattisten valikkorakenteiden lähteestä.

Tarkistan painikkeen vain pääsilmukalla.

I Haluan sanoa, että ensimmäinen askel on saada TFT. Jos kokeilet sitä, et koskaan palaa takaisin ... Rakastan erityisesti Adafruit 1,8 "TFT: tä ohjaussauvalla. Arduinot ovat riittävän hitaita, jotta en voi muistaa huolehtimista käyttäjän syötteen peruuttamisesta.

Pidän tavasta, jolla olet tehnyt sen - se on ymmärrettävää, puhdasta ja erittäin pienikokoinen. Olin etsinyt kirjaston (MenuBackend) käyttöä, mutta uusien ohjelmoijien (takaisinsoittoja käyttävien) on vaikea ymmärtää, enkä voi istua PROGMEM: ssä.
Mielestäni purkamista ei usein tarvita, mutta jotkut kytkimet näyttävät olevan paljon meluisempia kuin toiset. Pystysuorat, reunaan asennetut piirilevyn kosketuskytkimet näyttävät ylivoimaisesti pahimmilta, ehkä siksi, että käyttäjät painavat painikkeen sijaan usein näitä eteenpäin. Lausunto on niin helppoa, että teen melkein aina sen nyt.
Anteeksi kaikista kysymyksistä - miksi TFT? Työskentelen parhaillaan 128x64 LCD: n kanssa, jolla on paljon etuja (pääasiassa fyysisesti suuri). Myös halpaa.
@Cybergibbons ah, ei nähnyt mitään mainintaa näytöstä. Pidän yhdestä valmiista kilpestä, joka on tarpeeksi halpa, ja voit tehdä asioita väreillä. Tässä on viimeisimmän projektini koontiraportti: 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

Voit keskeyttää äänestämisen sijaan, jos voit poistaa laitteiston painikkeet. Muuten sinun on käytettävä paljon enemmän keskeytyksiä kuin painikkeita, ja sinun on silti poistettava ne ohjelmistosta.

Ensisijaiseen kysymykseen on kuitenkin, että valtion koneiden kokoelma voi olla ainakin hyödyllinen käyttöliittymälle, ja antaa sinulle suurimman osan monitehtävien eduista ilman tarvittavaa am / t-ydintä. Valitettavasti RAM-laitteissa voi olla rajoitettuja laitteita, koska

Tekniikka voi olla erityisen hyödyllinen näissä pienissä laitteissa, mutta RAM-muistin rajojen vuoksi, mikä tekee haastavaksi jakaa valtion-koneen tiedot flash-laitteiden välillä ja RAM, sopivaksi.

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

Koska Chris K, olen myös ottanut käyttöön staattisen valikkokirjaston, jossa on laaja valikoima ulostulovaihtoehtoja, kuten sarja, LCD, TFT jne. avoimen lähdekoodin ihmisille, joilla on samanlaisia ​​ongelmia, toivottavasti löydät siitä hyödyllisen.

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



Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 3.0-lisenssistä, jolla sitä jaetaan.
Loading...