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)