Du bist hier: Sketch > Arduino programmieren >
Arduino Referenz: Funktionen > millis() ↗
Arduino Referenz: Funktionen > millis() ↗
Zeit-in-ms (nicht blockierende Pause & Multitasking)
1. Beschreibung
1.1. Wirkung
Zeit-in-ms gibt die verstrichene Zeit in Millisekunden seit dem Einschalten des Arduinos aus. Diese innere Uhr wird alle 49 Tage oder 4'233'600'000ms auf Null zurückgesetzt. Vorausgesetzt, du schaltest dein Arduino nicht vorher aus ;-)
1.2. Zulässige Werte
Zeit-in-ms gibt positive, ganze Zahlen zurück
1.3. Verwendung
Zeit-in-ms ermöglicht es dir, auf simple Art parallele Vorgänge zu programmieren. Dies ist eine einfache Form von Multitasking.
Mit der inneren Uhr des Arduinos legst du fest, wann gewisse Dinge getan werden sollen. Das Ein- und Ausschalten einer LED wird an die aktuelle- und verstrichene Zeit gebunden. Das könnte so aussehen:
- Schaue auf die Uhr und mache einen Zeitstempel mit der aktuellen Zeit
- Schalte die LED ein
- Schaue auf die Uhr und prüfe, ob seit dem Zeitstempel bereits 1000ms verstrichen sind
- Falls ja, schalte die LED wieder aus
Diese Art von Sketch für eine blinkende LED lässt den Hauptloop immer am Laufen. Er wird nie gestoppt durch pausiere-1000-ms, wie dies z.B. im simplen Sketch Blink der Fall ist.
Falls du während des Blinkens deiner LED eine zweite LED in einem anderen Tempo blinken lassen möchtest, ist das kein Problem.
- arduino.cc: nicht blockierendes Delay ↗
Warum ist das so wichtig? Stelle dir vor, der Abstands-Tempomat deines Autos legt eine Funktionspause ein, weil der Prozessor gerade die Scheibenwischer steuern will :-(
1.4. Geschichte
Frühe Vorläufer von Multitasking hiessen "Multiprogrammierung" und hatten zum Ziel, eine höhere Prozessor-Auslastung im Gegensatz zur sequenziellen Ausführung von Aufgabenlisten zu erreichen. Erste Ansätze basieren auf Ideen aus dem Jahr 1959. Praktisch umsetzen ließen sich solche Konzepte aber erst später mit leistungsfähiger Hardware.
Weite Verbreitung fand Multitasking 1985 im Heimcomputer "Commodore Amiga", welcher massgeblich vom Amerikaner Carl Sassenrath entwickelt wurde. Der Commodore Amiga Computer darf durchaus als der Traum vieler Game-begeisterter Jugendlicher der 80er Jahre bezeichnet werden. Er war auch das erste Gerät, dass von Musikern und Künstlerinnen als kreatives Werkzeug entdeckt wurde.
- Wikipedia: Multitasking ↗
- Wikipedia: Commodore Amiga ↗
- Wikipedia: Carl Sassenrath ↗
2. Ausprobieren
2.1. Eine LED blinken lassen (mit blockierender Pause)
Das untenstehende Beispiel zeigt das sequenzielle Blinken lassen einer LED. Während der Pause von 1000ms ist dein Prozessor blockiert und kann nichts Weiteres tun. So wäre es nicht machbar, eine zweite LED in einem anderen Takt blinken zu lassen.
2.2. Eine LED blinken lassen (mit nicht blockierender Pause)
Dieses Sketch hat den genau gleichen Effekt, wie das Programm 2.1. Da es aber nie unterbrochen wird, könnte ein zweites Blinken in einer völlig anderen unabhängigen Frequenz problemlos programmiert werden.
Es fragt: Ist die abgelaufene Zeit seit dem letzten Zeitstempel grösser als 1000ms? Wenn ja, schalte den Zustand von LED 1 in sein Gegenteil um und setzte den Zeitstempel auf die aktuelle Zeit.
2.3. Vier LEDs unabhängig blinken lassen (einfaches Multitasking)
Das Sketch von 2.2. auf vier LEDs angewendet, die in unterschiedlichen Tempi blinken. Mit diesem Programm hast du eine einfache Variante von Multitasking umgesetzt.
3. PGLU-Sketches mit nicht blockierenden Methoden
Die meisten PGLU Projekte sind rein sequenziell programmiert. Du kommst also prima zurecht, wenn du pausiere-xxx-ms in deinen Sketches anwendest. Ein Paar Gelegenheiten gibt es aber, nicht blockierende Methoden auszuprobieren und diese sind sehr spannend. Zum Teil wurde auch mit anderen Strategien, als mit Zeit-in-ms gearbeitet.
- Roboter Auto Aufgabe 5 ↗
- Roboter Auto Variante 3 ↗
- LED Plexiglaslampe Aufgabe 9 ↗
- workshop.pglu.ch Präzise Tonhöhen berechnen ↗
- workshop.pglu.ch Ultraschallsensor ↗