mflorian24 Posted April 8, 2014 Share Posted April 8, 2014 Nu este ceva spectaculos, dar m-am gîndit să mai populez aria... Aveam nevoie de un buton care să acţioneze după mecanismul pornit-oprit. Adică la fiecare apăsare să comute în starea cealaltă. Bineînţeles că trebuia să tratez oscilaţiile mecanice care fac circuitul să comute de mai multe ori, în mod necontrolabil. Aveam de ales între o soluţie hardware, cu rezistoare şi condensatori, sau soluţia software. Pentru soluţia soft am dat o căutare pe net şi am găsit diverse implementări, care mai de care mai complicate şi încîlcite. Aşa că am decis să scriu eu o bucată de cod pentru debouncing. Treaba s-a dovedit deosebit de simplă, din cîteva linii de cod s-a rezolvat problema. Pentru doritori, iată codul şi schema pe care l-am testat. De remarcat că se poate controla comutarea, la alegere, pe front crescător sau căzător, dacă se alege în mod corespunzător condiţia din "if". De asemenea, este necesară ajustarea prin încercări a valorii delay(), funcţie de caracteristicile mecanice ale butonului. const int button = 2;const int led1 = 8;int push = 0;void setup() { pinMode(button, INPUT_PULLUP); pinMode(led1, OUTPUT); digitalWrite(led1, LOW); // set initial LED state}void loop() { //read the button twice, with some delay int read1 = digitalRead(button); delay(35);///wait for debouncing. Choose a value between 5 and 50. It depends by mechanical quality of the button int read2 = digitalRead(button); if(read1 != read2 && read1 == LOW){//button was pressed. Switch on pushing. //(read1 != read2 && read2 == LOW){//button was pressed. Switch on releasing. push++; } if(push%2==0){//toggle digitalWrite(led1, LOW); } else { digitalWrite(led1, HIGH); }} Quote Link to comment Share on other sites More sharing options...
marik2500 Posted December 8, 2017 Share Posted December 8, 2017 Am făcut din mai multe schițe un termostat de centrala cu 18B20 care are si ceas(DS1307). Se afișează aleator 2 sec ORA, 2sec TEMPERATURA si 2 sec PRAGUL la cat sa porneasca pompa(de ex. 40C). Am recuperat afisajul cu 4 digiti de la un mp3 player defect. Totul functioneaza bine insa as dori sa-i pun si un buton cu care sa reglez PRAGUL de la 0-60 C dar nu ma pricep. Mentionez ca toti pinii digitali sunt ocupati mai putin 0 si 1 si am liberi doar analogici. Vreau ca la apasare sa afiseze ultimul PRAG si daca continui apasarea acesta sa creasca pana la 60 dupa care sa sara la 0 si sa creasca pana la ridicarea degetului de pe buton. Ma poate ajuta cineva in aceasta chestiune??? Quote Link to comment Share on other sites More sharing options...
deejay2k1 Posted December 8, 2017 Share Posted December 8, 2017 pune sketch-ul aici se pot folosi si din pinii notati Ax... ca intrari digitale Quote Link to comment Share on other sites More sharing options...
marik2500 Posted December 8, 2017 Share Posted December 8, 2017 (edited) Menționez ca vreau doar un buton pentru reglarea temperaturii prag, eventual (dar nu neapărat) si pentru reglarea HH si MM. Multumiri!!! fac testele pe o placa Arduino Uno si nu am AX. termostat_cu_ceas.zip Edited December 8, 2017 by marik2500 Quote Link to comment Share on other sites More sharing options...
nico_2010 Posted December 8, 2017 Share Posted December 8, 2017 Pinii Ax sunt cei numerotati de la 0 la 5 si sunt corespunzatori intrarilor analogice. Arduino Uno are asa ceva sub conectorul cu 5, 3.3V si GND. Pentru debounce foloseste milis. Quote Link to comment Share on other sites More sharing options...
deejay2k1 Posted December 8, 2017 Share Posted December 8, 2017 (edited) are un buton definit deja pe o intrare analogica, mai are liberi doar a6 si a7 o sa incerc sa reformatez codul si sa punem 3 butoane pe pinul analogic cu r/2r ce nu inteleg, de ce nu punem 4 rezistente pe anozi? adica nu sunt batute in cuie conexiunile, as muta anozii pe pinii pwm si as controla mult mai elegant luminozitatea Edited December 8, 2017 by deejay2k1 Quote Link to comment Share on other sites More sharing options...
marik2500 Posted December 9, 2017 Share Posted December 9, 2017 (edited) Nu e nimic bătut in cuie, se poate si modifica. Eu am folosit D2...D13 din comoditate, ca sa pot băga afișajul direct in soclul la UNO. Dupa ce e gata proiectul normal ca nu va rămâne acolo deci daca ziceti ca e mai bine cu PWM se poate modifica(eventual si o schema daca se poate). Vreau doar ca sa am un singur buton care la apasare de mai mult de 2-3 sec sa-mi afiseze temperatura prag si daca continui apasarea sa inceapa sa creasca pana cand iau mana de pe buton. Totodata sa ramana memorat acest prag pana la o alta modificare. Cresterea sa se faca in bucla, adica sa creasca pana la 60 dupa care sa sara la 0 si iar sa creasca. Cresterea se poate face din 1 in 1 sau din 5 in 5 sau chiar si din 10 in 10 e bine. Momentan asa arata testul !Va mulțumesc ! Edited December 9, 2017 by marik2500 Quote Link to comment Share on other sites More sharing options...
deejay2k1 Posted December 9, 2017 Share Posted December 9, 2017 daca poate cineva sa testeze versiunea aceasta intermediara, lucrez cumva in orb, nu am acces la un display sa fac testele necesare ... in principiu A1 este selectia a ceea ce se afiseaza, A6 plus, A7 minus (daca e prag, +/- cu 5 unitati, daca e ora, +1 ora/+1 minut)termostat_cu_ceas.zip Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.