Mit Millis arbeiten und delay möglichst völlig weg lassen.

Handbücher zur Programmiersprache. Kleine übersichtliche Programme, die gut Dokumentiert sind. u.v.m.
Antworten
Benutzeravatar
Admin
Administrator
Beiträge: 1211
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Mit Millis arbeiten und delay möglichst völlig weg lassen.

Beitrag von Admin »

Ich habe hier mal ein Programm gemacht, das ohne Delay Programmteile nur nach bestimmten Zeiten anspringt.
Erst mal das Diagramm, das zeigt wie das Programm arbeitet.
Delay anstelle Millis.png
Delay anstelle Millis.png (172.54 KiB) 2215 mal betrachtet
Und hier das Programm, das genau das Diagramm ausführt. Das macht natürlich so für sich überhaupt keinen Sinn, weil es nur zeigt wie man Zeitabläufe programmiert. Erst wenn man an den Stellen, wo in dem Programm steht, "Programmteil 1 hier", bis "Programmteil 4 hier" Sinvolle Funktionen einfügt, oder Sprünge zu Funktionen, , wird daraus ein Sinnvolles Programm. Der einzige Programmteil der bei jedem Loop Durchgang ausgeführt wird, ist der Programmteil 4. Mit der Zeile "ablaufzeit02 = milliaktuell;" startet man die Wartezeit neu, die diese Ausführung von Programmteil 2 für die eingetragene verhindert. Bei zwei sind es 100ms, bei drei 500ms, u.s.w. Man könnte natürlich auch diese Wartezeiten verändert und dann neu Starten. Dafür muss man in der Deklaration der Pausezeiten aber dann das "const" von z.B. "const unsigned long Pausezeit01 = 2000;" weglassen. Also nur "unsigned long Pausezeit01 = 2000;". Dann kann man mit "unsigned long Pausezeit01 = 5000;" und "ablaufzeit01 = milliaktuell;" die Wartezeit von 2 auf 5 Sekunden erhöhen und neu starten. Und man kann diese Änderung und den Start der Wartezeit in jedem Programmteil machen!! Also ich kann die Wartezeit für den Programmteil 1 auch im Programmteil 2 / 3/ 4 ändern und starten!! Man ist also wesentlich flexibler als mit dem Delay() das ja immer nur genau dort ausgelöst werden kann, wo es im Programm steht. Und der eigentliche Vorteil ist natürlich, dass das Programm immer in ein paar Millisekunden komplett durchläuft, weil nicht gebremst wird, sondern nur die Teile, die man gerade nicht ausführen will / darf, umgangen werden.

Code: Alles auswählen

//Zeit für Programmteil 1
unsigned long ablaufzeit01 = 0; // Pause für Programmteil 1
const unsigned long Pausezeit01 = 2000;
//Zeit für Programmteil 2
unsigned long ablaufzeit02 = 0; // Pause für Programmteil 2
const unsigned long Pausezeit02 = 100;
//Zeit für Programmteil 3
unsigned long ablaufzeit03 = 0; // Pause für Programmteil 3
const unsigned long Pausezeit03 = 500;
unsigned long milliaktuell = 0;
// Baudrate fuer Serial Schnittstelle
const int baudSerial = 9600;
void setup()
{
  ablaufzeit01 = millis();
  // Serial Schnittstelle starten
  Serial.begin(baudSerial);
}
void loop()
{
  milliaktuell = millis();

  // Programmteil 1-2-3 überspringen?
  if (milliaktuell - ablaufzeit01 >= Pausezeit01) // 2000msec abgelaufen?
  {
    //Programmteil 1 hier

    // Programmteil 2 überspringen?
    if (milliaktuell - ablaufzeit02 >= Pausezeit02) // 100msec abgelaufen?
    {
      //Programmteil 2 hier
      Serial.print (milliaktuell);
      Serial.println(F("  Programmteil 2"));
      ablaufzeit02 = milliaktuell; // Progammteil 2 zurücksetzen
    }
    // Programmteil 3 überspringen?
    if (milliaktuell - ablaufzeit03 >= Pausezeit03) // 500msec abgelaufen?
    {
      //Programmteil 3 hier
      Serial.print (milliaktuell);
      Serial.println(F("  Programmteil 3"));
      ablaufzeit03 = milliaktuell; // Progammteil 3 zurücksetzen
    }
  }
  // Programmteil 4 hier

} //Loop Ende
Antworten

Wer ist online?

Mitglieder in diesem Forum: Ahrefs [Bot] und 0 Gäste