Arduino - PC817 Optokoppler: 12V/24V DC-Eingangssignal überwachen
Ein Arduino-Eingangspin ist für 5V ausgelegt und für nichts darüber hinaus. Wer eine 12V- oder 24V-Leitung direkt daran anschließt, zerstört den Pin. Der PC817-Optokoppler löst dieses Problem auf sichere Weise: Er überträgt das Signal als Licht über eine isolierende Lücke, sodass der Arduino erkennen kann, ob die externe Spannung anliegt, ohne sie jemals elektrisch zu berühren.
Am einfachsten verwenden Sie ein fertiges PC817-Optokoppler-Isolationsmodul: Der Widerstand und eine Status-LED sind bereits auf der Platine, und die externen Leitungen werden in Schraubklemmen gesteckt. Dieses Tutorial verwendet das Modul als Hauptweg.
In diesem Tutorial lernen wir:
- Wie der PC817-Optokoppler funktioniert
- Wie man das richtige Modul für ein 3,3V-, 5V-, 12V- oder 24V-Signal auswählt
- Wie man das Modul mit dem Arduino verdrahtet
- Wie man ein Gerät parallel abgreift, um zu sehen, ob es läuft
- Wie man herausfindet, ob das eigene Modul active-LOW oder active-HIGH liest
- Wie man den Arduino programmiert, um den isolierten Eingang auszulesen

Dies ist die Standardmethode, um mit einem Niederspannungsboard sicher ein 12V-DC-Signal zu erkennen oder einen 24V-SPS-Ausgang zu überwachen. Es ist außerdem die einfachste Antwort auf eine Frage, die in einer Werkstatt oder einem Maschinenraum ständig auftaucht: Läuft diese Pumpe, diese Heizung, diese Lampe oder dieser Motor gerade wirklich? Der Arduino muss nur sehen, ob Strom beim Gerät ankommt, und der PC817 lässt ihn das aus sicherer Entfernung sehen.
Erforderliche Hardware
Oder Sie können die folgenden Kits kaufen:
| 1 | × | DIYables STEM V3 Starter-Kit (Arduino enthalten) | |
| 1 | × | DIYables Sensor-Kit (18 Sensoren/Displays) |
Sie benötigen nur EIN Modul: dasjenige, das zur Spannung des Signals passt, das Sie überwachen möchten.
Über den PC817-Optokoppler
Der PC817 ist ein 4-poliger Optokoppler, auch Fotokoppler oder Optoisolator genannt. In seinem 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. Das Signal wird also als Licht statt als Elektrizität übertragen, weshalb beide Seiten elektrisch getrennt bleiben.
Diese Lücke ist für eine Isolation von 5000 Vrms über eine Minute ausgelegt, sodass ein Fehler auf der 12V- oder 24V-Seite den Arduino nicht erreichen kann.
Ein PC817-Optokoppler-Isolationsmodul ist dieser Chip auf einer kleinen Platine mit bereits bestücktem Vorwiderstand, einer Status-LED, Schraubklemmen für das externe Signal und Stiftleisten für den Arduino. Module gibt es in Ausführungen mit 1, 2, 4 und 8 Kanälen.
Die nützlichen Werte aus dem PC817-Datenblatt:
- LED-Durchlassspannung (Vf): typisch etwa 1,2V, max. 1,4V
- LED-Durchlassstrom (If): max. 20mA dauerhaft, 5mA bis 20mA ist der normale Bereich, 10mA ist ein guter Zielwert
- Kollektor-Emitter-Spannung am Ausgang (VCEO): max. 35V
- Kollektorstrom am Ausgang (IC): max. 50mA
- Kollektor-Verlustleistung: 150mW
- Isolationsspannung: 5000 Vrms für 1 Minute
- Stromübertragungsverhältnis (CTR): 50% bis 600% je nach Klasse (Klasse A 80-160%, B 130-260%, C 200-400%, D 300-600%)
- Schaltgeschwindigkeit: Anstiegszeit etwa 4us, Abfallzeit etwa 3us
- Betriebstemperatur: -30 bis +100 Grad Celsius
Welches Optokopplermodul brauche ich?
Das ist die eine Entscheidung, die Sie vor dem Kauf richtig treffen müssen. Der Widerstand auf dem Modul ist bereits bestückt und für eine bestimmte Eingangsspannung dimensioniert, daher wird das Modul in drei separaten Varianten verkauft. Schauen Sie sich das Signal an, das Sie überwachen möchten, und kaufen Sie dann die passende Variante:
| Zu überwachendes Signal | Zu kaufendes Modul |
|---|---|
| 3,3V- oder 5V-Logik | 3-5V-Modul |
| 12V DC | 12V-Modul |
| 24V DC | 24V-Modul |
Mit einem Modul berechnen Sie nie einen Widerstand. Die Wahl der Variante IST die Entscheidung über den Widerstand, die bereits für Sie getroffen wurde.
WARNING
Betreiben Sie ein Modul nicht mit der falschen Spannung. Ein 12V-Modul, das an einer 24V-Leitung hängt, erhält ungefähr den doppelten vorgesehenen Strom durch seine interne LED und wird beschädigt. Ein 24V-Modul an einer 12V-Leitung wird zu schwach angesteuert, sodass der Ausgang verspätet, unzuverlässig oder überhaupt nicht schaltet. Keiner der beiden Fehler macht sich bemerkbar: Am Ende haben Sie einfach ein totes Modul oder einen Messwert, dem Sie nicht trauen können.
※ Notiz:
Auch ein 5V- oder 3,3V-Signal lohnt sich zu isolieren. Bei der Isolation geht es darum, den Massepfad zu unterbrechen, nicht nur um hohe Spannung. Sie ist daher immer dann sinnvoll, wenn die beiden Schaltungen aus getrennten Netzteilen versorgt werden, an entgegengesetzten Enden eines langen Kabels liegen oder eine von ihnen elektrisch störbehaftet ist, etwa ein Motortreiber oder die Niederspannungs-Steuerplatine in einem netzbetriebenen Gerät. Genau das ist die Aufgabe des 3-5V-Moduls.
Wie es funktioniert
- Wenn das externe Signal an den Eingangsklemmen anliegt, fließt Strom durch den Widerstand des Moduls und die interne LED. Die LED leuchtet auf und schaltet den Fototransistor ein, und der OUT-Pin des Moduls ändert seinen Zustand.
- Wenn das externe Signal fehlt, ist die LED aus, der Fototransistor ist aus, und OUT kehrt in seinen Ruhezustand zurück.
Die Status-LED auf dem Modul leuchtet zusammen mit der internen LED, sodass Sie mit eigenen Augen sehen können, dass die Eingangsseite arbeitet.
Der PC817 misst die Spannung nicht. Er teilt dem Arduino nur mit, ob das externe Signal vorhanden ist oder nicht. Wenn Sie statt einer Ja/Nein-Antwort den tatsächlichen Wert benötigen, siehe Arduino - Spannung messen.
Verdrahtungsdiagramm
Verdrahtung des PC817-Optokopplermoduls mit dem Arduino
Das Modul hat zwei Seiten, und genau darum geht es: Die Schraubklemmen gehören zum externen Stromkreis, die Stiftleiste gehört zum Arduino, und nichts verbindet die beiden miteinander.
- Das externe 12V/24V-Signal muss mit der Schraubklemme IN+ verbunden werden
- Die Masse des externen Stromkreises muss mit der Schraubklemme IN- verbunden werden
- Der VCC-Pin des Moduls muss mit dem 5V-Pin des Arduino verbunden werden
- Der GND-Pin des Moduls muss mit dem GND-Pin des Arduino verbunden werden
- Der OUT-Pin des Moduls muss mit dem Pin D2 des Arduino verbunden werden

Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.
In dieser Verdrahtung muss nirgendwo ein Vorwiderstand ergänzt werden. Das Modul hat ihn bereits.
※ Notiz:
Verbinden Sie die Masse des 12V/24V-Stromkreises NICHT mit dem GND des Arduino. Die Klemme IN- und der GND-Pin des Moduls müssen getrennt bleiben, und genau diese Trennung schützt den Arduino. Wenn Sie sie miteinander verbinden, schaltet das Modul zwar weiterhin, aber die Isolation ist weg, und ein Optokoppler ist dann völlig sinnlos.
Den PC817 parallel zum überwachten Gerät anschließen
Meistens bekommt man keine freie Signalleitung. Sie haben ein Gerät, das bereits verdrahtet ist und bereits funktioniert, und Sie möchten, dass der Arduino weiß, wann es eingeschaltet ist. In diesem Fall wird der Moduleingang über das Gerät gelegt, also parallel dazu, genauso wie ein Voltmeter angeschlossen würde. Im bestehenden Stromkreis wird nichts aufgetrennt, verschoben oder umgeleitet.
Nehmen wir als Beispiel eine 12V-Relaisspule, was dies zu einer Aufgabe für das 12V-Modul macht. Die Spule hat bereits einen Plus-Anschluss, der Spannung führt, wenn das Relais angezogen ist, und einen Minus-Anschluss, der zur Masse der 12V-Versorgung zurückführt. Für den Abgriff sind nur zwei zusätzliche Leitungen nötig:
- Vom Plus-Anschluss (geschaltet) der Spule zur Klemme IN+ des Moduls.
- Vom Minus-Anschluss (Rückleitung) der Spule zur Klemme IN- des Moduls.
- VCC, GND und OUT gehen weiterhin an Arduino 5V, Arduino GND und Arduino D2, genau wie in der obigen Verdrahtung.
Der Abgriff zieht etwa 10mA. Eine 12V-Relaisspule nimmt allein etwa 30 bis 80mA auf, sodass die zusätzlichen 10mA nichts ändern und das Relais genau wie zuvor weiterarbeitet. Dies ist eine reine Lesemessung: Der PC817 beobachtet die Spule, er schaltet sie nicht.
WARNING
Schalten Sie das Modul niemals in Reihe mit dem Gerät. In Reihe müsste der gesamte Laststrom der Relaisspule, Lampe oder des Motors durch die winzige LED im PC817 fließen, die für 20mA ausgelegt ist, und der Optokoppler würde in dem Moment zerstört, in dem Sie das Gerät einschalten. Der Eingang liegt immer parallel zum Gerät, niemals in Reihe damit.
Da der Abgriff parallel zur Spule liegt statt in einer Arduino-Ausgangsleitung, folgt der Messwert dem, was das Gerät tatsächlich tut. Wenn ein Thermostat, ein Timer, eine SPS oder eine Person das Relais einschaltet, sieht der Arduino das. Wenn das Relais den Einschaltbefehl erhält, aber nie anzieht, weil eine Sicherung durchgebrannt ist oder sich ein Draht gelöst hat, sieht der Arduino auch das. Genau das macht den Aufbau lohnenswert für Betriebsstundenzähler, Stillstandsprotokolle und "Ist es wirklich angelaufen?"-Warnungen. Seien Sie aber ehrlich darüber, was gemessen wird: Es sagt Ihnen, dass das Gerät unter Spannung steht, nicht dass es seine Arbeit verrichtet. Ein festgefressener Motor oder ein durchgebranntes Heizelement nimmt weiterhin Strom auf und wird weiterhin als ON gemeldet.
Drei Dinge, die Sie prüfen sollten, bevor Sie den Abgriff mit Strom versorgen:
- Polarität. Die Eingangsseite ist eine LED und leitet daher nur in eine Richtung. Wenn IN+ und IN- vertauscht sind, schaltet das Modul einfach nie ein. Finden Sie heraus, welche Seite des Abgriffs die positive ist, bevor Sie ihn verdrahten.
- Ausgänge mit Leckstrom. Manche SPS-Transistorausgänge, Triac-Ausgänge und LED-Lampentreiber lassen auch im ausgeschalteten Zustand einen kleinen Strom durch. Dieser Leckstrom kann die PC817-LED teilweise zum Leuchten bringen, und der Arduino meldet das Gerät dann als ON, obwohl es eigentlich OFF ist. Das Symptom ist leicht zu erkennen: Der Messwert geht nie wieder auf ABSENT zurück. Die Abhilfe ist ein Ableitwiderstand von etwa 4,7 kOhm bis 10 kOhm zwischen den Klemmen IN+ und IN-, sodass der Leckstrom durch den Widerstand statt durch die LED fließt.
- Wechselspannungsleitungen. Der PC817-Eingang ist eine einzelne LED, er reagiert also nur auf eine Polarität und ist das falsche Bauteil zur Erfassung einer Wechselspannungsleitung. Dafür wird ein Optokoppler benötigt, dessen Eingangsstufe zwei antiparallele LEDs hat.
WARNING
Eine Relaisspule ist eine induktive Last. Beim Abschalten erzeugt ihr zusammenbrechendes Magnetfeld eine Gegenspannungsspitze über der Spule, die um ein Vielfaches größer ist als die 12V, mit denen sie betrieben wurde, und die Eingangs-LED des PC817 ist in Sperrrichtung nur für 6V ausgelegt. Setzen Sie eine gewöhnliche Diode antiparallel direkt über die Klemmen IN+ und IN-: die Kathode der Diode an IN+, die Anode der Diode an IN-. Im Normalbetrieb ist diese Diode in Sperrrichtung gepolt und tut überhaupt nichts, aber wenn die Spitze kommt, leitet sie und begrenzt die Sperrspannung auf deutlich unter ein Volt. Eine 1N4148 reicht für einen kleinen Abgriff wie diesen aus, eine 1N4007 für größere. Dasselbe gilt für Magnetspulen, Schütze, Ventile und Motoren.
Ist Ihr Optokopplermodul active-HIGH oder active-LOW?
Beim nackten Chip ist das eindeutige Physik. Bei aktiviertem internen Pull-up zieht der Fototransistor den Pin nach unten, wenn die LED leuchtet, also:
- Externes Signal VORHANDEN: Der Arduino-Pin liest LOW
- Externes Signal FEHLT: Der Arduino-Pin liest HIGH
Module sind nicht so vorhersehbar. Die meisten verhalten sich genau wie der nackte Chip, aber manche Hersteller invertieren den Ausgang auf der Platine, sodass OUT stattdessen dem Eingang folgt. Beide Arten sind im Handel erhältlich, und Sie können sie optisch nicht unterscheiden, also prüfen Sie Ihr Modul. Das dauert weniger als eine Minute:
- Verdrahten Sie das Modul wie oben beschrieben und laden Sie den untenstehenden Sketch unverändert hoch.
- Wenn nichts an den Eingangsklemmen angeschlossen ist, schauen Sie in den Serial Monitor und notieren Sie, was er ausgibt.
- Legen Sie nun das externe Signal an und notieren Sie, was er ausgibt.
- Der Pegel, den der Pin liest, während das Signal anliegt, ist der aktive Pegel Ihres Moduls.
- Gleichen Sie das mit der Status-LED des Moduls ab: Sie leuchtet, solange die Eingangsseite unter Spannung steht. Wenn diese LED leuchtet, der Serial Monitor aber trotzdem ABSENT anzeigt, ist Ihr Modul die andere Art.
Wenn die Messwerte vertauscht herauskommen, schreiben Sie nichts um. Ändern Sie die einzelne Zeile const bool MODULE_ACTIVE_LOW = true; am Anfang des Codes auf false und laden Sie ihn erneut hoch.
Der active-LOW-Fall entspricht demselben Muster wie bei einem Taster oder einem Endschalter, die mit einem Pull-up verdrahtet sind.
Optional: Aufbau mit dem nackten PC817-Chip
Wenn Sie den Eingang lieber selbst aufbauen möchten, erledigt der nackte 4-polige Chip dieselbe Aufgabe für ein paar Cent, allerdings müssen Sie den Vorwiderstand nun selbst dimensionieren. Pin 1 ist auf dem Chip durch einen Punkt oder eine Kerbe gekennzeichnet.
- Pin 1 - Anode (A): Das externe Signal muss hier über den Vorwiderstand angeschlossen werden
- Pin 2 - Kathode (K): Muss mit der Masse des externen Stromkreises verbunden werden, NICHT mit dem GND des Arduino
- Pin 3 - Emitter (E): Muss mit dem GND des Arduino verbunden werden
- Pin 4 - Kollektor (C): Muss mit dem Pin D2 des Arduino verbunden werden

Dimensionieren Sie den Widerstand für etwa 10mA mit R = (Vin - 1.2) / 0.01. Das ergibt 220 Ohm für 3,3V, 390 Ohm für 5V, 1 kOhm für 12V und 2,2 kOhm für 24V. Ein 1/4W-Widerstand ist bis 12V ausreichend, bei 24V verwenden Sie 1/2W.
Alles andere auf dieser Seite - der Parallelabgriff, die Klemmdiode, der Code - funktioniert auf die gleiche Weise.
Wie man den PC817 programmiert
- Konfiguriert einen Arduino-Pin mit der Funktion pinMode() als digitalen Eingang mit internem Pull-up. Zum Beispiel Pin 2:
- Liest den Zustand dieses Pins mit der Funktion digitalRead():
- Wandelt diesen Messwert in eine Ja/Nein-Antwort um. Eine einzige Konstante legt fest, in welche Richtung das geschieht, sodass Sie Ihr eigenes Modul anpassen können, ohne etwas anderes zu ändern:
Für dieses Projekt wird keine Bibliothek benötigt.
Arduino-Code - PC817 Optokoppler
Schnelle Schritte
- Verbinden Sie den Arduino über ein USB-Kabel mit dem PC
- Verdrahten Sie alles gemäß dem obigen Verdrahtungsdiagramm des Moduls
- Öffnen Sie die Arduino IDE und wählen Sie das richtige Board und den richtigen Port aus
- Kopieren Sie den obigen Code und öffnen Sie ihn mit der Arduino IDE
- Klicken Sie in der Arduino IDE auf die Schaltfläche Upload, um den Code auf den Arduino hochzuladen
- Schalten Sie das externe 12V/24V-Signal ein und aus
- Sehen Sie sich das Ergebnis im Serial Monitor an.
Wenn PRESENT und ABSENT vertauscht herauskommen, ist Ihr Modul die active-HIGH-Art: Setzen Sie MODULE_ACTIVE_LOW auf false und laden Sie den Code erneut hoch.
Von hier aus deckt dieselbe Schaltung viele Anwendungen ab: die Überwachung der Betriebs- oder Störungslampenleitung einer 24V-Maschine, die Prüfung, ob ein 12V-Fahrzeugstromkreis wie die Zündung oder die Scheinwerfer Spannung führt, oder die Erkennung, wann eine 24V-Magnetspule erregt wird. Sobald der Arduino den Zustand kennt, können Sie mit einem Relais, einem Summer oder einem Protokolleintrag darauf reagieren: die Betriebsstunden einer Pumpe zählen, einen Alarm auslösen, wenn eine Maschine starten sollte, es aber nicht tat, oder protokollieren, wie lange eine Produktionslinie stillstand.
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.