Anleitung: Endlicher Automat mit millis()

Da ich hier seit Tagen mit 'ner hartnäckigen Erkältung herumhänge und keine Lust auf Outdoor-Aktivitäten habe dachte ich mir, den von @agmue nett gemeinten Vorschlag umzusetzen und sein "Ampel-Programm gegen delay()" tatsächlich in OOP umzusetzen. Es ging einfacher als ursprünglich gedacht. Der nachfolgende Sketch zeigt meine Version seines obigen Programmes. Darin enthalten sind auch meine Ideen zur Ergänzung "Fußgänger-Anforderung", "Blaulicht auf Knopfdruck" und "Umschaltung Tag-/Nachtmodus". Der Sketch sieht ein wenig anders aus, als man es von üblichen Arduino-Sketches vielleicht gewöhnt ist, aber das Progi funktioniert wunderbar:

// ----------------------------------------------------------------------------------
// Ampel 1.0 ... für Arduino UNO      
// Mit Bibliothek "MobaTools.h", eigens für dieses Projekt erstellt

#include <MobaTools.h>   

// Parameter "Taster"
const byte tMod     =   2;        //  Taste "Modus"   (Tag-/Nacht)
const byte tPoli    =   3;        //  Taste "Polizei" (Kurzfristiger Blinker)
const byte tUeber   =   4;        //  Taste "Überweg" (Anforderung Fußgänger)

// Parameter "Ampel"
const byte aRot     =   5;        //  LED-Pin 
const byte aGelb    =   6;        //  "
const byte aGruen   =   7;        //  "
const byte aModus   =   8;        //  " (Signal Anforderung Tag-/Nacht-Modus)

const byte fFuss    =   9;        //  LED-Pins (Signal Anforderung f. Fussgänger)
const byte fWeiss   =  10;        //  " (Signal "Warten")
const byte fRot     =  11;        //  "
const byte fGruen   =  12;        //  "

const word zRot     =  30;        //  Sekunden
const word zRotgelb =   2;        //  "
const word zGruen   =  20;        //  "
const word zGelb    =   3;        //  "

// Parameter "Blaulicht"
const byte bPin     =  13;        //  Blaue LED
const word mEin     =  15;        //  Millis EIN
const word mAus     = 150;        //  Millis AUS

const byte wHol     =   2;        //  Wiederholungen
const word mZyk     = 555;        //  Millis Gesamt-Zyklus (Ein + Aus) * Wiederholung inkl. Warten
const word gAnz     =  25;        //  Anzahl kompletter Gesamt-Zyklen

// Instanzen
Taster          Modus(tMod);      //  "Nachtmodus" (Down-Aktiv)
Taster          Polizei(tPoli);   //  "Blaulicht"  (Down-Aktiv)
Taster          Ueberweg(tUeber); //  "Überweg"    (Down-Aktiv)

Warnblinker     Blaulicht( bPin, mEin, mAus, wHol, mZyk, gAnz );

Ampelschaltung  Ampel( aRot,   aGelb,        aGruen, aModus,  \
                       zRot,   zRotgelb,     zGruen, zGelb,   \
                       fWeiss, fRot, fGruen, fFuss            );  

void setup()
{
  Modus.begin();                  //  Buttons / Taster
  Polizei.begin();                //  "
  Ueberweg.begin();               //  "
  
  Ampel.begin();                  //  Ampelschaltung  
  Blaulicht.begin();              //  Blaulicht  
}

void loop()
{
  // --- Permanente Überwachung, Status-Updates etc. ---------------------
  //
  Blaulicht.Run();                //  Abarbeitung Blaulicht, nur bei Anforderung
  Ampel.Run();                    //  Abarbeitung Ampelschaltung, permanent
  
  // --- Aktionen auf Anforderung ----------------------------------------
  //
  if( Modus.KeyDown() )           //  Anforderung Tag-/Nachtmodus
    Ampel.Nachtmodus();           //  Bleibt dann bis neue Anforderung 

  if( Ueberweg.KeyDown() )        //  Anforderung Überweg 
    Ampel.Fussgaenger();          //  Wird in der Rotphase freigegeben
      
  if( Polizei.KeyDown() )         //  Anforderung Polizeieinsatz
    Blaulicht.Start();            //  Blinkt eine Weile, stoppt selbstständig       
}

Wer das Programm testen möchte muß die anhängende Library installieren und einen Blick auf die beigefügte Schaltung werfen. Es ist alles m.E. einigermaßen ausführlich kommentiert. Vielleicht hätte man es auch weniger umständlich programmieren können - aber es erfüllt seinen Zweck und zeigt, wie man mit "ohne delay()" und mit OOP coole Dinge zaubern kann.

LG, Rudi

MobaTools.zip (5.76 KB)

1 Like