Support http://amicus.ba with small donation

 
Četvrtak 8 Juni 2023

Zvjezdica neaktivnaZvjezdica neaktivnaZvjezdica neaktivnaZvjezdica neaktivnaZvjezdica neaktivna
 

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

Dodaj komentar

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.

Amicus copyright 2023