ESP32 - PC817 Optokoppler: 12V/24V-DC-Eingangssignal überwachen
Dieses Tutorial zeigt Ihnen, wie Sie mit dem ESP32 feststellen, ob ein 12V- oder 24V-Gerät – ein Ventil, eine Pumpe, eine Heizung, eine Maschine – gerade tatsächlich läuft, indem Sie dessen eigene Versorgung über ein PC817-Optokopplermodul überwachen, das keinerlei elektrische Verbindung mit dem ESP32 hat, und das Ergebnis im Seriellen Monitor ausgeben. Dabei verwenden Sie das fertige Modul in der 3-5V-, 12V- oder 24V-Variante, die zu Ihrem Signal passt; der nackte Vier-Pin-Chip wird am Ende für alle behandelt, die den Eingang lieber selbst aufbauen 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) |
Sie benötigen nicht mehr als ein Modul. Kaufen Sie die eine Variante, die zu der Spannung passt, die Sie überwachen möchten, wie im nächsten Abschnitt erklärt.
Über den PC817-Optokoppler
Der PC817 ist ein 4-poliger Optokoppler, auch Fotokoppler oder Optoisolator genannt. In seinem kleinen schwarzen Gehäuse befindet sich eine Infrarot-LED, die über einen isolierenden Spalt hinweg auf einen Fototransistor gerichtet ist. Wenn Strom durch die LED fließt, schaltet ihr Licht den Transistor ein, sodass das Signal den Spalt als Licht statt als Elektrizität überquert. Das ist der ganze Trick: Die beiden Seiten des Chips bleiben elektrisch getrennt, und genau das ermöglicht es einem 3,3V-ESP32, einen 12V- oder 24V-Stromkreis zu überwachen, ohne auch nur eine einzige Leitung mit ihm zu teilen.
Zwei Aufgaben, die der PC817 in einem ESP32-Projekt gut erledigt:
- Überwachen eines industriellen 24V-Näherungssensors oder eines SPS-Ausgangs und Melden seines Zustands über WLAN.
- Feststellen, ob ein 12V-Magnetventil oder die Spule eines Pumpenschützes gerade bestromt ist.
In beiden Fällen sieht der ESP32 immer nur seine eigenen 3,3V-Logikpegel, während die 12V- oder 24V-Seite hinter der Isolationsbarriere bleibt.
| Parameter | Wert |
|---|---|
| Die Isolationsspannung | 5000 Vrms (1 Minute) |
| Die Durchlassspannung der Eingangs-LED (Vf) | typisch etwa 1,2 V, max. 1,4 V |
| Der Durchlassstrom der Eingangs-LED (If) | max. 20 mA Dauerstrom, normal 5-20 mA, 10 mA ist ein guter Zielwert |
| Die Kollektor-Emitter-Spannung am Ausgang (VCEO) | max. 35 V |
| Der Kollektorstrom am Ausgang (IC) | max. 50 mA |
| Die Kollektor-Verlustleistung | 150 mW |
| Das Stromübertragungsverhältnis (CTR) | 50% bis 600% je nach Rang |
| Die Anstiegszeit / Abfallzeit | typisch etwa 4 us / etwa 3 us |
| Die Betriebstemperatur | -30 C bis +100 C |
| Das Gehäuse | 4-poliges DIP, Pin 1 durch einen Punkt oder eine Kerbe markiert |
Welches PC817-Optokopplermodul brauche ich?
Ein PC817-Optokopplermodul wird mit bereits bestücktem Vorwiderstand geliefert, und dieser Widerstand ist für eine bestimmte Eingangsspannung dimensioniert. Deshalb wird das Modul in drei separaten Varianten verkauft und nicht als eine Platine, die alles verkraftet, was man ihr zuführt. Wählen Sie die Variante passend zu dem Signal, das Sie überwachen möchten:
| Das Signal, das Sie überwachen möchten | Die zu kaufende Modulvariante |
|---|---|
| Eine 12V-Leitung – ein Magnetventil, eine Pumpenschützspule, ein Kfz-Zubehör | Das 12V-Modul |
| Eine 24V-Leitung – ein SPS-Ausgang, ein industrieller Näherungssensor, ein Maschinensignal | Das 24V-Modul |
| Ein 3,3V- oder 5V-Logiksignal – ein anderer Mikrocontroller, eine Sensorplatine, eine verbaute Steuerplatine | Das 3-5V-Modul |
Dies ist die einzige Kaufentscheidung auf dieser Seite, die Sie ein Bauteil kosten kann. Ein 12V-Modul, das an einer 24V-Leitung betrieben wird, führt etwa den doppelten vorgesehenen Strom durch seine interne LED und beschädigt sie. Ein 24V-Modul an einer 12V-Leitung hat das umgekehrte Problem: Seine LED wird zu schwach angesteuert, sodass der Ausgang verspätet, unzuverlässig oder gar nicht schaltet. Bei einem Modul gibt es nichts zu berechnen – die Variante ist der Widerstand; wählen Sie also die Variante, und die Dimensionierung ist erledigt.
Pinbelegung des PC817-Optokopplermoduls
Derselbe Chip wird auch fertig aufgebaut als PC817-Optokoppler-Isolationsmodul verkauft, in 1-, 2-, 4- und 8-Kanal-Versionen. Die Platine trägt den Vorwiderstand für ihre jeweilige Variante, meist eine Status-LED pro Kanal, Schraubklemmen auf der Eingangsseite und Stiftleisten auf der Ausgangsseite:
- Eingangsseite: eine + (oder IN+) und eine - (oder IN-) Schraubklemme. Verbinden Sie diese beiden Klemmen mit dem Signal, das Sie überwachen, und mit der Masse desselben isolierten Stromkreises – mit der Spannung, für die die Variante gebaut wurde, und mit der richtigen Polarität.
- Ausgangsseite: die Stiftleisten-Pins VCC, GND und OUT (bei Mehrkanalplatinen DO oder OUT1..OUTn genannt). Verbinden Sie diesen VCC-Pin mit dem 3,3V-Pin des ESP32, diesen GND-Pin mit einem GND-Pin des ESP32 und diesen OUT-Pin mit einem digitalen Eingangspin des ESP32.

Für dieses Projekt empfehlen wir die Modulform. Der Widerstand ist bereits für die Spannung, für die die Variante gebaut wurde, richtig dimensioniert, die Schraubklemmen halten dicke Feldverdrahtung weitaus besser als ein Steckbrett, und die Onboard-LED zeigt Ihnen den Eingangszustand an, ohne dass Sie Code lesen müssen.
Herausfinden, ob Ihr Modul Active LOW oder Active HIGH ist
Der ESP32-Pin verwendet seinen internen Pull-up-Widerstand, sodass er von sich aus HIGH ist und etwas ihn nach unten ziehen muss. Beim nackten Chip ist dieses Etwas der Fototransistor, und das Ergebnis folgt eindeutig aus der Physik:
- Das externe Signal ist VORHANDEN, die LED leuchtet, der Transistor leitet, und der ESP32-Pin liest LOW.
- Das externe Signal FEHLT, die LED ist aus, der Transistor sperrt, und der ESP32-Pin liest HIGH.
Bei einem Modul sieht die Sache anders aus, und genau hier geht gerne ein ganzer Abend verloren. Manche Hersteller führen den Fototransistor direkt an den OUT-Pin heraus, was genau das oben beschriebene Active-LOW-Verhalten ergibt. Andere fügen auf der Platine eine invertierende Stufe hinzu, sodass OUT stattdessen dem Eingang folgt und HIGH liest, solange das Signal anliegt. Beide Arten sind im Handel, auf einem Produktfoto nicht zu unterscheiden, und das Angebot verrät selten, welche Sie tatsächlich erhalten. Gehen Sie also nicht von etwas aus – finden Sie es heraus. Der Test dauert weniger als eine Minute:
- Verdrahten Sie das Modul wie unten gezeigt und laden Sie den Sketch von dieser Seite hoch, der für ein Active-LOW-Modul eingestellt ist.
- Lassen Sie die Eingangsklemmen unbeschaltet und lesen Sie ab, was der Serielle Monitor ausgibt. Das ist Ihr Ruhezustand.
- Legen Sie Ihr Signal an die Eingangsklemmen an und lesen Sie ab, was jetzt ausgegeben wird.
- Was der Pin meldet, während das Signal anliegt, ist der aktive Pegel Ihres Moduls. Wenn der Serielle Monitor beim Anlegen des Signals von idle auf LIVE wechselt, ist Ihr Modul Active-LOW und der Sketch ist bereits korrekt. Passiert das Gegenteil, ist Ihr Modul Active-HIGH.
- Die eigene Status-LED des Moduls dient zur Gegenprüfung, da sie immer dann leuchtet, wenn die Eingangsseite bestromt ist. Leuchtet die LED, zeigt der Serielle Monitor aber weiterhin idle, ist das das Kennzeichen eines Active-HIGH-Moduls und kein Verdrahtungsfehler.
Stellt sich heraus, dass es die andere Art ist, muss nichts umgeschrieben werden. Der Sketch enthält am Anfang der Datei eine einzige Konstante, MODULE_ACTIVE_LOW. Setzen Sie sie auf false, laden Sie erneut hoch, und jeder Messwert im Programm wird entsprechend umgekehrt.
Die Isolationsregel
Verbinden Sie die Masse des 12V- oder 24V-Stromkreises NICHT mit GND des ESP32. Bei einem Modul bedeutet das, dass die --Eingangsklemme auf der Feldseite bleibt und nie mit dem GND-Pin des Moduls in Berührung kommt. Die beiden Massen müssen getrennt bleiben. Diese Trennung ist der einzige Grund, warum der PC817 in der Schaltung ist: Sie verhindert, dass ein Fehler auf der 24V-Seite den ESP32 erreicht. Wenn Sie die Massen miteinander verbinden, schaltet der PC817 zwar weiterhin und der Code funktioniert noch, aber die Isolation ist weg und die Platine ist wieder ungeschützt.
Einen sicheren GPIO-Pin des ESP32 auswählen
Der ESP32 ist ein 3,3V-Board und seine GPIO-Pins sind NICHT 5V-tolerant, daher muss die Ausgangsseite des PC817-Moduls vom 3,3V-Pin versorgt werden, niemals vom 5V/VIN-Pin. Zwei weitere ESP32-spezifische Regeln sind für dieses Projekt wichtig:
- Vermeiden Sie die reinen Eingangspins GPIO34, GPIO35, GPIO36 und GPIO39. Sie haben KEINEN internen Pull-up-Widerstand, daher bewirkt INPUT_PULLUP bei ihnen nichts und der Ausgang des PC817 würde floaten. Wenn Sie wirklich einen dieser Pins benötigen, müssen Sie selbst einen externen 10-kOhm-Widerstand vom Pin nach 3,3V hinzufügen.
- Vermeiden Sie die Strapping-Pins GPIO0, GPIO2, GPIO12 und GPIO15. Der ESP32 liest sie beim Booten ein, und ein PC817, der einen davon beim Einschalten auf den falschen Pegel zieht, kann den Start des Boards verhindern.
Dieses Tutorial verwendet GPIO19, einen Allzweck-Pin mit funktionierendem internen Pull-up. GPIO4, GPIO13, GPIO16, GPIO17, GPIO18, GPIO21, GPIO22, GPIO23, GPIO25, GPIO26, GPIO27, GPIO32 und GPIO33 sind ebenso gute Wahlmöglichkeiten. Das vollständige Bild finden Sie im ESP32-Pinbelegungs-Tutorial.
Verdrahtungsdiagramm
Verdrahtung des PC817-Optokopplermoduls mit dem ESP32
Die Eingangsseite ist unabhängig von der gekauften Variante gleich: Die beiden Schraubklemmen kommen an das Signal, das Sie überwachen, und an die Masse desselben isolierten Stromkreises, und nirgendwo wird ein eigener Widerstand benötigt.
| PC817-Modul | Verbindung mit |
|---|---|
| IN+-Klemme | → der Signalleitung, die Sie überwachen, mit der Spannung Ihrer Variante |
| IN--Klemme | → NUR der Masse desselben Stromkreises |
| VCC-Pin | → 3,3V des ESP32 |
| GND-Pin | → GND des ESP32 |
| OUT-Pin | → GPIO19 des ESP32 |
Auf der Ausgangsseite haben Sie die Wahl zwischen zwei Wegen zum ESP32:
- So verbinden Sie ESP32 und PC817-Optokopplermodul mit einem Steckbrett

Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.
Wenn Sie nicht wissen, wie Sie ESP32 und andere Komponenten mit Strom versorgen, finden Sie Anleitungen im folgenden Tutorial: Wie man ESP32 mit Strom versorgt.
- So verbinden Sie ESP32 und PC817-Optokopplermodul mit einem Schraubklemmen-Breakout-Board

Die Schraubklemmen-Version ist diejenige für eine echte Installation. Die Feldverdrahtung von einer 24V-Maschine ist dick und bewegt sich, und ein Steckbrettkontakt, der sich lockert, liefert Ihnen einen Phantom-Messwert, der sehr schwer zu debuggen ist.
Beachten Sie, dass sich diese beiden Schaltpläne nur darin unterscheiden, wie die drei Ausgangspins des Moduls den ESP32 erreichen. Die gekaufte Variante bestimmt, was an den Eingangsklemmen geschieht, und ändert nichts auf der Ausgangsseite – es handelt sich also um zwei Verdrahtungsoptionen und drei Varianten, nicht um sechs verschiedene Dinge zum Kaufen.
Den PC817 parallel zur zu überwachenden 12V-Last verdrahten
Alles oben Beschriebene setzt voraus, dass Sie bereits eine freie Signalleitung zum Auslesen haben. Die meisten realen Projekte haben das nicht. Was sie haben, ist ein 12V-Magnetventil oder die Spule des Schützes, das eine Pumpe startet, und die Frage lautet, ob diese Spule in diesem Moment bestromt ist. Der PC817 beantwortet sie – aber nur, wenn Sie ihn richtig an den Stromkreis anschließen.
Der Moduleingang wird über das Gerät gelegt, parallel dazu, und niemals in Reihe damit. Schalten Sie ihn in Reihe, fließt der gesamte Laststrom des Ventils oder der Schützspule durch die winzige LED im Gehäuse und zerstört den PC817 in dem Moment, in dem der Stromkreis einschaltet. Parallel verdrahtet wird im bestehenden Stromkreis nichts durchtrennt, abgesteckt oder umgeleitet; Sie fügen einfach zwei Drähte an Klemmen hinzu, die bereits vorhanden sind.
| Anschlusspunkt | Verbindung mit |
|---|---|
| Positive (geschaltete) Klemme der Spule | → IN+-Schraubklemme des 12V-Moduls |
| Negative (Rückleiter-)Klemme der Spule | → IN--Schraubklemme des 12V-Moduls |
| VCC-Pin des Moduls | → 3,3V des ESP32 |
| GND-Pin des Moduls | → GND des ESP32 |
| OUT-Pin des Moduls | → GPIO19 des ESP32 |
An der Abgriffstelle muss kein Vorwiderstand hinzugefügt werden – das 12V-Modul trägt bereits den benötigten, und genau deshalb muss die Variante zur Spannung der Spule passen. Der Abgriff zieht nur den kleinen Strom, den die Eingangs-LED des Moduls benötigt. Verglichen mit den Hunderten von Milliampere, die ein Magnetventil oder eine Schützspule im gehaltenen Zustand aufnimmt, ist das nichts, sodass das Gerät genau so weiterarbeitet wie zuvor. Es handelt sich um eine reine Lesemessung, nicht um einen Eingriff.
Die Polarität ist hier wichtig. Die Eingangsseite des PC817 ist eine LED und leitet nur in eine Richtung. Werden die beiden Eingangsklemmen vertauscht, schaltet das Modul einfach nie ein, und Sie verbringen einen Abend mit der Suche nach einem Fehler, den es nicht gibt. Finden Sie heraus, welche Seite des Abgriffs positiv ist, bevor Sie einen Draht abisolieren.
Ein Magnetventil, eine Schützspule, eine Relaisspule oder ein Motor ist eine induktive Last, und eine induktive Last erzeugt bei jedem Abschalten eine große Gegenspannung. Die Eingangs-LED des PC817 ist in Sperrrichtung nur für 6 V ausgelegt, daher reicht diese Spitze aus, um sie zu zerstören.
※ Notiz:
Setzen Sie eine gewöhnliche Diode antiparallel direkt über die beiden Eingangsklemmen des Moduls – Kathode der Diode an IN+, Anode der Diode an IN- (beim nackten Chip Kathode an Pin 1 und Anode an Pin 2). Im Normalbetrieb ist sie in Sperrrichtung gepolt und bewirkt überhaupt nichts; bei einer Abschaltspitze leitet sie und begrenzt die Gegenspannung auf deutlich unter ein Volt. Eine 1N4148 eignet sich für einen kleinen Abgriff, eine 1N4007 für einen stärkeren.
Noch eine Falle auf der Maschinenseite: Manche SPS-Transistorausgänge, Triac-Ausgänge und LED-Lampentreiber lassen auch im ausgeschalteten Zustand etwas Strom durch. Genug Leckstrom lässt die LED des PC817 teilweise leuchten, und der ESP32 meldet dann das Ventil als laufend, obwohl es stillsteht. Das Symptom ist leicht zu erkennen – ein Messwert, der nie auf inaktiv zurückfällt. Abhilfe schafft ein Ableitwiderstand von etwa 4,7 kOhm bis 10 kOhm parallel zu den Eingangsklemmen des Moduls, sodass der Leckstrom über ihn statt über die LED abfließt.
Schließlich handelt es sich um eine reine DC-Technik. Der Eingang des PC817 ist eine einzelne LED und reagiert nur auf eine Polarität, daher ist er das falsche Bauteil zum Erfassen einer Wechselspannungsleitung – dafür benötigen Sie einen Optokoppler, dessen Eingangsstufe zwei antiparallele LEDs enthält.
Optional - Denselben Eingang mit einem nackten PC817-Chip aufbauen
Wenn Sie den Eingang lieber selbst aufbauen möchten, statt ein Modul zu kaufen, erledigt der nackte 4-polige Chip dieselbe Aufgabe – Sie liefern lediglich den Widerstand, den das Modul bereits bestückt gehabt hätte. Halten Sie den Chip so, dass der Punkt oder die Kerbe, die Pin 1 markiert, oben links ist; die Pins verlaufen von dort aus gegen den Uhrzeigersinn. Verbinden Sie diesen Pin 1 (Anode) über den Vorwiderstand mit der Signalleitung, verbinden Sie diesen Pin 2 (Kathode) mit der Masse des isolierten Stromkreises und nirgendwo sonst, verbinden Sie diesen Pin 3 (Emitter) mit einem GND-Pin des ESP32 und verbinden Sie diesen Pin 4 (Kollektor) mit GPIO19. Dimensionieren Sie den Widerstand für etwa 10 mA durch die LED mit R = (Vin - 1.2) / 0.01, was 220 Ohm für ein 3,3V-Signal, 390 Ohm für 5V, 1 kOhm für 12V und 2,2 kOhm für 24V ergibt. Übernehmen Sie niemals den 12V-Widerstand für eine 24V-Leitung: 1 kOhm treibt dort etwa 22,8 mA durch eine LED, die für 20 mA ausgelegt ist. So verdrahtet ist der nackte Chip immer Active-LOW, sodass der Sketch keine Änderung benötigt.

Was der Messwert über das laufende Gerät verrät
Da der Abgriff parallel zum Ventil oder zur Schützspule sitzt und nicht in der Steuerleitung, liest der ESP32 den tatsächlichen Zustand des Geräts und nicht nur ein Echo des Befehls, den Sie gegeben haben. Wenn ein Druckschalter, ein Timer, eine SPS oder eine Person in der Werkshalle die Pumpe einschaltet, folgt der Messwert. Wenn Sie sie eingeschaltet haben, sie aber nie angelaufen ist – eine durchgebrannte Sicherung, ein ausgelöster Überlastschutz, ein gebrochener Draht draußen im Feld –, bleibt der Messwert inaktiv und zeigt genau das an. Dadurch wird diese kleine Schaltung zu einem Betriebsstundenzähler für eine Pumpe, zu einer Warnung „Hat das Ventil wirklich geöffnet?“ oder zu einem Stillstandsprotokoll für eine Maschine – alles über WLAN gemeldet und ohne eine einzige gemeinsame Leitung mit der 12V-Seite.
Seien Sie aber ehrlich darüber, was der Messwert beweist: Er sagt Ihnen, dass das Gerät bestromt ist, nicht dass es seine Aufgabe erfüllt – ein festgefressener Pumpenmotor oder ein durchgebranntes Heizelement nimmt weiterhin Strom auf und wird trotzdem als EIN angezeigt.
Wie man den ESP32 zum Auslesen des PC817 programmiert
- Konfigurieren Sie den ESP32-Pin mit der Funktion pinMode() als digitalen Eingang mit aktiviertem internen Pull-up-Widerstand. Der Pull-up sorgt dafür, dass der Ruhezustand HIGH ist. Zum Beispiel Pin GPIO19:
- Lesen Sie den Rohzustand des Pins mit der Funktion digitalRead() aus.
- Wandeln Sie diesen Rohpegel in einer einzigen Zeile über die Polaritätskonstante in einen Signalzustand um, sodass sich der restliche Code natürlich liest und ein Modul der anderen Art Sie nur eine Änderung statt einer Neuschreibung kostet.
- Geben Sie das Ergebnis mit Serial.println() aus oder verwenden Sie es, um etwas anderes anzusteuern – zum Beispiel ein Relais.
ESP32-Code - PC817-Optokoppler
Schnelle Schritte
- Wenn Sie den ESP32 zum ersten Mal verwenden, sehen Sie sich an, wie man die Umgebung für den ESP32 in der Arduino IDE einrichtet.
- Führen Sie die Verdrahtung gemäß dem obigen Modul-Schaltplan durch und prüfen Sie doppelt, dass die 12V/24V-Masse NICHT mit GND des ESP32 in Berührung kommt.
- Verbinden Sie das ESP32-Board über ein USB-Kabel mit Ihrem PC.
- Öffnen Sie die Arduino IDE auf Ihrem PC.
- Wählen Sie das richtige ESP32-Board (z. B. ESP32 Dev Module) und den COM-Port aus.
- Kopieren Sie den obigen Code und fügen Sie ihn in die Arduino IDE ein.
- Klicken Sie in der Arduino IDE auf die Schaltfläche Upload, um den Code zu kompilieren und auf das ESP32-Board hochzuladen.
- Öffnen Sie den Seriellen Monitor in der Arduino IDE.
- Schalten Sie das externe 12V- oder 24V-Signal einige Male ein und aus.
- Vergleichen Sie die Ausgabe des Seriellen Monitors mit der Status-LED des Moduls. Wenn beide nicht übereinstimmen, setzen Sie MODULE_ACTIVE_LOW im Code auf false und laden Sie erneut hoch.
- Sehen Sie sich das Ergebnis im Seriellen Monitor an. Es sieht wie folgt aus:
Wenn der Serielle Monitor ständig LIVE ausgibt, obwohl nichts angeschlossen ist, liegt eine von zwei Ursachen vor. Entweder floatet der ESP32-Pin – prüfen Sie, ob Sie einen Pin gewählt haben, der tatsächlich einen internen Pull-up hat, und ob GND des Moduls (bzw. Pin 3 des nackten Chips) wirklich einen GND-Pin des ESP32 erreicht – oder Ihr Modul ist ein Active-HIGH-Modul, was Ihnen die Status-LED sofort verrät.
Wenn Sie mit digitalen Eingängen auf diesem Board weitermachen möchten, behandeln die Tutorials ESP32 - Button und ESP32 - Limit Switch dasselbe Lese-und-Invertier-Muster für mechanische Kontakte, und ESP32 - Measure Voltage behandelt den Fall, in dem Sie den tatsächlichen Spannungswert benötigen und nicht nur vorhanden/nicht vorhanden.
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.