Vizitator Postat Noiembrie 9, 2014 Partajează Postat Noiembrie 9, 2014 (editat) Va rog dati-mi o idee de cod, in ideea ca un buton sa aiba functii de genul: - OFF - ON MOD 1 - ON MOD 2 Cea mai rapida idee este fiecare apasare sa selecteze urmatoarea optiune, dar eu as vrea un pic diferit. De genul apasari lungi, scurte, numar de apasari ... uC = Attiny85 8MHz Nota: nu cer codul,doar ideea.. Va multumesc. Editat Noiembrie 9, 2014 de Vizitator Link spre comentariu
rlodina Postat Noiembrie 9, 2014 Partajează Postat Noiembrie 9, 2014 In cazul in care ai doar cele 3 functii : - OFF - ON MOD 1 - ON MOD 2 cel mai logic ar fi urmatoarea functionare: - OFF - 1 singura apasare lunga (>=3 sec) - cand este on orice apasare scurta comuta ciclic intre ON MOD 1 si ON MOD 2. - dIn modul Off orice apasare trece in ultimul mod ON folosit. Probabil ca un indicator vizual (chiar si 2 leduri cu un simplu marcaj 1 si 2) care sa reprezinte cele doua moduri ON ar fi totusi necesar. Parerea mea. Link spre comentariu
Vizitator Postat Noiembrie 11, 2014 Partajează Postat Noiembrie 11, 2014 cam asa l-am facut. exceptie indicatoarele vizule. un singur led, inclus in buton, pentru OFF = stins, MOD1 = aprins, MOD2 = intermitent 100ms. si mie mi se pare cel mai ok asa. Link spre comentariu
one Postat Noiembrie 26, 2014 Partajează Postat Noiembrie 26, 2014 (editat) Cam tarziu raspunsul dar poate util pentru unii. Eu de obicei includ cam in orice proiect un timer care il fac sa imi dea un timestamp, practic o unitate egala cu 100us sau 1ms, astfel am o masura de timp. De aici pot avea secunde, minute s.a.m.d. Daca ar fi sa fac ceva asemanator cu ce ii trebuia lui Genetix, as face astfel: la apasarea tastei: citeste timestamp si programeaza power-off peste X timp (sa zicem 2 secunde). La ridicarea tastei, citeste timestamp, anuleaza power-off si fa diferenta cat a fost apasat. Daca se incadreaza intr-un domeniu sau altul, functia va fi corespunzatoare. Power off eu am facut-o in 2 moduri: pentru aparatele alimentate la baterii sau cele unde oprirea inseamna power-off, nu restart, am un tranzistor sau releu scurtcircuitat de butonul power-on. La pornire, se inchide releul (un reed la 5V) sau tranzistorul. La sfarsitul perioadei de functionare, este suficienta intreruperea comenzii. Pentru aparatele unde am avut nevoie de restart, am folosit watchdog timerul, l-am activat si nu l-am mai resetat. Unele microcontrollere, ca de exemplu xmega, au posibilitatea de reset software. P.S. Acum mi-am amintit ca Arduino are un timestamp... un numar de milisecunde de cand a fost pornit sau ceva de genul asta... apoi are niste functii pentru calcularea timpului. Eu programez in C si placile Arduino si nu sunt expert cu wiring sau cum se cheama. Editat Noiembrie 26, 2014 de one Link spre comentariu
nico_2010 Postat Noiembrie 26, 2014 Partajează Postat Noiembrie 26, 2014 Sau folosesti declaratiile "Switch/Case". Incrementezi o variabila si functie de valoarea ei este apelata o subrutina, este data o comanda ... s.a.m.d. Link spre comentariu
Vizitator Postat Noiembrie 26, 2014 Partajează Postat Noiembrie 26, 2014 (editat) Sau folosesti declaratiile "Switch/Case". te rog dezvolta. proiectul e finisat, dar poate ptr altele... legat de timere, eu nu folosesc niciodata delay, mi se pare o prostie sa blochezi tot procesorul cu asa rutina, delay() e doar experimental, probabil. Editat Noiembrie 26, 2014 de Vizitator Link spre comentariu
nico_2010 Postat Noiembrie 27, 2014 Partajează Postat Noiembrie 27, 2014 Aici ai explicatiile necesare: http://arduino.cc/en/Reference/SwitchCase Link spre comentariu
one Postat Noiembrie 27, 2014 Partajează Postat Noiembrie 27, 2014 legat de timere, eu nu folosesc niciodata delay, mi se pare o prostie sa blochezi tot procesorul cu asa rutina, delay() e doar experimental, probabil. Eu folosesc delay destul de des... Procesorul nu este blocat, caci eu prefer stilul de programare bazat pe intreruperi, de obicei verific starea pinilor si iau decizii sa zicem la fiecare milisecunda. Cand faci regulatoare de exemplu este bine sa aplici corectia la intervale regulate. Evenimentele importante le pun sa genereze intreruperi. In timpul asta, procesorul poate linistit sa execute delay-uri cat cuprinde. Ar fi o problema in cazul aparatelor alimentate la baterii, unde poate ar fi mai indicat o intrerupere de la timer, care sa scoata procesorul din sleep. Link spre comentariu
Vizitator Postat Noiembrie 28, 2014 Partajează Postat Noiembrie 28, 2014 (editat) eu raman la ideea mea. daca te gandesti la un sleep de 10ms o fi ok, dar cand mergi pe mai multe "fire de executie" cu semafoare etc, si ai nevoie de exemplu sa citesti un senzor la 10 secunde de la momentul X, altul la 4s de la momentul y etc..nu prea vad cum faci asta cu delay.. delay e ptr proiecte simple. e parerea mea, de incepator. probabil daca se insista mult ar merge cu incrementare pe o variabila, dar cand ai laguri* pe uC, se duce de rapa milisecunda din loop(). nu acelasi lucru e cu millis() spun asta din practica..mea. _____________ * laguri poti genera usor daca folosesti Serial Sau folosesti declaratiile "Switch/Case". Incrementezi o variabila si functie de valoarea ei este apelata o subrutina, este data o comanda ... s.a.m.d. a, da. scuze, ptr moment ceea ce citeam nu era in concordanta cu ceea ce gandeam. Editat Noiembrie 29, 2014 de Vizitator Link spre comentariu
one Postat Decembrie 2, 2014 Partajează Postat Decembrie 2, 2014 ai nevoie de exemplu sa citesti un senzor la 10 secunde de la momentul X, altul la 4s de la momentul y etc..nu prea vad cum faci asta cu delay.. Nu, delay-ul il folosesc la alte operatii. De exemplu... afiseaza pe ecran "pornire pompa" Delay ... 3 secunde... afiseaza "pompa pregatita pentru operatie" . In timpul acesta am citit senzorii mei folosind intreruperile si daca asteptarea mea de 3 secunde a durat 3.005 secunde pentru ca procesorul a mai facut ceva in timpul asta, nu ma afecteaza. Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum