Lektion 14/31-3: Arduino-Programmierung millis()-Beispiel 3 mit Drucktaster
Mussten Sie schon einmal, dass Ihr Arduino sich merkt, wann etwas passiert ist—wie ein Tastendruck—und dann zu einem genauen Zeitpunkt später eine Aktion ausführt, während der Rest Ihres Programms reibungslos weiterläuft? Dies ist eine klassische Herausforderung in der Arduino-Programmierung, und die Lösung ist die millis()-Funktion. Dieses Tutorial, Teil des Robojax-Arduino-Kurses, zeigt ein praktisches Beispiel: Erkennen, ob ein Taster ein zweites Mal gedrückt wird, nachdem seit dem ersten Druck eine Verzögerung von 5 Sekunden vergangen ist. Diese Technik ist grundlegend für die Erstellung reaktionsfähiger, nicht blockierender Projekte, bei denen das Timing entscheidend ist.
Dieses Muster der Verwendung von millis() zur Zeitmessung, ohne das Programm anzuhalten, ist für eine Vielzahl realer Anwendungen unerlässlich. Hier sind einige Ideen, um Ihre eigenen Projekte zu inspirieren:
- Entprellte Tasterschnittstellen: Implementieren Sie ein System, bei dem ein Taster für eine bestimmte Dauer (z. B. 3 Sekunden) gedrückt gehalten werden muss, um ein Gerät einzuschalten und versehentliche Drücke zu verhindern.
- Sequenzielle Aktionen: Erstellen Sie ein System, bei dem ein Ereignis, wie ein Bewegungssensor-Trigger, eine sekundäre Aktion auslöst, die nur ausgeführt wird, wenn ein anderes Ereignis innerhalb eines bestimmten Zeitfensters eintritt.
- Benutzerinteraktions-Timer: Bauen Sie ein Projekt, das eine „Bestätigungs"-Eingabe (wie einen zweiten Tastendruck) innerhalb einer festgelegten Zeit erfordert, um eine kritische Funktion auszuführen, z. B. das Senden eines Befehls oder das Starten eines Motors.
- Sensor-Gating: Verwenden Sie ein erstes Signal von einem Sensor, um ein Zeitfenster zu starten, während dessen die Messung eines zweiten, anderen Sensors als gültig betrachtet oder ignoriert wird.
Erforderliche Hardware
Dieses Projekt verwendet Komponenten aus dem SunFounder 3-in-1-Arduino-Kit, das eine großartige Ressource zum Lernen ist. Sie benötigen:
- Arduino-Board (Uno, Nano usw.)
- Einen Taster (momentaner Schalter)
- Jumper-Kabel
Verdrahtungsanleitung
Die Verdrahtung für dieses Beispiel ist dank der internen Pull-up-Widerstände des Arduinos sehr einfach, wodurch ein externer Widerstand überflüssig wird. (Im Video bei 08:29)
- Verbinden Sie ein Bein des Tasters mit dem GND-Pin des Arduinos.
- Verbinden Sie das andere Bein des Tasters mit digitalem Pin 2 des Arduinos.
Durch die Verwendung von INPUT_PULLUP ist der Pin intern mit 5V verbunden, sodass er normalerweise HIGH liest. Wenn der Taster gedrückt wird, verbindet er den Pin mit GND, wodurch er LOW liest. Dies ist die Logik, die wir im Code verwenden.
Code-Erklärung
Der Kern dieses Projekts ist die Logik, die den ersten Tastendruck verfolgt und dann nach einem bestimmten Zeitintervall auf einen zweiten Druck prüft. Der Code ist so konzipiert, dass er nicht blockierend ist, was bedeutet, dass er die Ausführung anderer Aufgaben in Ihrer loop() nicht anhält.
Am Anfang des Sketches finden Sie die wichtigsten benutzerkonfigurierbaren Variablen, die das Timing-Verhalten steuern:
unsigned long event = 5000;// 5 Sekunden
unsigned long buttonPushed =0;
event: Dies ist die entscheidende Timing-Variable. Sie legt die Verzögerungsdauer in Millisekunden fest. In diesem Beispiel ist sie auf5000gesetzt, was 5 Sekunden entspricht. Sie können diesen Wert auf jede andere Dauer ändern, die zu Ihrem Projekt passt.buttonPushed: Diese Variable wird als Flag und Zeitstempel verwendet. Sie startet bei0und wird beim ersten Tastendruck auf den Wert vonmillis()aktualisiert. Diese gespeicherte Zeit wird dann verwendet, um die Differenz für die zweite Druckprüfung zu berechnen.
Die Logik in der loop()-Funktion arbeitet in zwei Phasen. Zuerst liest sie den Zustand des Tasters und, wenn er zum ersten Mal gedrückt wird (pb == LOW && buttonPushed == 0), zeichnet sie die aktuelle Zeit über millis() in der Variablen buttonPushed auf. Die zweite Phase prüft, ob der Taster noch gedrückt ist und ob ein erster Druck aufgezeichnet wurde. Wenn ja, berechnet sie die Zeitdifferenz zwischen der aktuellen Zeit und der Zeit des ersten Drucks. Wenn diese Differenz größer oder gleich Ihrer event-Zeit ist, führt sie die Aktion aus—in diesem Fall das Drucken einer Nachricht auf dem seriellen Monitor.
Live-Projektdemonstration
Im Video wird der Code auf den Arduino hochgeladen und der serielle Monitor geöffnet, um das Verhalten zu beobachten. (Im Video bei 16:03) Sie sehen den millis()-Wert kontinuierlich gedruckt, der die Zeit seit Programmstart anzeigt. Wenn Sie den Taster zum ersten Mal drücken, wird eine Nachricht wie Erster Druck bei:5019 gedruckt. Wenn Sie den Taster erneut drücken und länger als 5 Sekunden seit dem ersten Druck halten, wird die Nachricht Aktion nach 5 Sekunden des ersten Drucks gedruckt. Dies zeigt, dass die Aktion nur ausgelöst wird, wenn der zweite Druck nach Ablauf der angegebenen Verzögerung erfolgt.
Die Stärke dieses Ansatzes ist, dass die Zeile Serial.println(millis()) am Anfang der Schleife ohne Unterbrechung weiterläuft, was beweist, dass die Timing-Logik anderen Code nicht blockiert. Dies ist der grundlegende Vorteil der Verwendung von millis() gegenüber der delay()-Funktion.
Verwandte Projekte aus diesem Video
- Lektion 14/31-1: Arduino Millis (ohne Verzögerung) und map-Funktionen | SunFounder Robojax
- Lektion 14/31-2: Arduino-Codierung millis() Beispiel 2 mit Ereignis
- 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 den Kurs
- [01:19] Was ist millis() und warum es verwenden?
- [03:06] Erstes praktisches Beispiel: millis() ausgeben
- [05:46] millis() verwenden, um ein Ereignis nach 5 Sekunden auszulösen
- [08:29] Beispiel 2: Tastendruck-Aktion mit einer 5-Sekunden-Verzögerung
- [12:14] Beispiel 3: Erkennen eines zweiten Tastendrucks nach einer Verzögerung
- [17:20] Einführung in die map()-Funktion
- [19:47] Praktisches Beispiel zur Zuordnung von LED-Helligkeitsprozenten
/*
Lesson 14/31: Arduino coding millis() example 3 with push button
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
unsigned long buttonPushed =0;
void setup() {
Serial.begin(9600);//initialize serial monitor
Serial.println("Introduction to millis");
pinMode(2,INPUT_PULLUP);
}
void loop() {
// ilmoFan.com example-2 millis()
Serial.println(millis());
int pb = digitalRead(2);// read pin 2
if(pb ==LOW && buttonPushed ==0)
{
buttonPushed =millis();
Serial.print("First push at:");
Serial.println(buttonPushed);
}
if( pb ==LOW && buttonPushed >0 )
{
unsigned long difference = millis()- buttonPushed;
if( difference >= event)
{
Serial.println("Action after 5 seconds of first push");
}
}
}
Dinge, die Sie vielleicht brauchen
-
AmazonSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
Amazon
-
Amazon
-
Amazon
-
Amazon
Ressourcen & Referenzen
-
DokumentationDokumentation für das SunFounder 3 in 1 IoT/Smarte Auto/Lernkitdocs.sunfounder.com
-
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