S0-Messwerterfassung von Stromzählern

Neuere Stromzähler sind zum Teil mit einem Optokoppler ausgestattet, der für jede verbrauchte Wattstunde einen Impuls liefert (1000 Impulse = 1 kWh). Der Anschluss an einen Arduino gestaltet sich dem entsprechend einfach: D+ Ausgang des Zählers auf 5V legen und den D- Ausgang an einen digitalen Eingang des Arduino anschließen, dieser muss noch mit einem 4k7 Widerstand gegen Masse gezogen werden um ein klares Signal zu erhalten.



Zur Darstellung des aktuellen Wattzahlen werden dabei im Arduino die Millisekunden zwischen zwei Flanken auf dem Eingang gezählt. Bei 1000 Impulsen pro kWh entsprechen 3600 Millisekunden zwischen den Flanken einem angeschlossenen Verbraucher mit 1000 Watt.

/** Hilfsprogramm zur Auswertung der Zähler
* Maximal 8 SO-Zähler können angeschlossen werden, die mit folgendem Protokoll
* an die serielle Schnittstelle ausgegeben werden:
*
* byte0  byte1     byte2     byte3      ...
* A-H    0-9       0-9       0-9        n
* Kanal  Millis                         Newline
*
* Die Millis sind dabei die Millisekunden zwischen den letzten beiden Low-High-Flanken
* auf dem angegebenen Kanal.
*/
const byte counterPins[8] = { 2,3,4,5,6,7,8,9 };
unsigned long millisBetween[8];
unsigned long lastMillis[8];
byte lastState[8];

void setup() {
  for (byte i = 0; i < sizeof(counterPins); i++) {
     pinMode(counterPins[i], INPUT);
     digitalWrite(counterPins[i], LOW);
     millisBetween[i] = 0;
     lastMillis[i] = 0;
     lastState[i] = 0;
  }
  Serial.begin(9600);
}

void loop() {
  unsigned char bitMaskToSend = 0;
  unsigned long time = millis();
  for (byte i = 0; i < 8; i++) {
     byte val = digitalRead(counterPins[i]);
     if (val == HIGH && lastState[i] == LOW) {
       millisBetween[i] = time-lastMillis[i];
       lastMillis[i] = time;
       bitSet(bitMaskToSend, i);
     }
     lastState[i] = val;
  }
  for (byte i = 0; i < 8; i++) {
     unsigned long dataToWrite = millisBetween[i];
     if (bitRead(bitMaskToSend,i)) {
       Serial.print((char)('A'+i));
       Serial.println(dataToWrite);
     }
  }
}

2 thoughts on “S0-Messwerterfassung von Stromzählern

  1. induzer

    Hi Wolle, arazer und ich haben gerade ein ähnliches Stromzählerprojekt am laufen.
    Ich hoffe, du kannst unsere Nicks noch aus dem Hackerspace zuordnen 😉 ..

    Wir haben ein easymeter Stromzähler mit Infrarotschnittstelle, welcher Serielle Daten herauswirft, die per Photodiode in einem Schmitt-Trigger zur Signalverstärkung gehen.
    Wenn man einen solchen Stromzähler hat, kann man gleich alles Digital machen und muss selbst bei einem Stromausfall / Controllerfuckup keine $neuewerte einstellen, weil man direkt den Internen Zählerstand auswerten kann.
    Code ist fertig und läuft für D0-Schnittstelle, falls du Interresse hast, können wir dir gerne EAGLE-Files + Code zur Verfügung stellen.

    hack on.
    arazer + induzer

    1. elektrowolle

      Klingt gut, nur bei meiner Lösung geht es um die Erfassung der Ist-Daten und bei 8 Zählern sind die einfachen Zähler von B+G einfach unschlagbar günstig.

Leave a Reply