Raspberry Pi - PC817 Optokoppler: 12V/24V DC-Eingangssignal überwachen

Die GPIO-Pins eines Raspberry Pi arbeiten mit 3,3V und sind NICHT 5V-tolerant. Ein verirrter 12V- oder 24V-Draht, der die 40-polige Stiftleiste berührt, beschädigt daher nicht nur einen Pin – meist zerstört er das ganze Board, einschließlich SD-Kartensteckplatz, Ethernet-Anschluss und allem anderen darauf. Ein PC817-Optokoppler beseitigt dieses Risiko vollständig: Die externe Spannung erreicht den Pi nie, weil das Signal die Lücke als Licht statt als Strom überquert.

Die meisten, die so ein Bauteil verdrahten, stellen eigentlich eine einfache Frage: Läuft diese Maschine, Pumpe, Heizung oder Lampe gerade wirklich? Ein Raspberry Pi ist eine gute Antwort darauf, denn er kann wochenlang eingeschaltet bleiben und aufzeichnen, was er beobachtet hat. Dieses Tutorial zeigt, wie Sie einen Raspberry Pi in einen ständig laufenden Knoten verwandeln, der eine isolierte 12V- oder 24V-Leitung überwacht und darüber Buch führt. Im Detail lernen wir:

Wir empfehlen:

Raspberry Pi PC817-Optokoppler isolierter 12V-24V-Eingang

Erforderliche Hardware

1×Raspberry Pi 5
1×Micro-SD-Karte
1×PC817 Optocoupler Isolation Module - 3-5V version
1×PC817 Optocoupler Isolation Module - 12V version
1×12V Netzteil
1×(Alternativ) 24V Power Adapter
1×DC-Stromanschluss
1×Breadboard
1×Verbindungskabel
1×(Empfohlen) Schraubklemmenblock-Shield für Raspberry Pi
1×(Empfohlen) Raspberry Pi Prototyping-Grundplatte & Breadboard-Kit

Oder Sie können die folgenden Kits kaufen:

1×DIYables Sensor-Kit (18 Sensoren/Displays)
Offenlegung: Einige der in diesem Abschnitt bereitgestellten Links sind Amazon-Affiliate-Links. Wir können eine Provision für Käufe erhalten, die über diese Links getätigt werden, ohne zusätzliche Kosten für Sie. Wir schätzen Ihre Unterstützung.

Die Modulvarianten sind dieselbe Platine in verschiedenen Ausführungen – Sie kaufen die, die zu Ihrem Signal passt, nicht mehrere.

Über den PC817-Optokoppler

Der PC817 ist ein Fotokoppler, auch Opto-Isolator oder Optokoppler genannt. In seinem kleinen schwarzen Gehäuse befindet sich eine Infrarot-LED, die über einen isolierenden Spalt hinweg einem Fototransistor gegenübersteht. Wenn Strom durch die LED fließt, schaltet ihr Licht den Fototransistor ein. Da nur Licht den Spalt überquert, bleiben die beiden Seiten des Chips elektrisch voneinander getrennt – und genau das schützt den Raspberry Pi.

Die technischen Daten des PC817 sind:

  • Gehäuse: 4-poliges DIP, Pin 1 mit einem Punkt oder einer Kerbe markiert
  • Durchlassspannung der Eingangs-LED (Vf): typisch etwa 1,2 V, maximal 1,4 V
  • Durchlassstrom der Eingangs-LED (If): maximal 20 mA dauerhaft, 5 mA bis 20 mA im Normalbetrieb, 10 mA ist ein guter Zielwert
  • Kollektor-Emitter-Spannung des Ausgangs (VCEO): maximal 35 V
  • Kollektorstrom des Ausgangs (IC): maximal 50 mA
  • Kollektor-Verlustleistung: 150 mW
  • Isolationsspannung: 5000 Vrms für 1 Minute
  • Stromübertragungsverhältnis (CTR): 50% bis 600% je nach Klasse (Klasse A 80-160%, Klasse B 130-260%, Klasse C 200-400%, Klasse D 300-600%)
  • Schaltgeschwindigkeit: Anstiegszeit etwa 4 us, Abfallzeit etwa 3 us
  • Betriebstemperatur: -30 °C bis +100 °C

Die Isolationsspannung von 5000 Vrms ist der für einen Raspberry Pi entscheidende Wert. Er bedeutet, dass der 12V- oder 24V-Stromkreis fünftausend Volt Isolierung durchschlagen müsste, bevor er die Stiftleiste erreichen könnte.

Das PC817-Optokoppler-Isolationsmodul

Der praktische Weg, einen PC817 mit einem Raspberry Pi zu verwenden, ist ein fertiges Isolationsmodul. Es trägt denselben Chip auf einer kleinen Platine zusammen mit einem Vorwiderstand, einer Status-LED und Schraubklemmen, sodass nichts berechnet oder gelötet werden muss:

Pinbelegung des PC817-Optokoppler-Isolationsmoduls
  • Schraubklemmen IN+ und IN-: die Eingangsseite. Das 12V/24V-Signal muss an IN+ angeschlossen werden und die Masse desselben 12V/24V-Stromkreises an IN-.
  • VCC-Pin: muss mit 3,3V (Pin 1) des Raspberry Pi verbunden werden.
  • GND-Pin: muss mit einem Masse-Pin des Raspberry Pi verbunden werden, zum Beispiel GND (Pin 6).
  • OUT-Pin (manchmal als DO oder OUT1 bezeichnet): muss mit einem GPIO-Pin des Raspberry Pi verbunden werden, zum Beispiel GPIO 12 (Pin 32).

Die Status-LED auf der Platine sollten Sie kennen, bevor Sie etwas verdrahten: Sie leuchtet, wenn die Eingangsseite unter Spannung steht, und zeigt Ihnen so, dass die Eingangshälfte funktioniert, noch bevor der Raspberry Pi eingeschaltet ist.

※ Notiz:

Die Anordnung der Pins eines Moduls kann je nach Hersteller unterschiedlich sein. Manche Platinen vertauschen VCC und GND, und manche beschriften die Eingangsklemmen mit + und - statt mit IN+ und IN-. Verlassen Sie sich immer auf die Beschriftung Ihres eigenen Moduls statt auf das Bild oben, und schauen Sie genau hin, bevor Sie etwas mit Spannung versorgen.

Welches Optokoppler-Modul brauche ich – 3-5V, 12V oder 24V?

Dies ist die einzige Kaufentscheidung auf der ganzen Seite, und man kann sie leicht falsch treffen, weil alle drei Varianten identisch aussehen. Der Vorwiderstand ist bereits auf der Platine bestückt und für EINE Eingangsspannung ausgelegt. Deshalb werden die Module als drei separate Versionen verkauft:

Die zu überwachende Leitung Das zu kaufende Modul Typisches Beispiel
Ein 3,3V- oder 5V-Logiksignal das 3-5V-Modul ein Sensorausgang, ein 5V-SPS-Signal, ein anderer Mikrocontroller
Ein 12V-DC-Signal das 12V-Modul ein Kfz-Stromkreis, eine 12V-Pumpe oder ein 12V-Lüfter, eine Alarmzentrale
Ein 24V-DC-Signal das 24V-Modul ein Ausgang einer Industriemaschine, ein USV-Alarmkontakt, ein 24V-Magnetventil

Zwei Fehler sollten Sie vermeiden, denn sie kosten entweder ein Modul oder einen Nachmittag:

  • Wird ein 12V-Modul an einer 24V-Leitung betrieben, fließt etwa der doppelte vorgesehene Strom durch seine interne LED, was sie beschädigt.
  • Wird ein 24V-Modul an einer 12V-Leitung betrieben, wird die LED zu schwach angesteuert, sodass der Ausgang verspätet, unzuverlässig oder gar nicht schaltet – und ein sporadisch funktionierender Eingang ist weit schwerer zu diagnostizieren als ein toter.

Wenn Ihr Signal zwischen den genannten Spannungen liegt oder Sie nicht sicher sind, welche Spannung es hat, messen Sie es vor der Bestellung mit einem Multimeter. Bei einem Modul berechnen Sie nichts, Sie wählen die richtige Variante – und diese Wahl ist beim Modul das Gegenstück zur manuellen Auswahl des Widerstandswerts.

Die 3-5V-Variante überrascht manche: Warum sollte man ein Signal isolieren, das ein GPIO-Pin direkt lesen könnte? Weil es bei der Isolation darum geht, den Massepfad zu unterbrechen, nicht nur um hohe Spannung. Sie lohnt sich immer dann, wenn die beiden Stromkreise aus getrennten Netzteilen versorgt werden, an entgegengesetzten Enden eines langen Kabels sitzen oder einer von ihnen elektrisch verrauscht ist – etwa ein Motortreiber oder die Niederspannungs-Steuerplatine in einem netzbetriebenen Gerät. Beim Raspberry Pi wiegt dieses Argument schwerer als sonst, denn Sie schützen einen ganzen Linux-Computer mit einer SD-Karte darin.

Funktionsweise

Der GPIO-Pin des Raspberry Pi wird als Eingang mit aktiviertem internen Pull-up konfiguriert, sodass er auf 3,3V liegt, solange nichts ihn herunterzieht. Der Fototransistor ist das, was ihn herunterzieht.

Externes 12V/24V-Signal Interne LED Fototransistor Raspberry Pi GPIO-Messwert
VORHANDEN an leitend LOW
NICHT VORHANDEN aus nicht leitend HIGH

Der Messwert ist also INVERTIERT: Der Pin liest LOW, wenn das externe Signal vorhanden ist, und HIGH, wenn es fehlt. Das überrascht beim ersten Mal fast jeden. Der Code auf dieser Seite kehrt es wieder um, sodass eine Variable namens signal_active True ist, wenn die 12V/24V-Leitung tatsächlich unter Spannung steht.

Der Raspberry Pi hat per Software zuschaltbare interne Pull-up-Widerstände an seinen GPIO-Pins, sodass kein externer Pull-up-Widerstand hinzugefügt werden muss. Er wird mit einem Argument in GPIO.setup() aktiviert.

Ist Ihr Optokoppler-Modul Active-LOW oder Active-HIGH?

Die obige Tabelle ist gesicherte Physik für den nackten Chip, wenn er wie auf dieser Seite beschrieben verdrahtet ist: Mit einem Pull-up am GPIO-Pin zieht der Fototransistor den Pin herunter, also bedeutet Signal vorhanden = LOW.

Bei einem Modul sieht es anders aus. Manche Hersteller fügen auf der Platine eine invertierende Stufe hinzu, sodass der OUT-Pin dem Eingang folgt, statt ihm entgegengesetzt zu sein. Beide Arten sind im Handel, sie sehen gleich aus, und aus dem Angebot des Verkäufers geht selten hervor, welche Sie haben. Gehen Sie also nicht von etwas aus – nehmen Sie sich eine Minute, um es herauszufinden:

  • Verdrahten Sie das Modul wie unten gezeigt mit dem Raspberry Pi und führen Sie das erste Skript auf dieser Seite aus, das den Rohzustand des Pins meldet.
  • Notieren Sie, was das Terminal ausgibt, während an den Eingangsschraubklemmen nichts angeschlossen ist.
  • Legen Sie nun Spannung an die Eingangsseite an und notieren Sie, was stattdessen ausgegeben wird.
  • Was bei vorhandenem Signal erscheint, ist der aktive Pegel Ihres Moduls. Liest der Pin dann LOW, ist das Modul Active-LOW; liest er HIGH, ist das Modul Active-HIGH.
  • Gleichen Sie es mit der Status-LED auf der Platine ab: Diese LED leuchtet, wenn die Eingangsseite unter Spannung steht, daher sollten das Aufleuchten der LED und das Erreichen des aktiven Pegels am Pin immer gleichzeitig geschehen. Wenn die LED leuchtet und sich am Pi überhaupt nichts ändert, liegt das Problem auf der Ausgangsseite – VCC, GND oder die OUT-Leitung – und nicht auf der Eingangsseite.

Wie auch immer es bei Ihnen ausfällt, die Korrektur ist ein einziges Wort im Code. Beide Python-Skripte auf dieser Seite beginnen mit:

MODULE_ACTIVE_LOW = True

Lassen Sie es für ein Active-LOW-Modul auf True und setzen Sie es für ein Active-HIGH-Modul auf False. Sonst muss in keinem der beiden Skripte etwas geändert werden, da jeder Messwert von dieser einen Konstante abgeleitet wird.

Schaltplan

Anschluss eines PC817-Optokoppler-Isolationsmoduls an den Raspberry Pi

Raspberry Pi PC817-Optokoppler-Isolationsmodul Schaltplan für ein 12V-Signal

Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.

Um Ihren Verdrahtungsaufbau zu vereinfachen und zu organisieren, empfehlen wir die Verwendung eines Schraubklemmenblock-Shields für Raspberry Pi. Dieses Shield gewährleistet sicherere und besser verwaltbare Verbindungen, wie unten gezeigt:

Raspberry Pi Schraubklemmenblock-Shield

Die Verbindungen sind:

  • Die Plusleitung des externen 12V/24V-Signals an die Schraubklemme IN+ des Moduls
  • Die Masse des externen 12V/24V-Stromkreises an die Schraubklemme IN- des Moduls
  • Der VCC-Pin des Moduls an 3,3V (Pin 1) des Raspberry Pi
  • Der GND-Pin des Moduls an GND (Pin 6) des Raspberry Pi
  • Der OUT-Pin des Moduls an GPIO 12 (Pin 32) des Raspberry Pi

In dieser Liste taucht nirgends ein Vorwiderstand auf, und genau das ist der Sinn eines Moduls – solange die Variante zur Spannung an den Eingangsklemmen passt, ist der Widerstand bereits auf der Platine.

※ Notiz:

Versorgen Sie die Ausgangsseite des Optokopplers über 3,3V (Pin 1 oder Pin 17) des Raspberry Pi, NICHT über 5V (Pin 2 oder Pin 4). Ein GPIO-Pin ist nur für 3,3V ausgelegt, und ein mit 5V versorgtes Modul kann 5V an seinem OUT-Pin ausgeben.

※ Notiz:

Die Masse des 12V/24V-Stromkreises darf NICHT mit der Masse des Raspberry Pi verbunden werden. Diese beiden Massen müssen getrennt bleiben – diese Trennung ist der ganze Grund, warum der PC817 da ist. Werden die beiden Massen verbunden, schaltet die Schaltung zwar weiterhin und der Code funktioniert noch, aber die Isolation ist weg und der Raspberry Pi ist wieder allem ausgesetzt, was auf der 12V/24V-Seite passiert.

Optional – Denselben Eingang aus dem nackten PC817-Chip aufbauen

Wenn Sie lieber selbst löten, erledigt der nackte Chip dieselbe Aufgabe günstiger – Sie übernehmen einfach wieder die Widerstandsauswahl, die das Modul für Sie getroffen hat.

Der Chip ist ein 4-poliges DIP, Pin 1 ist mit einem Punkt oder einer Kerbe markiert und die Pins sind von dort aus gegen den Uhrzeigersinn nummeriert.

Pinbelegung des PC817-Optokopplers

Die Verbindungen sind:

  • Die Plusleitung des externen 12V/24V-Signals an ein Bein des Vorwiderstands
  • Das andere Bein des Vorwiderstands an PC817 Pin 1 – Anode (A)
  • PC817 Pin 2 – Kathode (K) an die Masse des externen 12V/24V-Stromkreises, NICHT an die Masse des Raspberry Pi
  • PC817 Pin 4 – Kollektor (C) an GPIO 12 (Pin 32) des Raspberry Pi
  • PC817 Pin 3 – Emitter (E) an GND (Pin 6) des Raspberry Pi

Die Pins 1 und 2 sind die Eingangsseite, die Pins 3 und 4 die Ausgangsseite, ohne elektrische Verbindung dazwischen. Dimensionieren Sie den Widerstand mit R = (Vin - 1.2) / 0.01 für einen LED-Zielstrom von 10 mA: 220 Ω bei 3,3V, 390 Ω bei 5V, 1 kΩ bei 12V, 2,2 kΩ bei 24V (bei 24V ein 1/2-W-Bauteil). Bleibt ein 1-kΩ-Widerstand an einer 24V-Leitung eingesetzt, fließen etwa 22,8 mA durch eine LED, die für 20 mA ausgelegt ist – die Nackt-Chip-Version davon, ein 12V-Modul an einer 24V-Leitung zu betreiben. Ein auf diese Weise verdrahteter nackter Chip ist immer Active-LOW.

Den PC817 parallel zum zu überwachenden Gerät anschließen

Die obigen Schaltpläne zeigen den Eingang aus einer eigenen Spannungsquelle gespeist, wie man es auf dem Labortisch tun würde. In einer realen Installation wird die Eingangsseite überhaupt nicht von einer eigenen Quelle gespeist – sie wird ÜBER das Gerät, dessen Zustand Sie wissen möchten, parallel dazu abgegriffen. Als Beispiel dient hier der 24V-Alarmkontakt einer Maschine oder einer USV, also eine Leitung, die bereits mit einer Signalleuchte oder einem Schaltfeld verbunden ist und die Sie nun zusätzlich vom Raspberry Pi überwachen lassen möchten.

WARNING

Schalten Sie den Optokoppler-Eingang niemals in REIHE mit dem Gerät. In Reihe wird der gesamte Laststrom dieses Geräts – einer Relaisspule, eines Schützes, einer Lampe, eines Motors – durch die interne LED gezwungen, und die LED wird in dem Moment zerstört, in dem das Gerät eingeschaltet wird. Der Eingang wird parallel über die beiden Anschlüsse des Geräts gelegt, und im bestehenden Stromkreis wird nichts getrennt oder umgeleitet.

Mit dem 24V-Maschinen- oder USV-Alarmkontakt als Beispiel und einem 24V-Modul dafür sind die Verbindungen:

  • Der positive (geschaltete) Anschluss des 24V-Alarmkontakts an die Schraubklemme IN+ des Moduls
  • Der negative (Rückleiter-)Anschluss des 24V-Alarmkontakts an die Schraubklemme IN- des Moduls
  • Der VCC-Pin des Moduls an 3,3V (Pin 1) des Raspberry Pi
  • Der GND-Pin des Moduls an GND (Pin 6) des Raspberry Pi
  • Der OUT-Pin des Moduls an GPIO 12 (Pin 32) des Raspberry Pi
  • Die bestehende Verdrahtung des Alarmkontakts bleibt genau so, wie sie war – nichts wird abgeklemmt

Ein paralleler Abgriff mit einem Modul benötigt keinen eigenen Vorwiderstand; der auf der Platine ist bereits für 24V dimensioniert, und genau deshalb muss die Variante zur abgegriffenen Leitung passen. Beim Aufbau mit dem nackten Chip erhält derselbe Abgriff einen 2,2-kΩ-Widerstand vor Pin 1.

Der Abgriff zieht etwa 10 mA. Verglichen mit dem, was eine Relaisspule, eine Lampe, ein Magnetventil oder ein Motor aufnimmt, ist das praktisch nichts, sodass das Gerät genau wie zuvor weiterarbeitet. Die Messung ist rückwirkungsfrei und rein lesend.

Die Polarität ist wichtig, denn die Eingangsseite ist eine LED, und eine LED leitet nur in eine Richtung. Vertauschen Sie IN+ und IN- – oder bei einem nackten Chip Pin 1 und Pin 2 – und die Schaltung wird einfach nie einschalten, ohne ein anderes Symptom, an dem man sich orientieren könnte. Prüfen Sie vor dem Verdrahten, welche Seite des Abgriffs positiv ist.

※ Notiz:

Ein induktives Gerät benötigt eine Klemmdiode. Eine Relaisspule, ein Magnet, ein Schütz, ein Ventil oder ein Motor erzeugt in dem Moment, in dem er abschaltet, eine große Rückspannungsspitze, und die Eingangs-LED des PC817 ist nur für 6 V in Sperrrichtung ausgelegt, sodass diese Spitze sie zerstören kann. Setzen Sie eine gewöhnliche Diode antiparallel direkt über die Eingangsklemmen – Kathode der Diode an IN+, Anode der Diode an IN- (bei einem nackten Chip Kathode an Pin 1 und Anode an Pin 2). Im Normalbetrieb ist diese Diode in Sperrrichtung gepolt und tut überhaupt nichts; bei einer Spitze leitet sie und begrenzt die Rückspannung auf deutlich unter ein Volt. Eine 1N4148 eignet sich für einen kleinen Abgriff, eine 1N4007 für einen stärkeren.

Manche Halbleiterausgänge haben Leckströme. SPS-Transistorausgänge, Triac-Ausgänge und LED-Lampentreiber können auch im ausgeschalteten Zustand einen kleinen Strom durchlassen, und genug davon bringt die interne LED teilweise zum Leuchten – dann meldet der Raspberry Pi das Gerät als EIN, obwohl es tatsächlich im Leerlauf ist. Das Symptom ist leicht zu erkennen: Der Messwert kehrt nie in den inaktiven Zustand zurück, und bei einem Modul glimmt die Status-LED schwach, statt zu erlöschen. Abhilfe schafft ein Ableitwiderstand von etwa 4,7 kΩ bis 10 kΩ parallel zu den Eingangsklemmen des Optokopplers, sodass der Leckstrom durch den Widerstand statt durch die LED fließt.

Dies ist außerdem ein reiner DC-Abgriff: Der PC817-Eingang ist eine einzelne LED und reagiert nur auf eine Polarität, daher ist er das falsche Bauteil, um eine AC-Leitung zu erfassen – dafür braucht man einen Optokoppler, dessen Eingangsstufe zwei antiparallele LEDs enthält.

Da der Abgriff über dem Gerät liegt und nicht davor, liest der Raspberry Pi den tatsächlichen Zustand dieses Geräts, ganz gleich, was ihn verursacht hat – ein Thermostat, ein Schwimmerschalter, eine SPS, ein Timer oder jemand, der am anderen Ende des Gebäudes einen Taster drückt. Er folgt dem Gerät genauso zuverlässig, wenn es überhaupt nicht einschaltet, und genau das macht die Protokollierung lohnenswert: Laufzeitsummen, Fehlerwarnungen und Prüfungen wie „Ist es tatsächlich angelaufen?“ ergeben sich alle aus demselben Abgriff. Eine ehrliche Einschränkung: Dies sagt Ihnen, dass das Gerät unter Spannung steht, nicht, dass es seine Aufgabe erfüllt. Ein blockierter Motor oder eine durchgebrannte Heizung nimmt weiterhin Strom auf und wird weiterhin als EIN gelesen.

Raspberry Pi Code – Ein isoliertes 12V/24V-Signal über den PC817-Optokoppler lesen

Für dieses Projekt wird keine Bibliothek benötigt. Der PC817 wandelt die externe Spannung in einen einfachen HIGH/LOW-Pegel um, daher genügt RPi.GPIO allein.

Schnelle Schritte

  • Verdrahten Sie den PC817 wie im obigen Modul-Schaltplan gezeigt mit Ihrem Raspberry Pi und prüfen Sie nochmals, dass die 12V/24V-Masse den Pi nicht berührt.
  • Stellen Sie sicher, dass Raspberry Pi OS oder ein anderes mit dem Raspberry Pi kompatibles Betriebssystem auf Ihrem Pi installiert ist.
  • Stellen Sie sicher, dass Ihr Raspberry Pi mit demselben lokalen Netzwerk wie Ihr PC verbunden ist.
  • Stellen Sie sicher, dass Ihr Raspberry Pi mit dem Internet verbunden ist, falls Sie Bibliotheken installieren müssen.
  • Wenn Sie den Raspberry Pi zum ersten Mal verwenden, lesen Sie wie man den Raspberry Pi einrichtet
  • Verbinden Sie Ihren PC über SSH mit dem Raspberry Pi, entweder mit dem integrierten SSH-Client unter Linux und macOS oder mit PuTTY unter Windows.
  • Stellen Sie sicher, dass die Bibliothek RPi.GPIO installiert ist. Falls nicht, installieren Sie sie mit folgendem Befehl:
sudo apt-get update sudo apt-get install python3-rpi.gpio
  • Erstellen Sie eine Python-Skriptdatei pc817_optocoupler.py und fügen Sie den folgenden Code hinzu:
# Dieser Raspberry Pi Code wurde von newbiely.de entwickelt # Dieser Raspberry Pi Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. # Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: # https://newbiely.de/tutorials/raspberry-pi/raspberry-pi-pc817-optocoupler-monitor-12v-24v-dc-input-signal import RPi.GPIO as GPIO import time # The collector of the PC817 (or the OUT pin of the module) is connected to # GPIO 12, which is physical pin 32 on the 40-pin header PC817_PIN = 12 # Most PC817 modules pull the OUT pin LOW while the input signal is present, # and that is also how the bare chip behaves with a pull-up. # If your module works the other way round, change this to False. MODULE_ACTIVE_LOW = True # Use the BCM numbering scheme (GPIO numbers, not physical pin numbers) GPIO.setmode(GPIO.BCM) # Configure the pin as an input and enable the internal pull-up resistor. # The pull-up keeps the pin HIGH until the phototransistor pulls it down. GPIO.setup(PC817_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) print("Watching the isolated line on GPIO 12 (pin 32)") try: while True: # Read the raw level, then turn it into a plain True/False according # to the polarity of your module raw = GPIO.input(PC817_PIN) signal_active = (raw == GPIO.LOW) if MODULE_ACTIVE_LOW else (raw == GPIO.HIGH) if signal_active: print("24V alarm contact -> ENERGISED") else: print("24V alarm contact -> idle") # Poll twice per second time.sleep(0.5) except KeyboardInterrupt: print("\nStopped by the user") # Release the GPIO pin before exiting GPIO.cleanup()
  • Speichern Sie die Datei und führen Sie das Python-Skript aus, indem Sie den folgenden Befehl im Terminal eingeben:
python3 pc817_optocoupler.py
  • Legen Sie Spannung an die externe 12V/24V-Leitung an und schalten Sie sie dann wieder ab.
  • Überprüfen Sie das Ergebnis im Terminal.
PuTTY - Raspberry Pi
Watching the isolated line on GPIO 12 (pin 32) 24V alarm contact -> idle 24V alarm contact -> idle 24V alarm contact -> idle 24V alarm contact -> ENERGISED 24V alarm contact -> ENERGISED 24V alarm contact -> ENERGISED 24V alarm contact -> ENERGISED 24V alarm contact -> idle 24V alarm contact -> idle

Das Skript fragt den GPIO-Pin fortlaufend jede halbe Sekunde ab und gibt jedes Mal eine Zeile aus, ohne Ende. Es stoppt erst, wenn Sie im Terminal Ctrl + C drücken, wodurch auch der GPIO-Pin freigegeben wird.

Dies ist auch das Skript für die zuvor beschriebene Prüfung auf Active-LOW oder Active-HIGH: Legen Sie Spannung an den Eingang an und sehen Sie, welche Bezeichnung erscheint. Wenn es ENERGISED ausgibt, während die Leitung im Leerlauf ist, und idle, während die Leitung unter Spannung steht, invertiert Ihr Modul auf der Platine – setzen Sie MODULE_ACTIVE_LOW oben in der Datei auf False und führen Sie es erneut aus. Nichts anderes im Skript entscheidet darüber, in welche Richtung der Messwert interpretiert wird, daher ist diese eine Konstante das Einzige, was geändert werden muss.

Code-Erklärung

Sehen Sie sich die zeilenweise Erklärung in den Kommentaren des Quellcodes an!

Raspberry Pi Code – Überwachen, ob ein Gerät ein- oder ausgeschaltet ist, und mit Zeitstempel protokollieren

Zweimal pro Sekunde dieselbe Zeile auszugeben, ist für einen ersten Test nützlich, aber ein Raspberry Pi läuft meist als kleiner, ständig eingeschalteter Server. In dieser Rolle möchten Sie keinen Strom identischer Zeilen – Sie möchten eine Aufzeichnung der Momente, in denen sich tatsächlich etwas geändert hat. Dieses zweite Skript gibt nur dann eine Zeile aus und hängt sie an eine Datei an, wenn der isolierte Eingang seinen Zustand ändert, zusammen mit der Dauer des vorherigen Zustands.

Das macht es direkt nutzbar für eine 24V-Leitung „Maschine läuft“ oder „Störungslampe“ und für ein 12V-Laufsignal eines Gefrierschrankkompressors oder einer Sumpfpumpe, bei denen die interessante Frage nicht der aktuelle Zustand ist, sondern wie oft und wie lange das Gerät über Nacht gelaufen ist. Wochenlang laufen gelassen – unter nohup oder als kleiner systemd-Dienst – erstellt dasselbe Skript still eine Betriebsstundenaufzeichnung des Geräts, und die Lücke zwischen zwei Einträgen beantwortet die Frage, die ein Blick auf ein Schaltfeld nie beantworten kann: Ist es tatsächlich angelaufen, als es sollte?

Klären Sie die Polaritätsfrage mit dem ersten Skript, BEVOR Sie weggehen und dieses hier laufen lassen, denn ein falsch herum verdrahtetes Modul fällt hier nicht lautstark aus – es schreibt still eine plausible, aber invertierte Historie in die Protokolldatei, jeder Lauf als Leerlaufphase und jede Leerlaufphase als Lauf aufgezeichnet, und Sie bemerken es womöglich wochenlang nicht.

Schnelle Schritte

  • Erstellen Sie eine Python-Skriptdatei pc817_optocoupler_logger.py und fügen Sie den folgenden Code hinzu:
# Dieser Raspberry Pi Code wurde von newbiely.de entwickelt # Dieser Raspberry Pi Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. # Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: # https://newbiely.de/tutorials/raspberry-pi/raspberry-pi-pc817-optocoupler-monitor-12v-24v-dc-input-signal import RPi.GPIO as GPIO import time from datetime import datetime # The collector of the PC817 (or the OUT pin of the module) is connected to # GPIO 12, which is physical pin 32 on the 40-pin header PC817_PIN = 12 # Most PC817 modules pull the OUT pin LOW while the input signal is present, # and that is also how the bare chip behaves with a pull-up. # If your module works the other way round, change this to False. # Check it with pc817_optocoupler.py BEFORE leaving this logger running, # otherwise the log file quietly fills up with an inverted history. MODULE_ACTIVE_LOW = True # The history is appended to this file, next to the script LOG_FILE = "isolated_input.log" # Use the BCM numbering scheme (GPIO numbers, not physical pin numbers) GPIO.setmode(GPIO.BCM) # Configure the pin as an input with the internal pull-up resistor enabled GPIO.setup(PC817_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) def read_signal(): # Read the raw level, then turn it into a plain True/False according # to the polarity of your module raw = GPIO.input(PC817_PIN) return (raw == GPIO.LOW) if MODULE_ACTIVE_LOW else (raw == GPIO.HIGH) def write_log(line): # Show the event on the terminal and keep a copy on disk print(line) with open(LOG_FILE, "a") as log: log.write(line + "\n") print("Logging the isolated input on GPIO 12 (pin 32) to " + LOG_FILE) # Remember the state we started from and when it started prev_signal = read_signal() changed_at = time.time() try: while True: signal = read_signal() # Write a line only when the external signal actually changes if signal != prev_signal: now = time.time() duration = now - changed_at stamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") if signal: write_log("[%s] the line went LIVE (it was IDLE for %.1f s)" % (stamp, duration)) else: write_log("[%s] the line went IDLE (it was LIVE for %.1f s)" % (stamp, duration)) prev_signal = signal changed_at = now # Poll 20 times per second so that short pulses are not missed time.sleep(0.05) except KeyboardInterrupt: print("\nStopped by the user") # Release the GPIO pin before exiting GPIO.cleanup()
  • Speichern Sie die Datei und führen Sie das Python-Skript aus, indem Sie den folgenden Befehl im Terminal eingeben:
python3 pc817_optocoupler_logger.py
  • Schalten Sie die externe 12V/24V-Leitung einige Male ein und aus und lassen Sie sie jeweils eine Weile in jedem Zustand.
  • Überprüfen Sie das Ergebnis im Terminal.
PuTTY - Raspberry Pi
Logging the isolated input on GPIO 12 (pin 32) to isolated_input.log [2025-03-04 09:12:41] the line went LIVE (it was IDLE for 132.4 s) [2025-03-04 09:14:07] the line went IDLE (it was LIVE for 86.1 s) [2025-03-04 09:31:52] the line went LIVE (it was IDLE for 1065.0 s) [2025-03-04 09:33:19] the line went IDLE (it was LIVE for 87.3 s)

Dieselben Zeilen werden an eine Datei namens isolated_input.log neben dem Skript angehängt, sodass die Historie erhalten bleibt, nachdem Sie die SSH-Sitzung geschlossen haben. Dieses Skript enthält dieselbe Konstante MODULE_ACTIVE_LOW wie das erste und leitet seine Änderungserkennung davon ab, sodass alles, was Sie dort festgelegt haben, auch hier gilt. Das Skript fragt in seinem eigenen Schleifenintervall weiter ab, bis Sie im Terminal Ctrl + C drücken.

Code-Erklärung

Sehen Sie sich die zeilenweise Erklärung in den Kommentaren des Quellcodes an!

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.

Fordern Sie sich heraus

  • Einfach: Ändern Sie die ausgegebenen Bezeichnungen passend zu Ihrer eigenen Maschine und lassen Sie eine LED an einem anderen GPIO-Pin leuchten, sobald der isolierte Eingang unter Spannung steht.
  • Mittel: Machen Sie aus dem zweiten Skript einen Betriebsstundenzähler für das überwachte Gerät: Addieren Sie die Zeit, in der es unter Spannung stand, zählen Sie, wie oft es gestartet ist, und geben Sie beide Summen bei jeder Änderung aus.
  • Fortgeschritten: Fügen Sie eine Software-Entprellung hinzu, damit eine verrauschte, lange 24V-Leitung nicht zwei Ereignisse hintereinander auslösen kann, überwachen Sie vier isolierte Leitungen gleichzeitig mit einem 4-Kanal-Optokoppler-Modul, oder schreiben Sie eine Warnung „Die Pumpe ist nicht angelaufen“ in das Protokoll, wenn der Eingang einige Minuten nach dem erwarteten Zeitpunkt immer noch nicht unter Spannung steht.

Zusätzliches Wissen

Eine sehr häufige Anfängerfrage lautet, warum ein paar Widerstände nicht dieselbe Aufgabe für viel weniger Geld erledigen würden.

Vergleichen wir einen PC817-Optokoppler mit einem Widerstands-Spannungsteiler zum Lesen eines 24V-Signals an einem Raspberry Pi.

Die Gemeinsamkeiten von Optokoppler und Spannungsteiler:

  • Beide bringen ein 24V-Signal auf einen Wert herunter, den ein 3,3V-GPIO-Pin verträgt.
  • Beide werden mit derselben einzelnen Python-Zeile gelesen.
  • Beide kosten sehr wenig.

Die Unterschiede zwischen Optokoppler und Spannungsteiler:

PC817-Optokoppler Widerstands-Spannungsteiler
Elektrische Verbindung zum Pi keine, die beiden Seiten sind getrennt direkt, die beiden Stromkreise teilen sich eine Masse
Isolationsspannung 5000 Vrms keine
Wenn auf der 24V-Seite eine Spitze oder ein Kurzschluss auftritt der Pi bleibt unbeeinträchtigt die Spitze erreicht den GPIO-Pin
Messwert beim nackten Chip und bei den meisten Modulen invertiert, per einer Konstante im Code einstellbar nicht invertiert, HIGH bedeutet Signal vorhanden
Umgang mit der Masse die 12V/24V-Masse muss getrennt bleiben die 12V/24V-Masse muss mit der Pi-Masse verbunden werden
Zusätzliche Bauteile ein Modul oder ein Chip und ein Widerstand zwei Widerstände

Für ein Experiment auf Ihrem Schreibtisch mit einem Labornetzteil, das Sie kontrollieren, ist ein Spannungsteiler akzeptabel. Für alles, was an einem Fahrzeug, einer Maschine, einer Alarmzentrale oder einem netzbetriebenen 24V-Netzteil hängt, ist der Spannungsteiler ein schlechter Tausch: Er spart ein Bauteil und gibt dafür das Einzige auf, was zwischen einem elektrischen Fehler und einem toten Raspberry Pi steht. Da ein beschädigter GPIO-Pin normalerweise den Austausch des ganzen Boards statt nur eines einzelnen Chips bedeutet, macht sich der Optokoppler beim ersten Mal, wenn etwas schiefgeht, bezahlt.

※ UNSERE NACHRICHTEN

  • Sie können gerne den Link zu diesem Tutorial teilen. Bitte verwenden Sie jedoch unsere Inhalte nicht auf anderen Websites. Wir haben viel Mühe und Zeit in die Erstellung der Inhalte investiert, bitte respektieren Sie unsere Arbeit!