Tlačítko a detekce změny stavu

Předchozí příklad tlačítka s externím rezistorem je vhodný, pokud chceme, aby sepnutý stav trval pouze po dobu fyzického stisknutí tlačítka – „svítím, dokud držím“. Nehodí se však pro použití tlačítka jako přepínače.

Pro užití tlačítka je třeba kód upravit tak, abychom detekovali změnu stavu talčítka. Tento přístup se také nazývá „detekce hrany“. Kromě stisku tlačítka je tak nutné v podmínce kontrolovat, že došlo ke změně současného stavu tlačítka od toho předchozího.

Při dlouhodobém stlačení tlačítka sice bude splněna podmínka stisku, ale změna stavu natane pouze jednou. Tzn. že skutečně dojde ke správnému vyhodnocení přepnutí ze stavu rozepnuto do stavu sepnuto.

Vyzkoušet to můžeme na příkladu níže, kdy počítáme, kolikrát došlo ke stisku tlačítka. Pokud bychom chtěli tohoto výsledku dosáhnout pouze s detekováním seplého tlačítka, nikdy bychom se nedopočítali.

Zapojení je stejné jako u příkladu tlačítka bez externího rezistoru.

Kód

byte citac = 0; // spočítá od 0 do 255 stisků
const byte tlacitko = 12; // konstanta - nelze za běhu měnit
int predchoziStav = HIGH; // dosud nebylo stisknuto

void setup()
{ // pin 12 bude zapojen jako vstup ale s připojením na +5 V
pinMode(tlacitko, INPUT_PULLUP); //přes vnitřní 20k rezistor
Serial.begin(9600);
}

void loop()
{ // musí být stisknuto a zároveň v předchozím průchodu nesmělo
if ((digitalRead(tlacitko) == LOW) && // a zároveň
(digitalRead(tlacitko) != predchoziStav)){ // nerovná se
citac++; // navýší hodnotu čítače o 1
Serial.print("Tlacitko bylo stisknuto jiz ");
Serial.print(citac); // vypíše pokolikáté bylo stisknuto
Serial.println("x"); // odřádkuje
} // uloží se současný stav tlačítka pro další průchod
predchoziStav = digitalRead(tlacitko);
}