Suchcode

Lektion 14/31-2: Arduino-Programmierung millis()-Beispiel 2 mit Ereignis

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.

Sunfounder-Auto zusammengebaut

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:

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

Bilder

Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
917-Lesson 14/31-2: Arduino coding millis() example 2 with event
Sprache: C++
/*
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

Ressourcen & Referenzen

Dateien📁

|||Benutzerhandbuch