Lektion 14/31-2: Arduino-Programmierung millis()-Beispiel 2 mit Ereignis
In diesem Tutorial lernst du, wie du die Arduino-millis()-Funktion verwendest, um eine Aktion erst nach Ablauf einer bestimmten Zeitspanne auszulösen, ohne den Rest deines Programms zu blockieren. Dies ist eine grundlegende Technik für die Erstellung reaktionsfähiger Arduino-Projekte, bei denen mehrere Aufgaben gleichzeitig ausgeführt werden müssen, wie z. B. das Blinken von LEDs während Sensoren gelesen oder Tastendrücke überwacht werden. Dieses spezielle Beispiel konzentriert sich darauf, ein Ereignis nach fünf Sekunden auszulösen, aber die Logik kann auf unzählige reale Szenarien angewendet werden.
Hier sind einige praktische Beispiele, wie du dieses Muster in deinen eigenen Projekten verwenden könntest:
- Verzögerte Aktivierung: Schalte einen Ventilator oder eine Pumpe erst ein, nachdem ein System eine festgelegte Zeit lang gelaufen ist.
- Sicherheitsverriegelungen: Verlange, dass ein Knopf für eine bestimmte Dauer gedrückt und gehalten wird, bevor eine gefährliche Aktion wie das Starten eines Motors ausgeführt wird.
- Zeitbasierte Warnungen: Löse einen Alarm oder eine Benachrichtigung aus, wenn sich ein Sensorwert innerhalb eines bestimmten Zeitfensters nicht geändert hat.
- Nicht blockierende Timer: Erstelle einen "Watchdog"-Timer, der ein Gerät zurücksetzt, wenn es nicht mehr reagiert.
Das Kernproblem, das dies löst, ist die Einschränkung der delay()-Funktion. Wenn du delay(5000) verwendest, stoppt der Arduino für diese fünf Sekunden die Ausführung jeglichen anderen Codes. Das ist für einfache Skizzen in Ordnung, wird aber bei komplexeren Projekten zu einem großen Problem, wenn du während des Wartens Sensoren lesen, Displays aktualisieren oder auf Tastendrücke hören musst. Die millis()-Funktion, die die Millisekunden seit dem Einschalten des Boards zählt, ermöglicht es dir, die Zeit zu überprüfen, ohne das Programm anzuhalten.
Benötigte Hardware
- Arduino-Board (Uno, Nano, Mega usw.)
- Ein Taster
- Jumper-Kabel
Verdrahtungsanleitung
Die Verdrahtung für dieses Beispiel ist sehr einfach. Es wird ein interner Pull-up-Widerstand verwendet, sodass kein externer Widerstand für den Taster benötigt wird.
- Verbinde ein Bein des Tasters mit dem GND-Pin am Arduino.
- Verbinde das andere Bein des Tasters mit dem digitalen Pin 2 am Arduino.
Da wir im Code INPUT_PULLUP verwenden, liest der Pin HIGH, wenn der Taster nicht gedrückt ist, und LOW, wenn er gedrückt ist und den Pin mit Masse verbindet. (im Video bei 08:29)
Den Code verstehen
Dieser Code demonstriert einen einfachen ereignisbasierten Timer. Das Programm gibt kontinuierlich den aktuellen millis()-Wert an den seriellen Monitor aus. Wenn der Taster gedrückt und gehalten wird und der Arduino mindestens 5 Sekunden lang gelaufen ist, wird "Take action" an den seriellen Monitor ausgegeben. Der Schlüssel liegt darin, dass die millis()-Überprüfung die kontinuierliche Ausgabe der Zeit nicht stoppt.
Lass uns die benutzerkonfigurierbaren Teile des Codes aufschlüsseln:
unsigned long event = 5000;// 5 Sekunden
Dies ist die wichtigste Variable, die zu konfigurieren ist. Sie definiert die Dauer deines "Ereignisses" in Millisekunden. In diesem Beispiel ist sie auf 5000 gesetzt, was 5 Sekunden entspricht. Um die Verzögerung zu ändern, ändere einfach diese Zahl. Zum Beispiel würde das Setzen auf 10000 die Aktion nach 10 Sekunden auslösen. Es ist entscheidend, den Datentyp unsigned long zu verwenden, da der Wert von millis() sehr groß werden kann und schließlich den Maximalwert einer Standard-int-Variable überschreiten wird, was zu Vergleichsfehlern führt. (im Video bei 05:46)
pinMode(2,INPUT_PULLUP);
Diese Zeile konfiguriert den digitalen Pin 2 als Eingang und aktiviert seinen internen Pull-up-Widerstand. Dies ist ein wichtiger Konfigurationsschritt, der es dir ermöglicht, einen Taster ohne externen Widerstand anzuschließen. Der Pin liest standardmäßig HIGH und geht auf LOW, wenn der Taster gedrückt wird und ihn mit Masse verbindet. Wenn du einen anderen Pin verwenden möchtest, ändere die Zahl 2 hier und in der Zeile digitalRead(2) innerhalb der Schleife. (im Video bei 08:46)
Die Logik innerhalb der loop() ist unkompliziert. Sie liest den Zustand des Tasters. Wenn der Taster gedrückt ist (pb == LOW), prüft sie, ob die aktuelle Zeit (millis()) größer oder gleich deiner definierten event-Zeit ist. Wenn beide Bedingungen wahr sind, wird die Aktionsmeldung ausgegeben. Der Rest der Schleife, der die Zeit ausgibt, läuft ununterbrochen weiter, was die Leistungsfähigkeit von millis() gegenüber delay() demonstriert.
Dieses Beispiel prüft die Zeit ab dem Moment, in dem der Arduino startet. Das dritte Beispiel in der Videoserie baut darauf auf, indem es die Zeit des ersten Tastendrucks aufzeichnet und eine Aktion nur auslöst, wenn ein zweiter Druck mindestens 5 Sekunden später erfolgt. Diese Logik wird in Lektion 14/31-3: Arduino-Codierung millis() Beispiel 3 mit Taster behandelt.
Live-Projektdemonstration
Sobald du den Code hochlädst und den seriellen Monitor (bei 9600 Baud) öffnest, siehst du einen kontinuierlichen Strom von Zahlen, die die Millisekunden seit dem Einschalten des Boards darstellen. Wenn du den Taster vor Ablauf von 5 Sekunden drückst und hältst, passiert nichts. Wenn du den Taster jedoch nach der 5-Sekunden-Marke drückst und hältst, siehst du die Meldung "Take action" im seriellen Monitor. Die Aktion wird weiterhin ausgegeben, solange der Taster gehalten wird. Dies demonstriert einen nicht blockierenden Timer, der es anderem Code (der Ausgabe) ermöglicht, nahtlos zu laufen. (im Video bei 10:52)
Verwandte Projekte aus diesem Video
Dieses Video ist Teil einer mehrteiligen Serie über Arduino-Timing- und Mapping-Funktionen. Entdecken Sie die anderen Tutorials, die aus diesem gleichen Quellmaterial erstellt wurden:
- Lektion 14/31-1: Arduino Millis (ohne delay) und map-Funktionen | SunFounder Robojax
- Lektion 14/31-3: Arduino-Codierung millis() Beispiel 3 mit Taster
- Lektion 14/31-4: Arduino-Codierung map() Beispiel 1
- Lektion 14/31-5: Arduino-Codierung map() Beispiel 2
Kapitel
- [00:00] Einführung in millis() und das SunFounder-Kit
- [01:19] Was ist millis() und warum es statt delay() verwenden?
- [03:06] Praktische Demonstration: Ausgeben des millis()-Werts
- [05:46] Erstellen eines Ereignisses mit millis() und unsigned long
- [08:29] Verdrahtung und Codierung eines Tasters mit INPUT_PULLUP
- [10:52] Ausführen des Ereignisbeispiels mit einem Taster
- [12:14] Vorschau auf Beispiel 3: Erkennen eines zweiten Tastendrucks
- [17:20] Einführung in die map()-Funktion
- [19:47] Codierung und Demonstration der map()-Funktion mit einer LED
/*
Lesson 14/31: Arduino coding millis() example 2 with event
Get this code and watch video Download and resource page https://robojax.com/RJT597
YouTube video https://www.youtube.com/watch?v=lqgzQohNiIM
* This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.*
* This code has been download from Robojax.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
unsigned long event = 5000;// 5 seconds
void setup() {
Serial.begin(9600);//initialize serial monitor
Serial.println("Introduction to millis");
pinMode(2,INPUT_PULLUP);
}
void loop() {
// Robojax.com millis() example 1
Serial.println(millis());
int pb = digitalRead(2);// read pin 2
if(pb ==LOW)
{
if(millis() >= event)
{
Serial.println("Take action");
}// if end
}// if end
}// loop end
Dinge, die Sie vielleicht brauchen
-
AmazonSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
Amazon
-
Amazon
-
Amazon
-
Amazon
-
Andere
Ressourcen & Referenzen
-
ExternKaufe das 3-in-1 Smart Car Lernkit von SunFounder.sunfounder.com
Dateien📁
|||Benutzerhandbuch
-
SunFounder 3-in-1 Arduino Smart Car assembly manualThis document shows step by step assembly of SunFounder 3-in-1 Arduino Smart Car
SunFounder_car_assembly_manual.pdf1.20 MB