Arduino Smartmeter S0 Watt Counter

Am Markt gibt es sehr viele Stromzähler bzw. Subzähler die in der Lage sind, ihre Daten an ein anderes System weiterzugeben. Dafür gibt es verschiedene Schnittstellen wie den ModBus, S0 oder auch Serial. In diesem Artikel geht es um das mitschreiben von verbrauchten Wattstunden mittels eines Arduino Board über S0.

Wie funktioniert S0

Das S0 System von Stromzählern ist ein einfacher Impuls, der bei jedem verbrauchten Watt erzeugt wird. Dieses System hat absolut nichts mit der bekannten S0-Schnittstelle vom ISDN zu tun. In dem Zähler befindet sich meistens ein Optokoppler oder Relais, das nach jedem verbrauchten Watt einen kurzen Impuls gibt, indem der angeschlossene Stromkreis geschlossen wird. Die Impulszeit ist nicht standardisiert und je nach Hersteller unterschiedlich. In der Regel dauert ein Impuls etwa 20 - 100 Millisekunden. Ebenso gibt es auch keine bestimmte Größe pro Impuls. Bei den meisten Zählern entspricht ein Impuls einem verbrauchten Watt. Auf Wikipedia gibt es eine genaue Beschreibung von der S0-Schnittstelle.

Arduino Pulldown S0 Interface Smartmeter

Anschluss an den Ardunio

Um eine S0-Schnittstelle mit dem Arduino zu verbinden, wird lediglich ein Widerstand benötigt. Die 5V-Spannungsversorgung vom Arduino wird die S0-Klemme vom Zähler durchgeschliffen und geht zu einem Interrupt-Pin (D2). Damit der digitale Eingang vom Arduino ein genaues Signal bekommt wird hier in Serie zur Masse ein PullDown-Widerstand von etwa 10 KOhm geschaltet. Gibt der Zähler einen Impuls, so geht der Pegel am digitalen Eingang in dieser Zeit von Low auf High.

Wattstunden zählen und Speichern

Mittels Interrupt werden am Arduino die Wattstunden gezählt. Der Beispielcode enthält eine Integer-Variable, die bei jedem Impuls um eine Eins erhöht wird. Damit kann der Wattverbrauch seit dem Programmstart mitgezählt werden. Bei einem Reset oder Stromausfall gehen jedoch am Arduino die gezählten Wattstunden verloren. Um dies zu verhindern, kann der Zählerstand in einem bestimmten Intervall auf den internen EEPROM gespeichert werden. Um den EEPROM jedoch zu schonen, sollte der Schreibvorgang im Dauerbetrieb nur alle paar Stunden durchgeführt werden.

Arduino Smartmeter Serial Monitor Watt Counter

Der Beispielcode

Wenn die Software startet, wird der Zählerstand vom EEPROM eingelesen und die Integer Variable "wh_total" damit beschrieben. Parallel dazu startet auch ein weiterer Counter, der die verbrauchten Wattstunden seit dem Reset bzw. Systemstart mitzählt. Die S0-Impulse werden als Interrupt empfangen. Bei jedem Interrupt wird die Counter-Funktion aufgerufen und die beiden Zählerstände um den Wert "1" erhöht. Die Speicherung des Zählerstandes in den EEPROM erfolgt nach einem definierbaren Intervall. Achtung: In diesem Beispiel werden aufgrund der Einfachheit alle Zählerstände als Integer definiert. Integer ist ein Zahlenwert-Datentyp, der bis max 32.767 bzw. 65.535 als unsigned Integer geht. Damit ist es möglich, bis zu 65 Kilowattstunden zu zählen. Wenn das nicht ausreicht, kann anstatt dem Datentyp Integer auch Long verwendet werden.

#include <EEPROM.h>

int interval = 5;  //Counter refresh and save interval

int wh_start, wh_total;
int pulseCount, crontimer;
 
void setup() {
Serial.begin(9600);
attachInterrupt(0, onPulse, FALLING);
}

void loop() {
  if(millis()/1000 > crontimer+interval){
    crontimer = millis()/1000;
    wh_total = read_counter(0);
    wh_total = wh_total+pulseCount;
    save_counter(0, wh_total);
    pulseCount = 0; 
    
    Serial.print("Start Wh: ");
    Serial.println(wh_start);
    Serial.print("Total Wh: ");
    Serial.println(wh_total);
    Serial.println("================");
  }
}

int read_counter(int address)
{
  long byte_2 = EEPROM.read(address);
  long byte_1 = EEPROM.read(address + 1);
  return ((byte_2 << 0) & 0xFFFFFF) + ((byte_1 << 8) & 0xFFFFFFFF);
}

void save_counter(int address, int value)
{
  byte byte_2 = (value & 0xFF);
  byte byte_1 = ((value >> 8) & 0xFF);
  EEPROM.update(address, byte_2);
  EEPROM.update(address + 1, byte_1);
}

void onPulse()
{
    pulseCount++;
    wh_start++;
}

Oft gelesen

Anzeige:

Video zum Beitrag

Social Media

Newsletter