Nyomógomb pergésmentesítése

Nyomógomb olvasása, zajszűrés.


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


A nyomógombok lenyomásakor gyakran hamis nyitás/zárás átmeneteket generálnak mechanikai és fizikai problémák miatt: ezek az átmenetek nagyon rövid időn belüli többszöri megnyomásként olvashatók, ami megtéveszti a programot. Ez a példa bemutatja, hogyan lehet pergésmentesíteni egy bemenetet, ami azt jelenti, hogy rövid időn belül kétszer kell ellenőrizni, hogy a nyomógomb határozottan meg van-e nyomva. Pergésmentesítés nélkül a gomb egyszeri megnyomása előre nem látható eredményt okozhat. Ez a vázlat a millis() függvényt használja a gomb megnyomása óta eltelt idő nyomon követésére.

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

Vázlat

A kód

Az alábbi vázlat Limor Fried pergésmentesítés-változatán alapul, de a logikája a fordítottja a ő példájának. A példájában a kapcsoló LOW értéket ad vissza, ha zárva van, és HIGH-t, amikor nyitva van. Itt a kapcsoló HIGH-t ad vissza, ha megnyomja, és LOW-t, ha nem nyomja meg.

/*
  Debounce

  Minden alkalommal, amikor a bemeneti kivezetés LOW-ról HIGH-ra vált (például egy nyomógomb megnyomása miatt),
  a kimeneti kivezetés LOW-ról HIGH-ra vagy HIGH-ról LOW-ra vált. Az átkapcsolások között minimális késleltetés
  van az áramkör pergésmentesítéséhez (azaz a zaj figyelmen kívül hagyásához). 

  Az áramkör:
  - LED csatlakozik a 13-as kivezetéstől a földig 220 ohmos ellenálláson keresztül
  - nyomógomb +5V-ról a 2-es kivezetésre csatlakoztatva
  - 10 kohm-os ellenállás csatlakozik a 2. kivezetésre a földről

  - Megjegyzés: A legtöbb Arduino kártyán már van egy LED a 13-as kivezetésre csatlakoztatva,
    így ehhez a példához nincs szükség további alkatrészekre.

  created 21 Nov 2006
  by David A. Mellis
  modified 30 Aug 2011
  by Limor Fried
  modified 28 Dec 2012
  by Mike Walters
  modified 30 Aug 2016
  by Arturo Guadalupi

  Ez a kód nyilvános.

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

// az állandók nem változnak. Itt a kivezetés számának beállítására szolgálnak:
const int buttonPin = 2;     // a nyomógomb kivezetés száma
const int ledPin =  13;      // a LED kivezetés száma

// a változók megváltozhatnak:
int ledState = HIGH;         // az output kivezetés aktuális állapota
int buttonState;             // az input kivezetés aktuális beolvasása
int lastButtonState = LOW;   // az input kivezetés előző beolvasása

// a következő változók unsigned longok, mert az ezredmásodpercben mért idő gyorsan
// nagyobb számmá válik, mint amennyit egy intben el lehet tárolni.
unsigned long lastDebounceTime = 0;  // a kimeneti kivezetés legutóbbi átkapcsolása
unsigned long debounceDelay = 50;    // a pergésmentesítési idő; növelje, ha a kimenet villog

void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);

  // a LED állapotának inicializálása
  digitalWrite(ledPin, ledState);
}

void loop() {
  // beolvassa a kapcsoló állapotát egy helyi változóba:
  int reading = digitalRead(buttonPin);

  // ellenőrizze, hogy most nyomta-e meg a gombot (azaz a bemenet
  // LOW-ról HIGH-ra vált), és elég sokáig várt az utolsó megnyomás
  // óta, hogy figyelmen kívül hagyja a zajt:

  // Ha a kapcsoló zaj vagy megnyomás miatt megváltozott:
  if (reading != lastButtonState) {
    // a pergésmentesítési időzítő resetelése
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    // Bármi is legyen a leolvasás, hosszabb ideig van jelen, mint a
    // pergésmentesítési késleltetés, ezért tekintse aktuális állapotnak:

    // ha a gomb állapota megváltozott:
    if (reading != buttonState) {
      buttonState = reading;

      // csak akkor kapcsolja be a LED-et, ha az új gombállapot HIGH
      if (buttonState == HIGH) {
        ledState = !ledState;
      }
    }
  }

  // a LED beállítása:
  digitalWrite(ledPin, ledState);

  // az olvasás mentése. A következő alkalommal a ciklusban ez lesz a lastButtonState:
  lastButtonState = reading;
}

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.