Menu

Go to english version.

Infrarot-Sensor-Adapter um "Smart-Meter"-Stromzähler auszulesen

Vorgehensweise

Mein Ziel war, unseren Stromverbrauch im Haus über einen Tag hinweg zu messen, nicht regelmäßig sondern bei typischen Haushalts-Tätigkeiten. Meine Anforderungen waren:

Die Voraussetzungen waren

Dieses Projekt besteht aus vier Teilen von Hardware und Software:

  1. Ein Lesekopf mit Infrarot-Photodiode, der magnetisch am Stromzähler befestigt wird. Der Lesekopf empfängt die Daten, die der Stromzähler über eine eingebaute Infrarot-Leuchtdiode (LED) ausgibt.
  2. Ein elektronischer Verstärker für das Lesekopf-Signal, der es in eine digitales Logik-Signal verwandelt
  3. Ein USB-UART Digital-Adapter, der per USB 2.0-Schnittstelle an Standard-PCs oder andere Geräte angeschlossen wird und eine "TTL-UART"-Schnittstelle bereitstellt
  4. Einfache Zusatz-Software für die libsml​-Bibliothek, um die Daten anzuzeigen oder in einer Datei zu speichern

Die vier Teile sind modular gestaltet, z.B.

Hardware-Bilder

Das folgende Bild zeigt alle Hardware-Teile. Das Bild zeigt auch die USB-B-Buchse für das USB-UART. Die USB-B-Buchse hat vier Kabel-Klemmen. Zu sehen ist auch ein kurzes drei-poliges Kabel, das USB-UART und Verstärker verbindet.

Alle Hardware-Komponenten

Großaufnahme des Lesekopfs. Zwei zylindrische Magnete halten den Kopf am Stromzähler:

Photo-Dioden-Lesekopf

Photo-Dioden-Stromverstärker-Baugruppe:

Photo-Dioden-Verstärker

USB-UART mit TTL-Ein- und Ausgang:

USB-UART

Ansicht des ganzen Geräts, wie es am Stromzähler sitzt:

Photo des gesamten Geräts am Stromzähler

Schaltplan

Das folgende Bild zeigt den Schaltplan, der in eine SVG-Datei "geplottet" wurde:

Smart Meter IR-Adapter Schematics

Der Schaltplan sollte mir auch beim Layout der Streifen-Raster-Platinen helfen und ist deshalb nicht optimal.

Beschreibung des USB-UART-Teils

Das USB-UART ist mit dem IC MCP2221A des Herstellers Microchip aufgebaut, das ein vorprogrammierter Mikrocontroller ist. Ab Werk bietet er zwei unabhängige Funktionsblöcke:

  1. Eine USB zu UART Brücke
  2. Einen I2C Bus-Master

Um den Stromzähler auszulesen, nutze ich nur die USB-UART-Brücke. Der Hersteller Microchip bietet ein fertiges "MCP2221 Breakout Module" an, das die USB-UART-Funktion bereitstellt: https://www.microchip.com/en-us/development-tool/ADM00559

Mein Schaltungsentwurf hat zusätzlich vier LEDs, mit denen man den Betrieb überwachen kann. Ab Werk sind die vier Mehrzweck-IO-Pins des MCP2221A so programmiert, dass sie vier LEDs treiben können:

Die Strombegrenzungs-Widerstände von 3,3 kΩ stellen den LED-Strom auf ≈1 mA ein. Weil D3 die ganze Zeit an ist, habe ich dort 6,8 kΩ vorgesehen, um 0,5 mA einzustellen. Am besten nimmt man moderne LEDs, mit klarem, nicht diffusem Gehäuse, die >1000 mCd Lichtstrom liefern, bei ihrem maximalen Strom (in der Regel 20 mA).

R4 = 2,2 MΩ stellt sicher, dass der Rx-Eingang Ruhepegel sieht (= +5 V), wenn nichts angeschlossen ist. Der MCP2221A scheint an diesem Pin keinen Pull-Up-Widerstand zu haben.

R2 = 10 kΩ ist der empfohlene Pull-Up für den MCP2221A-Reset-Eingang.

Der MCP2221A stellt TTL-Pegel am Tx-Ausgang zu Verfügung und erwartet TTL-Pegel am Rx-Eingang. Für Standard-RS232-Pegel muss man einen Treiber-/Empfänger-Baustein hinzufügen, z.B. den MAX232. Die RS232-Pegel sind nicht nur höher, sondern auch invertiert.

Nota bene: der MCP2221A unterstützt nur die Kern-UART-Funktionen mittels Rx und Tx. D.h. er bietet keine Unterstützung für Hardware-Handshake. Zwar können andere MCP2221A-Pins als allgemeine Eingänge oder Ausgänge per Software eingestellt und genutzt werden. Aber mir ist keine Treiber-Software bekannt, die das zum Zweck des Hardware-Handshakes tut. Und: der MCP2221A hat Sende- und Empfangs-FIFOs. Die MCP2221A-Firmware müsste die RTS/RTR-Handshake-Leitung auch bedienen, falls das Empfangs-FIFO fast voll ist.

Beschreibung des IR-Empfänger-Verstärkers

Ich habe vergessen, warum ich eine IR-Photodiode gewählt habe, statt eines IP-Phototransistors. Deswegen musste ich einen Verstärker einbauen, der den Photostrom in ein Logik-Signal umsetzt. Ich habe mehrere Schaltungen ausprobiert und schlussendlich einen Verstärker mit MOSFET ausgewählt, der die Umsetzung macht (siehe unten). Der MOSFET arbeitet zusammen mit seinem Drain-Widerstand als primitiver Operations-Verstärker. Der Rückkoppel-Widerstand R9 stellt die Empfindlichkeit ein, d.h. das Verhältnis von Ausgangs-Spannung zum Photodioden-Strom. R8 stellt den Arbeitspunkt ein, d.h. die Spannung an DP2 (Pin 1 von U1) im Ruhezustand, wenn der Diodenstrom Null ist.

Zwei hintereinander geschaltete CMOS-Inverter verstärken zusätzlich und stellen auch sicher, dass das Ausgangs-Signal zwischen 0 und +5 V wechselt (rail-to-rail). Das ist nötig, weil der MCP2221A-Rx-Eingang eine recht große Hysterese hat.

Die CMOS-Inverter erlauben auch, lange Kabel zu treiben. Beim Schaltungs-Test habe ich erfolgreich ein 5 m langes Kabel zwischen Verstärker und USB-UART eingesetzt.

Das 4007 CMOS-IC (in meinem Fall ein alter HBF4007 des Herstellers SGS Ates) beinhaltet den P-MOSFET, als Verstärker und die beiden CMOS-Inverter.

Die 4007-MOSFETs haben relativ niedrige Gate-Kapazität verglichen mit einzelnen MOSFETs, wie z.B. BS170 oder BS250. Das ist wichtig, weil die Schaltzeit umso größer wird, je höher die Gate-Kapazität ist. Mit anderen Worten: MOSFETs wie BS170 oder BS250 sind bei höheren Datenraten nicht gut geeignet, Photodiode-Ströme zu verstärken.

Beschreibung des Lesekopfs

Ich habe ein Kabel aus einem alten PC verwendet, das aus zweipoliger, verdrillter Litze besteht, die in zwei 2-Pin-Buchsen mit 1/10-Zoll Abstand endet. Die Buchsen passen genau zu den Photodioden-Beinchen und der 2-Pin-Stiftleiste auf der Verstärker-Schaltung.

Achtung: die Photodiode ist auch erhältlich als SFH203 ohne das FA-Suffix. Jenes Bauteil hat keinen Infrarot-Filter, ist also auch für normales Licht empfindlich. Die SFH203 würde trotzdem in dieser Anwendung funktionieren, wenn man sicherstellt, dass der Lesekopf alles Umgebungslicht abschirmt

Der Lesekopf ist am Smart-Meter mit zwei zylindrischen Magneten in einem Plastikgehäuse befestigt, was ich eh' zur Hand hatte. Das Plastikgehäuse umhüllt ein Stahlband, dass die beiden Magneten auf der Rückseite verbindet, zum Kraftschluß des magnetischen Feldes.

Am besten wären drei im Kreis angeordnete Magneten, die auf den runden Stahl-Ring passen, der im Smart-Meter verbaut ist. Ein runder Lesekopf mit 32 mm Durchmesser wird empfohlen.

In meinem Fall muss die Photodiode das durchsichtige Fensterchen vor der Infrarot-LED sanft berühren. Einige Millimeter Abstand würden das Signal bereits zu sehr schwächen. Dies könnte man notfalls durch einen größeren Widerstand R9 ausgleichen, der eine größere Verstärkung einstellt.

Software

Ich verwende die libsml​-Software des Volkszähler-Projekts. Die Quelle ist: https://github.com/volkszaehler/libsml/blob/master/

Die aktuelle Version von libsml ist im Standard-Software-Repository von Debian-Linux 13 (Trixie). Der Laptop hat aber noch Debian 12 (Bookworm), bei dem die libsml​-Version veraltet ist. Deshalb musste ich libsml selbst compilieren, was keine Mühe gemacht hat.

libsml enthält das Programm sml_server im examples​-Ordner. sml_server ist ein Kommandozeilen-Werkzeug und zeigt (alle?) empfangenen Daten in lesbarer Form an. Das ist für Tests sehr nützlich.

Tests

Den USB-UART testen

Die USB-UART-Schaltung kann für sich allein getestet werden. Wenn man den USB-UART an einen PC-USB-Port anschließt, sollte die USB-LED angehen. Dies bestätigt, dass das USB-UART vom PC-Betriebssystem erkannt wurde. Unter Linux kann man das auch nachvollziehen, mit

# dmesg | tail -n 20

nachdem das USB-Kabel eingesteckt wurde. Das dmesg​-Kommando zeigt auch den Device-Namen an, den das OS dem USB-UART zugewiesen hat. In meinem Fall war das /dev/ttyACM0.

Als nächstes nutzt man ein Programm, um die serielle Schnittstelle zu testen, z.B. den Emacs serial-terminal​-Mode. Er fragt den Device-Namen ab und die Bit-Rate, bei der ich 9600 wähle. Wenn man dann etwas auf der Tastatur tippt, sollte die Tx-LED jeweils kurz aufleuchten. Wenn man Tx und Rx mit einem Jumper verbindet, sollte auch die Rx-LED leuchten und die Zeichen sollten im Terminal-Programm erscheinen (loopback test).

Den Lesekopf und Verstärker testen

Anfang wusste ich nicht, dass das Smart-Meter ständig Daten ausgibt. Ich hatte das mit der Smartphone-Kamera überprüft aber nichts gesehen. Daher nahm ich fälschlicherweise an, man müsse erst etwas senden, um Daten anzufordern.

Deshalb hatte ich einen Infrarot-Sender gebaut, um ohne Smart-Meter testen zu können:

test Sender Schematics

Der 620 Ω Widerstand stellt den Strom durch die SFH4546-Infrarot-LED auf ≈5 mA ein. Das ist meine Schätzung für den Strom durch die IR-LED im Smart-Meter.

Diese Sende-Schaltung kann z.B. an den Tx-Ausgangs-Pin des USB-UART angeschlossen werden. Dadurch kann man mittels Terminal-Programm testen oder per Script.

Das Schaltbild zeigt auch eine einfache andere Schaltung, um die Infrarot-LED mit einem Funktions-Generator anzusteuern, z.B. mit einem 5 kHz-Rechteck-Signal, was ≈9600 bps entspricht.

Ich habe die SFH4546 Infrarot-LED und die SFH203FA-Infrarot-Photodiode provisorisch einander gegenüber montiert, auf eine 10 mm × 10 mm L-förmige Aluminiumschiene, 100 mm lang. Dadurch konnte ich leicht verschiedene Abstände von LED und Photodiode einstellen.

Wenn die Photodiode nicht angeschlossen ist oder ohne IR-Licht, zeigt der Drain-Anschluss des verstärkenden P-MOSFETs (Pin 1 von U1, DP2) eine Spannung von ≈3.0 V. Bei beleuchteter IR-Photodiode, fällt die Spannung unter 2,5 V, was die Schaltschwelle ist. Beim 4007 ist die Schaltschwelle stets die halbe Versorgungsspannung.

Für dynamische Tests braucht man ein Oszilloskop, um die Signalform an Pin 1 zu prüfen. Pins 8, 10 und 13 sollten das invertierte Signal zeigen und Pin 12 ‑ was der Ausgang ist ‑ sollte das nicht invertierte Signal zeigen.

Daten-Erfassung, -Speicherung und -Auswertung

Ich habe den sml_server​-Source-Code kopiert und angepasst, um die folgenden Daten auszugeben:

Ich trenne die sechs Werte mit dem Tab-Zeichen und schließe jede Zeile mit newline ab. Mein Smart-Meter-Zähler erzeugt einen vollen Datensatz pro Sekunde. Ich erhalte also eine Zeile/Sekunde. Ich leite die Ausgabe in eine Datei. An einem Tag kommen ≈3 MB Daten zusammen.

Tab-Separated-Values-Dateien können leicht in LibreOffice importiert werden und dort mittels Pivot-Tabellen und Grafiken analysiert werden.

Verschiedene Verstärker-Entwürfe

Ich habe verschiedene Schaltungen ausprobiert, um den Photodioden-Strom in eine Logik-Signal zu wandeln:

Amplifier Variants Schematics

Für die Smart-Meter-Schnittstelle gilt folgender Standard: der Logik-Ausgang muss "high" sein (entweder +5 V ‑ in meinem Fall ‑ oder +3,3 V für einen RasPi), ohne Licht und "low" (0 V) mit Licht.


Last change: 2026-08-29
© 2002-2026 Dr. Thomas Redelberger redetho(a‍t)gmx.de

Close menu