Până acum am aprins led-uri fără a folosi vreo comandă externă. În acest proiect va trebui să aprindem un led doar dacă apăsăm un buton ( push-button ) și vom învăța să lucrăm cu pini configurați ca pini de intrare.
Valoarea rezistorului ce este conectat la led , este după cum bine știm 100 \(\Omega \). Rezistorul \(R_2 \) este de 100K\(\Omega\) și are rolul de a pune la masă pinul 3.
Codul sursă :
\( int \ pinbuton \ \ 3; \\ int \ pinled \ \ 2; \\ void \ setup() \\ \left\{ \\ pinMode(pinled,OUTPUT); \\ pinMode(pinbuton,INPUT); \\ \right\} \\ void \ loop() \\ \left\{ \\ int \ val=digitalRead(pinbuton); \\ if \ (val==HIGH) \\ \left\{ \\ digitalWrite(pinled, HIGH); \\ \right\} \\ else \\ digitalWrite(pinled,LOW); \\ \right\} \)
Explicații:
În funcția setup(), după cum știți, am declarat pinii ca fiind de intrare respectiv de ieșire.
În funcția loop() lucrurile stau astfel : am declarat o variabilă val în care memorăm starea pinului de intrare sau a pinului la care este conectat butonul ( starea butonului: închis/deschis ). Inițial pinul este conectat la masă printr-o rezistență, astfel că la intrarea pinului 3 vom avea inițial 0V sau LOW. În cazul în care apăsăm butonul, starea pinului 3 se va schimba din 0V în 5V respectiv din LOW în HIGH.
În acest caz variabila val va stoca valoarea LOW sau HIGH, așa că am folosit o instrucțiune IF pentru a vedea dacă valoarea variabilei val este LOW sau HIGH respectiv pentru a vedea dacă butonul este apăsat ( activat ) sau nu.
În cazul în care butonul este apăsat, variabila val va avea valoarea HIGH, ledul se va aprinde punând pinul 2 în valoarea HIGH.
În cazul în care butonul nu este apăsat, variabila val va avea valoarea LOW, ledul va fi stins punând pinul 2 în valoarea LOW.
Prin acest exemplu am vrut să punem în evidență conectarea unor dispozitive externe către microcontroller. Dispozitivul nostru extern este un buton ( push-button ). Pentru a citi starea acestuia am transformat pinul 2 ( digital ) în pin de intrare și i-am citit starea.
IMPORTANT!!! Pentru ca un pin să fie transformat în pin de intrare, trebuie să ne asigurăm că în acest pin va intra o tensiune cuprinsă între 0 și 5V în funcție de uC ( microcontroller ). În caz contrar se va arde microcontrollerul.
Un buton dă voie curentului să treacă mai departe când acesta este apăsat.
Butoanele ( push-button ) manifestă un fenomen interesant numit ”bouncing” ce se referă la tendința butonului de a se activa și dezactiva de câteva ori după ce acesta a fost apăsat. Acest fenomen este generat de contactul de metal din interiorul butonului, care fiind foarte mic acesta poate vibra după ce butonul este eliberat ducând la activarea și dezactivarea butonului.
Acest fenomen se poate minimaliza folosind un filtru ( rezistor + capacitor ) sau prin modificare software care constă din : folosirea pulldown resistor și a unei întârzieri.
Vom realiza o schemă folosind un filtru pentru a minimiza acest fenomen și apoi vă voi scrie partea de cod ce se poate folosi pentru a reduce, de asemenea, acest fenomen.
După cum vedeți în schemă, rezistorul de 10k\(\Omega\) este conectat între pinul digital și masă ( GND ) este rezistor pull-down deoarece face ca tensiunea la pin să fie aproape 0V.
Capacitorul conectat în paralel – am creat un circuit ”debouncing”.
Când butonul este apăsat, pinul este în stare HIGH dar când butonul este eliberat pinul este pus la masă prin rezistorul de 10K\(\Omega\) și capacitorul de 100nF creează o întârziere mică astfel încât pinul trece în starea de LOW cu întârziere, acoperind astfel sau eliminând citirile false produse de fenomenul ”bounce”.
Rezolvarea software :
\( int \ pin = 2; \\ int \ pinled=13; \\ int \ stare=HIGH; \\ int \ reading; \\ int \ prev=LOW; \\ long \ timp=0; \\ long \ debounce=200; \\ void \ setup() \\ \left\{ \\ pinMode(pin,INPUT); \\ pinMode(pinled,OUTPUT); \\ \right\} \\ ( void \ loop() \\ \left\{ \\ reading=digitalRead(pin); \\ if \ (reading==HIGH \ \&\& \ prev==LOW \ \&\& \ millis()-timp>debounce) \\ \left\{ \\ if \ (stare==HIGH) \\ stare=LOW;\\ else \ stare==HIGH; \\ \right\} \\ digitalWrite(pinled,stare); \\ prev=reading; \\ \right\} \)
Lasă un răspuns