//Variablen Ampel(A)
const byte RotA = 8;
const byte Gelb = 9;
const byte GrunA = 10;
//Variablen Ampel(F)
const byte RotF = 4;
const byte GrunF =5;
//Variable Taster
const byte Taster = 13;
//Variable Lautsprecher
const byte Ton = 11;
#define TIMEUNIT 100
// mögliche Ampelphasen:
// Auto_Fußgänger
enum Ampelphasen {GRUEN_ROT, GELB_ROT, ROT_ROT_1, ROT_GRUEN, ROT_ROT_2, ROTGELB_ROT};
Ampelphasen phase = GRUEN_ROT;
// Zeitsteuerung
uint32_t lastTime;
uint32_t waitTime;
bool phasenAktiv = false; // Merker für laufende Schrittkette
void setup () {
//Modus Ampel(A)
pinMode(RotA,OUTPUT);
pinMode(Gelb,OUTPUT);
pinMode(GrunA,OUTPUT);
//Modus Ampel(F)
pinMode(RotF,OUTPUT);
pinMode(GrunF,OUTPUT);
//Modus Taster
pinMode(Taster,INPUT_PULLUP);
Serial.begin(115200);
schalteAmpel(phase);
}
void loop (){
byte tasterLesen = digitalRead(Taster);
static byte letzterTasterStatus = tasterLesen;
uint32_t currentTime = millis();
if (tasterLesen != letzterTasterStatus)
{
Serial.print("Tasterstatus: ");
Serial.println(tasterLesen);
letzterTasterStatus = tasterLesen;
}
// Wenn Taster nicht gedrückt wurde:
// nichts ändern (grün für die Autos)
// anderenfalls:
// Ampelphasen einmal durchschalten
if (phasenAktiv || tasterLesen == LOW)
{
phasenAktiv = true;
if (currentTime - lastTime > waitTime)
{
// Wartezeit ist abgelaufen, nächste Ampelphase schalten
switch(phase)
{
case GRUEN_ROT:
waitTime = 5*TIMEUNIT; // Zeit für nächste Phase!!!
phase = GELB_ROT;
break;
case GELB_ROT:
waitTime = 5*TIMEUNIT;
phase = ROT_ROT_1;
break;
case ROT_ROT_1:
waitTime = 40*TIMEUNIT;
phase = ROT_GRUEN;
break;
case ROT_GRUEN:
waitTime = 20*TIMEUNIT;
phase = ROT_ROT_2;
break;
case ROT_ROT_2:
waitTime = 10*TIMEUNIT;
phase = ROTGELB_ROT;
break;
case ROTGELB_ROT:
waitTime = 20*TIMEUNIT; // minimale Zeit nach der auf den Taster reagiert wird
phase = GRUEN_ROT;
phasenAktiv = false;
break;
}
schalteAmpel(phase);
lastTime = currentTime;
}
}
}
void schalteAmpel(Ampelphasen phase)
{
switch(phase)
{
case GRUEN_ROT:
digitalWrite(RotA,LOW);
digitalWrite(Gelb,LOW);
digitalWrite(GrunA,HIGH);
digitalWrite(RotF,HIGH);
digitalWrite(GrunF,LOW);
break;
case GELB_ROT:
digitalWrite(RotA,LOW);
digitalWrite(Gelb,HIGH);
digitalWrite(GrunA,LOW);
digitalWrite(RotF,HIGH);
digitalWrite(GrunF,LOW);
break;
case ROT_ROT_1:
digitalWrite(RotA,HIGH);
digitalWrite(Gelb,LOW);
digitalWrite(GrunA,LOW);
digitalWrite(RotF,HIGH);
digitalWrite(GrunF,LOW);
break;
case ROT_GRUEN:
digitalWrite(RotA,HIGH);
digitalWrite(Gelb,LOW);
digitalWrite(GrunA,LOW);
digitalWrite(RotF,LOW);
digitalWrite(GrunF,HIGH);
break;
case ROT_ROT_2:
digitalWrite(RotA,HIGH);
digitalWrite(Gelb,LOW);
digitalWrite(GrunA,LOW);
digitalWrite(RotF,HIGH);
digitalWrite(GrunF,LOW);
break;
case ROTGELB_ROT:
digitalWrite(RotA,HIGH);
digitalWrite(Gelb,HIGH);
digitalWrite(GrunA,LOW);
digitalWrite(RotF,HIGH);
digitalWrite(GrunF,LOW);
break;
}
}