Vizitator Bajenica.gabriel Postat Martie 7, 2017 Partajează Postat Martie 7, 2017 De multe ori vroiam sa stiu in ce stare se afla bareriile de la sistemul solar. Cea mai simpla metoda a fost montarea nui voltmetru analog pe care il aveam prin casa , dar nu stiam niciodata exact ce procent mai aveam in baterie. In urmacautarilor pe net am gasit o schema care arata tensiunea exacta si capacitatea bateriei. Tensiune Capacitate 10,5v 0% 11,31v 10% 11,58v 20% 11,75v 30% 11,90v 40% 12,06v 50% 12,20v 60% 12.32v 70% 12.42v 80% 12.50v 90% 12.70v 100% 14.40v tensiune maxima Codul pe care l-am creat pentru a putea citi arduino tensiunile, valorile lui R1 si R2 nu sunt cele din program. Eu am facut mai intai grupul de semireglabile si le-am reglat ca la 20volti pe intrare in arduino sa intre max 5 volti. Valorile date lui R1 si R2 au fost date prin incercari si rotunjiri pina vlotmetrul a aratat ce vroiam eu. int led = 2; int led1 = 3; int led2 = 4; int led3 = 5; int led4 = 6; int led5 = 7; int led6 = 8; int led7 = 9; int led8 = 10; int led9 = 11; int led10 = 12; int led11 = 13; int analogInput = 0; float vout = 0.0; float vin = 0.0; float R1 = 13870.0; float R2 = 5000.0; int value = 0; void setup() { pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT); pinMode(12, OUTPUT); pinMode(13, OUTPUT); Serial.begin(9600); } void loop() { value = analogRead(analogInput); vout = (value * 5.0) / 1024.0; vin = vout / (R2/(R1+R2)); if (vin<0.09) { vin=0.0; } if(vin > 10.50) { digitalWrite(2, HIGH); } else { digitalWrite(2, LOW); } if(vin >11.31) { digitalWrite(3, HIGH); } else { digitalWrite(3, LOW); } if(vin > 11.58) { digitalWrite(4, HIGH); } else { digitalWrite(4, LOW); } if(vin > 11.75) { digitalWrite(5, HIGH); } else { digitalWrite(5, LOW); } if(vin > 11.90) { digitalWrite(6, HIGH); } else { digitalWrite(6, LOW); } if(vin > 12.06) { digitalWrite(7, HIGH); } else { digitalWrite(7, LOW); } if(vin > 12.20) { digitalWrite(8, HIGH); } else { digitalWrite(8, LOW); } if(vin > 12.32) { digitalWrite(9, HIGH); } else { digitalWrite(9, LOW); } if(vin > 12.42) { digitalWrite(10, HIGH); } else { digitalWrite(10, LOW); } if(vin > 12.50) { digitalWrite(11, HIGH); } else { digitalWrite(11, LOW); } if(vin > 12.70) { digitalWrite(12, HIGH); } else { digitalWrite(12, LOW); } if(vin > 14.40) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); } Serial.println(vin); } A doua oara nu mai fac corecturi ci voi sterge topicul ! Link spre comentariu
mihaicozac Postat Martie 8, 2017 Partajează Postat Martie 8, 2017 Felicitări, poate era ma simplu cu un divizor fix pe intrare şi o funcţie map(input) care să translateze domeniul de intrare în 10 valori discrete. De ex. int volts = map(Vin, 640, 1023, 0, 9). Adică între cca. 3 şi 5V la intrare variabila volts ia valori intre 0 şi 9. Apoi o funcţie for() care să aprindă ledurile condiţionat de valoarea mapată. Ieşea un cod de maximum 10 linii. 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