mihai 7 Postat August 19, 2022 Autor Partajează Postat August 19, 2022 (editat) Acum 1 oră, Liviu.Mihaiu a spus: Si nici sa descarci acumulatoare inseriate. Domnule @Liviu.Mihaiu, stiu că nu este corect să descarc acumulatoare înseriate, dar este vorba de un acumulator de 8.4 V (tipul 9V), cum să-l descarc altfel? Acum 1 oră, Liviu.Mihaiu a spus: Cate tipuri de acumulatoare vrei sa utilizezi ? Două tipuri: de 1.2 V și 8.4V . 900mV este limita inferioară de descărcarea a unui acumulator de 1.2 V; - 1700 mV am considerat a fi limita maximă de încărcare a unui acumulator de 1.2V; - similar pentru un acumulator de 8.4 V (6300 V limita minimă de descărcare, iar 10000 mV nivelul maxim de încărcare). P.S: Am încercat să adaptez codul furnizat de dvs. pentru 2 tipuri de acumulator, dar la compilare îmi afișează mesajul " 'reset' was not declared in this scope". Vă refereați cumva la altă funcție C/C++? Editat August 19, 2022 de mihai 7 completare Link spre comentariu
Vizitator Postat August 19, 2022 Partajează Postat August 19, 2022 (editat) Acum 39 minute, mihai 7 a spus: 'reset' was not declared in this scope". Trebuie definita. Cauta "arduino softreset" pe google. Sau comenteaza acum linia cu if + reset(). Si dai reset manual daca schimbi acumulatorul 'din mers'. Poti sa lasi asa cum este acum. Cu patru tipuri. Trebuie sa mearga si cu doua. Nu asta este problema acum. Editat August 19, 2022 de Vizitator Link spre comentariu
mihai 7 Postat August 19, 2022 Autor Partajează Postat August 19, 2022 Am ajuns la următoarea formă a codului: float Vi[2]={1.2, 8.4}; // patru tipuri de acumlator float proc=75; // 75% minim descarcare (asa am dedus din codul tau) float Acc_V=0; // voltajul nominal al acumulatorului de descarcat const int inputPin_1 = A5; const int outputPin_1 = 7; float valueProbe; //variable to store the value of analogPinOne float voltageProbe; //calculated voltage at analogPinOne void setup() { Serial.begin(9600); pinMode(outputPin_1, OUTPUT); pinMode(inputPin_1, INPUT); int i; Serial.print("detectare acumulator..."); while(Acc_V==0) { // aici pui cod citire ADC for(i=0;i<2;i++) { if(voltageProbe<=Vi[i] && voltageProbe>=Vi[i]*proc/100) { Acc_V=Vi[i]; // am gasit tipul de acumulator break; } } } Serial.print("acumulator de tipul: "); Serial.print(Acc_V); Serial.print(" V"); Acc_V=Acc_V*1000; // in milivolti } void loop() { valueProbe = analogRead(inputPin_1); // read analog input voltageProbe = (valueProbe*5000*326*1.38)/102400; //calculate voltage at probe one in milliVolts Serial.print("Voltage Probe (mV): "); //display voltage at probe one Serial.println(voltageProbe); delay(2000); // aici pui cod citire ADC // if(voltageProbe==0) // daca se scoate acumulatorul // reset(); // trebuie detectat tipul (voltajul) in caz ca urmeaza descarcarea altuia. if(voltageProbe>Acc_V*proc/100) { Serial.print("Descrcare actuală = "); Serial.print(voltageProbe); Serial.println(" mV"); digitalWrite(outputPin_1, HIGH); // descarc } else { Serial.print("descarcare terminta"); digitalWrite(outputPin_1, LOW); } } Problema este că în terminal îmi afișează "detectare acumulator...", iar ledul rămâne stins, și doar atât. Renunțând la bucla while, și la mesajele din void setup(), îmi afisează valoarea lui "voltage probe" și "descărcare actuală", ledul este aprins, deci așa funcționează. Link spre comentariu
Vizitator Postat August 19, 2022 Partajează Postat August 19, 2022 Acum 3 minute, mihai 7 a spus: // aici pui cod citire ADC for(i=0;i<2;i++) unde-i codul pentru citire voltaj baterie ? Acum 4 minute, mihai 7 a spus: valueProbe = analogRead(inputPin_1); // read analog input voltageProbe = (valueProbe*5000*326*1.38)/102400; //calculate voltage at probe one in milliVolts adica asta Link spre comentariu
mihai 7 Postat August 19, 2022 Autor Partajează Postat August 19, 2022 Am inserat secvența de citire a voltajului, dar problema persistă, îmi afișează "detectare acumulator...", iar ledul rămâne stins. Așa arată codul actual: float Vi[2]={1.2, 8.4}; // patru tipuri de acumlator float proc=75; // 75% minim descarcare (asa am dedus din codul tau) float Acc_V=0; // voltajul nominal al acumulatorului de descarcat const int inputPin_1 = A5; const int outputPin_1 = 7; float valueProbe; //variable to store the value of analogPinOne float voltageProbe; //calculated voltage at analogPinOne void setup() { Serial.begin(9600); pinMode(outputPin_1, OUTPUT); pinMode(inputPin_1, INPUT); int i; Serial.print("detectare acumulator..."); while(Acc_V==0) { valueProbe = analogRead(inputPin_1); // read analog input voltageProbe = (valueProbe*5000*326*1.38)/102400; //calculate voltage at probe one in milliVolts // aici pui cod citire ADC for(i=0;i<2;i++) { if(voltageProbe<=Vi[i] && voltageProbe>=Vi[i]*proc/100) { Acc_V=Vi[i]; // am gasit tipul de acumulator break; } } } Serial.print("acumulator de tipul: "); Serial.print(Acc_V); Serial.print(" V"); Acc_V=Acc_V*1000; // in milivolti } void loop() { valueProbe = analogRead(inputPin_1); // read analog input voltageProbe = (valueProbe*5000*326*1.38)/102400; //calculate voltage at probe one in milliVolts // aici pui cod citire ADC // if(voltageProbe==0) // daca se scoate acumulatorul // reset(); // trebuie detectat tipul (voltajul) in caz ca urmeaza descarcarea altuia. if(voltageProbe>Acc_V*proc/100) { Serial.print("Descrcare actuală = "); Serial.print(voltageProbe); Serial.println(" mV"); digitalWrite(outputPin_1, HIGH); // descarc } else { Serial.print("descarcare terminta"); digitalWrite(outputPin_1, LOW); } } Link spre comentariu
Vizitator Postat August 19, 2022 Partajează Postat August 19, 2022 (editat) Eu nu am cum sa testez. Ti-am dat doar o idee cum s-ar putea face pentru mai multe tipuri de tensiuni ale acumulatorilor. Afiseaza si tu inainte de for(...) valoare "voltageProbe" citita si vezi daca se incadreaza intre Vi[i] si Vi[i]*75% (asa cum se face comparatia) care detecteaza acc. LE: Eu am vazut unde am gresit. Se fac comparatii "Volti" cu "milivolti". Sa te vad daca gasesti si tu eroarea. Editat August 19, 2022 de Vizitator Link spre comentariu
mihai 7 Postat August 19, 2022 Autor Partajează Postat August 19, 2022 if(voltageProbe/1000<=Vi[i] && voltageProbe/1000>=Vi[i]*proc/100) Acum arată mai bine? Codul funcționează acum, doar că îmi detectează ca tip de acumulator doar 1.2V, nu și 8.4V. Link spre comentariu
Vizitator Postat August 19, 2022 Partajează Postat August 19, 2022 (editat) Acum 13 minute, mihai 7 a spus: Acum arată mai bine? Prea multe transformari din volti in milivolti si invers. Lasa cum a fost comparatia Si mergi numai in milivolti. Adica: float Vi[2]={1200, 8400}; si scoate linia: Acc_V=Acc_V*1000; // in milivolti Ti-am mai spus, inainte de for() afiseaza in terminal tensiunea citita. Ce arata cand conectezi acc de 1.2V sau 8.4V ? Serial.print("Tensiune actuala = "); Serial.print(voltageProbe); Serial.println(" mV"); Editat August 19, 2022 de Vizitator Link spre comentariu
mihai 7 Postat August 19, 2022 Autor Partajează Postat August 19, 2022 (editat) Când conectez acumulatorul de 8.4 V, îmi afisează "Tensiune actuală= 11971 mV", iar pentru 1.2 V îmi afișează "Tensiune actuală= 1296.04 mV". Doar că mesajul nu este corespunzător acumulatorului de 8.4V. Îmi afișează doar "acumulator de tipul 1.2V", dar descarcă și acumulatori de 8.4V. Editat August 19, 2022 de mihai 7 Link spre comentariu
Vizitator Postat August 19, 2022 Partajează Postat August 19, 2022 (editat) Asigurate ca masuratorile corespund cu cele ale unui multimetru. Apoi este posibil sa trebuiasca sa faci comparatia de genul: if(voltageProbe<=Vi[i]*110/100 && voltageProbe>=Vi[i]*proc/100) am pus 10% peste valoarea nominala. Nu am idee care-i teoria la NiMh. Mai citeste. Poate intervine si altcineva. Editat August 19, 2022 de Vizitator Link spre comentariu
Elison Postat August 19, 2022 Partajează Postat August 19, 2022 Pentru afisarea corecta a tensiunii de intrare in divizorul rezistiv poti sa declari valorile celor doi rezistori float R1 = 33000.00; // valoarea masurata a resistorului R1 (33K) float R2 = 15000.00; // valoarea masurata a resistorului R2 (15K) si atunci cand faci citirea tensiunii, folosesti urmatoarele linii de cod: valueProbe = analogRead(inputPin_1); voltageProbe = ((valueProbe*5000)/1024)/ (R2/(R1+R2)); In cazul in care vrei sa folosesti doar raportul de divizare, citirea tensiunii de intrare in divizor se face asa: valueProbe = analogRead(inputPin_1); // read analog input voltageProbe = ((valueProbe*5000)/1024)*3.198 ; // 3.198 fiind raportul corect pentru cei doi rezistori folositi in divizor Trebuie sa ai in vedere si faptul ca pentru anumite tensiuni bucla while(Acc_V==0) va rula la nesfarsit, lucru care nu va permite rularea buclei principale a programului. Link spre comentariu
mihai 7 Postat August 21, 2022 Autor Partajează Postat August 21, 2022 La 20.08.2022 la 0:37, Elison a spus: Pentru afisarea corecta a tensiunii de intrare in divizorul rezistiv poti sa declari valorile celor doi rezistori Am inserat liniile de cod de mai jos în program, dar tensiunile afișate sunt cu aproximație înjumătățite față de cele reale. Așa cum am mai menționat, fiind pe breadboard (deocamdată), se mai mișcă conexiunile, dar totuși cred că și de altundeva vine problema. valueProbe = analogRead(inputPin_1); // read analog input voltageProbe = ((valueProbe*5000)/1024)/ (R2/(R1+R2)); //calculate voltage at probe in V // aici pui cod citire ADC valueProbe = analogRead(inputPin_1); // read analog input voltageProbe = ((valueProbe*5000)/1024)/ (R2/(R1+R2)); //calculate voltage at probe in V // aici pui cod citire ADC Din schemă se vede că citirea se face pe divizorul de tensiune, iar acesta este conectat între plusul (+) acumulatorului și masa montajului. Ar putea fi o soluție conectarea divizorului direct pe (+) și (-) terminale ale acumulatorului? Deasemenea, atunci când se face descărcarea prin sarcină, tensiunea pe acumulator scade simțitor, și chiar în această soluție afișarea trebuie să se facă corect. Link spre comentariu
mihai 7 Postat August 22, 2022 Autor Partajează Postat August 22, 2022 Între timp am trecut montajul pe cablaj de test (mai puțin buffer-ul cu LM 358) și formula pentru determinarea voltajului de mai sus returnează valori aproximativ înjumătățite.În schimb, folosind raportul de divizare 3.198 obțin valori aproape egale cu tensiunea măsurată pe acumulator (probabil pentru că valorile reale ale rezistorilor din divizor nu sunt exacte? - ele au valorile indicate de mine mai sus): voltageProbe = ((valueProbe*5000)/1024)*3.198; Link spre comentariu
nico_2010 Postat August 22, 2022 Partajează Postat August 22, 2022 Poti sa folosesti: voltageProbe = ((valueProbe*5000)/1024) * ((R1+R2)/R2); si ar trebui sa obtii aceleasi rezultate. Link spre comentariu
mihai 7 Postat August 22, 2022 Autor Partajează Postat August 22, 2022 La 20.08.2022 la 0:37, Elison a spus: valueProbe = analogRead(inputPin_1); voltageProbe = ((valueProbe*5000)/1024)/ (R2/(R1+R2)); Nu obțineam rezultate corecte pentru că eu inversasem R1 cu R2. Acum rezultatelle sunt exacte, cu ușoare oscilații. 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