#include <Arduino.h>
#define AmpelAus 0
#define FussgaengerTaster 1
// Setzen der Zustände der Ampeln
#define Rot 0
#define Rot_Gelb 1
#define Gruen 2
#define Gelb 3
#define Gelb_blinkend 4
// Benennung der Pins
#define Ampel1_Fahrzeug_Rot 12
#define Ampel1_Fahrzeug_Gelb 11
#define Ampel1_Fahrzeug_Gruen 10
#define Ampel2_Fahrzeug_Rot 9
#define Ampel2_Fahrzeug_Gelb 8
#define Ampel2_Fahrzeug_Gruen 7
#define Ampel_Fussgaenger_Rot 6
#define Ampel_Fussgaenger_Gruen 5
#define Taster_Aus 4
#define Taster_Fussgaenger 3
int pinsAmpel1[3] = {Ampel1_Fahrzeug_Rot, Ampel1_Fahrzeug_Gelb, Ampel1_Fahrzeug_Gruen};
int pinsAmpel2[3] = {Ampel2_Fahrzeug_Rot, Ampel2_Fahrzeug_Gelb, Ampel2_Fahrzeug_Gruen};
int pinsFussgaenger[2] = {Ampel_Fussgaenger_Rot, Ampel_Fussgaenger_Gruen};
int pinsTaster[2] = {Taster_Aus, Taster_Fussgaenger};
// Fahrzeug-Ampeln: 2 Ampeln mit 4 Zustaänden
int ampel_zustaende[2][5] = {
{Rot, Rot_Gelb, Gruen, Gelb, Gelb_blinkend}, // Ampel 1
{Rot, Rot_Gelb, Gruen, Gelb, Gelb_blinkend}, // Ampel 2
};
// Fussgaengerampel: 2 Zustände
int FussgaengerAmpel[2] = {Rot, Gruen};
// Taster: 2 Zustände
int Tater[2] = {AmpelAus, FussgaengerTaster};
// Variablen für den AN/AUS-Taster
bool button1_on = false;
bool button1_read = false;
bool switch1 = false;
// Setzen des Index für jede Ampel
int indexAmpel1 = 0;
int indexAmpel2 = 0;
int indexFussgaenger = 0;
// Setzen der Timer
unsigned long serial_millis = 0;
unsigned long button_millis = 0;
unsigned long ampel_state_millis = 0;
// Vorausdeklaration der Funktionen
void serial_monitor();
void button_OnOff();
void manage_ampel_state();
void execute_ampel_state();
// Setzen der State_machine
enum current_ampel_state {
ROT1,
ROT_GELB1,
GRUEN1,
GELB1,
ROT2,
ROT_GELB2,
GRUEN2,
GELB2,
GELB_BLINKEN,
};
current_ampel_state ampel_state = GELB_BLINKEN;
void setup() {
// Starte den Serial_Monitor
Serial.begin(9600);
// Setzen der Outputs für Ampel1
Serial.println("Setze Outputs für Ampel1:");
for (int i= 0; i < 3; i++) {
pinMode(pinsAmpel1[i], OUTPUT);
Serial.print("Pin ");
Serial.print(pinsAmpel1[i]);
Serial.println(" als OUTPUT gesetzt");
}
// Setzen der Outputs für Ampel2
Serial.println("Setze Outputs für Ampel2:");
for (int i = 0; i < 3; i++) {
pinMode(pinsAmpel2[i], OUTPUT);
Serial.print("Pin ");
Serial.print(pinsAmpel2[i]);
Serial.println(" als OUTPUT gesetzt");
}
// Setzen der Outputs für Fussgaengerampel
Serial.println("Setze Outputs für Fussgaengerampel:");
for (int i = 0; i < 2; i++) {
pinMode(pinsFussgaenger[i], OUTPUT);
Serial.print("Pin ");
Serial.print(pinsFussgaenger[i]);
Serial.println(" als OUTPUT gesetzt");
}
// Setzen der Inputs für die Schalter
Serial.println("Setzen der Inputs für die Taster:");
for (int i = 0; i < 2; i++) {
pinMode(pinsTaster[i], INPUT_PULLUP);
Serial.print("Pin ");
Serial.print(pinsTaster[i]);
Serial.println(" als INPUT_PULLUP gesetzt");
}
}
void loop() {
// Abruf der Funktionen
serial_monitor();
button_OnOff();
manage_ampel_state();
execute_ampel_state();
}
//============================================//
//================FUNCTIONS===================//
//============================================//
void serial_monitor() {
// Variablen für diesen Abschnitt
unsigned long serial_timer = millis() - serial_millis;
if (serial_timer > 250) {
Serial.print(" St.T = ");
Serial.println(switch1);
Serial.print("amp.state = ");
Serial.print(ampel_state);
serial_millis = millis();
}
}
//============================================//
//================FUNCTIONS===================//
//============================================//
void button_OnOff() {
// Variablen für diesen Abschnitt
unsigned long button_timer = millis() - button_millis;
button1_read = digitalRead(pinsTaster[0]);
if (button1_read) {
button_millis = millis();
}
if (!button1_read && !button1_on && button_timer > 20) {
button1_on = true;
}
if (button1_read && button1_on) {
button1_on = false;
switch1 = !switch1;
}
}
//============================================//
//================FUNCTIONS===================//
//============================================//
void manage_ampel_state() {
unsigned long ampel_state_timer = millis() - ampel_state_millis;
if (switch1) {
switch(ampel_state) {
case ROT1:
if (ampel_state_timer > 1000) {
ampel_state = ROT_GELB1;
ampel_state_millis = millis();
}
break;
case ROT_GELB1:
if (ampel_state_timer > 1000) {
ampel_state = GRUEN1;
ampel_state_millis = millis();
}
break;
case GRUEN1:
if (ampel_state_timer > 1000) {
ampel_state = GELB1;
ampel_state_millis = millis();
}
break;
case GELB1:
if (ampel_state_timer > 1000) {
ampel_state = ROT2;
ampel_state_millis = millis();
}
break;
case ROT2:
if (ampel_state_timer > 1000) {
ampel_state = ROT_GELB2;
ampel_state_millis = millis();
}
break;
case ROT_GELB2:
if (ampel_state_timer > 1000) {
ampel_state = GRUEN2;
ampel_state_millis = millis();
}
break;
case GRUEN2:
if (ampel_state_timer > 1000) {
ampel_state = GELB2;
ampel_state_millis = millis();
}
break;
case GELB2:
if (ampel_state_timer > 1000) {
ampel_state = ROT1;
ampel_state_millis = millis();
}
break;
default:
ampel_state = ROT1;
ampel_state_millis = millis();
break;
}
} else {
ampel_state = GELB_BLINKEN;
ampel_state_millis = millis();
}
}
//============================================//
//================FUNCTIONS===================//
//============================================//
void execute_ampel_state() {}
//============================================//
//================FUNCTIONS===================//
//============================================//