Arduino UNO Q - PC817 Optokoppler: 12V/24V DC-Eingangssignal überwachen

Ein PC817 Optokoppler ermöglicht es dem Arduino UNO Q, einen 12V- oder 24V-Stromkreis über einen Lichtstrahl statt über einen Draht zu beobachten, sodass nichts von der Hochspannungsseite jemals die Platine erreichen kann. Das ist beim UNO Q besonders wichtig, denn hinter der 3,3V-STM32-MCU sitzt ein Qualcomm-Prozessor mit Debian Linux — eine Platine, die Sie wirklich nicht durch eine 24V-Spannungsspitze aus einem Maschinenschaltschrank verlieren möchten.

In neun von zehn Fällen steckt hinter dem Bau dieser Schaltung eine einfache Frage zu einem Gerät: Läuft diese Maschine gerade wirklich? Hängen Sie ein PC817-Optokoppler-Modul parallel zur 24V-Betriebsleuchte einer Maschine, und die Antwort wird zu einem digitalen Pin — einem, den der STM32 ausliest, die Linux-Seite protokolliert und Telegram meldet.

In diesem Tutorial lernen Sie:

Arduino UNO Q PC817 Optokoppler galvanisch getrennter 24V-Eingang

Erforderliche Hardware

1×Arduino UNO Q
1×USB Cable for Arduino Uno Q
1×PC817 Optocoupler Module - 12V version
1×PC817 Optocoupler Module - 3-5V version
1×Breadboard
1×Verbindungskabel
1×(Empfohlen) Schraubklemmenblock-Shield für Arduino Uno
1×(Empfohlen) Sensors/Servo Expansion Shield for Arduino Uno
1×(Empfohlen) Breadboard-Shield für Arduino Uno
1×(Empfohlen) Gehäuse für Arduino Uno
1×(Empfohlen) Prototyping-Grundplatte & Breadboard-Kit für Arduino Uno

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.

Sie benötigen eine Modulvariante - der nächste Abschnitt sagt Ihnen, welche.

Über den PC817 Optokoppler

Im Inneren des PC817 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 als Licht statt als Elektrizität übertragen wird — deshalb bleiben die beiden Seiten elektrisch voneinander getrennt. Das Datenblatt gibt für diesen Spalt 5000 Vrms für eine Minute an.

Wichtige Werte aus dem Sharp-Datenblatt, die genauso für den PC817 auf einem fertigen Modul gelten:

Parameter Wert
LED-Durchlassspannung (Vf) etwa 1,2 V typisch, 1,4 V max
LED-Durchlassstrom (If) 5-20 mA normal, 20 mA dauerhaft max
Kollektor-Emitter-Spannung (VCEO) 35 V max
Kollektorstrom (IC) 50 mA max
Kollektor-Verlustleistung 150 mW
Isolationsspannung 5000 Vrms (1 Minute)
Stromübertragungsverhältnis (CTR) 50% bis 600% je nach Klasse
Schaltgeschwindigkeit Anstieg etwa 4 us, Abfall etwa 3 us
Betriebstemperatur -30 C bis +100 C

Welches PC817-Modul brauche ich?

Ein fertiges PC817-Modul wird mit bereits aufgelötetem Vorwiderstand, Schraubklemmen für die galvanisch getrennte Seite und meist einer Status-LED geliefert. Genau dieser eingebaute Widerstand ist der springende Punkt: Er ist für eine Eingangsspannung ausgelegt. Deshalb werden die Module als drei separate Varianten verkauft, und die einzige Kaufentscheidung, die zählt, ist die Wahl derjenigen, die zu dem Signal passt, das Sie überwachen möchten.

Signal, das Sie überwachen möchten Zu kaufende Modulvariante
24V DC — Betriebs-/Störungsleuchten von Maschinen, SPS-Ausgänge, Industrieschaltschränke 24V-Modul
12V DC — Pumpen, Relais- und Schützspulen, Fahrzeugstromkreise, Alarmzentralen 12V-Modul
3,3V- oder 5V-Logik — eine andere Platine, ein Sensorausgang, eine Niederspannungs-Steuerkarte 3-5V-Modul

※ Notiz:

Die Variante ist kein Aufkleber auf der Tüte, sondern der Widerstand. Legen Sie eine 24V-Leitung an ein 12V-Modul an, fließt etwa der doppelte vorgesehene Strom durch seine interne LED, was sie beschädigt. Im umgekehrten Fall — eine 12V-Leitung an ein 24V-Modul — wird die LED zu schwach angesteuert, sodass der Ausgang verspätet, unzuverlässig oder gar nicht schaltet. Bei einem Modul müssen Sie nie etwas berechnen: Die Wahl der Variante *ist* die Berechnung.

Es gibt auch Mehrkanalplatinen — 2-, 4- und 8-Kanal-Versionen desselben Designs —, aber alle Kanäle auf einer Platine teilen sich deren Variante, sodass ein 4-Kanal-24V-Modul vier 24V-Leitungen überwacht und nichts anderes.

Die 3-5V-Variante ist nicht nur da, um das Sortiment aufzufüllen. Ein 5V- oder 3,3V-Logiksignal galvanisch zu trennen lohnt sich immer dann, wenn die beiden Schaltungen aus getrennten Netzteilen versorgt werden, an entgegengesetzten Enden eines langen Kabels sitzen oder eine davon sich eine Platine mit etwas Störendem teilt, etwa einem Motortreiber oder der Niederspannungs-Steuerkarte in einem netzbetriebenen Gerät — bei der galvanischen Trennung geht es darum, den Massepfad zu unterbrechen, nicht um die Höhe der Spannung. Gut zu wissen ist auch, dass der PC817-Eingang auf Strom reagiert, nicht darauf, wie viel Strom die Quelle liefern kann: Eine 5V-Schiene, die 10 A abgeben kann, belastet die LED des Moduls nicht stärker als eine, die für 50 mA ausgelegt ist, weil der Widerstand auf der Platine diesen Strom in jedem Fall festlegt. Was das stärkere Netzteil wirklich verändert, ist, wie schlimm ein Verdrahtungsfehler an anderer Stelle ausgeht — ein weiteres Argument dafür, es galvanisch zu trennen.

Ist Ihr Modul Active HIGH oder Active LOW?

Beginnen Sie mit dem nackten Chip, denn dieser Teil ist gesicherte Physik. Der digitale Pin des Arduino UNO Q wird durch seinen internen Pull-up hochgezogen, sodass der Fototransistor ihn immer nur nach unten ziehen kann:

Externes 12V/24V-Signal PC817-LED Fototransistor Arduino UNO Q Pin liest
VORHANDEN leuchtet leitend LOW
FEHLT dunkel sperrend HIGH

Bei einem Modul sieht es anders aus. Manche Hersteller führen den Fototransistor direkt heraus, was sich genau wie in der obigen Tabelle verhält; andere fügen auf der Platine eine invertierende Stufe hinzu, sodass der Ausgang dem Eingang stattdessen folgt. Beide Arten werden unter demselben Foto und derselben Beschreibung verkauft, daher ist der einzig verlässliche Weg herauszufinden, welche auf Ihrem Tisch liegt, eine Minute zu investieren und es zu testen — einmalig.

  • Verdrahten Sie das Modul wie unten gezeigt und führen Sie den ersten Sketch auf dieser Seite aus. Er gibt zweimal pro Sekunde PRESENT oder ABSENT in der App-Lab-Konsole aus.
  • Lassen Sie die Klemmen IN+ / IN- stromlos und lesen Sie die Konsole. Sie sollte ABSENT ausgeben.
  • Legen Sie nun das Signal an IN+ / IN- an. Die Konsole sollte auf PRESENT umschalten. Der Pegel, der diese Zeile erzeugt, ist der *aktive* Pegel Ihres Moduls.
  • Gleichen Sie dies mit der Status-LED des Moduls ab, die immer dann leuchtet, wenn die Eingangsseite unter Spannung steht: Wenn die LED leuchtet, während die Konsole weiterhin ABSENT meldet, ist der Ausgang Ihres Moduls umgekehrt zu dem, was der Sketch annimmt.
  • Wenn beide vertauscht sind, ändern Sie eine Zeile am Anfang des Sketches und laden Sie ihn neu — keine Neuverdrahtung, kein Umschreiben:
const bool MODULE_ACTIVE_LOW = false; // was true

Beide MCU-Sketches auf dieser Seite enthalten diese Konstante und leiten jeden Messwert daraus ab, sodass es sich um eine einzige Änderung an einer Stelle handelt. Die Linux-Seite sieht überhaupt keinen rohen Pin-Pegel — die MCU übergibt ihr über Bridge ein fertiges "present" oder "absent" —, sodass die Python-Dateien genau so bleiben, wie sie sind, egal wie sich Ihr Modul verhält.

Stattdessen mit dem nackten Chip aufbauen

Wenn Sie lieber den rohen 4-Pin-DIP auf ein Breadboard setzen möchten, gilt alles oben Gesagte weiterhin, nur dass Sie den Widerstand selbst wählen müssen. Pin 1 ist mit einem Punkt oder einer Kerbe markiert.

PC817 Optokoppler Pinbelegung
  • Pin 1 — Anode (A): + des galvanisch getrennten Signals, über den Vorwiderstand zugeführt
  • Pin 2 — Kathode (K): Masse des 12V/24V-Stromkreises, nicht GND des Arduino UNO Q
  • Pin 3 — Emitter (E): GND des Arduino UNO Q
  • Pin 4 — Kollektor (C): digitaler Eingangspin des Arduino UNO Q

Dimensionieren Sie den Widerstand für etwa 10 mA LED-Strom:

$$R = \frac{V_{in} - 1.2}{0.01}$$

  • 3,3V → 220 Ohm (etwa 9,5 mA)
  • 5V → 390 Ohm (etwa 9,7 mA)
  • 12V → 1 kOhm (etwa 10,8 mA)
  • 24V → 2,2 kOhm (etwa 10,4 mA, verwenden Sie ein 1/2-W-Bauteil)

Wird dieselbe Schaltung von einer 12V-Leitung an eine 24V-Leitung umgehängt, muss dieser Widerstand mitgeändert werden — genau der Fehler, den Ihnen die drei Modulvarianten abnehmen sollen.

Die Isolationsregel

Die Masse des 12V/24V-Stromkreises darf nicht mit GND des Arduino UNO Q verbunden werden. Die beiden Massen getrennt zu halten, ist der ganze Sinn der Sache — es ist diese Trennung, nicht der Chip selbst, die die Platine schützt. Verbinden Sie sie, und der PC817 schaltet zwar weiterhin problemlos, aber die galvanische Trennung ist weg, und Sie haben wieder eine direkte Leitung zwischen der Maschine und Ihrem Linux-Prozessor.

Schaltplan

Die STM32-MCU des Arduino UNO Q ist ein 3,3V-Bauteil, daher wird die Ausgangsseite des Optokopplers auf 3,3V hochgezogen und niemals höher. Ob die galvanisch getrennte Seite mit 12V oder 24V arbeitet, macht für den Pin keinen Unterschied — der Transistor schließt ihn entweder gegen GND kurz oder lässt ihn in Ruhe.

Verdrahtung des PC817-Optokoppler-Moduls

Arduino UNO Q PC817 Optokoppler-Isolationsmodul Schaltplan

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

Fünf Klemmen, und die Aufteilung zwischen ihnen ist die Isolationsbarriere selbst — IN+ und IN- gehören zur Maschine, VCC/GND/OUT gehören zum Arduino UNO Q, und kein Draht verläuft zwischen den beiden Gruppen.

Modulklemme Verbinden mit
IN+ (Eingangsseite) + des 12V/24V-Signals
IN- (Eingangsseite) Masse des 12V/24V-Stromkreises (getrennt von GND der Platine halten)
VCC (Ausgangsseite) Arduino UNO Q 3,3V
GND (Ausgangsseite) Arduino UNO Q GND
OUT / DO (Ausgangsseite) Arduino UNO Q Pin 2

※ Notiz:

Versorgen Sie VCC des Moduls über den 3,3V-Pin, nicht über 5V. Der Ausgangspin des Moduls folgt dem, was Sie an VCC anlegen, und der STM32-Eingang des Arduino UNO Q erwartet 3,3V. Und denken Sie daran, dass das eingesetzte Modul die Variante sein muss, die zu diesem 12V- oder 24V-Signal passt — eine Fehlanpassung kann der Code nicht korrigieren.

Verdrahtung des nackten PC817-Chips

PC817-Pin Verbinden mit
Pin 1 - Anode (A) Vorwiderstand, dann + des 12V/24V-Signals (1 kOhm für 12V, 2,2 kOhm für 24V)
Pin 2 - Kathode (K) Masse des 12V/24V-Stromkreises (getrennt von GND der Platine halten)
Pin 3 - Emitter (E) Arduino UNO Q GND
Pin 4 - Kollektor (C) Arduino UNO Q Pin 2, mit INPUT_PULLUP

Der interne Pull-up ist die einfachste Option und verbindet den Pin mit der eigenen 3,3V-Schiene der MCU. Wenn Sie lieber einen externen verwenden möchten, setzen Sie einen 10-kOhm-Widerstand von Pin 2 zum 3,3V-Pin des Arduino UNO Q — nicht zu 5V, wofür die STM32-Eingänge nicht ausgelegt sind.

Den PC817 parallel zur Last verdrahten

Beide Schaltpläne oben gehen stillschweigend davon aus, dass Sie die 12V/24V-Leitung von Grund auf selbst verdrahten. Bei einer echten Maschine ist das nicht der Fall: Die Leitung speist bereits etwas, und genau dieses Etwas wollen Sie überwachen. Der Optokoppler wird deshalb parallel zum vorhandenen Gerät angeschlossen — an dieselben beiden Klemmen, an denen das Gerät bereits hängt.

Nehmen Sie die Betriebs-/Störungsleuchten-Leitung einer 24V-Industriemaschine, dieselbe Leitung, die der Telegram-Abschnitt weiter unten in „Conveyor 3 started“ verwandelt. Die Leuchte ist zwischen den geschalteten 24V des Schaltschranks und dessen 0V-Rückleitung verdrahtet, und ein 24V-Modul wird einfach dort mit angeschlossen:

Abgriff von Geht an
Geschaltete +-Klemme der 24V-Leuchte Modul IN+
0V-Rückleitungsklemme der 24V-Leuchte Modul IN-

Am Abgriff muss kein Widerstand ergänzt werden: Das 24V-Modul hat bereits den richtigen, und genau deshalb kauft man die Variante, die zur Leitung passt. (Beim Aufbau mit dem nackten Chip kommen hier die 2,2 kOhm hin, in Reihe mit Pin 1.)

Im Schaltschrank wird nichts durchtrennt, abgesteckt oder umverlegt. Der Abgriff zieht ein paar Milliampere, was im Vergleich zu dem, was eine Leuchte, eine Schützspule, ein Magnetventil oder ein Motor bereits aufnimmt, nichts ist, sodass sich die Maschine genau so verhält wie zuvor — eine reine Lesemessung, die neben dem Stromkreis angebracht und nicht in ihn eingefügt wird.

※ Notiz:

Schalten Sie den Optokoppler niemals in Reihe mit dem Gerät. In Reihe geschaltet wird der volle Laststrom dieser Leuchte, Spule oder dieses Motors durch die interne LED gezwungen, und der PC817 wird in dem Moment zerstört, in dem der Stromkreis einschaltet — der Widerstand auf der Modulplatine rettet ihn nicht. Seine Eingangsseite ist eine LED, die für einige zehn Milliampere ausgelegt ist, und nicht mehr. Immer parallel zum Gerät.

Vier Details entscheiden darüber, ob der Abgriff auf Anhieb funktioniert:

  • Die Polarität ist nicht optional. IN+ und IN- sind die beiden Enden einer LED, daher fließt Strom nur in eine Richtung. Vertauschen Sie sie, und der Optokoppler leuchtet nie — kein Schaden, kein Messwert und kein Hinweis darauf, warum. Prüfen Sie, welche der beiden Klemmen die positive ist, bevor Sie einen Draht abisolieren.
  • Begrenzen Sie eine induktive Last mit einer Diode. Eine Schützspule, ein Relais, ein Magnetventil oder ein Motor erzeugt beim Abschalten eine große Rückspannungsspitze, und die Eingangs-LED des PC817 hält nur 6 V in Sperrrichtung aus. Setzen Sie eine gewöhnliche Diode antiparallel direkt über die Eingangsklemmen des Moduls — Kathode der Diode an IN+, Anode der Diode an IN- (Pins 1 und 2 beim nackten Chip). Im Normalbetrieb ist sie in Sperrrichtung gepolt und tut überhaupt nichts; bei einer Spitze leitet sie und hält die Sperrspannung deutlich unter einem Volt. Eine 1N4148 genügt für kleine Abgriffe, eine 1N4007 für die größeren.
  • Fügen Sie einen Ableitwiderstand hinzu, wenn der Messwert nie zurückgeht. SPS-Transistorausgänge, Triac-Ausgänge und LED-Lampentreiber lassen im ausgeschalteten Zustand häufig etwa ein Milliampere Leckstrom fließen. Dieses Rinnsal reicht aus, um die Eingangs-LED teilweise zum Leuchten zu bringen, und der Arduino UNO Q meldet die Maschine dann als laufend, während der Schaltschrank dunkel ist — das Erkennungszeichen ist ein Messwert, der nie auf ABSENT zurückfällt, und eine schwach glimmende Status-LED des Moduls. Ein 4,7-kOhm- bis 10-kOhm-Widerstand über den Eingangsklemmen bietet dem Leckstrom einen leichteren Weg als die LED, und der Messwert stabilisiert sich.
  • Nur DC-Leitungen. Mit einer einzelnen LED am Eingang reagiert der PC817 nur auf eine Polarität, daher ist er das falsche Bauteil zum Erfassen einer AC-Leitung — dafür braucht man einen Optokoppler, dessen Eingangsstufe zwei antiparallele LEDs enthält.

Überwachen, ob die Maschine ein- oder ausgeschaltet ist

Da der Pin parallel zum Gerät und nicht vor ihm sitzt, folgt er dem tatsächlichen elektrischen Zustand der Maschine und nicht Ihren Absichten. Ein Bediener, der den physischen Starttaster drückt, eine SPS, die die Leitung nach Zeitplan einschaltet, ein Timer an anderer Stelle im Schaltschrank, der einen Kontakt schließt — der Arduino UNO Q sieht jeden davon. Ebenso wertvoll: Er sieht den Fall, in dem ein Start befohlen wird und die Leitung spannungslos bleibt. Genau das hebt die Schaltung von einem Signaldetektor zu einem Betriebsstundenzähler, einem Stillstandsprotokoll, einem Störungsleuchten-Wächter und einer „Ist sie wirklich angelaufen?“-Prüfung.

Beim letzten Punkt macht sich die Linux-Hälfte des Arduino UNO Q bezahlt: Der Bridge-Abschnitt unten übergibt jeden Zustandswechsel an Python, und der Telegram-Abschnitt danach macht daraus innerhalb einer Sekunde eine Nachricht — so wird ein Startbefehl, der keine 24V erzeugt, zu einer Benachrichtigung auf Ihrem Handy statt zu einer Entdeckung Stunden später.

※ Notiz:

Eine ehrliche Einschränkung: Der PC817 sagt Ihnen, dass das Gerät unter Spannung steht, nicht, dass es seine Arbeit verrichtet. Ein festgefressener Motor, ein durchgebranntes Heizelement oder ein blockiertes Förderband zieht weiterhin Strom aus der Leitung und wird weiterhin als PRESENT gelesen. Um zu wissen, dass die Maschine wirklich arbeitet, überwachen Sie zusätzlich zu diesem Signal Strom, Temperatur oder Bewegung.

Wie man den PC817 programmiert

  • Wählen Sie den Pin, an den die OUT-Klemme des Moduls angeschlossen wird:
#define PC817_PIN 2
  • Legen Sie die Polarität Ihres Moduls an einer Stelle fest, sodass eine falsche Annahme mit einer Zeile behoben ist, statt den ganzen Sketch durchsuchen zu müssen:
const bool MODULE_ACTIVE_LOW = true;
  • Aktivieren Sie den internen Pull-up, damit der Pin auf 3,3V liegt, solange die galvanisch getrennte Leitung spannungslos ist:
pinMode(PC817_PIN, INPUT_PULLUP);
  • Lesen Sie den rohen Pin-Pegel und werten Sie ihn über die Konstante aus, statt irgendwo LOW fest einzuprogrammieren:
int raw = digitalRead(PC817_PIN); bool line_present = MODULE_ACTIVE_LOW ? (raw == LOW) : (raw == HIGH);
  • Auf das Ergebnis reagieren:
if (line_present) Serial.println("24V line: PRESENT"); else Serial.println("24V line: ABSENT");
  • Um den Moment zu erfassen, in dem die Leitung umschaltet, statt ihren Pegel, merken Sie sich den vorherigen Messwert und vergleichen:
if (line_present != last_present) { last_present = line_present; Monitor.println(line_present ? "24V line went PRESENT" : "24V line went ABSENT"); }

Für all das wird keine Bibliothek benötigt — ein PC817 wird mit einfachem digitalRead() ausgelesen, genau wie ein Taster oder ein Endschalter, nur dass die 24 Volt sicher auf der anderen Seite des Spalts bleiben.

Arduino UNO Q Code

Der Arduino UNO Q hat zwei Prozessoren, die zusammenarbeiten:

  • Die STM32-MCU verwaltet den galvanisch getrennten Eingangspin und liest ihn alle 500 ms aus
  • Die Qualcomm-MPU führt Debian Linux mit WLAN aus — sie bleibt in diesem ersten Abschnitt untätig, und ein späterer Abschnitt bindet sie über Bridge ein
/* * Dieser Arduino UNO Q Code wurde von newbiely.de entwickelt * Dieser Arduino UNO Q 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/arduino-uno-q/arduino-uno-q-pc817-optocoupler-monitor-12v-24v-dc-input-signal */ // PC817 optocoupler on Arduino UNO Q - isolated digital input. // Use the module variant that matches the signal: 3-5V, 12V or 24V. The series // resistor is already fitted on the module and is sized for that variant. // (On the bare 4-pin chip you fit the resistor yourself: 1 kohm for 12V, // 2.2 kohm for 24V.) // The STM32 MCU runs at 3.3V logic, so INPUT_PULLUP ties the pin to 3.3V - the // pin can never go above 3.3V no matter what the isolated side is doing. #define PC817_PIN 2 // Most PC817 modules pull the output LOW when the input signal is present, and // so does the bare chip wired with a pull-up. Some modules invert on-board and // work the other way round - if yours does, change this to false. const bool MODULE_ACTIVE_LOW = true; void setup() { Serial.begin(9600); // Internal pull-up to the MCU 3.3V rail - no external resistor needed pinMode(PC817_PIN, INPUT_PULLUP); Serial.println("Arduino UNO Q PC817 isolated input ready"); Serial.print("Watching the 24V line on pin 2 - module treated as "); Serial.println(MODULE_ACTIVE_LOW ? "active-LOW" : "active-HIGH"); } void loop() { int raw = digitalRead(PC817_PIN); // The single place the module polarity is resolved bool line_present = MODULE_ACTIVE_LOW ? (raw == LOW) : (raw == HIGH); if (line_present) Serial.println("24V line: PRESENT"); else Serial.println("24V line: ABSENT"); delay(500); }

Schnellanleitung

Zum ersten Mal mit dem Arduino UNO Q? Folgen Sie zunächst dem Tutorial Erste Schritte mit dem Arduino UNO Q, bevor Sie fortfahren.

  • Wählen Sie zuerst die richtige Modulvariante: das 24V-Modul für eine 24V-Leitung, das 12V-Modul für eine 12V-Leitung, das 3-5V-Modul für Logikpegelsignale. Das ist die eine Entscheidung, die der Code nicht retten kann.
  • Das Modul verdrahten: Folgen Sie dem obigen Schaltplan und prüfen Sie doppelt, dass die 12V/24V-Masse nirgendwo in die Nähe von GND des Arduino UNO Q kommt.
  • Verbinden: Schließen Sie den Arduino UNO Q mit dem USB-C-Kabel an Ihren Computer an.
  • Arduino App Lab öffnen: Starten Sie Arduino App Lab und warten Sie, bis Ihr Arduino UNO Q erkannt wird.
  • Eine neue App erstellen: Klicken Sie auf die Schaltfläche Create New App.
Neue App in Arduino App Lab auf dem Arduino UNO Q erstellen
  • Geben Sie der App einen Namen, zum Beispiel: PC817IsolatedInput
  • Klicken Sie zur Bestätigung auf Create.
Arduino App Lab App-Ordner und -Dateien auf dem Arduino UNO Q
  • Den Sketch einfügen: Kopieren Sie den obigen MCU-Code in sketch/sketch.ino. Lassen Sie die anderen Dateien unverändert.
  • Keine Bibliothek erforderlich — der PC817 wird mit der eingebauten Funktion digitalRead() ausgelesen.
  • Hochladen: Klicken Sie in Arduino App Lab auf die Run-Schaltfläche.
Run-Schaltfläche in Arduino App Lab auf dem Arduino UNO Q klicken
  • Schalten Sie das galvanisch getrennte 12V/24V-Signal ein und aus, während Sie den Serial Monitor beobachten — das dient gleichzeitig als der zuvor beschriebene Polaritätstest.

App Lab Konsolenausgabe

DIYables_Apps
Stop
sketch.ino
1#include "Arduino_RouterBridge.h"
Serial Monitor
Python
Message (Enter to send a message to "Newbiely" on usb(2820070321))
New Line
9600 baud
[2026-05-14 08:12:03] Arduino UNO Q PC817 isolated input ready [2026-05-14 08:12:03] Watching the 24V line on pin 2 - module treated as active-LOW [2026-05-14 08:12:04] 24V line: ABSENT [2026-05-14 08:12:04] 24V line: ABSENT [2026-05-14 08:12:05] 24V line: PRESENT [2026-05-14 08:12:05] 24V line: PRESENT [2026-05-14 08:12:06] 24V line: ABSENT

※ Notiz:

Sehen Sie PRESENT, wenn die Maschine aus ist, und ABSENT, wenn sie läuft? Ihr Modul invertiert auf der Platine — setzen Sie MODULE_ACTIVE_LOW auf false, führen Sie den Sketch erneut aus und lassen Sie die Verdrahtung unverändert. Wenn sich der Pin dagegen überhaupt nie ändert, ist die übliche Ursache eine Variantenfehlanpassung: Ein 24V-Modul, das von einer 12V-Leitung gespeist wird, bringt seine LED kaum zum Leuchten. Vergleichen Sie die Status-LED des Moduls mit der Konsole, bevor Sie irgendetwas anderes anfassen.

Bridge: Linux + MCU

Dieser Abschnitt verbindet beide Prozessoren des Arduino UNO Q, damit die Linux-Seite den galvanisch getrennten Eingang sehen kann:

  • Der PC817-Ausgang liegt an einem MCU-Pin — die MCU überwacht ihn in loop(), entprellt ihn, wertet ihn über MODULE_ACTIVE_LOW aus und merkt sich jede Änderung als Ereignis
  • Die MPU kann diesen Pin nicht berühren — sie fragt per RPC mit Bridge.call("get_line") nach dem Zustand und mit Bridge.call("get_event") nach einer ausstehenden Änderung. Sie erhält ein fertiges "present" / "absent", niemals einen rohen Pin-Pegel, sodass die Modulpolarität einmal auf der MCU geklärt wird und nie wieder. Die MCU antwortet immer nur; nichts auf der Linux-Seite kann den galvanisch getrennten Eingang ansteuern
  • Die MPU hat WLAN — vollständiges Debian Linux, sodass sie jeden Zustandswechsel in eine Datei protokollieren oder innerhalb einer Sekunde nach dem Anlaufen der Maschine eine Telegram-Nachricht senden kann
  • Arduino_RouterBridge stellt die RPC-Verbindung zwischen den beiden Prozessoren bereit
  • ⚠️ /dev/ttyHS1 (Linux) und Serial1 (MCU) sind vom Router RESERVIERT — öffnen Sie sie niemals in Ihrem eigenen Code

Kurz gesagt: Die 24V-Leitung ändert sich → die MCU zeichnet das Ereignis auf → die MPU fragt es über Bridge ab → Linux protokolliert es oder leitet es weiter. Wenn Sie das vollständige Bild davon möchten, wie die beiden Prozessoren kommunizieren, lesen Sie Kommunikation zwischen Linux und MCU.

MCU-Code (Bridge)

/* * Dieser Arduino UNO Q Code wurde von newbiely.de entwickelt * Dieser Arduino UNO Q 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/arduino-uno-q/arduino-uno-q-pc817-optocoupler-monitor-12v-24v-dc-input-signal */ // PC817 optocoupler on Arduino UNO Q - MCU side of the Bridge. // The MCU owns the isolated input pin and exposes it READ-ONLY to Linux: // get_line -> "present" / "absent" (the state right now) // get_event -> "on" / "off" / "none" (a state change waiting to be consumed) // Module polarity is resolved here, so Linux only ever receives a finished // answer and never has to know about pin levels. // The 12V/24V ground never touches the board GND - that is what keeps the // isolation intact. #include "Arduino_RouterBridge.h" #define PC817_PIN 2 #define DEBOUNCE_MS 20 // Most PC817 modules pull the output LOW when the input signal is present, and // so does the bare chip wired with a pull-up. Some modules invert on-board and // work the other way round - if yours does, change this to false. const bool MODULE_ACTIVE_LOW = true; int last_state = HIGH; bool line_on_event = false; bool line_off_event = false; // The single place the module polarity is resolved bool is_line_present(int raw) { return MODULE_ACTIVE_LOW ? (raw == LOW) : (raw == HIGH); } String get_line(String arg) { return is_line_present(digitalRead(PC817_PIN)) ? "present" : "absent"; } // Returns one pending change and clears it, so Linux never sees it twice String get_event(String arg) { if (line_on_event) { line_on_event = false; return "on"; } if (line_off_event) { line_off_event = false; return "off"; } return "none"; } void setup() { Bridge.begin(); Monitor.begin(); pinMode(PC817_PIN, INPUT_PULLUP); last_state = digitalRead(PC817_PIN); Bridge.provide("get_line", get_line); Bridge.provide("get_event", get_event); Monitor.println("Arduino UNO Q PC817 Bridge ready"); Monitor.println(is_line_present(last_state) ? "24V line: PRESENT" : "24V line: ABSENT"); } void loop() { int state = digitalRead(PC817_PIN); if (state != last_state) { // Field wiring can be long, so confirm the change before trusting it delay(DEBOUNCE_MS); if (digitalRead(PC817_PIN) != state) return; last_state = state; if (is_line_present(state)) { line_on_event = true; Monitor.println("24V line went PRESENT - machine running"); } else { line_off_event = true; Monitor.println("24V line went ABSENT - machine stopped"); } } }

Python-Code (Bridge)

/* * Dieser Arduino UNO Q Code wurde von newbiely.de entwickelt * Dieser Arduino UNO Q 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/arduino-uno-q/arduino-uno-q-pc817-optocoupler-monitor-12v-24v-dc-input-signal */ # PC817 optocoupler on Arduino UNO Q - Linux side of the Bridge. # Linux cannot touch the isolated input pin: it asks the MCU over RPC. # Never open /dev/ttyHS1 here - it belongs to the Arduino Router. # The MCU has already applied MODULE_ACTIVE_LOW, so what arrives here is a # finished "present" / "absent" - there is no polarity setting on this side. from arduino.app_utils import * import time def loop(): line = Bridge.call("get_line") if line == "present": print("24V line: PRESENT (machine running)") else: print("24V line: ABSENT (machine stopped)") time.sleep(1) App.run(user_loop=loop)

Schnellanleitung

  • Verbinden: Behalten Sie dieselbe Verdrahtung bei — der Optokoppler bleibt auf der MCU-Seite.
  • Öffnen Sie Arduino App Lab und erstellen Sie eine neue App mit dem Namen PC817Bridge.
  • Fügen Sie den MCU-Sketch in sketch/sketch.ino ein.
  • Fügen Sie den Python-Code in die Python-Datei der App ein.
  • Wenn Sie MODULE_ACTIVE_LOW im ersten Sketch auf false setzen mussten, setzen Sie es hier genauso — es ist die einzige Zeile, die zwischen beiden übereinstimmen muss.
  • Install the library: Click the Add sketch library button (the open book icon with a + sign) in the left sidebar.
Add sketch library in Arduino App Lab on Arduino UNO Q
  • Search for Arduino_RouterBridge created by Arduino and click the Install button.
My Apps / DIYables Apps
Run
Bricks
No bricks added...
Sketch Libraries
No sketch libra...
Files
python
sketch
.gitignore
README.md
app.yaml
sketch.ino
Add sketch library
Arduino_RouterBridge Arduino

This library provides a simple RPC bridge for Arduino UNO Q boards, allowing communication between the board and other devices using MsgPack serialization.

0.4.1
Install
More Info
  • Hochladen: Klicken Sie auf die Run-Schaltfläche.
Run-Schaltfläche in Arduino App Lab auf dem Arduino UNO Q klicken
  • Schalten Sie das galvanisch getrennte 12V/24V-Signal um und beobachten Sie, wie beide Konsolen reagieren.
  • ⚠️ Warnung: Öffnen Sie nicht /dev/ttyHS1 unter Linux und verwenden Sie nicht Serial1 auf der MCU — der Arduino Router besitzt sie, und ein Zugriff darauf unterbricht die Bridge.

App Lab Konsolenausgabe

DIYables_Apps
Stop
sketch.ino
1#include "Arduino_RouterBridge.h"
Serial Monitor
Python
Message (Enter to send a message to "Newbiely" on usb(2820070321))
New Line
9600 baud
[2026-05-14 08:30:00] Arduino UNO Q PC817 Bridge ready [2026-05-14 08:30:00] 24V line: ABSENT [2026-05-14 08:30:11] 24V line went PRESENT - machine running [2026-05-14 08:34:46] 24V line went ABSENT - machine stopped
DIYables_Apps
Stop
sketch.ino
1#include "Arduino_RouterBridge.h"
Serial Monitor
Python
[2026-05-14 08:30:01] 24V line: ABSENT (machine stopped) [2026-05-14 08:30:12] 24V line: PRESENT (machine running) [2026-05-14 08:30:13] 24V line: PRESENT (machine running) [2026-05-14 08:34:47] 24V line: ABSENT (machine stopped)

Telegram

Eine 12V- oder 24V-Leitung hat keinen Wert, mit dem man vergleichen könnte — sie ist entweder da oder nicht. Die sinnvolle Benachrichtigung ist hier daher eine Zustandswechsel-Benachrichtigung: Der Bot schreibt Ihnen in dem Moment, in dem die galvanisch getrennte Leitung Spannung führt, und erneut, wenn sie spannungslos wird, was bei einem Maschinenschaltschrank „gestartet“ und „gestoppt“ bedeutet.

Wenn Sie noch keinen Bot haben, lesen Sie zuerst Wie man einen Telegram-Bot erstellt.

MCU-Sketch: Behalten Sie denselben MCU-Sketch aus dem vorherigen Bridge-Abschnitt bei.

Python-Code (Telegram)

/* * Dieser Arduino UNO Q Code wurde von newbiely.de entwickelt * Dieser Arduino UNO Q 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/arduino-uno-q/arduino-uno-q-pc817-optocoupler-monitor-12v-24v-dc-input-signal */ # PC817 optocoupler on Arduino UNO Q - Telegram bot on the Linux side. # Pushes an alert the moment the isolated 24V line turns on or off, and answers # /line on demand. The MCU sketch (pc817_optocoupler_Bridge.cpp) must already be # running on the STM32 - it resolves module polarity with MODULE_ACTIVE_LOW and # hands this script a finished "present" / "absent". from arduino.app_utils import * import requests import time TELEGRAM_BOT_TOKEN = "YOUR_TELEGRAM_BOT_TOKEN" CHAT_ID = "YOUR_CHAT_ID" MACHINE_NAME = "Conveyor 3" last_update_id = 0 def get_updates(): global last_update_id url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/getUpdates" params = {"offset": last_update_id + 1, "timeout": 5} try: response = requests.get(url, params=params, timeout=10) data = response.json() if data["ok"]: return data["result"] except Exception as e: print(f"Error getting updates: {e}") return [] def send_message(chat_id, text): url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendMessage" payload = {"chat_id": chat_id, "text": text} try: requests.post(url, data=payload, timeout=10) except Exception as e: print(f"Error sending message: {e}") def loop(): global last_update_id # Auto-alert on every change of the isolated 24V line event = Bridge.call("get_event") if event == "on": msg = f"🟢 {MACHINE_NAME} started - 24V run line is live" print(msg) send_message(CHAT_ID, msg) elif event == "off": msg = f"🔴 {MACHINE_NAME} stopped - 24V run line went dead" print(msg) send_message(CHAT_ID, msg) # Answer commands sent from Telegram for update in get_updates(): last_update_id = update["update_id"] if "message" not in update: continue message = update["message"] chat_id = message["chat"]["id"] text = message.get("text", "").strip() print(f"Received: {text}") if text == "/start": send_message(chat_id, "Arduino UNO Q PC817 Isolated Input Bot\n" "/line - is the 24V line present right now?\n" "/machine - running or stopped?") elif text == "/line": line = Bridge.call("get_line") send_message(chat_id, f"24V line: {line.upper()}") elif text == "/machine": line = Bridge.call("get_line") state = "RUNNING" if line == "present" else "STOPPED" send_message(chat_id, f"{MACHINE_NAME}: {state}") else: send_message(chat_id, "Unknown command. Send /start for help.") time.sleep(0.5) App.run(user_loop=loop)

Schnellanleitung

  • Ersetzen Sie YOUR_TELEGRAM_BOT_TOKEN durch Ihr Bot-Token von BotFather.
  • Ersetzen Sie YOUR_CHAT_ID durch Ihre Telegram-Chat-ID.
  • Ändern Sie MACHINE_NAME in das, wozu die 24V-Leitung tatsächlich gehört.
  • Fügen Sie diesen Python-Code in die Python-Datei Ihrer App ein und behalten Sie denselben MCU-Sketch bei.
  • Nichts in dieser Datei kennt oder interessiert sich für die Modulpolarität — die MCU hat sie bereits aufgelöst, sodass es keine zweite Einstellung gibt, die synchron gehalten werden muss.
  • Klicken Sie auf die Run-Schaltfläche und schalten Sie dann die galvanisch getrennte Leitung ein und aus — innerhalb einer Sekunde sollte eine Benachrichtigung in Telegram eintreffen.
  • Senden Sie jederzeit /line, um abzufragen, ob das 24V-Signal gerade vorhanden ist.

App Lab Konsolenausgabe

DIYables_Apps
Stop
sketch.ino
1#include "Arduino_RouterBridge.h"
Serial Monitor
Python
[2026-05-14 08:40:00] Waiting for Telegram messages... [2026-05-14 08:40:19] 🟢 Conveyor 3 started - 24V run line is live [2026-05-14 08:52:04] 🔴 Conveyor 3 stopped - 24V run line went dead [2026-05-14 08:52:31] Received: /line
Telegram
Telegram 12:45
Welcome to Telegram!
ArduinoBot 10:19
Chatting with Arduino...
telegram-botfather
BotFather Yesterday
Your bot has been created.

ArduinoBot

bot
Today
🟢 Conveyor 3 started - 24V run line is live
10:15 AM
🔴 Conveyor 3 stopped - 24V run line went dead
10:16 AM
/line
10:17 AM ✓✓
24V line: ABSENT
10:18 AM
/machine
10:19 AM ✓✓
Conveyor 3: STOPPED
10:20 AM

OpenClaw

You can adapt the OpenClaw to this tutorial by refering the instruction on Arduino Uno Q - OpenClaw Tutorial

Projektideen

Der galvanisch getrennte Eingang wird deutlich interessanter, sobald die Linux-Seite ins Spiel kommt:

  • Betriebszeit-Logger für 24V-Maschinen: Führen Sie die 24V-„Läuft“-Leuchtenleitung einer Maschine in ein 24V-Modul — Python versieht jeden Start und Stopp mit einem Zeitstempel in einer CSV-Datei im Linux-Dateisystem und sendet jeden Abend eine Telegram-Zusammenfassung mit Gesamtlaufzeit und Zyklusanzahl
  • Betriebsstundenzähler und Stillstandsprotokoll: Behandeln Sie den galvanisch getrennten Eingang rein als Ein/Aus-Monitor für ein Gerät — Python führt eine laufende Summe darüber, wie viele Stunden die Maschine unter Spannung stand, wie lange sie zwischen den Aufträgen stillstand und wie oft sie gestartet wurde, und beantwortet dann einen Telegram-Befehl /hours mit den Tageswerten
  • Störungsleuchten-Wächter: Setzen Sie ein zweites 24V-Modul an den Stromkreis der Störungsleuchte und stellen Sie es als eigene Bridge-Funktion bereit — Linux benachrichtigt Sie in dem Moment, in dem die Störungsleitung aufleuchtet, und bleibt still, solange sie dunkel ist
  • 12V-Pumpen-Dashboard: Überwachen Sie die Spulenversorgung einer 12V-Pumpe mit einem 12V-Modul und stellen Sie den aktuellen Zustand von der Linux-Seite aus als kleine Webseite bereit, damit jeder im Netzwerk sehen kann, ob die Pumpe läuft
  • Fahrzeug-Zündungs-Tracker: Überwachen Sie einen 12V-Zündungs- oder Scheinwerferstromkreis — die Linux-Seite zeichnet auf, wie lange der Stromkreis pro Fahrt Spannung führte, und sendet die Summe an Telegram, wenn er spannungslos wird
  • SPS-Ausgangsspiegel: Lesen Sie einen 24V-SPS-Ausgang mit dem Optokoppler aus und spiegeln Sie ihn auf ein Relais, das von einem anderen MCU-Pin angesteuert wird, sodass der UNO Q als sichere Brücke zwischen einem Industrieschaltschrank und Ihrer eigenen Niederspannungstechnik dient

Fordern Sie sich selbst heraus

Bereit, den PC817 am Arduino UNO Q weiter auszureizen? Probieren Sie diese Aufgaben:

  • Einfach: Lassen Sie die integrierte LED leuchten, wann immer die galvanisch getrennte Leitung vorhanden ist, und ändern Sie die ausgegebenen Bezeichnungen von PRESENT/ABSENT in Begriffe, die zu Ihrer eigenen Maschine passen.
  • Mittel: Fügen Sie eine Bridge-Funktion get_on_count hinzu, die zählt, wie oft die 24V-Leitung seit dem Start Spannung geführt hat, sowie eine Funktion get_on_seconds, die zurückgibt, wie lange sie in diesem Zyklus schon Spannung führt — und melden Sie dann beides mit einem Telegram-Befehl /stats.
  • Fortgeschritten: Verdrahten Sie ein 4-Kanal-24V-Modul mit vier MCU-Pins, stellen Sie alle vier Zustände in einem einzigen Bridge-Aufruf bereit und lassen Sie Python eine Telegram-Nachricht senden, die genau benennt, welcher Kanal sich geändert hat — der Anfang eines kleinen galvanisch getrennten E/A-Monitors für einen ganzen Schaltschrank.

Funktionsreferenzen

Verwandte Tutorials

※ 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!