GreenEyes2020 Postat Martie 8, 2021 Partajează Postat Martie 8, 2021 Buna !!! Sunt incepator in Arduino si am de facut proiectul acesta.Am facut in thinkercad cu intreruperi.Cand apas o data pe buton ar trebui sa arate temperatura de la senzor1 iar cand apas a doua oara sa arate temperatura de la senzor2.Imi spuneti va rog, ce am gresit de imi dau urmatoarele erori ?Aici se poate vedea : https://www.tinkercad.com/things/5wfJvqSCOBx-sensor-de-temp/ Link spre comentariu
Liviu M Postat Martie 9, 2021 Partajează Postat Martie 9, 2021 Ai o acolada neinchisa când definești funcția temp(). Ori lipsește de tot, ori ai intercalat funcția temp in loop. Link spre comentariu
nico_2010 Postat Martie 9, 2021 Partajează Postat Martie 9, 2021 (editat) Acum 8 ore, GreenEyes2020 a spus: Am facut in thinkercad cu intreruperi.Cand apas o data pe buton ar trebui sa arate temperatura de la senzor1 iar cand apas a doua oara sa arate temperatura de la senzor2.Imi spuneti va rog, ce am gresit de imi dau urmatoarele erori ?Aici se poate vedea : https://www.tinkercad.com/things/5wfJvqSCOBx-sensor-de-temp/ Care erori? Cum arata sketch-ul generat (probabil) de aplicatia on-line? OK, acum am vazut si codul. Despre asta discutam mai tarziu. Modul de conectare al butonului este cel putin dubios! Vreau sa spun ca contactul nu este conectat la pinul digital 7 (asta este conectat permanent la +Vcc) astfel incat la apasare sa permita conectarea pinului digital 7 la +Vcc si Pin Change Interrupt sa fie activat. Acum cu privire la sketh: utilizarea acestei sintaxe pentru activarea intreruperii: attachInterrupt(pin, ISR, mode) nu este recomandata, dar se pare ca a fost folosita in sketch. Insa a fost folosita gresit pentru ca: attachInterrupt(0,temp,RISING); Pinul 0 ar fi trebuit sa fie pinul care declanseaza intreruperea, insa in realizarea "practica" pinul folosit ar fi trebuit sa fie pinul digital 7. Vai, dar asta este conectat permanent la +Vcc si uC o va tine tot intr-o intrerupere (cred, nu am verificat). Pentru ca tot vorbim de pinul 7, asta nu are activata rezistenta de pull-up in program pinMode(7, INPUT); in loc de: pinMode(7, INPUT_PULLUP); Asa ca si de ar fi fot conectat corect butonul la pinul cu pricina, comportamentul uC ar fi fost bizar, ca sa nu spun haotic. Un alt aspect ce tine tot de "folosirea" pinului 7: asta nu poate fi folosit decat cu intreruperea CHANGE (Pin Change Interrupt) pentru ca nu e asignat nici lui INT0, nici lui INT1. Concluzia: Realizeaza fizic si electric corect montajul, inspira-te din sketch-ul propus de ciumpalac si scrie-ti propriul sketch in mod corect. Asta dupa ce te mai documentezi cum sta treaba cu intreruperile si cu structura unui program. Incearca totusi si varianta asta (LiviuM a fost mai rapid): int baselineTemp = 0; int celsius = 0; int button = 7; int i = 0; void setup() { Serial.begin(9600); pinMode(A0, INPUT); pinMode(A5, INPUT); pinMode(7, INPUT); pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(9, OUTPUT); attachInterrupt(0, temp, RISING); } void loop() { if (button) { if (!(i == 0)) { int celsius = map(((analogRead(A5) - 20) * 3.04), 0, 1023, -40, 125); Serial.print(celsius); Serial.print( "C"); if (celsius < 20) { digitalWrite(2, LOW); digitalWrite(3, HIGH); digitalWrite(4, LOW); Serial.println("Temp de exterior is cold "); } if (celsius > 20 && celsius < 30) { digitalWrite(2, HIGH); digitalWrite(3, LOW); digitalWrite(4, LOW); Serial.println(" Temp de exterior is fine "); } if (celsius > 30) { digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(9, HIGH); Serial.println(" Temp de exterior is hot"); delay(1000); } } } } void temp () { if (button) { button = true; { int celsius = map(((analogRead(A5) - 20) * 3.04), 0, 1023, 0, 125); Serial.print(celsius); Serial.print( "C"); if (celsius < 20) { digitalWrite(2, LOW); digitalWrite(3, HIGH); digitalWrite(4, LOW); Serial.println("Temp de ex is cold "); } if (celsius > 20 && celsius < 30) { digitalWrite(2, HIGH); digitalWrite(3, LOW); digitalWrite(4, LOW); Serial.println(" Temp de exterior is fine "); } if (celsius > 30) { digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(9, HIGH); Serial.println(" Temp de exterior is hot "); } delay(1000); } } } Poate functioneaza, nu stiu. Editat Martie 9, 2021 de nico_2010 corectie Link spre comentariu
mihaicozac Postat Martie 9, 2021 Partajează Postat Martie 9, 2021 Dacă e pe RISING întreruperea nu contează cât stă butonul în HIGH, doar momentul trecerii este luat în calcul. Din câte ştiu eu Uno aceeptă 2 doar întreruperi hardware 0 şi 1 şi numai pe pinii 2 şi 3, după specificaţii. Pe pinul 7 nu cred că merge cu întreruperi. Link spre comentariu
nico_2010 Postat Martie 9, 2021 Partajează Postat Martie 9, 2021 Dupa foaia de catalog merge si pe pinul 7 (PCINT23), dar trebuie sa stii cum tratezi intreruperea. Acum 27 minute, mihaicozac a spus: Dacă e pe RISING întreruperea nu contează cât stă butonul în HIGH, doar momentul trecerii este luat în calcul. Am spus ca nu stiu cum se va comporta cand gaseste 1 logic pe pin. Dupa ce am citit DS pot spune ca nu va reactiona in niciun fel, cat timp nu are loc o schimbare de nivel logic pe pinul cu pricina (poate doar o singura data, la aplicarea tensiunii de alimentare, dar nu sunt convins de asta). Link spre comentariu
zvonacfirst Postat August 26, 2023 Partajează Postat August 26, 2023 Va salut. Pentru ca am o problema cu un sketch care se incadreaza la tema acestui topic, sper ca initiatorul sa nu se supere ca postez aici dar nu as vrea sa deschid un topic nou pentru atata lucru. Despre ce este vorba veti vedea accesand acest link. https://wokwi.com/projects/374150153870245889 Este un simulator simplu. Si pe breadboard se comporta identic. Ce vreau eu este ca acel cursor sa se plimbe la rotirea encoderului pe pozitia 0 numai pe liniile 1, 2 si 3. Ce gresesc? Am pus comentarii acolo unde am crezut necesar dar revin cu detalii daca este necesar. Multumesc. Link spre comentariu
nico_2010 Postat August 27, 2023 Partajează Postat August 27, 2023 La rotirea encoderului in sensul acelor de ceasornic variabila "encoder_value" devine negativa. De aici si comportamentul ciudat. Link spre comentariu
zvonacfirst Postat August 27, 2023 Partajează Postat August 27, 2023 Dis-de-dimineata, cu mintea limpede dupa prima cafeluta a zilei, am observat usor eroarea care m-a chinuit aseara. Am corectat liniile 29 la 33, functia for(). Aseara era asa: for (int i = 0; i < NUM_OPTIONS; ++i) { lcd.setCursor(0, i + 1); lcd.print(">"); lcd.print(options[i]); } Acum este asa si functioneaza perfect: for (int i = 0; i < NUM_OPTIONS; ++i) { lcd.setCursor(1, i + 1); // lcd.print(">"); lcd.print(options[i]); } Am corectat si in simulator: https://wokwi.com/projects/374150153870245889 Link spre comentariu
zvonacfirst Postat August 27, 2023 Partajează Postat August 27, 2023 (encoderValue + NUM_OPTIONS) % NUM_OPTIONS adauga NUM_OPTIONS (adica 3, numarul maxim de optiuni) la encoderValue, rezultatul final find astfel intotdeauna un numar pozitiv. Apoi, rezultatul este impartit la NUM_OPTIONS, restul impartirii reprezentand noua pozitie a encoderului care ramane in intervalul de la 0 la NUM_OPTIONS - 1. Operatorul % garanteaza ca noua pozitie se va incadra in limitele valide ale optiunilor meniului. Link spre comentariu
zvonacfirst Postat August 27, 2023 Partajează Postat August 27, 2023 Mda! Cand rotesc dreapta este ok, pozitia calculata este 0, 1, 2 si se roteste in bucla. Cand rotesc spre stanga trece pe negativ si nu mai este ok. Imi oferi si o solutie? Link spre comentariu
nico_2010 Postat August 27, 2023 Partajează Postat August 27, 2023 Acum 3 ore, zvonacfirst a spus: (encoderValue + NUM_OPTIONS) % NUM_OPTIONS adauga NUM_OPTIONS (adica 3, numarul maxim de optiuni) la encoderValue, rezultatul final find astfel intotdeauna un numar pozitiv. Apoi, rezultatul este impartit la NUM_OPTIONS, restul impartirii reprezentand noua pozitie a encoderului care ramane in intervalul de la 0 la NUM_OPTIONS - 1. Operatorul % garanteaza ca noua pozitie se va incadra in limitele valide ale optiunilor meniului. Problema ta este ca la rotirea in sensul acelor de ceasornic valoarea variabilei"encoderValue) devine -4 la inceput, cand nu ai apucat sa misti encoderul. Asa ca nu vei obtine ceea ce iti doresti. Incearca cu abs(encoderValue). Link spre comentariu
zvonacfirst Postat August 27, 2023 Partajează Postat August 27, 2023 @nico_2010, nu inteleg. Fara sa ating encoderul valoarea este zero. Creste pozitiv la rotirea CW si ajunge pe negativ la un moment dat la rotirea CCW. Eu am zis ca functioneaza pentru ca am tot rotit CW si am acumulat valori pozitive iar cand am rotit CCW scadea dar tot cu valori pozitive. @antemir mi-a deschis ochii. Link spre comentariu
nico_2010 Postat August 28, 2023 Partajează Postat August 28, 2023 Am facut modificarea in sketch. Vezi cum merge. https://wokwi.com/projects/374150153870245889 Link spre comentariu
zvonacfirst Postat August 28, 2023 Partajează Postat August 28, 2023 (editat) Multumesc @nico_2010 dar nu stiu daca puteai sa salvezi proiectul meu. Din cate vad, proiectul al carui link l-ai postat este salvat de mine cu 19 ore in urma. In sketch nu este nimic modificat decat ce am adaugat eu ieri la sugestia lui @antemir. Am incercat sa implementez functia abs(); in sketch, nu mai apar problemele generate de trecerea in negativ a valorii encoderului dar tot nu functioneaza cum trebuie. https://wokwi.com/projects/374150153870245889 @nico_2010, ard de nerabdare sa vad ce modificari ai facut tu in sketch asa ca te rog sa le postezi aici nu in proiect. Editat August 28, 2023 de zvonacfirst Link spre comentariu
nico_2010 Postat August 28, 2023 Partajează Postat August 28, 2023 https://wokwi.com/projects/374294075267986433 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