millis() anstelle von delay()
Verfasst: Sa 17. Apr 2021, 11:27
Ich habe hier mal ein Programm gemacht, das nur zeigt wie die Zeitkontrolle mit "millis()" funktioniert.
Man kann diesen Grundstock benutzen, um drei Aktionen, bei denen jede für sich, in einem anderen Zeittackt immer wieder laufen sollen, ständig kontrolliert zu wiederholen. Natürlich kann man die Aktionen auch endlos erweitern. Und die Zeiten verändern / anpassen. Hier im Programm ist die einzige Aktion die in diesen Zeittackten stattfinden nur die Serial.println() Ausgabe, dass man sieht wie es abläuft. Der Sekundentakt kommt jede Sekunde, der 2 Sekundentakt alle zwei Sekunden, der 3 Sekundentakt alle drei Sekunden. Da, wo ich immer reingeschrieben habe "//Hier die aktuelle Aktion oder mehr Aktionen einsetzen" schreibt man das rein, was in diesem Zeittakt ablaufen soll. Natürlich darf da auch kein delay() rein, sonst ist alles für´n Arsch. Da kann man Relais einschalten oder ausschalten. LED´s ein oder aus. Daten zu Display´s schicken. Sensoren abfragen. Und vieles mehr. Was man eben in den Zeitabständen machen will.
Die Serial.println() kann man natürlich verschwinden lassen, ausser man will kontrollieren ob alles korrekt abläuft. Die Zeit für die jeweilige Zelle läuft immer wieder neu los, wenn man die "pausestartzeit" an die "aktuellezeit" angleicht. Man kann also z.B. die Zeile "pausestartzeit02 = aktuellezeit;" auch aus der Zelle herausnehmen und wo anders im Loop diese Startzeit aktivieren. Egal wo diese Zeile ausgeführt wird, ab da läuft die Zeit für diese Zelle neu ab, und wird nach Ablauf der zugehörigen "pausezeit" wieder EINMAL ausgeführt.
Code: Alles auswählen
// Baudrate fuer Serial Schnittstelle
const int baudSerial = 9600;
// ------Zeitmerker Deklaration ----
unsigned long aktuellezeit = 0;
// ------millis Deklaration 01 -----
unsigned long pausestartzeit01 = 0; // Jede Sekunde eine Aktion
const unsigned long pausezeit01 = 1000;
// ------millis Deklaration 02 -----
unsigned long pausestartzeit02 = 0; // Alle zwei Sekunden eine Aktion
const unsigned long pausezeit02 = 2000;
// ------millis Deklaration 03 -----
unsigned long pausestartzeit03 = 0; // Alle drei Sekunden eine Aktion
const unsigned long pausezeit03 = 3000;
//-----------------------------------------------------------------------------------
void setup()
{
// Serial Schnittstelle starten
Serial.begin(baudSerial);
}
//----------------------------------------------------------------------------------
void loop() {
aktuellezeit = millis(); // Aktuelle Zeit für alle Millis Aktionen übergeben
//------------------Erste Aktion-------------------------------------------------
if (aktuellezeit - pausestartzeit01 >= pausezeit01) // Eine Sekunde abgelaufen??
{
//Hier die aktuelle Aktion einsetzen, die jede Sekunde ablaufen soll.
pausestartzeit01 = aktuellezeit; // Neue Pausestartzeit übergeben
}
//------------------Zweite Aktion-------------------------------------------------
if (aktuellezeit - pausestartzeit02 >= pausezeit02) // Zwei Sekunden abgelaufen??
{
//Hier die aktuelle Aktion einsetzen, die alle zwei Sekunden ablaufen soll
pausestartzeit02 = aktuellezeit; // Neue Pausestartzeit übergeben
}
//------------------Dritte Aktion-------------------------------------------------
if (aktuellezeit - pausestartzeit03 >= pausezeit03) // Drei Sekunden abgelaufen??
{
//Hier die aktuelle Aktion einsetzen, die alle zwei Sekunden ablaufen soll
pausestartzeit03 = aktuellezeit; // Neue Pausestartzeit übergeben
}
}
Die Serial.println() kann man natürlich verschwinden lassen, ausser man will kontrollieren ob alles korrekt abläuft. Die Zeit für die jeweilige Zelle läuft immer wieder neu los, wenn man die "pausestartzeit" an die "aktuellezeit" angleicht. Man kann also z.B. die Zeile "pausestartzeit02 = aktuellezeit;" auch aus der Zelle herausnehmen und wo anders im Loop diese Startzeit aktivieren. Egal wo diese Zeile ausgeführt wird, ab da läuft die Zeit für diese Zelle neu ab, und wird nach Ablauf der zugehörigen "pausezeit" wieder EINMAL ausgeführt.