/*
Debounce
Pokaždé, když se vstupní pin změní z LOW na HIGH (například kvůli stlačení tlačítka),
výstupní pin je přepnut z LOW na HIGH nebo naopak.
Mezi přepnutími je minimální prodleva, která slouží pro ošetření zákmitů (debouncing) obvodu.
Obvod:
* LED připojena od pinu 13 k zemi
* tlačítko připojené od pinu 2 k +5V
* 10 kΩ rezistor připojen od pinu 2 k zemi
* Poznámka: Na většině Arduin je LED
k pinu 13 již připojena, takže k tomuto příkladu už další
komponenty nebudete potřebovat.
vytvořeno 21. listopadu 2006 autorem David A. Mellis
upraveno 30. srpna 2011 Limor Fried
upraveno 28. prosince 2012 Mike Walters
Příklad tohoto kódu je veřejnou doménou.
http://www.arduino.cc/en/Tutorial/Debounce
*/
// konstanty použité k nastavení čísel pinů se nezmění:
const int buttonPin = 2; // číslo pinu tlačítka
const int ledPin = 13; // číslo pinu LED
// Proměnné se změní:
int ledState = HIGH; // současný stav výstupního pinu
int buttonState; //nejnovější hodnota načtená ze vstupního pinu
int lastButtonState = LOW; // předchozí hodnota načtení ze vstupního pinu
// Následné proměnné jsou typu long, jelikož čas měřený v milisekundách se
//rychle změní na větší číslo, jež nemůže být uloženo v int
long lastDebounceTime = 0; // čas posledního změny výstupního pinu
long debounceDelay = 50; // čas debounce prodlevy; pokud výstup bliká,
//je potřeba čas „zvětšit“
void setup() {
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
// nastavte počáteční stav LED
digitalWrite(ledPin, ledState);
}
void loop() {
// Stav spínače přiřaďte do místní proměnné:
int reading = digitalRead(buttonPin);
// Zkontroluje, zda-li jste stlačili tlačítko
// (tj. že vstup se z LOW změnil na HIGH), a od posledního zmáčknutí jste čekali
// dostatečně dlouho na to, aby byl veškerý šum ignorován:
// Pokud se spínač změnil kvůli šumu nebo stlačení:
if (reading != lastButtonState) {
// upravte proměnou lastDebounceTime
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
// Ať už je načtená hodnota jakákoliv, byla tam déle než debounce prodleva,
// berme ji tedy jako aktuální stav:
// Pokud se stav tlačítka změnil:
if (reading != buttonState) {
buttonState = reading;
// LED přepněte pouze když je nový stav tlačítka označen jako HIGH
if (buttonState == HIGH) {
ledState = !ledState;
}
}
}
// nastavte LED:
digitalWrite(ledPin, ledState);
// načtené hodnoty uložte. V příští smyčce bude označeno jako lastButtonState:
lastButtonState = reading;
}