int TIMINGS[] = {-1, 1, 5, 10 };
int BUTTONS[] = {16, 17, 18, 19 };
int LEDS[] = {27, 26, 25, 33 };
String COLORS[] = {"Grün", "Gelb", "Blau", "Weiss"};
String DESC = "GYBW";
int VALVE = 23;
String last_pressed = "";
String mode = "";
int time_target = 0;
void led_write(String active) {
for (int i = 0; i < sizeof(LEDS) / sizeof(LEDS[0]); i++) {
digitalWrite(LEDS[i], LOW);
}
for (int i = 0; i < active.length(); ++i) {
digitalWrite(LEDS[DESC.indexOf(active[i])], HIGH);
}
}
void startup_sequence() {
led_write("G");
delay(250);
led_write("Y");
delay(250);
led_write("B");
delay(250);
led_write("W");
delay(250);
led_write("");
delay(250);
led_write("GYBW");
delay(250);
led_write("");
delay(250);
led_write("GYBW");
delay(250);
led_write("");
}
String get_pressed() {
String pressed = "";
for (int i = 0; i < sizeof(BUTTONS) / sizeof(BUTTONS[0]); i++) {
if (digitalRead(BUTTONS[i]) == HIGH) {
pressed += DESC[i];
}
}
return pressed;
}
void setup() {
Serial.begin(115200);
Serial.println("Initializing...");
pinMode(VALVE, OUTPUT);
for (int i = 0; i < sizeof(BUTTONS) / sizeof(BUTTONS[0]); i++) {
pinMode(BUTTONS[i], INPUT);
}
for (int i = 0; i < sizeof(LEDS) / sizeof(LEDS[0]); i++) {
pinMode(LEDS[i], OUTPUT);
}
delay(250);
led_write("");
delay(250);
startup_sequence();
Serial.println("Finished Initialization!");
}
void loop() {
if (time_target != 0) {
if (millis() > time_target) {
time_target = 0;
mode = "";
led_write(mode);
digitalWrite(VALVE, LOW);
}
}
String pressed = get_pressed();
if (last_pressed != pressed) {
delay(50);
pressed = get_pressed();
last_pressed = pressed;
if (pressed.length() == 0) {
if (mode == "restart") {
for (int i = 0; i < 10; ++i) {
led_write("GYBW");
delay(250);
led_write("");
delay(250);
}
ESP.restart();
}
} else {
if (pressed.length() == 1) {
if (mode == "") {
mode = pressed;
led_write(mode);
int start_time = millis();
digitalWrite(VALVE, HIGH);
if (TIMINGS[DESC.indexOf(mode)] >= 0) {
time_target = start_time + TIMINGS[DESC.indexOf(mode)] * 1000;
}
} else if (mode == pressed){
time_target = 0;
mode = "";
led_write(mode);
digitalWrite(VALVE, LOW);
}
} else {
if (pressed == "GY") {
led_write("GYBW");
mode = "restart";
}
}
}
}
}