Arduino - LED - Blinken ohne Delay

Bereit, eine der mächtigsten Arduino-Programmiertechniken zu erlernen? Sie sind hier genau richtig! Dieses Tutorial zeigt Ihnen, wie Sie eine LED ohne die delay()-Funktion blinken lassen - und glauben Sie mir, sobald Sie diese Technik beherrschen, werden Ihre Arduino-Projekte nie wieder dieselben sein.

Stellen Sie sich vor, dass Ihr Arduino Mega zwei wichtige Aufgaben erfüllen muss: eine LED blinken lassen und einen Button-Zustand überprüfen, der jederzeit gedrückt werden kann. Wenn wir die delay()-Funktion verwenden (beschrieben in einem vorherigen Tutorial), könnte Ihr Arduino einige der Button-Drück-Ereignisse verpassen. Mit anderen Worten: Ihr Arduino kann die zweite Aufgabe nicht vollständig bewältigen, während es während der Delay-Periode beschäftigt wartet.

Hier wird die "Blinken ohne Delay"-Technik zu einem echten Game-Changer! In diesem umfassenden Tutorial lernen wir, wie Ihr Arduino Mega gleichzeitig eine LED blinken lassen und den Zustand eines Buttons überwachen kann, ohne Drück-Ereignisse zu verpassen. Stellen Sie es sich vor wie die Fähigkeit, gleichzeitig zu gehen und Kaugummi zu kauen - Ihr Arduino wird wahrhaft multitasking-fähig.

Wir werden drei detaillierte Beispiele durcharbeiten und die Unterschiede zwischen ihnen vergleichen, damit Sie genau sehen können, warum diese Methode so mächtig ist. Sie werden entdecken, wie Sie die millis()-Funktion effektiv einsetzen, Timing-Konzepte verstehen, die auf unzählige Projekte anwendbar sind, und Fähigkeiten erlangen, die Sie zu einem selbstbewussteren Arduino-Programmierer machen. Am Ende dieses Tutorials werden Sie das Wissen haben, um responsive, nicht-blockierende Arduino-Projekte zu erstellen, die mehrere Aufgaben reibungslos und effizient bewältigen können.

Wir werden die drei folgenden Beispiele durchlaufen und die Unterschiede zwischen ihnen vergleichen:

※ Notiz:

  • Diese Methode ist nicht nur für das Blinken von LEDs und die Überprüfung des Button-Zustands geeignet. Allgemein ermöglicht diese Methode Arduino, mehrere Aufgaben gleichzeitig auszuführen, ohne sich gegenseitig zu blockieren.
  • Dieses Tutorial bietet tiefgreifendes Wissen, das Ihnen hilft, das Funktionsprinzip zu verstehen. Um es einfach zu machen, können Sie die Arduino - LED Bibliothek verwenden.

Benötigte Hardware

1×Arduino Mega
1×USB 2.0 Kabel Typ A/B
1×LED Kit
1×LED (red)
1×LED Module
1×220 Ohm Widerstand
1×Breadboard-montierter Button mit Kappe
1×Breadboard-montierter Button Kit
1×Panel-montierter Druckknopf
1×Taster-Modul
1×Breadboard (Steckplatine)
1×Jumper-Drähte
1×(Empfohlen) Screw Terminal Block Shield for Arduino Uno/Mega
1×(Empfohlen) Breadboard Shield for Arduino Mega
1×(Empfohlen) Enclosure for Arduino Mega

Oder Sie können die folgenden Kits kaufen:

1×DIYables Sensor-Kit (30 Sensoren/Displays)
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.

Kaufhinweis: Um den Verdrahtungsprozess zu vereinfachen, empfehlen wir die Verwendung des LED Module, das mit einem eingebauten Widerstand geliefert wird.

Über LED und Button

Das Verstehen von LEDs und Buttons ist wesentlich für die Beherrschung nicht-blockierender Arduino-Programmiertechniken. Eine LED (Light Emitting Diode - Leuchtdiode) ist ein Halbleiterbauelement, das Licht emittiert, wenn Strom in Vorwärtsrichtung durch sie fließt. Was LEDs perfekt für das Erlernen von Timing-Konzepten macht, ist ihre sofortige Reaktion - sie schalten sich sofort ein und aus, wenn Sie ihren Zustand ändern, wodurch es leicht zu sehen ist, wann genau Ihr Code funktioniert.

Der Button dient als unser Eingabegerät und bietet eine Möglichkeit, mit dem Arduino zu interagieren, während andere Aufgaben laufen. Wenn Sie einen Button drücken, entsteht eine momentane Verbindung zwischen zwei Pins, wodurch Strom fließen kann und sich der digitale Zustand ändert, den Ihr Arduino erkennen kann. Die Schönheit der Kombination von LEDs und Buttons in nicht-blockierendem Code liegt darin, dass sie reale Reaktionsfähigkeit demonstriert - Ihre LED kann in einem gleichmäßigen Rhythmus blinken, während Ihr Arduino wachsam bleibt und bereit ist, sofort auf Button-Drücke zu reagieren.

In traditionellem blockierendem Code mit delay() wird Ihr Arduino während der Delay-Perioden "taub" für Button-Drücke. Aber mit unserem millis()-basierten Ansatz behält Ihr Arduino Mega ständige Aufmerksamkeit für sowohl das LED-Timing als auch den Button-Zustand. Dies schafft eine viel professionellere und benutzerfreundlichere Erfahrung, ähnlich dem, was Sie von kommerziellen elektronischen Geräten erwarten würden.

Falls Sie sich nicht mit LED und Button auskennen (Pinbelegung, wie sie funktionieren, wie man sie programmiert ...), lernen Sie darüber in den folgenden Tutorials:

Verdrahtungsdiagramm

Lassen Sie uns die Verbindungen für unser LED-Blinken-ohne-Delay-Projekt einrichten - keine Sorge, die Verdrahtung ist unkompliziert und wir führen Sie durch jede Verbindung! Das Verstehen dieser Verbindungen ist entscheidend dafür, dass Ihr nicht-blockierendes Arduino-Projekt reibungslos funktioniert.

Arduino LED Verdrahtungsdiagramm

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

Das obige Verdrahtungsdiagramm zeigt, wie Sie sowohl die LED als auch den Button mit Ihrem Arduino Mega verbinden. Lassen Sie sich Zeit bei den Verbindungen - wenn Sie sie beim ersten Mal richtig machen, sparen Sie sich später die Fehlersuche. Die LED wird über einen strombegrenzenden Widerstand angeschlossen, um sowohl die LED als auch Ihren Arduino zu schützen, während der Button die interne Pull-up-Widerstand-Funktion des Arduino Mega für saubere, zuverlässige Eingabemessungen nutzt.

Bauteil-Pin Arduino Mega Pin Zweck
LED Langes Bein (Anode) Pin 13 über 220Ω Widerstand Ausgangssignal zur LED-Steuerung
LED Kurzes Bein (Kathode) GND Ground-Verbindung
Button Pin 1 Pin 7 Digitaler Eingang mit internem Pull-up
Button Pin 2 GND Ground-Verbindung für Button

Arduino Code - Mit Delay

Jetzt kommt der interessante Teil - schauen wir uns zuerst den traditionellen blockierenden Ansatz an, damit Sie genau verstehen können, warum die nicht-blockierende Methode so viel besser ist! Dieses erste Beispiel verwendet die delay()-Funktion, und Sie werden sehen, wie sie Beschränkungen in der Reaktionsfähigkeit Ihres Arduino erzeugt. Machen Sie sich keine Sorgen, wenn das Konzept zunächst komplex erscheint; wir gehen alles Schritt für Schritt durch.

/* * Dieser Arduino Mega Code wurde von newbiely.de entwickelt * Dieser Arduino Mega 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-mega/arduino-mega-led-blink-without-delay */ // constants won't change: const int LED_PIN = 3; // the number of the LED pin const int BUTTON_PIN = 7; // the number of the button pin const long BLINK_INTERVAL = 1000; // interval at which to blink LED (milliseconds) // Variables will change: int ledState = LOW; // ledState used to set the LED int previousButtonState = LOW; // will store last time button was updated void setup() { Serial.begin(9600); // set the digital pin as output: pinMode(LED_PIN, OUTPUT); // set the digital pin as an input: pinMode(BUTTON_PIN, INPUT); } void loop() { // if the LED is off turn it on and vice-versa: ledState = (ledState == LOW) ? HIGH : LOW; // set the LED with the ledState of the variable: digitalWrite(LED_PIN, ledState); delay(BLINK_INTERVAL); // If button is pressed during this time, Arduino CANNOT detect int currentButtonState = digitalRead(BUTTON_PIN); if(currentButtonState != previousButtonState) { // print out the state of the button: Serial.println(currentButtonState); // save the last state of button previousButtonState = currentButtonState; } // DO OTHER WORKS HERE }

Schnelle Schritte

Neu bei Arduino? Kein Problem! Beginnen Sie mit unserem Arduino Getting Started Leitfaden, um zuerst die Grundlagen zu lernen.

  • Hardware Verbinden: Verdrahten Sie die LED und den Button gemäß dem obigen Diagramm. Lassen Sie sich Zeit dabei - gute Verbindungen sind die Grundlage eines funktionierenden Projekts.
  • Arduino IDE Öffnen: Starten Sie die Arduino IDE auf Ihrem Computer und wählen Sie Ihr Arduino Mega aus dem Board-Menü. Vergessen Sie nicht, den richtigen COM-Port zu wählen!
  • Code Hochladen: Kopieren Sie den obigen Code in einen neuen Arduino-Sketch und klicken Sie auf den Upload-Button. Sie sollten die "Done uploading"-Nachricht sehen, wenn es erfolgreich war.
  • Serial Monitor Öffnen: Klicken Sie auf den Serial Monitor Button (Lupensymbol), um die Button-Drück-Ausgaben zu sehen. Stellen Sie die Baudrate auf 9600 ein.
  • Blockierendes Verhalten Testen: Drücken Sie den Button mehrmals schnell hintereinander, während Sie das LED-Blinken beobachten. Sie werden etwas Frustrierendes bemerken - einige Ihrer Button-Drücke werden verpasst!
  • Das Problem Beobachten: Beobachten Sie die Serial Monitor-Ausgabe. Sie werden sehen, dass nicht alle Ihre Button-Drücke erkannt werden, besonders wenn Sie während der Delay-Perioden drücken.

Profi-Tipp: Versuchen Sie, den Button zu verschiedenen Zeiten während des LED-Zyklus zu drücken. Sie werden bemerken, dass Drücke während der delay()-Perioden völlig ignoriert werden - das ist genau das Problem, das wir lösen werden!

  • Verbinden Sie Arduino über USB-Kabel mit dem PC
  • Öffnen Sie die Arduino IDE, wählen Sie das richtige Board und den Port
  • Kopieren Sie den obigen Code und öffnen Sie ihn mit der Arduino IDE
  • Klicken Sie auf den Upload-Button in der Arduino IDE, um den Code auf Arduino hochzuladen
Arduino IDE - Code Hochladen
  • Öffnen Sie den Serial Monitor
  • Drücken Sie den Button 4 Mal
  • Beobachten Sie die LED: Die LED wechselt periodisch alle Sekunde zwischen AN/AUS
  • Sehen Sie sich die Ausgabe im Serial Monitor an
COM6
Send
Button pressed at 15:23:42.156 Button pressed at 15:23:44.891 Button pressed at 15:23:47.203
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Im Serial Monitor wurden einige Drück-Zeiten verpasst. Das liegt daran, dass Arduino während der Delay-Zeit NICHTS anderes tun kann. Daher ist es nicht in der Lage, das Drück-Ereignis zu erkennen.

Arduino Code - Ohne Delay

Hier geschieht die Magie! Dieser nicht-blockierende Ansatz mit millis() wird völlig transformieren, wie Ihr Arduino mehrere Aufgaben bewältigt. Die LED wird mit genau derselben Rate blinken, aber jetzt bleibt Ihr Arduino vollständig reaktionsfähig für Button-Drücke. Es ist wie ein Upgrade von einem einzelnen-Aufgaben-Computer zu einem Multitasking-Kraftpaket!

/* * Dieser Arduino Mega Code wurde von newbiely.de entwickelt * Dieser Arduino Mega 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-mega/arduino-mega-led-blink-without-delay */ // constants won't change: const int LED_PIN = 3; // the number of the LED pin const int BUTTON_PIN = 7; // the number of the button pin const long BLINK_INTERVAL = 1000; // interval at which to blink LED (milliseconds) // Variables will change: int ledState = LOW; // ledState used to set the LED int previousButtonState = LOW; // will store last time button was updated unsigned long previousMillis = 0; // will store last time LED was updated void setup() { Serial.begin(9600); // set the digital pin as output: pinMode(LED_PIN, OUTPUT); // set the digital pin as an input: pinMode(BUTTON_PIN, INPUT); } void loop() { // check to see if it's time to blink the LED; that is, if the difference // between the current time and last time you blinked the LED is bigger than // the interval at which you want to blink the LED. unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= BLINK_INTERVAL) { // if the LED is off turn it on and vice-versa: ledState = (ledState == LOW) ? HIGH : LOW; // set the LED with the ledState of the variable: digitalWrite(LED_PIN, ledState); // save the last time you blinked the LED previousMillis = currentMillis; } // check button state's change int currentButtonState = digitalRead(BUTTON_PIN); if(currentButtonState != previousButtonState) { // print out the state of the button: Serial.println(currentButtonState); // save the last state of button previousButtonState = currentButtonState; } // DO OTHER WORKS HERE }

Schnelle Schritte

  • Neuen Code Hochladen: Ersetzen Sie den vorherigen Code mit dieser millis()-basierten Version und laden Sie sie auf Ihr Arduino Mega hoch. Sie werden gleich eine dramatische Verbesserung der Reaktionsfähigkeit sehen!
  • Mehrere Aufgaben Testen: Drücken Sie den Button mehrmals schnell hintereinander, während die LED blinkt. Diesmal werden Sie bemerken, dass jeder einzelne Button-Druck erkannt wird - keine verpassten Ereignisse mehr!
  • Den Unterschied Vergleichen: Beobachten Sie, wie die LED ihren gleichmäßigen Blink-Rhythmus beibehält, während Ihr Arduino sofort auf jeden Button-Druck reagiert. Das ist die Kraft der nicht-blockierenden Programmierung!
  • Serial Monitor Überprüfen: Öffnen Sie den Serial Monitor und drücken Sie den Button mehrere Male. Sie werden sehen, dass alle Drück-Ereignisse nun erfasst werden, unabhängig davon, wann während des LED-Zyklus Sie drücken.
  • Mit Timing Experimentieren: Versuchen Sie, den Button kurz gedrückt zu halten oder ihn schnell hintereinander zu drücken. Bemerken Sie, wie reaktionsfähig und zuverlässig das System im Vergleich zur delay-basierten Version geworden ist.
  • Führen Sie den obigen Code aus und drücken Sie den Button 4 Mal
  • Beobachten Sie die LED: Die LED wechselt periodisch alle Sekunde zwischen AN/AUS
  • Sehen Sie sich die Ausgabe im Serial Monitor an
COM6
Send
Button pressed at 15:25:12.445 Button pressed at 15:25:13.156 Button pressed at 15:25:13.892 Button pressed at 15:25:14.567
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Alle Drück-Ereignisse wurden erkannt.

Code-Erklärung

Lesen Sie die zeilenweise Erklärung in den Kommentarzeilen des Codes!

Weitere Aufgaben Hinzufügen

Der folgende Code demonstriert die wahre Kraft der nicht-blockierenden Programmierung, indem er zwei LEDs mit unterschiedlichen Blink-Intervallen steuert und gleichzeitig einen Button überwacht. Dieses Beispiel zeigt, wie Sie diese Technik skalieren können, um mehrere unabhängige Aufgaben zu bewältigen - stellen Sie sich die Möglichkeiten für Ihre zukünftigen Projekte vor!

/* * Dieser Arduino Mega Code wurde von newbiely.de entwickelt * Dieser Arduino Mega 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-mega/arduino-mega-led-blink-without-delay */ // constants won't change: const int LED_PIN_1 = 3; // the number of the LED 1 pin const int LED_PIN_2 = LED_BUILTIN; // the number of the LED 2 pin const int BUTTON_PIN = 7; // the number of the button pin const long BLINK_INTERVAL_1 = 1000; // interval at which to blink LED 1 (milliseconds) const long BLINK_INTERVAL_2 = 500; // interval at which to blink LED 2 (milliseconds) // Variables will change: int ledState_1 = LOW; // ledState used to set the LED 1 int ledState_2 = LOW; // ledState used to set the LED 2 int previousButtonState = LOW; // will store last time button was updated unsigned long previousMillis_1 = 0; // will store last time LED 1 was updated unsigned long previousMillis_2 = 0; // will store last time LED 2 was updated void setup() { Serial.begin(9600); // set the digital pin as output: pinMode(LED_PIN_1, OUTPUT); pinMode(LED_PIN_2, OUTPUT); // set the digital pin as an input: pinMode(BUTTON_PIN, INPUT); } void loop() { unsigned long currentMillis = millis(); // check to see if it's time to blink the LED 1 if (currentMillis - previousMillis_1 >= BLINK_INTERVAL_1) { // if the LED is off turn it on and vice-versa: ledState_1 = (ledState_1 == LOW) ? HIGH : LOW; // set the LED with the ledState of the variable: digitalWrite(LED_PIN_1, ledState_1); // save the last time you blinked the LED previousMillis_1 = currentMillis; } // check to see if it's time to blink the LED 2 if (currentMillis - previousMillis_2 >= BLINK_INTERVAL_2) { // if the LED is off turn it on and vice-versa: ledState_2 = (ledState_2 == LOW) ? HIGH : LOW; // set the LED with the ledState of the variable: digitalWrite(LED_PIN_2, ledState_2); // save the last time you blinked the LED previousMillis_2 = currentMillis; } // check button state's change int currentButtonState = digitalRead(BUTTON_PIN); if(currentButtonState != previousButtonState) { // print out the state of the button: Serial.println(currentButtonState); // save the last state of button previousButtonState = currentButtonState; } // DO OTHER WORKS HERE }

Erweiterbarkeit

Diese millis()-basierte Methode eröffnet unglaubliche Möglichkeiten für Ihre Arduino Mega-Projekte! Sie können diesen nicht-blockierenden Ansatz verwenden, um Ihrem Arduino zu ermöglichen, mehrere Aufgaben gleichzeitig ohne jede Interferenz zwischen ihnen zu bewältigen. Stellen Sie es sich vor, als würden Sie Ihrem Arduino die Fähigkeit geben, Multitasking wie ein moderner Computer zu betreiben.

Zum Beispiel könnten Sie ein Projekt erstellen, das Anfragen an das Internet sendet und auf Antworten wartet, während es gleichzeitig LED-Status-Anzeigen blinken lässt, mehrere Buttons überprüft, Sensorwerte liest und ein Display aktualisiert - alles zur gleichen Zeit! Der Schlüssel ist, dass jede Aufgabe ihr eigenes Timing mit millis() verwaltet, wodurch sie harmonisch koexistieren können.

Andere praktische Anwendungen umfassen: die Erstellung reaktionsfähiger Benutzeroberflächen, die während langer Operationen nicht einfrieren, den Bau von Datenlogging-Systemen, die weiterhin Sensormessungen sammeln, während sie auf SD-Karten schreiben, die Entwicklung von IoT-Geräten, die Netzwerkverbindungen aufrechterhalten, während sie physische Ausgänge steuern, oder das Design interaktiver Installationen, die auf mehrere Eingaben reagieren, während sie komplexe Lichtsequenzen ausführen.

Anwendungsideen: Jetzt, da Sie die nicht-blockierende Programmierung beherrschen, ist Ihrer Kreativität keine Grenzen gesetzt! Hier sind einige aufregende Projektideen für den Einstieg: Sie könnten einen Smart Home Controller erstellen, der Lichter, Sensoren und drahtlose Kommunikation gleichzeitig verwaltet, eine Wetterstation bauen, die Daten protokolliert, während sie einen Webserver aktualisiert und Echtzeitinformationen anzeigt, eine interaktive Kunstinstallation mit mehreren Sensoren und LED-Arrays einrichten, die unabhängig reagieren, ein Sicherheitssystem entwickeln, das mehrere Zonen überwacht, während es Alarme sendet und Status-Displays aktualisiert, oder sogar einen Roboter entwerfen, der navigieren kann, während er Sensordaten verarbeitet und auf Fernbefehle reagiert. Was werden Sie zuerst bauen?

Fordern Sie sich selbst heraus: Bereit, Ihre nicht-blockierenden Programmierfähigkeiten auf die nächste Stufe zu heben? Probieren Sie diese spannenden Herausforderungen:

  • Einfache Herausforderung: Modifizieren Sie den Code, um drei LEDs mit verschiedenen Raten (500ms, 1000ms und 1500ms) blinken zu lassen, während Sie den Button überwachen. Beginnen Sie mit dieser, um Ihr Selbstvertrauen aufzubauen!
  • Mittlere Herausforderung: Fügen Sie einen zweiten Button hinzu, der die Blink-Geschwindigkeit einer LED ändert, wenn er gedrückt wird. Das wird Ihnen beibringen, wie man mehrere Eingaben in nicht-blockierendem Code behandelt.
  • Fortgeschrittene Herausforderung: Erstellen Sie ein "Simon Says"-artiges Gedächtnisspiel mit mehreren LEDs und Buttons, bei dem Muster ablaufen, während das System auf Spielereingaben reaktionsfähig bleibt. Machen Sie sich keine Sorgen, wenn Sie stecken bleiben - so lernen wir!
  • Experten-Herausforderung: Bauen Sie ein Datenlogging-System, das alle 30 Sekunden einen Sensor liest, jede Sekunde eine Status-LED blinken lässt, auf Button-Drücke zum Starten/Stoppen des Loggings prüft und Daten über Serial sendet - alles ohne eine Aufgabe zu blockieren.
  • Kreative Herausforderung: Entwerfen Sie Ihr eigenes interaktives Projekt, das mindestens drei verschiedene Timing-Intervalle kombiniert. Vielleicht einen Ampel-Simulator, eine musikalische Lichtshow oder ein Pflanzen-Bewässerungs-Erinnerungssystem!

Beginnen Sie mit den einfachen und arbeiten Sie sich hoch! Jede Herausforderung wird Ihr Verständnis der nicht-blockierenden Programmierung stärken und Sie für noch komplexere Projekte vorbereiten. Denken Sie daran, der beste Weg zu lernen ist durch das Tun, also haben Sie keine Angst zu experimentieren und unterwegs Fehler zu machen.

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