Na Arduino, pored kompleksnih senzora, vrlo često spajamo i običnu tipku (dugme) ili button.
Button služi za slanje signala Arduinu za pokretanje odgovarajućih akcija, kao što je uključivanje i isključivanje LED diode kao na slici ispod.
Razlika između tipke i prekidača je što tipka na pritisak uspostavi kontakt koji se prekida nakon otpuštanja, dok prekidač zadrži stanje koje je nastalo pritiskom.
Problem sa upotrebom dugmeta (button) je u tome što dolazi do odskakanja kontakata nakon pritiska i otpuštanja i višestrukog uspostavljanja i gubljenaj kontakta. To i nije neki problem sa aspekta čovjeka ali budući da Arduino napravi ogroman broj ciklusa u sekundi, to i izvrši veliki broj detekcija uključivanja i isključivanja dugmeta i time mijenja stanje na izlazima kao da je izvršeno višestruko pritiskanje tipke.
Da bi to spriječili koristimo debounce metod za sprječavanje višestruke detekcije pritiska dugmeta.
Ispod je kôd sketch-a koji vrši button debounce (kopirajte kompletan kôd ispod u Arduino IDE prozor i upload-ujte ga na Arduino) :
/*
* UKLJUČIVANJE/ISKLJUČIVANJE (TOGGLE) IZLAZA
* POMOĆU ISTOG DUGMETA (PUSH-BUTTON) UZ DEBOUNCE METOD
*
* Autor: Samir Gutić
* URL: http://amicus.ba
* Datum: 29. I 2017.
*/
//Uključivanje i isključivanje (toggle) izlaza pomoću istog dugmeta (push-button)
const int intPinDugmeta = 6; //Broj pin-a dugmeta
int intStanjeIzlaza = LOW; //Trenutno stanje izlaznog pina (LED)
int intOcitanoStanje; //Trenutno očitavanje sa ulaznog pina (dugme)
int intPrethodnoOcitano= LOW; //Prethodno očitavanje sa ulaznog pina (dugme)
int intZadnjeStanjeDugmeta = LOW; //Prethodno stanje dugmeta
int intStanjeDugmeta; //Stanje dugmeta
unsigned long longVrijeme = 0; //Zadnje vrijeme preklapanja dugmeta
unsigned long longDebounce = 30; //Vrijeme čekanja na odskakanje (debounce) dugmeta. Povećati ako izlaz treperi
int intLedPin = 13; //LED povezana na digitalni pin 13
int intDugme; //Uključeno/isključeno dugme
void setup()
{
pinMode(intPinDugmeta, INPUT);
digitalWrite(intPinDugmeta, HIGH); //Uključivanje ugrađenog pull-up otpornika
pinMode(intLedPin, OUTPUT);
intDugme=0;
}
void loop()
{
intOcitanoStanje = digitalRead(intPinDugmeta);
//Ako je dugme pritisnuto zbog odskakanja ili stvarnog pritiska
if (intOcitanoStanje != intPrethodnoOcitano)
{
//Reset debounce timera
longVrijeme = millis();
}
if ((millis() - longVrijeme) > longDebounce)
{
//Dodjela očitanog stanja stanju dugmeta
intStanjeDugmeta = intOcitanoStanje;
//Sada promijeniti stanje intStanjeIzlaza kada je dugme pritisnuto
if (intStanjeDugmeta == HIGH && intZadnjeStanjeDugmeta == LOW)
{
intZadnjeStanjeDugmeta = HIGH;
if (intStanjeIzlaza == HIGH)
{
intStanjeIzlaza = LOW;
intDugme=0;
}
else
{
intStanjeIzlaza = HIGH;
intDugme=1;
}
}
if (intStanjeDugmeta == LOW && intZadnjeStanjeDugmeta == HIGH)
{
intZadnjeStanjeDugmeta = LOW;
}
}
//Uzimanje zadnjeg očitavanja zbog praćenja stanja
intPrethodnoOcitano= intOcitanoStanje;
if (intDugme ==1)
{
//Dugme uključeno
digitalWrite(intLedPin, HIGH); // Uključuje LED 13
}
else
{
//Dugme isključeno
digitalWrite(intLedPin, LOW); // Isključuje LED 13
}
}
U suštini, sketch prati da li se dogodio ponovljeni pritisak dugmeta u određenom vremenskom periodu i ignoriše ga.
Drugi način za debounce dugmeta je pomoću bounce2 metoda (debounce se zvanično više ne koristi - depricated).
/*
* UKLJUČIVANJE/ISKLJUČIVANJE (TOGGLE) IZLAZA
* POMOĆU ISTOG DUGMETA (PUSH-BUTTON) UZ BOUNCE2 METOD
*
* Autor: Samir Gutić
* URL: http://amicus.ba
* Datum: 31. I 2017.
*/
#include <Bounce2.h>
#define PinDugmeta 6
#define PinLED 13
int intStanjeLED = LOW;
//Kreiranje instance Bounce objekta
Bounce bOdskakanje = Bounce();
void setup()
{
//Kreiranje dugmeta sa internim pull-up otpornikom
pinMode(PinDugmeta,INPUT_PULLUP);
//Kreiranje Bounce instance
bOdskakanje.attach(PinDugmeta);
bOdskakanje.interval(100); //Interval odskakanja dugmeta
//Definisati LED
pinMode(PinLED,OUTPUT);
digitalWrite(PinLED,intStanjeLED);
}
void loop()
{
//Update Bounce instancu
bOdskakanje.update();
//Izvršavanje koda kada Bounce pada (prijelaz sa HIGH na LOW)
if (bOdskakanje.fell())
{
//Promijeni (toggle) stanje LED
intStanjeLED = !intStanjeLED;
digitalWrite(PinLED,intStanjeLED);
}
}
U primjeru iznad je korištena biblioteka bounce2.h koju treba uključiti u sketch a koja sadrži metode detekcije prednje i zadnje ivice signala odnosno pritiska i odpuštanja tipke. Zbog toga je i kôd sketch-a puno kraći i pregledniji.
Debounce i bounce2 metod je demonstriran na šemi sa Arduino Uno, dugmetom u pull down spoju i LED diode. Pritiskom na dugme i otpuštanjem se uključuje LED dioda koja ostaje uključena do ponovnog pritiska na isto dugme. To predstavlja toggle dugme.
Šema spoja elemenata kreirana u Fritzing programu je na slici ispod.
Kao što se vidi sa šeme iznad, plus pol LED diode je, preko otpornika R1=220Ω spojen na pin broj 13. Jedan kontakt tipke za pritiskanje je spojen direktno na +5V. Drugo kontakt je, preko otpornika R2=10KΩ spojen na masu ali i direktno na Arduino pin broj 6. Takav spoj tipke se naziva pull down spoj.
Električna šema spoja je na sljedećoj slici.
Video koji prikazuje rad dugmeta i LED diode je ispod.
Bez debounce metoda bi LED dioda, nakon pritiska na dugme, nekoliko puta bila uključena i isključena i nikada ne bi bilo sigurno da li će ostati uključena ili isključena.
Umjesto uključivanja i isključivanja LED diode je moguće izvršti bilo koju akciju po želji.
Potrebne komponente:
1 x Arduino UNO
1 x Breadboard
1 x Button (NO - normalno otvoren)
1 x LED
1 x otpornik 220Ω
1 x otpornik 10KΩ
Žice za spajanje
9V napajanje