Arduino Energiezähler

Arduino Quellcode

In diesem Schritt gehen wir Schritt für Schritt durch den gesamten Arduino Quellcode.

Dabei sehen wir welche Bibliotheken und Variablen verwendet werden und wie wir die Eingangswerte der Analog Pins einlesen und in die Werte für Spannung und Strom umrechnen.

Des weiteren sehen wir wie die Berechnung der Leitung und Arbeit durchgeführt wird und wie die Ergebnisse auf der SD Karte gespeichert und im seriellen Output sowie dem LCD Display ausgegeben werden.

Vollständiger Arduino Code

#include <SPI.h>
#include <SD.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 7, 6, 5, 4, 3, 2);

// Variablen
float numberOfSamples = 250.0;  // Anzahl der Messungen über die gemittelt wird
float fSampleA = 0.0;   // Strom Wert
float fAmperage = 0.0;  // Stromstärke
float fAmperageOld = 0.0;   // Stromstärke der vorhergehenden Berechnung(en)
float fSampleV = 0.0;   // Spannungs Wert
float fVoltage = 0.0;   // Spannung
float fVoltageOld = 0.0;    // Spannung der vorhergehenden Berchnung(en)
float fSampleVBat = 0.0;  // Spannungs Wert Batterie
float fVoltageBat = 0.0; // Spannung Batterie
float fVoltageOldBat = 0.0;  // Spannung Batterie der vorhergehenden Berchnung(en)
long lTime = 0; // aktuelle Zeit
long lTimeOld = 0;  // Zeit des vorhergehenden Berechnungszyklus
float fPower = 0.0; // Leistung
float fEnergy = 0.0;    // Arbeit berechnen

void setup() 
{
  Serial.begin(9600);

  // initialize SD Card
  if (!SD.begin(10)) { Serial.println(„card initialization failed“); return; }
  Serial.println(„card initialization successfull“);
  File logFile = SD.open(„logFile.csv“, FILE_WRITE);
  if(logFile) // write table header
  {
    logFile.println(„Zeit [ms]; Stromstaerke [mA]; Spannung [mV]; Spannung Bat [mV]“);
    Serial.println(„Zeit [ms]; Stromstaerke [mA]; Spannung [mV]; Spannung Bat [mV]; Leistung [W]; Arbeit [Wh]; extra Variable [#]“);
    logFile.close();
  }

  // initialize LCD display
  pinMode(9, OUTPUT); //pin 9 as output
  analogWrite(9, 35); // set output of pin 9 (backlight intensity 0-254)
  lcd.begin(16,2); // display size (columns, rows)
}

void loop()
{
  // Strom und Spannungs Eingangssignal ermitteln
  fSampleA = 0.0
  fSampleV = 0.0
  fSampleVBat = 0.0
  for(int i = 0; i < numberOfSamples; i++)
  {
    fSampleA = fSampleA + analogRead(A3); // Strom
    fSampleV = fSampleV + analogRead(A2); // Spannung
    fSampleVBat = fSampleVBat + analogRead(A4); // Spannung Batterie
    delay(5);
  }
  fSampleA = fSampleA / numberOfSamples;
  fSampleV = fSampleV / numberOfSamples;
  fSampleVBat = fSampleVBat / numberOfSamples;

  lTime = millis(); // Arduino Laufzeit in ms
  
  // Berechnungen
  fAmperage = (fSampleA – 513.5) / 20.54 * (-1.0);  // Stromstärke [A] berechnen
  fVoltage = 5.5 * 4.82 * fSampleV / 1000.0;    // Spannung [V] berechnen
  fVoltageBat = 5.5 * 4.82 * fSampleVBat / 1000.0;  // Spannung Batterie [V] berechnen
  fPower = fVoltage * fAmperage;    // Leistung [W] berechnen
  fEnergy += fPower * (lTime – lTimeOld) / 1000.0 / 3600.0; // Arbeit [Wh] berechnen
  lTimeOld = lTime; // alte Zeit speichern

  // Zeit, Strom und Spannung zu Ausgabestring hinzufuegen
  String dataString = „“;
  dataString += String(lTime) + „;“; // Zeit [ms]
  dataString += String(fAmperage * 1000.0) + „;“;  // Stromstaerke [mA]
  dataString += String(fVoltage * 1000.0) + „;“;  // Spannung [mV]
  dataString += String(fVoltageBat * 1000.0);  // Spannung Batterie [mV]

  // Daten auf SD Karte speichern wenn Grenzwert im Vergleich zur vorhergehenden Messung ueber- / unterschritten wird
  if(fAmperage > fAmperageOld + 0.025 
      || fAmperage < fAmperageOld – 0.025 
      || fVoltage > fVoltageOld + 0.015 
      || fVoltage < fVoltageOld – 0.015 
      || fVoltageBat > fVoltageOldBat + 0.015 
      || fVoltageBat < fVoltageOldBat – 0.015)
  {
    fAmperageOld = fAmperage;
    fVoltageOld = fVoltage;
    fVoltageOldBat = fVoltageBat;

    File logFile = SD.open(„logFile.csv“, FILE_WRITE);
    if(logFile)
    {
        logFile.println(dataString);
        logFile.close();
    }
    else { Serial.println(„could not save data to file“); }
  }

  // Energie, Arbeit und extra Variable zu Ausgabestring ergaenzen
  dataString += „;“ + String(fPower) + „;“;  // Leistung [W]
  dataString += String(fEnergy) + „;“; // Arbeit [Wh]
  dataString += String(fSampleVBat);  // extra Variable [#]

  // serielle Ausgabe
  Serial.println(dataString);

  //LCD Ausgabe
  lcd.clear();
  lcd.setCursor(0,0); lcd.print(„B“ + String(fVoltageBat) + „V P“ + String(fPower) + „W“);
  lcd.setCursor(0,1); lcd.print(„Ges “ + String(fEnergy) + „Wh“);

  // naechste Messung um 5s verzögern
  delay(5000);
}

2 Kommentare zu „Arduino Energiezähler Arduino Quellcode“

  1. Reinhard Siebert

    Hallo Peter,

    ich habe eben gerade das sehr gut gelungene und interessante Projekt „Arduino Energiezähler für Solaranlage“ gefunden. Weil ich selbst für den Eigenbedarf mehrere Solar- Inselanlagen für meinen Garten mit den entsprechenden Meßwerterfassungen aufgebaut habe + die dazu gehörenden Powerstation (in Holzgehäusen); erst mit Bleiakku, jetzt mit LiFe- Akkus verschiedener Bauart, interessiere ich mich für diese Möglichkeit, mir die Messwerte über den Arduino UNO + LCD16x2 Display anzeigen zu lassen. Schon vor einiger Zeit baute ich einen Stromzähler mit einer Schaltung aus den 90-er Jahren, welche die Impulse über einen AD654- Strom/Frequenzwandler generiert und diese nach über einen Abgleich (mit Poti und Divider- IC´s) an einen (mechanischen oder digitalen) Zähler weitergibt, der diese wiederum per Mini- LCD- Display oder LED- Display anzeigt. Danach wurde eine passende Platine nach dem ca. 30 Jahre alten Schaltplan am PC entworfen und das Ganze zeigt seit vielen Jahren in den verschiedenen Powerstationen neben den Display- Modulen für Strom und Spannung die gesammelten, bzw. verbrauchten Ah- Stunden in mA an. Mit dem Arduino UNO, Nano, ESP8266 und seinen zahlreichen Verwandten baue ich ebenfalls seit Jahren die verschiedensten Projekte zu Hobby- Zwecken auf. Für gute Projekte erstelle ich anschließend eine passende Platine am PC (EasyEDA) und erhalte diese ca. 14 Tage später per Post.
    Nun aber zu meiner eigentlichen Frage: In dem obigen Quellcode (https://pitrium.de/arduino-energiezaehler-arduino-quellcode) wird die Spannung, die Leistung und die gesammelte Energie am Display angezeigt. Der Quellcode wurde mit Arduino IDE ohne Komplikationen kompiliert, aber ich möchte anfragen, ob es sicherlich noch einen Quellcode gibt, der auf dem LCD- Display die Werte für V, A, W und möglichst auch Ah ausgibt, so wie es der Excel- Datei „EnergyMeter.xlsx“ unter „10) Anschluss an Solaranlage“ auf dem zweiten, rechten Bild auf dem Display zu erkennen ist.
    D. h. die Anzeige sollte mir den aktuellen Strom und die gesammelten Ah anzeigen und … wie genau sind diese Werte? Ist es möglich, diesen Quellcode zu erhalten?
    Wenn dann nach einem Probeaufbau alles läuft (bis auf das SD- Shield habe ich alle Bauteile zu Hause), würde ich daraus eine Platine am PC erstellen und hätte dann für meine DIY- Powerstationen zusätzlich eine nützliche Anzeige für diese Werte, die ich gerne auf dem LCD- Display vereint, kontrollieren möchte.
    Weil ich demnächst meinen Solar- Projekten mehr Zeit im Garten widmen möchte, würde mich über eine zeitnahe Antwort freuen.

    Schöne Grüße nach Gera …

    Reinhard

    1. Guten Morgen Reinhard,
      es ist leider schon eine ganze Weile her, dass ich mich damit beschäftigt habe, aber ich vermute, dass der Code dazu in etwa so ausgesehen hatte:
      //LCD Ausgabe
      lcd.clear();
      lcd.setCursor(0,0); lcd.print(String(fVoltageBat) + „V “ + String(fAmperage) + „A“);
      lcd.setCursor(0,1); lcd.print(String(fPower) + „W “ + String(fEnergy) + „Wh“);

      Wenn du anstatt Wh lieber die Ah aufsummieren möchtest, könntest du vermutlich den Berechnungs Teil entsprechend anpassen:
      fEnergy += fAmperage * (lTime – lTimeOld) / 1000.0 / 3600.0; // Arbeit [Ah] berechnen
      Allerdings würde dir dabei ja dann alle gesammelte Information über die Spannung verloren gehen, und ich bin mir nicht ganz sicher ob das wirklich Sinn macht.
      Genau genommen bin ich mir nicht einmal sicher ob ich das komplett richtig verstanden habe, also betrachte diesen Teil meiner Antwort bitte sehr skeptisch.

      Vielen Dank für deinen Kommentar und ich wünsche dir viel Spaß mit deinen Anlagen im Garten!
      Peter =)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert