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.