Állapotváltozás észlelése (élérzékelés) a nyomógomboknál

Megszámoljuk a gombnyomások számát.


Utolsó felülvizsgálat: 2022.02.04 16:50


Ha már működik egy nyomógomb, gyakran szeretne valamilyen műveletet végrehajtani aszerint, hogy hányszor lett megnyomva a gomb. Ehhez tudnia kell, hogy a gomb mikor vált kikapcsolt állapotról bekapcsolt állapotba, és számolja meg, hogy ez az állapotváltozás hányszor történik meg. Ezt állapotváltozás észlelésnek vagy élérzékelésnek nevezik. Ebben az oktatóanyagban megtanuljuk, hogyan ellenőrizhető az állapotváltozás, üzenetet küldünk a Soros Monitornak a megfelelő információkkal, és négy állapotváltozást számolunk a LED be- és kikapcsolásához.

Hardver szükséglet

  • Arduino kártya

  • Egy pillanatkapcsoló, gomb vagy billenőkapcsoló

  • 10 kohm-os ellenállás

  • összekötő vezetékek

  • dugdosós próbapanel (breadboard)

Az áramkör

Csatlakoztasson három vezetéket a kártyához. Az első a nyomógomb egyik lábától egy lehúzó ellenálláson (itt 10 kohm) keresztül a földre megy. A második a nyomógomb megfelelő lábától az 5 voltos táphoz megy. A harmadik egy digitális I/O kivezetéshez csatlakozik (itt a 2. kivezetéshez), amely leolvassa a gomb állapotát.

Nyitott (nem lenyomott) nyomógomb esetén nincs kapcsolat a nyomógomb két lába között, így a kivezetést földeljük (a lehúzó ellenálláson keresztül) és LOW-t olvasunk. A gomb bezárásakor (lenyomva) összeköttetést hoz létre a két lába között, a kivezetést feszültségre köti, így HIGH-t olvasunk. (A kivezetés továbbra is a földre van kötve, de az ellenállás ellenáll az áram áramlásának, így a legkisebb ellenállás útja a +5 V-ig terjed.)

Ha mindenről leválasztja a digitális I/O érintkezőt, előfordulhat, hogy a LED hibásan villog. Ennek az az oka, hogy a bemenet "lebegő" - vagyis nem csatlakozik sem feszültséghez, sem földhöz. Többé-kevésbé véletlenszerűen ad vissza HIGH vagy LOW értéket. Ezért kell egy lehúzó ellenállás az áramkörben.

Vázlat

A kód

Az alábbi vázlat folyamatosan leolvassa a gomb állapotát. Ezután összehasonlítja a gomb állapotát a legutóbbi állapotával a fő ciklusban. Ha a gomb aktuális állapota eltér a legutóbbi gombállapottól, és az aktuális gombállapot HIGH, akkor a gomb kikapcsolt állapotról bekapcsolt állapotra váltott. A vázlat ezután növeli a gombnyomás-számlálót.

A vázlat a gombnyomás-számláló értékét is ellenőrzi, és ha ez a négy páros többszöröse, akkor a 13-as kivezetésen lévő LED-et bekapcsolja. Ellenkező esetben kikapcsolja.

/*
  State change detection (edge detection)

  Gyakran nem kell folyamatosan tudnod a digitális bemenet állapotát, de csak azt kell
  tudni, hogy a bemenet mikor vált egyik állapotból a másikba.
  Például tudni szeretné, hogy egy gomb mikor vált KI állásból BE állapotba. Ezt
  állapotváltozás észlelésnek vagy élérzékelésnek nevezik.

  Ez a példa bemutatja, hogyan észlelhető, ha egy gomb ki-be, illetve be-ki kapcsol.

  Az áramkör:
  - nyomógomb +5V-ról a 2-es kivezetésre csatlakoztatva
  - 10 kohm-os ellenállás a 2-es kivezetésről a földre csatlakoztatva
  - LED a 13-as kivezetéstől a földig 220 ohmos ellenálláson keresztül
    (vagy használja a legtöbb Arduino kártyára beépített LED-et)

  created  27 Sep 2005
  modified 30 Aug 2011
  by Tom Igoe

  Ez a kód nyilvános.

  https://docs.arduino.cc/built-in-examples/digital/StateChangeDetection
*/

// ezek az állandók nem változnak:
const int  buttonPin = 2;    // a nyomógomb kivezetés száma
const int ledPin = 13;       // a LED kivezetés száma

// Variables will change:
int buttonPushCounter = 0;   // a gombnyomások számának számlálója
int buttonState = 0;         // a gomb aktuális állapota
int lastButtonState = 0;     // a gomb előző állapota

void setup() {
  // inicializálja a nyomógomb kivezetést bemenetként:
  pinMode(buttonPin, INPUT);
  // inicializálja a LED kivezetést kimenetként:
  pinMode(ledPin, OUTPUT);
  // inicializálja a soros kommunikációt:
  Serial.begin(9600);
}


void loop() {
  // olvassa el a nyomógomb beviteli kivezetését:
  buttonState = digitalRead(buttonPin);

  // összehasonlítja a buttonState-et az előző állapottal
  if (buttonState != lastButtonState) {
    // ha az állapot megváltozott, növeljük a számlálót
    if (buttonState == HIGH) {
      // ha az aktuális állapot HIGH akkor a gomb ki-ről be-re váltott:
      buttonPushCounter++;
      Serial.println("on");
      Serial.print("number of button pushes: ");
      Serial.println(buttonPushCounter);
    } else {
      // ha az aktuális állapot LOW akkor a gomb be-ről ki-re váltott:
      Serial.println("off");
    }
    // Késleltessen egy kicsit, hogy elkerülje a pergést
    delay(50);
  }
  // mentse el az aktuális állapotot utolsó állapotként, ez lesz a ciklusban következő alkalommal
  lastButtonState = buttonState;


  // négy gombnyomásonként bekapcsolja a LED-et a gombnyomás-számláló
  // maradékának ellenőrzésével. a maradék függvény megadja
  // a két szám osztásának maradékát:
  if (buttonPushCounter % 4 == 0) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }

}

Tudj meg többet

További alapvető oktatóanyagokat a beépített példák részben talál.

Felfedezheti a nyelvi referenciát is, az Arduino programozási nyelv részletes gyűjteményét.