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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.