Autor: Samir Gutić
Pročitano: 3619 puta

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.

LED button debounce spoj

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.

LED button debounce - breadboard

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.

LED button debounce - električna šema

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