Arduino UNO Q - LED - Blinken ohne Verzögerung
Wenn Ihr Arduino UNO Q zwei Dinge gleichzeitig tun muss – wie das Blinken einer LED und das Auslesen einer Taste – wird die delay()-Funktion zum Problem. Sie friert das MCU ein und führt zu verpassten Ereignissen. In diesem Tutorial erfahren Sie, wie Sie eine LED ohne delay() mit Hilfe von millis() blinken lassen, damit der Arduino UNO Q reibungslos mehrere Aufgaben gleichzeitig ausführen kann.
※ Notiz:
- Diese Methode tut mehr als nur eine LED zum Blinken bringen und den Tastenstatus prüfen. Sie ermöglicht es dem Arduino UNO Q, mehrere Aufgaben gleichzeitig ohne Unterbrechung auszuführen.
In diesem Tutorial erfahren Sie:
- Warum delay() Probleme in Multitasking-Programmen verursacht
- Wie Sie eine LED ohne delay() mit Hilfe von millis() auf Arduino UNO Q blinken lassen
- Wie Sie zwei LEDs mit unterschiedlichen Geschwindigkeiten gleichzeitig zum Blinken bringen
- Wie Sie sowohl die Linux-Seite (Python) als auch die MCU-Seite (C/C++ Arduino-Code) programmieren, um die Blinkgeschwindigkeit von der Linux-Seite zu steuern
- Wie Sie Telegram verwenden, um die LED-Blinkgeschwindigkeit auf Arduino UNO Q aus der Ferne zu steuern

Erforderliche Hardware
Oder Sie können die folgenden Kits kaufen:
| 1 | × | DIYables Sensor-Kit (18 Sensoren/Displays) |
Kaufhinweis: Um den Verdrahtungsprozess zu vereinfachen, empfehlen wir die Verwendung des LED Module, das mit einem eingebauten Widerstand geliefert wird.
Über LED und Taste
Informationen zu LED und Taste (Pinbelegung, Funktionsweise, Programmierung) finden Sie in diesen Tutorials:
Schaltplan

Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.
MCU-Code — Mit delay() (Problembeschreibung)
Der Arduino UNO Q hat zwei Prozessoren: das STM32-MCU (handhabt Echtzeitsteuerung von Hardware) und das Qualcomm MPU (führt Debian Linux aus). In diesem Abschnitt wird nur das STM32-MCU programmiert. Ein späterer Abschnitt zeigt, wie beide Prozessoren zusammenarbeiten.
Dieses erste Beispiel verwendet delay() zum Blinken der LED – und zeigt warum dies ein Problem ist:
- Die LED blinkt jede 1 Sekunde mit delay(1000)
- Während delay() wartet, ist das MCU vollständig gefroren – es kann Tastendrücke nicht erkennen
- Drücken Sie die Taste mehrmals und beobachten Sie, dass viele Drücke übersehen werden
Schnelle Schritte
- Erste Schritte mit Arduino UNO Q? Folgen Sie dem Erste Schritte mit Arduino UNO Q-Tutorial, um Ihre Entwicklungsumgebung vorzubereiten, bevor Sie fortfahren.
- Komponenten verdrahten: Verbinden Sie die LED (mit 220Ω-Widerstand) mit Pin 3 und die Taste mit Pin 7 gemäß Schaltplan.
- Verbinden: Schließen Sie den Arduino UNO Q mit einem USB-C-Kabel an Ihren Computer an.
- Öffnen Sie Arduino App Lab: Starten Sie Arduino App Lab und warten Sie, bis es Ihren Arduino UNO Q erkennt – dies kann beim ersten Start mehrere Minuten dauern.
- Erstellen Sie eine neue App: Klicken Sie auf die Schaltfläche Neue App erstellen.

- Geben Sie der App einen Namen, z. B.: DIYables_BlinkDelay
- Klicken Sie auf Erstellen, um zu bestätigen.
- Sie werden eine Reihe von Ordnern und Dateien in Ihrer neuen App sehen.

- Finden Sie die Datei sketch/sketch.ino – hier werden Sie die MCU-Skizze einfügen.
- Install the library: Click the Add sketch library button (the open book icon with a + sign) in the left sidebar.

- Search for Arduino_RouterBridge created by Arduino and click the Install button.
- Hochladen: Klicken Sie auf die Schaltfläche "Ausführen" in Arduino App Lab, um den Code zu kompilieren und auf den STM32 hochzuladen.

- Test: Drücken Sie die Taste mehrmals schnell hintereinander – beachten Sie, dass viele Drücke ignoriert werden, da delay() das MCU blockiert.
- Pro-Tipp: Dies ist das Problem, das millis() löst – siehe das nächste Beispiel.
MCU-Code — Ohne delay() (Lösung)
Dieses Beispiel verwendet millis(), um die LED ohne Blockierung zum Blinken zu bringen – das MCU prüft die verstrichene Zeit und handelt nur wenn nötig, sodass es weiterhin jeden Tastendruck erkennen kann:
- Verwendet millis() und prev_millis, um nachzuverfolgen, wann die LED umgeschaltet werden soll
- Ruft niemals delay() auf – das MCU ist immer frei für andere Aufgaben
- Drücken Sie die Taste und beobachten Sie, dass jeder Druck erkannt wird, auch während die LED blinkt
Schnelle Schritte
- Laden Sie diese Skizze genauso wie oben hoch (erstellen Sie eine neue App oder ersetzen Sie die Skizze in der vorhandenen).
- Drücken Sie die Taste mehrmals schnell hintereinander – jeder Druck wird ohne Unterbrechung erkannt.
- Pro-Tipp: Fügen Sie mehr Aufgaben in // DO OTHER WORKS HERE ein – die LED wird weiter blinken, während diese Aufgaben ausgeführt werden.
Weitere Aufgaben hinzufügen — Zwei LEDs blinken mit unterschiedlichen Geschwindigkeiten
Dieses Beispiel lässt zwei LEDs mit unterschiedlichen Intervallen blinken und erkennt weiterhin Tastendrücke – alles ohne delay():
- LED 1 blinkt alle 1000 ms
- LED 2 blinkt alle 500 ms
- Beide laufen unabhängig voneinander mit separaten prev_millis-Variablen
- Tastendrücke werden niemals übersehen
Schnelle Schritte
- Fügen Sie eine zweite LED (mit 220Ω-Widerstand) zu Pin 4 hinzu.
- Laden Sie diese Skizze hoch – beide LEDs blinken mit ihren eigenen unabhängigen Raten.
- Pro-Tipp: Fügen Sie weitere LEDs mit ihren eigenen Intervallen hinzu, indem Sie mehr prev_millis_N-Variablen und if-Blöcke hinzufügen.
Linux + MCU-Brückenprogrammierung
Der Arduino UNO Q hat zwei Prozessoren, die zusammenarbeiten: das MPU (Qualcomm, führt Debian Linux aus) und das MCU (STM32, führt Zephyr OS mit Ihrem Arduino-Sketch aus). Sie kommunizieren über RPC über die Arduino_RouterBridge-Bibliothek – niemals über rohe serielle Anschlüsse.
- Die LED ist mit dem MCU (STM32) verbunden – verdrahtet mit einem digitalen Pin am STM32. Das MCU lässt sie mit einer nicht blockierenden millis()-Schleife blinken.
- Das MPU kann die LED nicht direkt steuern – es sendet Befehle an das MCU über Bridge.call(). Das MCU führt die registrierte Bridge.provide_safe()-Funktion aus und handhabt die LED.
- Das MPU hat Wi-Fi – es kann sich mit dem Internet verbinden und Dinge tun, die das MCU nicht kann: Telegram-Befehle empfangen, Blinkgeschwindigkeit aus der Ferne steuern und vieles mehr.
- Kommunikation: Bridge.call() auf der Linux-Seite ruft Bridge.provide_safe()-Funktionen auf der MCU-Seite auf
- ⚠️ Reserviert: /dev/ttyHS1 (Linux) und Serial1 (MCU) werden vom Arduino Router verwendet – öffnen Sie sie niemals direkt
Kurz gesagt: MPU sendet den Intervallbefehl → MCU empfängt ihn → MCU passt die LED-Blinkgeschwindigkeit in Echtzeit an.
MCU-Skizze – LED-Blinken ohne Blockierung mit Remote-Geschwindigkeitssteuerung:
Python-Skript (Arduino App Lab) – Blinkgeschwindigkeit von Linux aus steuern:
- Hinweis: Stellen Sie sicher, dass Bridge.begin() in der MCU-Skizze aufgerufen wird und die Skizze hochgeladen wurde, bevor Sie das Python-Skript auf der Linux-Seite ausführen.
- ⚠️ Warnung: Öffnen Sie niemals direkt /dev/ttyHS1 (unter Linux) oder verwenden Sie Serial1 (auf MCU) in Ihrem Code – diese sind vom Arduino Router reserviert und der Zugriff darauf unterbricht die Bridge.
Schnelle Schritte
- MCU-Skizze hochladen: Öffnen Sie Arduino App Lab, erstellen Sie eine neue App, fügen Sie die oben angegebene Bridge-MCU-Skizze in sketch/sketch.ino ein, und klicken Sie auf "Ausführen".
- Python-Skript hinzufügen: Fügen Sie den obigen Python-Code in die Python-Registerkarte derselben App ein.
- Führen Sie die App aus: Klicken Sie auf "Ausführen" – die LED beginnt zu blinken. Die Python-Seite ändert automatisch alle paar Sekunden die Geschwindigkeit.
- Überprüfen Sie die Konsole: Öffnen Sie die Registerkarte "Konsole" → Unterregisterkarte "Python-Konsole", um Meldungen zur Geschwindigkeitsänderung anzuzeigen.
- Pro-Tipp: Rufen Sie Bridge.call("blink_stop") von Python aus auf, um die LED zu stoppen, dann Bridge.call("blink_start"), um fortzufahren – das MCU handhabt es sofort.
App Lab-Konsolenausgabe
Telegram-Integration
Sie können die LED-Blinkgeschwindigkeit aus der Ferne über Telegram steuern – senden Sie einen Befehl von überall, und die LED antwortet sofort.
Wenn Sie noch keinen Telegram-Bot haben, lesen Sie Wie man einen Telegram-Bot erstellt, um Ihr Bot-Token vor dem Fortfahren zu erhalten.
Dieser Abschnitt behandelt:
- Ausführung eines Python-Skripts auf der Linux-Seite von Arduino UNO Q zum Abhören von Telegram-Nachrichten
- Weiterleitung von Blinkgeschwindigkeit oder Start-/Stoppbefehlen an die MCU-Seite über Bridge.call()
- Rücksennung einer Bestätigungsantwort an Telegram
MCU-Skizze: Behalten Sie die gleiche MCU-Skizze aus dem vorherigen Bridge-Abschnitt – keine Änderungen erforderlich. Stellen Sie sicher, dass sie bereits auf den STM32 hochgeladen und ausgeführt wird, bevor Sie fortfahren.
Python-Skript (Arduino App Lab) – Telegram-Bot zur LED-Blinksteuerung:
- Hinweis: Ersetzen Sie YOUR_BOT_TOKEN durch das Token, das Sie von @BotFather auf Telegram erhalten haben.
- Senden Sie /blink 200, um die LED schnell blinken zu lassen. Senden Sie /blink 2000, um langsam zu blinken.
- Senden Sie /stop, um das Blinken zu beenden. Senden Sie /start, um fortzufahren.
Schnelle Schritte
- MCU-Skizze hochladen: Verwenden Sie die Bridge-MCU-Skizze aus dem vorherigen Abschnitt (laden Sie sie zuerst hoch, wenn nicht bereits geschehen).
- Telegram-Skript einfügen: Kopieren Sie den obigen Python-Code in die Python-Registerkarte Ihrer App in Arduino App Lab.
- Token festlegen: Ersetzen Sie YOUR_BOT_TOKEN im Skript durch Ihr tatsächliches Bot-Token.
- Führen Sie die App aus: Klicken Sie auf "Ausführen" – der Bot beginnt sofort mit dem Abhören von Telegram-Nachrichten.
- Test: Senden Sie /blink 100 für sehr schnelles Blinken oder /stop, um die LED einzufrieren.
- Pro-Tipp: Versuchen Sie /blink 50 für ein sehr schnelles Blinken, das wie ein schwaches Leuchten aussieht.