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);
}
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
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 =)