// Setzen der Bibliotheken
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Adressierung des LCD
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Belegung der Ampeln
#define ampel_fuss_red 22
#define ampel_fuss_green 24
#define ampel1_red 12
#define ampel1_yellow 11
#define ampel1_green 10
#define ampel2_red 9
#define ampel2_yellow 8
#define ampel2_green 7
#define warning_light 13
// Belegung der Taster
#define input_button1 6
#define input_sensor 4
#define input_button2 5
#define input_button4 3
#define input_button5 2
// Variablen Global
// Variable State
enum current_state_ampel {
BLINKEN, // 0
ROT, // 1
ROT_GELB, // 2
GRUEN, // 3
GELB, // 4
ROT2, // 5
ROT_GELB2, // 6
GRUEN2, // 7
GELB2, // 8
FUSS_ROT, // 9
FUSS_GRUEN, // 10
WARNUNG, // 11
SCHRANKE_OFFEN, // 12
SCHRANKE_GESCHLOSSEN // 13
};
current_state_ampel ampel_state = BLINKEN;
// Variablen für Taster 1
bool button1_read = false;
bool button1_on = false;
bool switch1 = false;
// Variablen für den Taster 2
bool button2_read = false;
bool button2_on = false;
bool switch2 = false;
// Variablen für den Sensor
bool sensor_read = false;
bool sensor_on = false;
bool switch3 = false;
// Variablen Fussgänger-Ampel
bool block_ampel = false;
// Variablen Ampel1
bool red = false;
bool yellow = false;
bool green = false;
bool red2 = false;
bool yellow2 = false;
bool green2 = false;
// Variablen Fussgänger-Ampel
bool fuss_red = false;
bool fuss_green = false;
// Setzen der Timer
unsigned long serial_millis = 0;
unsigned long lcd_millis = 0;
unsigned long button1_millis = 0;
unsigned long button2_millis = 0;
unsigned long sensor_millis = 0;
unsigned long ampel_millis = 0;
unsigned long ampel_fuss_millis = 0;
unsigned long blink_millis = 0;
// Belegung der Potis
#define poti1 A0
#define poti2 A1
#define poti3 A2
// Vorrausdeklarierung der Void-Abschnitte
void update_serial_monitor();
void update_lcd();
void toggle_switch();
void toggle_switch_fuss();
void toggle_sensor();
void set_ampel();
void handle_ampel();
void set_ampel_fuss();
void handle_ampel_fuss();
void set_barrier();
void handle_barrier();
void setup() {
// Initialisierung des LCD
lcd.init();
lcd.backlight();
// Setzen der outputs Ampel 1 und 2
pinMode(ampel1_red, OUTPUT);
pinMode(ampel1_yellow, OUTPUT);
pinMode(ampel1_green, OUTPUT);
pinMode(ampel2_red, OUTPUT);
pinMode(ampel2_yellow, OUTPUT);
pinMode(ampel2_green, OUTPUT);
// Setzen der outputs für die Fußgängerampel
pinMode(ampel_fuss_red, OUTPUT);
pinMode(ampel_fuss_green, OUTPUT);
// Setzten der Outputs für das Andreaskreuz
pinMode(warning_light, OUTPUT);
// Setzen der inputs der Taster
pinMode(input_button1, INPUT_PULLUP);
pinMode(input_sensor, INPUT_PULLUP);
pinMode(input_button2, INPUT_PULLUP);
pinMode(input_button4, INPUT_PULLUP);
pinMode(input_button5, INPUT_PULLUP);
// Setzen der analogen inputs der Potis
pinMode(poti1, INPUT);
pinMode(poti2, INPUT);
pinMode(poti3, INPUT);
// Starten des Serial-Monitors
Serial.begin(9600);
}
void loop() {
// Setzen der Funktion für den Serial_Monitor
update_serial_monitor();
// Setzen der Funktion für den LCD
update_lcd();
// Setzen der Funktion für den Toggle_Switch
toggle_switch();
// Setzen der Funktion für den Fussgänger-Taster
toggle_switch_fuss();
// Setzen der Funktion für den Sensor
toggle_sensor();
// Setzen der Funktion für die Auto-Ampeln
set_ampel();
// Setzen der Funktion für die Auto-Ampeln
handle_ampel();
// Setzen der Funktion für die Fussgänger-Ampeln
set_ampel_fuss();
// Setzen der Funktion für die Fussgänger-Ampeln
handle_ampel_fuss();
// Setzen der Funktion für die Schranke
set_barrier();
// Setzen der Funktion für die Schranke
handle_barrier();
}
//===============================================//
//===============Funktionen======================//
//===============================================//
// Abschnitt für den Serial_monitor
void update_serial_monitor() {
// Variablen für diese Funktion
unsigned long serial_timer = millis() - serial_millis;
if (serial_timer > 250){
Serial.print(" Service = ");
Serial.println(switch1);
Serial.print( "Fuss-Taster = ");
Serial.print(switch2);
Serial.print(" Sensor = ");
Serial.print(switch3);
Serial.print(" Ampel_Zustand = ");
Serial.print(ampel_state);
Serial.print(" Ampel_blocker = ");
Serial.print(block_ampel);
serial_millis = millis();
}
}
//===============================================//
//===============Funktionen======================//
//===============================================//
// Abschnitt für den LCD
void update_lcd() {}
//===============================================//
//===============Funktionen======================//
//===============================================//
// Abschnitt für den Toggle-Schalter
void toggle_switch() {
// Variablen für diesen Abschnitt
unsigned long button1_timer = millis() - button1_millis;
button1_read = digitalRead(input_button1);
// Implementierung der Logik
if (button1_read == true) {
button1_millis = millis();
}
if (button1_read == false && button1_on == false && button1_timer > 20) {
button1_on = true;
}
if (button1_read == true && button1_on == true) {
button1_on = false;
switch1 = !switch1;
ampel_millis = millis();
}
}
//===============================================//
//===============Funktionen======================//
//===============================================//
// Abschnitt für den Fussgänger-Taster
void toggle_switch_fuss() {
// Variablen für diesen Abschnitt
unsigned long button2_timer = millis() - button2_millis;
button2_read = digitalRead(input_button2);
// Implementierung der Logik
if (button2_read == true) {
button2_millis = millis();
}
if (button2_read == false && button2_on == false && button2_timer > 20) {
button2_on = true;
}
if (button2_read == true && button2_on == true) {
button2_on = false;
switch2 = !switch2;
}
}
//===============================================//
//===============Funktionen======================//
//===============================================//
// Abschnitt für den Sensor
void toggle_sensor() {
// Variablen für diesen Abschnitt
unsigned long sensor_timer = millis() - sensor_millis;
sensor_read = digitalRead(input_sensor);
// Implementierung der Logik
if (sensor_read == true) {
sensor_millis = millis();
}
if (sensor_read == false && sensor_on == false && sensor_timer > 20) {
sensor_on = true;
}
if (sensor_read == true && sensor_on == true) {
sensor_on = false;
switch3 = !switch3;
}
}
//===============================================//
//===============Funktionen======================//
//===============================================//
// Abschnitt für die Auto-Ampeln
void set_ampel() {
// Variablen für diesen Abschnitt
unsigned long ampel_timer = millis() - ampel_millis;
if (switch1 && block_ampel == false) {
switch (ampel_state) {
case ROT:
if (ampel_timer >= 3000) {
ampel_state = ROT_GELB;
ampel_millis = millis();
}
break;
case ROT_GELB:
if (ampel_timer >= 2000) {
ampel_state = GRUEN;
ampel_millis = millis();
}
break;
case GRUEN:
if (ampel_timer >= 3000) {
ampel_state = GELB;
ampel_millis = millis();
}
break;
case GELB:
if (ampel_timer >= 2000) {
ampel_state = ROT2;
ampel_millis = millis();
}
break;
case ROT2:
if (ampel_timer >= 3000) {
ampel_state = ROT_GELB2;
ampel_millis = millis();
}
break;
case ROT_GELB2:
if (ampel_timer >= 2000) {
ampel_state = GRUEN2;
ampel_millis = millis();
}
break;
case GRUEN2:
if (ampel_timer >= 3000) {
ampel_state = GELB2;
ampel_millis = millis();
}
break;
case GELB2:
if (ampel_timer >= 2000) {
ampel_state = ROT;
ampel_millis = millis();
}
break;
// Default-Zustand
default:
ampel_state = ROT;
ampel_millis = millis();
break;
}
}
else {
ampel_state = BLINKEN;
}
}
//===============================================//
//===============Funktionen======================//
//===============================================//
// Abschnitt für die Auto-Ampeln
void handle_ampel() {
// Variablen für diesen Anschnitt
unsigned long blink_timer = millis() - blink_millis;
switch(ampel_state) {
case ROT:
red = true;
yellow = false;
green = false;
red2 = true;
yellow2 = false;
green2 = false;
fuss_red = true;
fuss_green = false;
break;
case ROT_GELB:
red = true;
yellow = true;
green = false;
red2 = true;
yellow2 = false;
green2 = false;
fuss_red = true;
fuss_green = false;
break;
case GRUEN:
red = false;
yellow = false;
green = true;
red2 = true;
yellow2 = false;
green2 = false;
fuss_red = true;
fuss_green = false;
break;
case GELB:
red = false;
yellow = true;
green = false;
red2 = true;
yellow2 = false;
green2 = false;
fuss_red = true;
fuss_green = false;
break;
case ROT2:
red = true;
yellow = false;
green = false;
red2 = true;
yellow2 = false;
green2 = false;
fuss_red = true;
fuss_green = false;
break;
case ROT_GELB2:
red = true;
yellow = false;
green = false;
red2 = true;
yellow2 = true;
green2 = false;
fuss_red = true;
fuss_green = false;
break;
case GRUEN2:
red = true;
yellow = false;
green = false;
red2 = false;
yellow2 = false;
green2 = true;
fuss_red = true;
fuss_green = false;
break;
case GELB2:
red = true;
yellow = false;
green = false;
red2 = false;
yellow2 = true;
green2 = false;
fuss_red = true;
fuss_green = false;
break;
case BLINKEN:
if (blink_timer > 1000){
red = false;
yellow = true;
green = false;
red2 = false;
yellow2 = true;
green2 = false;
fuss_red = false;
fuss_green = false;
}
if (blink_timer > 2000){
red = false;
yellow = false;
green = false;
red2 = false;
yellow2 = false;
green2 = false;
fuss_red = false;
fuss_green = false;
blink_millis = millis();
}
break;
}
// Schreiben der Ampel_Pins
// Ampel1
digitalWrite(ampel1_red, red);
digitalWrite(ampel1_yellow, yellow);
digitalWrite(ampel1_green, green);
//Ampel2
digitalWrite(ampel2_red, red2);
digitalWrite(ampel2_yellow, yellow2);
digitalWrite(ampel2_green, green2);
}
//===============================================//
//===============Funktionen======================//
//===============================================//
// Abschnitt für die Fussgänger-Ampel
void set_ampel_fuss() {}
//===============================================//
//===============Funktionen======================//
//===============================================//
// Abschnitt für die Fussgänger-Ampel
void handle_ampel_fuss() {}
//===============================================//
//===============Funktionen======================//
//===============================================//
// Abschnitt für die Zug-Schranke
void set_barrier() {}
//===============================================//
//===============Funktionen======================//
//===============================================//
// Abschnitt für die Zug-Schranke
void handle_barrier() {}