Pulse counter

Um das Auslesen und Auswerten meines Stromzählers zu vereinfachen, habe ich mir mittels eines ESP32 Board und eines TRCT5000 Infrarot Sensor einen Lesekopf gebaut. Leider habe ich hier noch einen alten, sogenannten “Ferraries Stromzähler”. Dieser besitzt aber eine Drehscheibe mit einer roten Markierung. Diese macht X Umdrehungen pro kWh, in meinen Fall 75. Durch die Dauer einer Umdrehung kann dann der momentane Verbrauch berechnet werden.

Für den Sensor habe ich dann ein Gehäuse im 3D Drucker gedruckt, um diesen auf den Zähler zu montieren und auszurichten. Zum Festkleben habe ich Klebeband benutzt, mit welchen man normalerweise Wände beim Streichen abklebt, um scharfe Kanten zu bekommen. Dieses lässt sich gut wieder entfernen und klebt aber trotzdem ausreichend. Entworfen habe ich das Gehäuse in Autodesk Fusion 360.

Gehäuse

Der TRCT5000 den ich verwende, hat ein Potentiometer mit welchen die Empfindlichkeit des digitalen Ausgangs eingestellt werden kann. So kann theoretisch der Sensor so justiert werden, dass bei der roten Markierung an und sonst aus ist. So war auch mein erster Versuch. Leider war die richtige Einstellung gefühlt innerhalb einer 0.1° Drehung. Irgendwie habe ich es dann doch hinbekommen es einigermaßen einzustellen und habe es eine Weile laufen lassen. Es hat auch ein bisschen funktioniert, aber nicht zufriedenstellend. Das Problem war zum einen, dass das Signal beim Übergang noch oft hin und her gesprungen ist. Das ließ sich noch mit einem digitalen Debouncing in Griff bekommen. Ein weiteres Problem war dann aber noch, dass nach einer Weile teilweise gar keine Umdrehung mehr erkannt wurden. Warum weiß ich nicht genau, vielleicht waren es andere Lichtverhältnisse oder das Gehäuse ist doch einen Millimeter verrutscht? Für mich war aber klar, ich brauche eine andere Lösung.

Für den nächsten Versuch habe ich den analogen Ausgang vom TRCT5000 benutzt, welchen meine Platine glücklicherweise hat. Hier habe ich erstmal mit dem Oszilloskop nachgemessen. Der Unterschied zwischen Rot und nicht Rot waren, wenn ich mich recht erinnere, 15 mV. Wenn man den ESP32 auf die Verstärkung ADC_ATTEN_DB_0 stellt und 12 Bit Auflösung verwendet, bietet dieser eine Genauigkeit von ca. 0.2mV, was also ausreichen sollte.

Ich habe also den TRCT5000 an einen analogen Eingang vom ESP32 gehängt und angefangen eine Firmware dafür zu schreiben. Zunächst wurden die Schwellenwerte hart einprogrammiert, was auch ganz gut funktioniert hat. Dazu habe ich zwei Grenzen benutzt. Eine welche überschritten werden muss für Rot, eine andere welche dann unterschritten werden muss für nicht Rot. Auch hier hatte ich am Anfang noch hin und wieder noch falsche Impulse.

Um das Signal zu verbessern, habe ich die Rohdaten geglättet. Dazu benutzte ich einen gleitenden Durchschnitt mit einem Fenster von 10 Samples. Das Sampling mache ich mittels eines Timer-Interrupts von einer Millisekunde. Zusätzlich habe ich eine automatische Kalibrierung eingebaut, welche am Anfang einfach nur eine Tabelle erstellt, welcher Wert wie oft gelesen wurde. Aus der Tabelle wird dann versucht zwei Hügel zu finden, mit einem Tal dazwischen, um so die Grenzen festzulegen.

Das Ergebnis wurde dann über zwei Wochen getestet, indem ich den Zähler manuell abgelesen habe und die Differenz mit meiner Lösung verglichen habe. Der Unterschied war 0.1 kWh, was aber auch vom ablesen kommen konnte. Ich bin mit dem Resultat zufrieden.

Der ESP32 sendet aktuell die absoluten Werte in kWh und den momentanen Verbrauch in Watt zu meinen Raspberry wo sie in einer InfluxDB gespeichert werden. Zusätzlich speichere ich noch die einzelnen Pulse mit, dies half am Anfang super falsche Werte zu identifizieren.

Zur Auswertung benutze ich ein Dashboard in Grafana, in welchen ich den Stromverbrauch im zeitlichen Verlauf sehen kann.

Stromverbrauch

Hier wie die einzelnen Pulse aussehen:

Pulse