bogdan666 Postat Iunie 28, 2020 Partajează Postat Iunie 28, 2020 Am o problema cu afisarea totala a puterii la un incarcator solar, si anume, totul merge ok pana cand variabilele se schimba, daca V si A sunt constanti tot timpul nu e nici o problema, deci as avea nevoie ca arduino sa adauge puterea curenta cu puterea de acum 10ms sa zicem. In codul actual, daca sa zicem A = 0, toata ecuatia e 0. atasez codul. #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 20, 4); #include <Adafruit_ADS1015.h> Adafruit_ADS1115 ads(0x4B); Adafruit_ADS1115 adsa(0x4A); float V1 = 0.0; float V2 = 0.0; float V3 = 0.0; float V4 = 0.0; float V5 = 0.0; float V6 = 0.0; void setup(void) { lcd.init(); lcd.backlight(); Serial.begin(9600); ads.begin(); adsa.begin(); } unsigned long startMillis; unsigned long currentMillis; unsigned long elapsedMillis; void loop(void) { int16_t adc1; adc1 = ads.readADC_SingleEnded(1); V1 = (adc1 * 0.0001875) * 6; int16_t adc2; adc2 = ads.readADC_SingleEnded(2); V2 = (adc2 * 0.0001875) * 6; int16_t adc3; adc3 = ads.readADC_SingleEnded(3); V3 = (adc3 * 0.0001875) * 6; int16_t adc4; adc4 = adsa.readADC_SingleEnded(1); V4 = (adc4 * 0.0001875) * 10; int16_t adc5; adc5 = adsa.readADC_SingleEnded(2); V5 = (adc5 * 0.0001875) * 10; int16_t adc6; adc6 = adsa.readADC_SingleEnded(3); V6 = (adc6 * 0.0001875) * 10; currentMillis = millis(); elapsedMillis = (currentMillis - startMillis); unsigned long SS = (elapsedMillis / 1000) % 60; unsigned long MM = (elapsedMillis / (60000)) % 60; unsigned long HH = (elapsedMillis / (3600000)); lcd.setCursor(0, 0); lcd.print(V1, 2); lcd.setCursor(5, 0); lcd.print("V"); lcd.setCursor(7, 0); lcd.print(V2, 2); lcd.setCursor(12, 0); lcd.print("V"); lcd.setCursor(14, 0); lcd.print(V3, 2); lcd.setCursor(19, 0); lcd.print("V"); lcd.setCursor(0, 1); lcd.print(V4, 2); lcd.setCursor(5, 1); lcd.print("A"); lcd.setCursor(7, 1); lcd.print(V5, 2); lcd.setCursor(12, 1); lcd.print("A"); lcd.setCursor(14, 1); lcd.print(V6, 2); lcd.setCursor(19, 1); lcd.print("A"); lcd.setCursor(0, 2); lcd.print(V1 * V4, 1); lcd.setCursor(5, 2); lcd.print("W"); lcd.setCursor(7, 2); lcd.print(V2 * V5, 1); lcd.setCursor(12, 2); lcd.print("W"); lcd.setCursor(14, 2); lcd.print(V3 * V6, 1); lcd.setCursor(19, 2); lcd.print("W"); lcd.setCursor(0, 3); lcd.print((((V1 * V4) + (V2 * V5)) * elapsedMillis) / 3600000, 0); lcd.setCursor(7, 3); lcd.print(((V3 * V6) * elapsedMillis) / 3600000, 0); lcd.setCursor(14, 3); lcd.print(MM); lcd.setCursor(17, 3); lcd.print(":"); lcd.setCursor(19, 3); lcd.print(" "); lcd.setCursor(18, 3); lcd.print(SS); } Link spre comentariu
mihaicozac Postat Iunie 28, 2020 Partajează Postat Iunie 28, 2020 (editat) Foloseşti o variabilă float "energy" care pleacă de la zero şi la fiecare ciclu de 10ms se incrementează cu V x A x 1 / 360000. energy = energy += V * A * 1/360000; Dacă schimbi viteza buclei trebuie modificat şi raportul de înmulţire. Editat Iunie 28, 2020 de mihaicozac Link spre comentariu
bogdan666 Postat Iunie 29, 2020 Autor Partajează Postat Iunie 29, 2020 da, functioneaza perfect, multumesc mult. Acum ca monitorizarea voltajelor si a curentilor e ok, o sa trec la cealalta parte, si anume la incarcarea propriu zisa a bateriilor. Daca avetio vreo idee, oricat de mica e binevenita. Link spre comentariu
mihaicozac Postat Iunie 29, 2020 Partajează Postat Iunie 29, 2020 Asta nu e mare scofală, stabileşti 2 praguri V_Max şi V_Min funcţie de chimia bateriilor, şi faci condiţiile: charge = V < V_Max ? TRUE : FALSE; digitalWrite(un_pin_liber, charge); Variabila booleană "charge" comandă printr-o ieşire releul sau tranzistorul sau ce ai pe acolo între panoul solar şi baterie. Asta e o funcţie de bază, în practică ar mai trebui introdus şi un histerezis ca să nu tot comute aiurea când ajunge în jurul pragului V_Max. V_Min se poate folosi ca să decuplezi ieşirea când bateria e descărcată: output = V > V_Min ? TRUE : FALSE; digitalWrite(alt_pin_liber, output); Link spre comentariu
bogdan666 Postat Iunie 29, 2020 Autor Partajează Postat Iunie 29, 2020 am testat asta if (V3 < 28 ) { if (pulseWidth != 255) pulseWidth++; } if (V3 > 28 ) { if (pulseWidth = 0); } analogWrite(9, pulseWidth); pare sa fie in regula pe breadboard si sa mentina voltajul la cel setat, oare ar fi ok si in realitate ? Link spre comentariu
mihaicozac Postat Iunie 30, 2020 Partajează Postat Iunie 30, 2020 Cum arată etajul de ieşire? de fapt cum conanzi hardware încărcarea? Link spre comentariu
bogdan666 Postat Iulie 1, 2020 Autor Partajează Postat Iulie 1, 2020 O sa fie 4 N MOSFET comandati de un tc4426 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