Hallo,
als Anfänger bezüglich Arduino bin ich am experimentieren bezüglich dem erfassen und auswerten der S0 Pulse von Drehstromzwischenzähler.
Das triggern mit dem S0 Pulse funktioniert von der Hardwareseite.
Meine ersten Versuche waren mit einem Pythonscript und Interrupt auf einem Raspberry die Daten in eine csv Datei zu schreiben. Das hat funktioniert, nur läuft auf diesem Raspi noch eine Smart Home Control software, hauptsächlich in php geschrieben und diese wird durch die vielen Interrupts (2000pulse / kWh)gestört.
Deshalb möchte ich das Zählen und berechnen auf einen Arduino oder besser noch auf einen ESP8266 auslagern. Die Auswertung der Ergebnisse soll im Volkszähler erfolgen.
Es gibt im Netz zahlreiche Ansätze hierzu. Mein Favorit ist:
https://wwwvs.cs.hs-rm.de/vs-wiki/index.php/Internet_der_Dinge_WS2015/EnergyEye
Hier wird ein Real Time OS auf dem ESP8266 verwendet. Für einen Laien wie mich sehe ich aber keine Möglichkeit die Anleitung umzusetzen.
Kennt jemand vielleicht ein Tutorial, wo dies bereits einmal einfacher umgesetzt wurde?
Funktioniert das überhaupt mit einem "einfachen sketch" auf einem Arduino oder besser ESP8266 ohne SD Karte die der S0 Pulse pro Minute zu zählen und an den Volkszähler zu übergeben, ohne in dieser Zeit eingehende Impulse zu verlieren?
Oder muss man doch auf ein Real Time OS zurückgreifen?
Im Augenblick experimentiere ich mit dem Code aus #82 und habe ihn etwas angepasst.
// Linefeet geht nicht
// Watt werden nicht angezeigt
volatile int Pin2 = HIGH; // S0 Impulseingang = Pin2
volatile unsigned long s0start = 0; // für Zeitmessung S0-Impuls
volatile unsigned long s0dauer = 0;
volatile unsigned long s0dauerSum = 0;
volatile unsigned long s0ImpAnz = 0;
volatile float kWh = 0; // Arbeit aus S0-Impuls
volatile float watt = 0; // Leistung aus S0-Impuls
void setup()
{
pinMode(Pin2, INPUT); // S0 Impulseingang
Serial.begin(9600);
attachInterrupt(0, ISR0, FALLING); // Interrupt für S0-Impuls aktivieren
}
/******************************************
-
- SUB - Leistung aus S0-Impuls berechnen *
-
******************************************/
void s0Leistung ()
{
watt = 0;
if (s0ImpAnz != 0) {
watt = 360000000/(float)(s0dauerSum/s0ImpAnz);
s0dauerSum = 0;
s0ImpAnz = 0;
}
}
/****************************************************************
-
- SUB - Interruptroutine ausgelöst durch Flanke 1-->0 an Pin 2 *
-
****************************************************************/
void ISR0()
{
Pin2 = !Pin2;
s0dauer = micros() - s0start;
s0start = micros();
s0dauerSum = s0dauerSum + s0dauer;
++kWh;
++s0ImpAnz;
}
void loop() // Hauptroutine
{
s0Leistung (); // Leistung aus S0-Impuls berechnen
Serial.print("Watt = " );
Serial.print(watt,2); // Aktuelle Leistung
Serial.print("\t kWh = " );
Serial.print((kWh/800),2); // aufsummierte Arbeit
}
Leider bekomme ich hier keine Watt Ausgabe. Immer 0. kWh werden hochgezählt. Ausserdem wird alles in eine Zeile geschrieben. Da habe ich auch keinen Plan, warum es keine Spalten sind.
Wenn ich hier plausible Ergebnisse hätte, könnte ich weiter daran arbeiten die Impulse pro Minute zu zählen. Wobei ich mich frage, ob ich hier ein RTC Modul benötige.
Bin für jede Hilfe dankbar.