Um den heimischen Energieverbrauch messen und auswerten zu können, habe ich mir einen RaspberryPi und einen Hutschienen-Stromzähler mit S0-Ausgang besorgt. In den nächsten Tagen und Wochen werde ich hier beschreiben, wie man
- den Zähler direkt am RaspberryPi ausliest, ohne eine S0-Adapterplatine zu verwenden
- den Zähler für höhere Genauigkeit modifiziert
- die eingelesenen Werte abspeichert und visualisiert.
Als Zähler habe ich den Swissnox S-Watt gewählt, den es online für ca. 20,-€ zu kaufen gibt. Der hat nämlich die Eigenschaft, dass er sich mit geringem Aufwand so modifizieren lässt, dass er ca. 400 bis 500x höher auflöst als er das von Haus aus tut. Mehr dazu in einem weiteren Artikel oder hier bei volkszaehler.org. Aber nun mal los.
Anschluss des Zählers
Der S0-Ausgang des Zählers gibt im Standard 1000 Impulse pro kWh aus. Das kann man sich ungefähr vorstellen wie einen Taster, der 1000x gedrückt und wieder losgelassen wird. Die Länge eines solchen Impulses beträgt im Falle des Swissnox wohl ca. 70-90ms. Wir behandeln den S0-Ausgang also ab jetzt erst mal als “Taster” (im Zähler übernimmt ein Optokoppler diese Funktion).
Um diesen “Taster” nun mit den GPIO-Anschlüssen des RaspberryPi zu verbinden, nehmen wir einen der Pins, die von Haus aus mit einem internen Pull-Up-Widerstand ausgestattet sind. Bei den Boards der Rev. 2 trifft das auf die Pins GPIO 2 und GPIO 3 zu, wir wählen den Pin 3. Natürlich könnte man auch einen der anderen Pins nehmen und selbst einen Pull-Up-Widerstand hinzufügen, aber wir wollen uns ja nicht mehr Arbeit machen als nötig.
Kurzer Einwurf: Der S0-Ausgang des Zählers funktioniert offiziell mit Spannungen von 5-27VDC, der RaspberryPi arbeitet aber mit 3.3V. Funktioniert aber genauso gut.
Nun bleibt nur noch, den Pin GPIO 3 mit S0+ des Zählers und GND mit S0- zu verbinden – fertig.
Impulse zählen mit wiringPi
Um die Impulse nun auch zählen zu können, werden wir uns der großartigen wiringPi Library bedienen, die uns das Leben hier sehr leicht macht. Installationsanleitung für Raspbian hier. Praktischerweise ist auch direkt ein Stück Beispielsoftware dabei, nämlich die Datei ISR.c, die bei jedem Interrupt (also jedem Impuls) eine Zählervariable hochsetzt. Wir müssen jetzt noch die Pin-Nummer von 0 auf 9 anpassen (Achtung, die wiringPi Pin-Nummerierung unterscheidet sich von der normalen GPIO-Nummerierung, Tabelle hier):
#define BUTTON_PIN 9
Jetzt den Code kompilieren und ausführen:
gcc -lwiringPi -o isr isr.c sudo ./isr
Nun kann der erste Test erfolgen: Der Counter sollte bei jedem Impuls um 1 erhöht werden.
Basierend auf diesem Beispielprogramm habe ich nun etwas C-Code geschrieben um die Impulse pro definiertem Zeitintervall zu zählen und im CSV-Format auszugeben. Mehr dazu und wie man daraus eine anschauliche Grafik erstellt, in einem der folgenden Beiträge.
10 thoughts on “S0-Stromzähler am RaspberryPi”