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
Komentari odražavaju stavove svojih autora a NE stavove http://amicus.ba. Možete slobodno izraziti svoje mišljenje o članku koji komentarišete ili o komentarima drugih sve dok su vaši komentari u granicama uljudnosti. Uvredljivi, vulgarni, rasistički, nacionalistički i ostali opšte neprihvatljivi komentari će biti izbrisani! Ako imate neku sugestiju, prijedlog ili primjedbu ovo je dobro mjesto da je iznesete.
Coments WILL NOT BE published automatically. Administrator will check and publish each comment.