Wie bereits vor Jahren mal als Idee festgehalten kam ich nun endlich dazu, die Idee mit dem DIY SmartMeter umzusetzen.
Im vorherigen Artikel habe ich bereits angesprochen, das mySensors Netzwerk bei mir zuhause zu erweitern.
Nun ist den Stromzähler daran anzubinden der nächste logische Schritt, da mich die Stromverbrauchswerte schon immer interessiert haben.
Hardware
Bei diesem Projekt galt für mich nach dem eher hardwarelastigen letzten Projekt, der PDBox, ganz klar “Software first”.
Natürlich benötige ich trotzdem hardwareseitig einen Testaufbau. Hier daher ganz klassisch als Breadboard-Aufbau gelöst.
Komponenten
Reflexkoppler
Der CNY70 ist ein Infrarotreflexkoppler. Das bedeutet, dass er ähnlich wie ein Optokoppler aus einer Infrarot Leuchtdiode und einem Fototransistor besteht.
Während bei einem Optokoppler die beiden Komponenten jedoch im Gehäuse aufeinander zeigend verbaut sind, zeigen diese bei einem Reflexkoppler aus dem Gehäuse nach außen.
Das von der Leuchtdiode abgestrahlte Licht wird von der Oberfläche reflektiert und fällt zurück in den Fototransistor, der dann abhängig von der Lichtstärke einen gewissen Strom fließen lässt. Dieser Strom wird durch einen Widerstand in einen Spannungswert umgewandelt. Die Spannung kann anschließend mithilfe des Analog-Digital-Wandlers eines Mikrocontrollers gemessen werden.
CNY70 Adapterplatine
Der hier verwendete CNY70 benötigt noch zwei zusätzliche Widerstände, die ich zusammen mit dem Sensor auf eine eigen kleine Adapterplatine gelötet habe. Normalerweise hätte ich den CNY70 einfach mit Jumper Kabeln verbunden und die Widerstände erst auf dem Breadboard verbaut. Allerdings sind die Beinchen des Sensors ein bisschen dünner als normale Dupont Pins und die Kabel haben deshalb nicht gehalten.
Testaufbau
Für den Testaufbau habe ich dann einfach den Sensor mit Klebeband an den Stromzähler geklebt und das Breadboard in den Zählerschrank gelegt. Versorgt wird der Arduino mit einem normalen USB-Netzteil.
Software
Da nun die Hardware grundsätzlich erst mal steht kann ich mit dem spaßigen Teil beginnen.
Sensor auslesen
Die erste Hürde, an der ich vor ca. zwei Jahren gescheitert bin war, dass man mit dem Reflexkoppler ja diesen kleinen roten Strich auf der Zählscheibe erkennen muss. Wenn sich dieser am Sensor vorbei dreht, bewirkt er allerdings nur eine relativ geringe Änderung der reflektierten Lichtstärke, da sich der CNY70 nicht wirklich gut fokussieren lässt und infrarotes Licht nur bedingt von der roten Markierung absorbiert wird.
Als Größenordnung der geringen Änderung mal so viel: Beim Arduino tritt eine Änderung des gemessenen Analogwerts bei Erkennung des roten Strichs um ca. 5 Werte (von 1023) auf, während bei Ruhezustand bereits durch das Rauschen des Analog-Digital-Wandlers (ADC) der Wert schon um ca. 3 Werte schwankt.
Ein so geringes Signal müssten man nun entweder verstärken, oder man filtert das ADC-Rauschen mithilfe von Software aus dem Signal heraus. Letzteres ist der Weg, den ich gewählt habe, da eine Verstärkung auf der analogen Seite für mich deutlich komplexer wäre und den Messbereich des Sensors einschränken würde.
Filterung
Als Filterung nutze ich hier einen gleitenden Mittelwert. Bei diesem merkt sich der Mikrocontroller die letzten x gemessenen Werte und nimmt davon den Durchschnitt. Wird ein neuer Wert gemessen, so wird der älteste Wert verworfen. Durch diesen Filter beschränken sich die Schwankungen dann nur noch auf ungefähr einen halben ADC-Wert.
Den Messintervall habe ich mal auf 5 Millisekunden festgelegt. Damit sieht man ganz gute Kanten in den Werten und hat eine gute Reaktionszeit auf die rote Markierung.
Kalibrierung
Nun ist es allerdings so, dass der Fototransistor nicht nur auf das reflektierte Infrarotlicht von der Leuchtdiode reagiert, sondern auch auf anderes einfallendes Licht. Um den Sensor nicht jedes Mal manuell auf die Lichtverhältnisse im Zählerschrank kalibrieren zu müssen, habe ich hier erneut eine Filterung eingebaut. Dafür kommt ein sogenannter “exponentiell gewichteter gleitender Mittelwert” (EWMA) zum Einsatz.
Das hört sich jetzt sehr kompliziert an, heißt aber insgesamt eigentlich nur, dass der neu eingelesene Wert in einem Verhältnis zu dem bereits vorhandenen Durchschnittswert verrechnet wird. Das spart einiges an Arbeitsspeicher, da nur der aktuelle Durchschnittswert im Speicher gehalten werden muss.
Wird ein neuer Wert eingelesen, so wird von dem Durchschnittswert bspw. ein Hundertstel abgezogen und der neue Wert geteilt durch hundert dazuaddiert.
Somit wird immer errechnet, was der durchschnittliche Helligkeitswert ohne die rote Markierung ist, damit eine Abweichung akkurat ermittelt werden kann.
Sensorwerte
Im folgenden Screenshot sieht man nun die rohen Sensorwerte beim Vorbeidrehen der roten Markierung.
Die rote Linie ist der gleitende Mittelwert der Sensorfilterung, dort sieht man sehr gut, dass ein klarer Helligkeitsabfall auftritt, der recht gut in Software erkannt werden kann.
Die grüne Linie ist der EWMA von der automatischen Kalibrierung. Man sieht sehr gut, dass er sich immer sehr langsam dem aktuellen Wert annähert und immer maximal einen Wert vom gefilterten Eingangssignal abweicht.
Die blaue Linie ist ein Vergleichswert, was passieren würde, wenn man die kurzzeitige Filterung mit einem EWMA vornehmen würde. Die langsam abfallende Kante ist mir hier nicht eindeutig genug, weshalb ich den gleitenden Mittelwert (rot) bevorzuge.
Die ungefilterten Sensorwerte sind in diesem Diagramm nicht gezeigt, da man sonst die gefilterten Linien gar nicht mehr erkennen würde.
Momentanverbrauch
Da nun eine Umdrehung der Zählerscheibe sehr gut gemessen werden kann geht es darum, was man mit diesen Daten anfangen kann.
Auf dem Stromzähler steht immer, wie viele Umdrehungen pro gemessener Kilowattstunde anfallen. In meinem Fall sind es 375U/kWh. Das heißt man kann durch Zählen der Umdrehungen den Verbrauch in kWh erfassen und quasi den Zählerstand digital vorhalten, sofern der Sensor akkurat jede Umdrehung erkennt und keinen Ausfall erleidet.
Allerdings kann man zusätzlich auch die Zeit einer Umdrehung messen. Dadurch lässt sich dann nämlich der aktuelle Verbrauch in Watt berechnen. Dazu kann man einfach folgende Formel anwenden:
\[Watt=\frac{3600}{Intervall\ *\ \frac{375\ U/kWh}{1000}}\]Ende Part 1
In einem eventuell folgenden zukünftigen Artikel möchte ich dann noch auf das Senden der Daten über MySensors und die Darstellung mithilfe InfluxDB und Grafana berichten. Außerdem erfolgt noch ein Umbau auf die modulare Platine SHMod24, um das Kabelgewirr im Zählerschrank zu reduzieren. Diese befindet sich aktuell noch in Entwicklung und es folgt hierzu hoffentlich™ bald auch ein Blog Artikel.