Sari la conținut
ELFORUM - Forumul electronistilor

Afisare W\h


bogdan666

Postări Recomandate

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
  • Răspunsuri 6
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

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 de mihaicozac
Link spre comentariu

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

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări