#define led_red 10
#define led_green 9
#define led_yellow 8
#define button_1_input 7
#define button_2_input 6
bool button_on = false;
bool button_read = false;
bool switch1 = false;
int red_brightness = 0;
int yellow_brightness = 0;
int green_brightness = 0;
unsigned long button_millis = 0;
unsigned long red_millis = 0;
unsigned long green_millis = 0;
unsigned long yellow_millis = 0;
unsigned long serial_millis = 0;
enum current_state {
red_fade_up,
red_fade_down,
green_fade_up,
green_fade_down,
yellow_fade_up,
yellow_fade_down,
leds_off,
};
current_state led_state = leds_off;
void setup() {
pinMode(led_red, OUTPUT);
pinMode(led_green, OUTPUT);
pinMode(led_yellow, OUTPUT);
pinMode(button_1_input, INPUT_PULLUP);
pinMode(button_2_input, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
handle_toggle_switch();
handle_led();
execute_led();
if (millis() - serial_millis > 100){
Serial.print(" led_state == ");
Serial.println(led_state);
Serial.print(" Taster == ");
Serial.print(switch1);
Serial.print(" LED_RED == ");
Serial.print(red_brightness);
Serial.print(" LED_GREEN == ");
Serial.print(green_brightness);
Serial.print(" LED_YELLOW == ");
Serial.print(yellow_brightness);
serial_millis = millis();
}
}
void handle_toggle_switch() {
bool button_read = digitalRead(button_1_input);
unsigned long button_timer = millis() - button_millis;
if (button_read == true){
button_millis = millis();
}
if (button_read == false && button_on == false && button_timer > 20){
button_on = true;
}
if (button_read == true && button_on == true){
button_on = false;
switch1 = !switch1;
}
}
void handle_led() {
unsigned long red_timer = millis() - red_millis;
unsigned long green_timer = millis() - green_millis;
unsigned long yellow_timer = millis() - yellow_millis;
if (!switch1){
led_state = leds_off;
}
if (switch1 && led_state == leds_off) {
led_state = red_fade_up; // Schalter aktiviert den ersten Zustand nur einmal
}
switch(led_state) {
case leds_off:
red_brightness = 0;
green_brightness = 0;
yellow_brightness = 0;
break;
case red_fade_up:
if (red_timer > 10){
red_brightness ++;
red_millis = millis();
if (red_brightness >= 255){
led_state = green_fade_up;
red_brightness = 255;
}
}
break;
case green_fade_up:
if (green_timer > 10){
green_brightness ++;
green_millis = millis();
if (green_brightness >= 255){
led_state = yellow_fade_up;
green_brightness = 255;
}
}
break;
case yellow_fade_up:
if (yellow_timer > 10){
yellow_brightness ++;
yellow_millis = millis();
if (yellow_brightness >= 255){
led_state = yellow_fade_down;
yellow_brightness = 255;
}
}
break;
case yellow_fade_down:
if (yellow_timer > 10) {
yellow_brightness --;
yellow_millis = millis();
if (yellow_brightness <= 0) {
led_state = green_fade_down;
yellow_brightness = 0;
}
}
break;
case green_fade_down:
if (green_timer > 10) {
green_brightness --;
green_millis = millis();
if (green_brightness <= 0) {
led_state = red_fade_down;
green_brightness = 0;
}
}
break;
case red_fade_down:
if (red_timer > 10) {
red_brightness --;
red_millis = millis();
if (red_brightness <= 0) {
switch1 = false;
red_brightness = 0;
}
}
break;
}
}
void execute_led() {
analogWrite(led_red, red_brightness);
analogWrite(led_green, green_brightness);
analogWrite(led_yellow, yellow_brightness);
}