#include const byte ldr = A1; const byte press_sensor = A3; const byte warnlight = 6; const byte nummernschild = 10; const byte magnetventil = 5; const byte motor = 8; const byte ablassventil = 7; const byte buzzer = 11; const byte led = 13; const byte switch1 = 3; const byte switch2 = 12; int pressure; int pressure_array[9]; int pressure_low = 200; int pressure_high = 300; int open_time; int warnlight_power = 0; byte warnlight_power_dir = 1; byte error = 0; byte led_state = 0; byte compressor_state = 0; byte startup_state = 5; byte move_state = 0; unsigned long t_heartbeat = 0; unsigned long t_pressure_readtime = 0; unsigned long t_open = 0; unsigned long t_startup = 0; unsigned long t_warnlight = 0; void setup() { Serial.begin(9600); pinMode(warnlight, OUTPUT); pinMode(nummernschild, OUTPUT); pinMode(magnetventil, OUTPUT); pinMode(motor, OUTPUT); pinMode(ablassventil, OUTPUT); pinMode(buzzer, OUTPUT); pinMode(led, OUTPUT); pinMode(switch1, INPUT_PULLUP); pinMode(switch2, INPUT_PULLUP); digitalWrite(led, HIGH); tone(buzzer, 300, 500); delay(100); tone(buzzer, 400, 500); delay(100); tone(buzzer, 500, 500); digitalWrite(led, LOW); press_read(); press_read(); press_read(); press_read(); press_read(); press_read(); press_read(); press_read(); press_read(); wdt_enable(WDTO_8S); } void loop() { if (millis() > t_pressure_readtime + 500) { t_pressure_readtime = millis(); press_read(); } heartbeat(); compressor(); if (!digitalRead(switch1)) { delay(200); if (!digitalRead(switch1)) { tone(buzzer, 500, 500); digitalWrite(magnetventil, HIGH); t_open = millis(); open_time = 45000; move_state = 1; warnlight_power = 0; warnlight_power_dir = 1; } } if (!digitalRead(switch2)) { delay(200); if (!digitalRead(switch2)) { tone(buzzer, 500, 500); digitalWrite(magnetventil, HIGH); t_open = millis(); open_time = 120000; move_state = 1; warnlight_power = 0; warnlight_power_dir = 1; } } if (millis() > t_open + 9640 && move_state == 1) //lampe aus { move_state = 2; } if (millis() > t_open + open_time && move_state == 2)//lampe an, Vorwarnung { move_state = 3; warnlight_power = 0; warnlight_power_dir = 1; } if (millis() > t_open + open_time + 6000 && move_state == 3)//lampe an { digitalWrite(magnetventil, LOW); move_state = 4; } if (millis() > t_open + open_time + 10000 && move_state == 4)//lampe aus { move_state = 0; } if (millis() > t_warnlight + 2) { if ((move_state == 1 || move_state == 3 || move_state == 4)) { t_warnlight = millis(); if (warnlight_power == 0) { warnlight_power_dir = 1; } if (warnlight_power == 255) { warnlight_power_dir = 0; } if (warnlight_power_dir == 1) { warnlight_power++; } if (warnlight_power_dir == 0) { warnlight_power--; } analogWrite(warnlight, warnlight_power); } else { while (warnlight_power != 0) { analogWrite(warnlight, warnlight_power); warnlight_power--; } analogWrite(warnlight, 0); } } } void heartbeat() { wdt_reset(); if (t_heartbeat + 5000 < millis()) //7000 { t_heartbeat = millis(); if (pressure < 0) { error = 1; } if (error == 0) { digitalWrite(led, HIGH); delay(60); digitalWrite(led, LOW); } if (error == 1) { for (int i = 0; i < 6; i++) { digitalWrite(led, HIGH); tone(buzzer, 100, 500); delay(500); digitalWrite(led, LOW); delay(500); } } if (error == 2) { digitalWrite(led, HIGH); } } } int press_read() { pressure_array[9] = pressure_array[8]; pressure_array[8] = pressure_array[7]; pressure_array[7] = pressure_array[6]; pressure_array[6] = pressure_array[5]; pressure_array[5] = pressure_array[4]; pressure_array[4] = pressure_array[3]; pressure_array[3] = pressure_array[2]; pressure_array[2] = pressure_array[1]; pressure_array[1] = pressure_array[0]; pressure = (pressure_array[1] + pressure_array[2] + pressure_array[3] + pressure_array[4] + pressure_array[5] + pressure_array[6] + pressure_array[7] + pressure_array[8] + pressure_array[9]) / 9; pressure_array[0] = map(analogRead(press_sensor), 98, 920, 0, 1200); } void compressor() { if (error == 0) { if (pressure < pressure_low && startup_state == 5) { startup_state = 0; } if (startup_state == 0) { startup_state = 1; digitalWrite(ablassventil, HIGH); t_startup = millis(); } if (startup_state == 1 && millis() > t_startup + 5000) { startup_state = 2; digitalWrite(motor, HIGH); t_startup = millis(); } if (startup_state == 2 && millis() > t_startup + 5000) { startup_state = 3; digitalWrite(ablassventil, LOW); t_startup = millis(); } if (startup_state == 3 && millis() > t_startup + 1200000 && pressure < pressure_high) { error = 2; } if (pressure > pressure_high && startup_state == 3) { startup_state = 4; t_startup = millis(); digitalWrite(ablassventil, HIGH); digitalWrite(motor, LOW); error = 0; } if (startup_state == 4 && millis() > t_startup + 5000) { startup_state = 5; digitalWrite(ablassventil, LOW); } } else { startup_state = 5; } }