ESP32 - PC817 Optokoppler: 12V/24V DC-Eingangssignal überwachen
Um zu wissen, ob ein Ventil, eine Pumpe oder eine Heizung gerade in diesem Moment läuft, muss man in der Regel die Spannung auf der Leitung messen, die das Gerät versorgt - und diese Leitung führt 12 oder 24 Volt, nicht 3,3. Der ESP32 arbeitet mit 3,3 Volt und ist nicht 5V-tolerant, daher würde eine direkte Verbindung einer solchen Leitung mit einem seiner Pins die Platine zerstören - ein PC817-Optokoppler-Isolationsmodul löst dieses Problem, und diese Anleitung zeigt Ihnen, wie Sie es mit MicroPython auf dem ESP32 auslesen. Wir behandeln die folgenden Details:
- Wie ein PC817-Optokoppler es dem ESP32 ermöglicht, eine 12V- oder 24V-Leitung zu überwachen, ohne sie elektrisch zu berühren.
- Welches der drei PC817-Optokoppler-Module - das 24V-, das 12V- oder das 3-5V-Modul - zu der Leitung passt, die Sie überwachen möchten, und was schiefgeht, wenn Sie das falsche kaufen.
- Wie Sie das Modul mit dem ESP32 verdrahten, auf einem Steckbrett und auf einem Schraubklemmenblock.
- Wie Sie das Modul parallel zu einem bereits verdrahteten Gerät anschließen, damit der ESP32 melden kann, ob dieses Gerät ein- oder ausgeschaltet ist.
- Wie Sie herausfinden, ob Ihr Modul Active LOW oder Active HIGH ist, und wie Sie den MicroPython-Code mit einer einzigen Konstante umkehren.
- Wie Sie denselben Eingang aus dem nackten 4-poligen PC817-Chip aufbauen, falls Sie den Vorwiderstand lieber selbst einsetzen möchten.

Erforderliche Hardware
Oder Sie können die folgenden Kits kaufen:
| 1 | × | DIYables ESP32 Starter-Kit (ESP32 enthalten) | |
| 1 | × | DIYables Sensor-Kit (18 Sensoren/Displays) |
Kaufen Sie ein Modul: Die richtige Variante hängt von der Leitung ab, die Sie überwachen, und der nächste Abschnitt sagt Ihnen, welche das ist.
Überblick über PC817 Optocoupler
Der PC817 ist ein 4-poliger Chip, der ein digitales Signal mithilfe von Licht statt eines Drahtes über eine Lücke überträgt. Im Inneren befindet sich eine Infrarot-LED, die über eine isolierende Lücke hinweg einem Fototransistor gegenübersteht. Wenn Strom durch die LED fließt, schaltet ihr Licht den Transistor ein, sodass das Signal als Licht statt als Elektrizität übertragen wird - deshalb bleiben die beiden Seiten elektrisch getrennt. Der PC817 wird auch unter den Namen Fotokoppler, Opto-Isolator und Optoisolator verkauft.
Die meisten Projekte verwenden nie den nackten Chip. Was Sie tatsächlich kaufen, ist ein PC817-Optokoppler-Isolationsmodul: derselbe Chip auf einer kleinen Platine, mit bereits bestücktem Vorwiderstand, Status-LED und Schraubklemmen, erhältlich in Versionen mit 1, 2, 4 und 8 Kanälen. Genau das wird in diesem Tutorial verdrahtet, und der nackte Chip wartet am Ende auf alle, die ihn lieber von Hand aufbauen möchten.
Isolation ist genau das, was ein ESP32 braucht, wenn das zu überwachende Objekt kein 3,3-Volt-Sensor, sondern eine Industrie- oder Kfz-Leitung ist. Zwei Anwendungen, auf die dieses Tutorial abzielt:
- Überwachung der Leitung eines 24-Volt-Bewässerungs-Magnetventils, damit der ESP32 weiß, welche Zone die Bewässerungssteuerung tatsächlich geöffnet hat.
- Überwachung des 12-Volt-Betriebssignals eines Notstromaggregats oder eines Wechselrichters, damit der ESP32 protokollieren kann, wann das Gerät gestartet und gestoppt wurde.
Keine dieser Leitungen darf jemals direkt mit dem ESP32 in Berührung kommen. Der PC817 sitzt dazwischen und gibt nichts als Licht weiter.
Welches PC817-Optokoppler-Modul brauche ich?
Hier ist das, was Ihnen die Produktfotos nie verraten: Ein Modul deckt nicht jede Eingangsspannung ab. Der auf der Platine aufgelötete Widerstand ist für eine Spannung ausgelegt, daher werden die Module als drei separate Varianten verkauft, und Sie kaufen diejenige, die zu Ihrem Signal passt.
| Zu überwachende Leitung | Zu kaufendes Modul | Wo Ihnen diese Leitung begegnet |
|---|---|---|
| 24 Volt DC | 24V-Modul | Bewässerungsventile, SPS-Ausgänge, Maschinen- und Lkw-Verkabelung |
| 12 Volt DC | 12V-Modul | Betriebssignale von Generatoren und Wechselrichtern, Alarmzentralen, Kfz-Schaltungen |
| 3,3 oder 5 Volt DC | 3-5V-Modul | Der Ausgang einer anderen Platine oder eine Niederspannungs-Steuerplatine, die Sie auf Abstand halten möchten |
Wählen Sie die falsche Variante, passiert eines von zwei Dingen:
- Ein 12V-Modul, das an einer 24-Volt-Leitung hängt, bekommt ungefähr den doppelten Strom, für den sein Widerstand ausgelegt wurde, und dieser zusätzliche Strom fließt direkt durch die interne LED. Das Modul wird nicht lange halten.
- Ein 24V-Modul an einer 12-Volt-Leitung ist das umgekehrte Problem: Die LED wird zu schwach angesteuert, sodass der Ausgang verspätet, nur manchmal oder gar nicht schaltet. Nichts brennt durch, aber es funktioniert auch nichts.
※ Notiz:
Die Wahl der richtigen Variante ist für Modulbesitzer das Gegenstück zur Dimensionierung des Vorwiderstands - es ist die einzige Kaufentscheidung auf dieser Seite, die wirklich zählt. Sobald das richtige Modul auf dem Tisch liegt, gibt es keinen Widerstand zu berechnen und keine Rechnung, bei der man sich vertun kann.
Pinbelegung
Ein einkanaliges PC817-Optokoppler-Isolationsmodul hat zwei Schraubklemmen auf der isolierten Feldseite und eine dreipolige Stiftleiste auf der ESP32-Seite. Eine Status-LED neben den Eingangsklemmen leuchtet, sobald die Eingangsseite unter Spannung steht, was sich beim Testen gut beobachten lässt.
- IN+ - die positive Eingangsklemme. Verbinden Sie sie mit der 24-Volt-Ventilleitung, die Sie überwachen möchten.
- IN- - die negative Eingangsklemme. Verbinden Sie sie mit der Masse desselben 24-Volt-Stromkreises, NICHT mit der ESP32-Masse.
- VCC - die Versorgung der Ausgangsseite. Verbinden Sie sie mit dem 3V3-Pin des ESP32, der 3,3 Volt liefert.
- GND - die Masse der Ausgangsseite. Verbinden Sie sie mit einem GND-Pin des ESP32, der 0 Volt hat.
- OUT - der isolierte Ausgang. Verbinden Sie ihn mit einem ESP32-Eingangspin mit eingeschaltetem internen Pull-up, in diesem Tutorial GPIO19.
IN+ und IN- gehören zur Feldseite, VCC, GND und OUT gehören zur ESP32-Seite, und nichts außer der Isolationslücke im PC817 verbindet sie.
Technische Daten
Dies sind die Werte des PC817-Chips selbst - des Bauteils, das unter dem Kunststoff auf jeder der drei Modulvarianten sitzt.
| Spezifikation | Wert |
|---|---|
| Gehäuse | 4-poliges DIP |
| Durchlassspannung der Eingangs-LED (Vf) | ca. 1,2 V typisch, 1,4 V max. |
| Durchlassstrom der Eingangs-LED (If) | 20 mA Dauerstrom max., 5-20 mA normaler Bereich |
| Ausgangsspannung (VCEO) | 35 V max. |
| Ausgangsstrom (IC) | 50 mA max. |
| Kollektor-Verlustleistung | 150 mW |
| Isolationsspannung | 5000 Vrms für 1 Minute |
| Stromübertragungsverhältnis (CTR) | 50 % bis 600 % je nach Rang |
| Schaltgeschwindigkeit | Anstiegszeit ca. 4 us, Abfallzeit ca. 3 us |
| Betriebstemperatur | -30 C bis +100 C |
Die Isolationsangabe von 5000 Vrms ist hier der entscheidende Wert. Sie ist der Grund, warum eine Spannungsspitze auf der 24-Volt-Seite keinen Weg in den ESP32 findet.
Warum der Messwert invertiert ist
Die Ausgangsseite des PC817 erzeugt keine eigene Spannung. Sie kann den ESP32-Pin lediglich mit GND verbinden oder ihn in Ruhe lassen, daher benötigt der Pin einen Pull-up, um einen definierten Pegel zu haben, wenn der Transistor aus ist. Beim ESP32 ist der interne Pull-up die einfachste Wahl, und ein 10-kOhm-Widerstand vom Pin nach 3,3 Volt erfüllt denselben Zweck.
Mit dem Pull-up:
- 12V/24V-Signal VORHANDEN: Die LED leuchtet, der Fototransistor leitet, und der ESP32-Pin wird nach unten gezogen, sodass er LOW liest.
- 12V/24V-Signal NICHT VORHANDEN: Die LED ist dunkel, der Fototransistor ist aus, und der Pull-up setzt sich durch, sodass der ESP32-Pin HIGH liest.
Der Messwert ist also umgekehrt zu dem, was Sie vielleicht erwarten, und der MicroPython-Code muss ihn wieder umdrehen. Das ist dieselbe Active-LOW-Gewohnheit, die Ihnen in den Tutorials ESP32 MicroPython Taster und ESP32 MicroPython Endschalter begegnet.
Noch etwas speziell zum ESP32: Wählen Sie für dieses Projekt einen normalen GPIO. GPIO34 bis GPIO39 sind reine Eingangspins und haben überhaupt keinen internen Pull-up, sodass der Modulausgang an ihnen floaten würde. Dieses Tutorial verwendet GPIO19.
Ist Ihr Modul Active LOW oder Active HIGH?
Alles oben Gesagte ist für den nackten Chip gesicherte Physik. Bei einem Modul sieht das anders aus, denn manche Hersteller fügen auf der Platine eine invertierende Stufe hinzu, sodass OUT dem Eingang folgt, statt ihm entgegengesetzt zu sein. Beide Arten sind im Handel, sie sehen auf den Fotos gleich aus, und die Produktbeschreibung sagt selten, welche Sie bekommen. Gehen Sie also von nichts aus - nehmen Sie sich eine Minute und messen Sie nach.
- Verdrahten Sie das Modul wie unten gezeigt mit dem ESP32, lassen Sie IN+ und IN- aber vorerst unbeschaltet.
- Öffnen Sie das Skript unten in Thonny und drücken Sie den grünen Run-Button. Es gibt am Ende jeder Zeile den Rohpegel von GPIO19 in Klammern aus.
- Beobachten Sie die Shell unten im Thonny-Fenster und notieren Sie die Zahl, die erscheint, solange kein Signal am Eingang anliegt.
- Legen Sie nun das Signal an IN+ und IN- an. Die Status-LED am Modul sollte leuchten.
- Notieren Sie die Zahl, die die Shell ausgibt, während das Signal anliegt. Diese Zahl ist der aktive Pegel Ihres Moduls: 0 bedeutet Active LOW, 1 bedeutet Active HIGH.
Die Status-LED dient zur Gegenprobe. Sie ist mit der Eingangsseite verbunden und leuchtet daher genau dann, wenn das Feldsignal anliegt - wenn die LED an ist und die Shell die Leitung trotzdem als OFF meldet, müssen Sie die Polarität korrigieren, nicht die Verdrahtung.
Korrigieren Sie es dann an einer Stelle. Das Skript hat oben eine einzige Konstante, MODULE_ACTIVE_LOW, die standardmäßig auf True steht, weil sich die meisten Module so verhalten. Wenn Ihr Test ergibt, dass der aktive Pegel 1 ist, setzen Sie sie auf False, und alles Weitere kommt richtig herum heraus. Sonst muss im Skript nichts angefasst werden.
Halten Sie die beiden Massen getrennt
Das ist der eigentliche Sinn der ganzen Übung, daher sei es klar gesagt: Verbinden Sie die Masse des 12V/24V-Stromkreises NICHT mit dem GND-Pin des ESP32. Die 12-Volt- oder 24-Volt-Versorgung behält ihre eigene Masse, der ESP32 behält seine eigene Masse, und die beiden treffen sich nie. Wenn Sie sie miteinander verbinden, schaltet das Modul zwar weiterhin und der Code funktioniert noch, aber die Isolation ist weg und der ESP32 ist wieder allem ausgesetzt, was auf der Hochspannungsseite passiert.
Verdrahtungsdiagramm
Verdrahtung des PC817-Optokoppler-Isolationsmoduls
Mit der richtigen Variante in der Hand gibt es nichts zu berechnen. Die 24-Volt-Ventilleitung geht an IN+, die Masse derselben 24-Volt-Versorgung geht an IN-, und diese Masse bleibt am Modul und erreicht nie den ESP32. Auf der anderen Seite der Isolationslücke gehen VCC, GND und OUT an den ESP32.
- So verbinden Sie den ESP32 und das PC817-Optokoppler-Isolationsmodul mithilfe eines Steckbretts. Versorgen Sie VCC des Moduls über den 3V3-Pin des ESP32, der 3,3 Volt liefert, denn der ESP32 ist eine 3,3-Volt-Platine und nicht 5V-tolerant.

Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.
- So verbinden Sie den ESP32 und das PC817-Optokoppler-Isolationsmodul mithilfe einer Schraubklemmen-Breakout-Platine, die die aufgeräumtere Wahl ist, sobald die 24-Volt-Feldverdrahtung aus echtem Kabel statt aus Jumperkabeln besteht.

Wenn Ihr Modul mehr als einen Kanal hat, erhält jeder Kanal sein eigenes Paar Eingangsklemmen und seinen eigenen OUT-Pin, und jeder Kanal auf der Platine ist für dieselbe Eingangsspannung ausgelegt.
Das PC817-Modul parallel verdrahten, um den Ein/Aus-Zustand eines Geräts zu überwachen
Die obige Verdrahtung setzt voraus, dass eine Signalleitung auf Sie wartet. Meistens ist das nicht der Fall - was Sie haben, ist ein Gerät, das bereits installiert ist und bereits funktioniert, und Sie möchten wissen, ob es in dieser Sekunde läuft. Die Lösung besteht darin, den Moduleingang parallel zu diesem Gerät anzuschließen und jede vorhandene Leitung dort zu lassen, wo sie ist.
Nehmen Sie das 24-Volt-Bewässerungs-Magnetventil, auf das dieses Tutorial immer wieder zurückkommt. Die Bewässerungssteuerung speist die Ventilspule über ihr eigenes Kabel, und Sie durchtrennen nichts davon. Sie fügen nur zwei Drähte hinzu, und beide landen auf den Schraubklemmen eines 24V-Moduls:
- Von der geschalteten Klemme der Ventilspule zu IN+.
- Von der Rückleiterklemme derselben Spule zu IN-.
Hier muss kein Widerstand hinzugefügt werden - das Modul trägt bereits denjenigen, der zu 24 Volt passt, und genau deshalb musste die Variante stimmen. Der Abgriff zieht etwa 10 mA. Neben dem, was eine Magnetspule zieht, ist das nichts, sodass das Ventil weiterhin genau so öffnet und schließt wie immer. Dies ist eine reine Lesemessung, die an einen laufenden Stromkreis angeschlossen wird.
WARNING
Verdrahten Sie das Modul niemals in Reihe mit dem Ventil. In Reihe müsste der gesamte Spulenstrom durch die winzige interne LED fließen, und der Chip wird in dem Moment zerstört, in dem die Steuerung die Zone einschaltet. Der Optokoppler-Eingang wird parallel zum Gerät angeschlossen, niemals in Reihe.
Zwei weitere Dinge müssen auf der Eingangsseite stimmen. Zuerst die Polarität: IN+ und IN- speisen eine LED, und diese leitet nur in eine Richtung, sodass ein Vertauschen nichts beschädigt, der Eingang aber einfach nie einschaltet - finden Sie heraus, welche Seite des Abgriffs positiv ist, bevor Sie einen Draht abisolieren. Zweitens ist die Spule induktiv, und ein Magnetventil, Relais, Schütz oder Motor erzeugt beim Abschalten eine große Gegenspannungsspitze. Die Eingangs-LED des PC817 ist in Sperrrichtung nur für 6 V ausgelegt, sodass diese Spitze sie zerstören kann. Setzen Sie eine gewöhnliche Diode antiparallel direkt über die beiden Eingangsklemmen - Kathode der Diode an IN+, Anode der Diode an IN-. Im Normalbetrieb ist sie in Sperrrichtung gepolt und tut überhaupt nichts; bei einer Spitze leitet sie und begrenzt die Sperrspannung auf deutlich unter ein Volt. Eine 1N4148 reicht für einen kleinen Abgriff wie diesen, eine 1N4007 für einen stärkeren.
Ein falscher Messwert ist auch in die andere Richtung möglich. Manche SPS-Transistorausgänge, Triac-Ausgänge und LED-Lampentreiber lassen auch im ausgeschalteten Zustand etwas Leckstrom durch, und genug Leckstrom hält die interne LED schwach am Leuchten, sodass der ESP32 das Ventil weiterhin als eingeschaltet meldet, obwohl die Steuerung es bereits geschlossen hat. Das Symptom ist ein Messwert, der nie in den inaktiven Zustand zurückkehrt. Setzen Sie einen Ableitwiderstand von etwa 4,7 kOhm bis 10 kOhm über IN+ und IN-, und der Leckstrom fließt durch diesen statt durch die LED. Und eine Grenze, die Sie vor dem Start kennen sollten: Der PC817-Eingang ist eine einzelne LED, er reagiert also nur auf eine Polarität und ist das falsche Bauteil für die Erfassung einer AC-Leitung, die einen Optokoppler benötigt, dessen Eingangsstufe zwei antiparallele LEDs enthält.
Da der Abgriff parallel zum Gerät und nicht parallel zum Befehl der Steuerung liegt, liest der ESP32 den tatsächlichen Zustand des Geräts - einschließlich der Fälle, in denen etwas anderes die Zone eingeschaltet hat, und der Fälle, in denen die Steuerung sie angefordert hat und nichts angesprungen ist. Genau das macht das Skript zu einem Betriebsstundenzähler für jedes Ventil, zu einem "Ist die Pumpe tatsächlich angelaufen?"-Alarm oder zu einem Leerlaufprotokoll für eine Maschine. Seien Sie aber ehrlich darüber, was es beweist: Es sagt Ihnen, dass das Gerät unter Spannung steht, nicht dass es funktioniert, und ein festgefressener Motor oder ein durchgebranntes Heizelement zieht trotzdem Strom und wird trotzdem als ON gelesen.
Optional: Aufbau aus dem nackten PC817-Chip
Sie löten lieber selbst? Der rohe 4-polige PC817 erfüllt denselben Zweck, sobald Sie den Vorwiderstand einsetzen, was sich lohnt, wenn die Eingangsspannung fest ist. Ein Punkt oder eine Kerbe markiert Pin 1, und die Nummerierung verläuft gegen den Uhrzeigersinn: Pin 1 Anode und Pin 2 Kathode der LED auf der Feldseite, Pin 3 Emitter und Pin 4 Kollektor des Fototransistors auf der ESP32-Seite.

Dimensionieren Sie den Widerstand mit R = (Vin - 1.2) / 0.01 für etwa 10 mA: 220 Ohm bei 3,3 Volt, 390 Ohm bei 5 Volt, 1 kOhm bei 12 Volt und 2,2 kOhm bei 24 Volt als 1/2-W-Bauteil. Lassen Sie an einer 24-Volt-Leitung einen 1-kOhm-Widerstand stecken, fließen etwa 22,8 mA, mehr als das 20-mA-Limit des Chips.
Verdrahten Sie dann den Widerstand zwischen dem Signal und Pin 1, Pin 2 mit der Masse dieses externen Stromkreises, Pin 3 mit einem GND-Pin des ESP32, der 0 Volt hat, und Pin 4 mit GPIO19. Der Code unten läuft unverändert.
ESP32 MicroPython Code - PC817 Optokoppler
Es wird keine Bibliothek benötigt. Das Auslesen eines PC817-Moduls ist gewöhnliche Digitaleingangs-Arbeit, daher ist ein Pin-Objekt mit Pin.PULL_UP der gesamte Treiber. Das Skript unten überwacht den isolierten Eingang und gibt nur dann eine Zeile aus, wenn sich der Zustand ändert, was die Thonny-Shell übersichtlich hält, wenn das Ventil eine Weile offen bleibt. Jede Zeile endet mit dem Rohpegel von GPIO19, was den obigen Polaritätstest möglich macht.
Schnelle Schritte
Hier finden Sie eine Anleitung, wie Sie Ihren MicroPython-Code auf dem ESP32 mit der Thonny IDE einrichten und ausführen:
- Verdrahten Sie das Modul wie im obigen Modul-Schaltplan gezeigt mit dem ESP32 und prüfen Sie noch einmal, dass die 12V/24V-Masse nirgendwo in der Nähe von ESP32 GND ist, bevor Sie etwas einschalten.
- Stellen Sie sicher, dass Thonny IDE auf Ihrem Computer installiert ist.
- Vergewissern Sie sich, dass die MicroPython-Firmware auf Ihrem ESP32-Board geladen ist.
- Wenn Sie zum ersten Mal einen ESP32 mit MicroPython verwenden, lesen Sie die Anleitung ESP32 MicroPython Erste Schritte für eine Schritt-für-Schritt-Anleitung.
- Verbinden Sie das ESP32-Board mit einem USB-Kabel mit Ihrem Computer.
- Öffnen Sie Thonny IDE auf Ihrem Computer.
- Gehen Sie in Thonny IDE zu Tools Options.
- Wählen Sie im Tab Interpreter aus dem Dropdown-Menü MicroPython (ESP32).
- Stellen Sie sicher, dass der richtige Port ausgewählt ist. Thonny IDE erkennt ihn normalerweise automatisch, aber möglicherweise müssen Sie ihn manuell auswählen (z. B. COM12 unter Windows oder /dev/ttyACM0 unter Linux).
- Kopieren Sie den bereitgestellten MicroPython-Code und fügen Sie ihn in den Editor von Thonny ein.
- Speichern Sie den Code auf Ihrem ESP32:
- Klicken Sie auf den Save-Button oder drücken Sie Ctrl+S.
- Wählen Sie im Speicherdialog MicroPython device.
- Nennen Sie die Datei main.py.
- Klicken Sie auf den grünen Run-Button (oder drücken Sie F5), um das Skript auszuführen.
- Schalten Sie die 24-Volt-Ventilleitung ein, lassen Sie sie einige Sekunden eingeschaltet und schalten Sie sie dann wieder aus.
- Sehen Sie sich die Meldung in der Shell unten in Thonny an.
Wenn die Shell das Gegenteil dessen meldet, was die Status-LED des Moduls anzeigt, ist das der Active-HIGH-Fall von vorhin - setzen Sie MODULE_ACTIVE_LOW auf False und führen Sie das Skript erneut aus.
Da das Skript unter dem Namen main.py auf dem MicroPython-Gerät gespeichert wurde, startet es jedes Mal von selbst, wenn der ESP32 eingeschaltet wird, auch ohne angeschlossenen Computer. Das macht daraus eine eigenständige isolierte Eingangsüberwachung - kombinieren Sie es mit dem Tutorial ESP32 MicroPython Relais, und der ESP32 kann auf die 24-Volt-Leitung reagieren, statt sie nur zu melden.
Video Tutorial
Wir erwägen die Erstellung von Video-Tutorials. Wenn Sie Video-Tutorials für wichtig halten, abonnieren Sie bitte unseren YouTube-Kanal , um uns zu motivieren, die Videos zu erstellen.