// ---- INGANGEN (Knoppen) ----
#define KNOP_W_RECHT 2
#define KNOP_W_AFBUIG 3
#define KNOP_S_GROEN 4
#define KNOP_S_ROOD 5
// ---- UITGANGEN (Kato Wissel Relais) ----
#define RELAIS_W_RECHT 6
#define RELAIS_W_AFBUIG 7
// ---- UITGANGEN (Blok Relais) ----
#define RELAIS_STOP 12 // Relais voor Rijden/Stop sectie
#define RELAIS_REM 13 // Relais voor de Remdiodes sectie
// ---- UITGANGEN (Lichtsein buiten - NU GECORRIGEERD!) ----
#define SEIN_BUITEN_GROEN 11 // Was 10, nu 11
#define SEIN_BUITEN_ROOD 10 // Was 11, nu 10
// ---- UITGANGEN (Status Leds Heki-paneel - NU GECORRIGEERD!) ----
#define LED_W_RECHT 8
#define LED_W_AFBUIG 9
#define LED_PANEEL_GROEN A2 // Was A1, nu A2
#define LED_PANEEL_ROOD A1 // Was A2, nu A1
// Relais Active Low
#define RELAIS_AAN LOW
#define RELAIS_UIT HIGH
void setup() {
Serial.begin(9600);
pinMode(KNOP_W_RECHT, INPUT_PULLUP);
pinMode(KNOP_W_AFBUIG, INPUT_PULLUP);
pinMode(KNOP_S_GROEN, INPUT_PULLUP);
pinMode(KNOP_S_ROOD, INPUT_PULLUP);
digitalWrite(RELAIS_W_RECHT, RELAIS_UIT);
digitalWrite(RELAIS_W_AFBUIG, RELAIS_UIT);
digitalWrite(RELAIS_REM, RELAIS_AAN);
digitalWrite(RELAIS_STOP, RELAIS_AAN);
pinMode(RELAIS_W_RECHT, OUTPUT);
pinMode(RELAIS_W_AFBUIG, OUTPUT);
pinMode(RELAIS_STOP, OUTPUT);
pinMode(RELAIS_REM, OUTPUT);
pinMode(LED_W_RECHT, OUTPUT);
pinMode(LED_W_AFBUIG, OUTPUT);
pinMode(LED_PANEEL_GROEN, OUTPUT);
pinMode(LED_PANEEL_ROOD, OUTPUT);
pinMode(SEIN_BUITEN_GROEN, OUTPUT);
pinMode(SEIN_BUITEN_ROOD, OUTPUT);
// Beginstand bij opstarten: Wissel recht, sein is ROOD
digitalWrite(LED_W_RECHT, HIGH);
digitalWrite(LED_W_AFBUIG, LOW);
digitalWrite(LED_PANEEL_GROEN, LOW);
digitalWrite(LED_PANEEL_ROOD, HIGH);
analogWrite(SEIN_BUITEN_GROEN, 0); // Groen buiten is UIT
analogWrite(SEIN_BUITEN_ROOD, 255); // Rood buiten is VOL AAN
Serial.println("Heki Lichtsein (Gecorrigeerd) Online!");
}
void loop() {
// ---- WISSEL RECHT ----
if (digitalRead(KNOP_W_RECHT) == LOW) {
digitalWrite(LED_W_RECHT, HIGH);
digitalWrite(LED_W_AFBUIG, LOW);
Serial.println("Wisselstand: RECHTHOOG");
digitalWrite(RELAIS_W_RECHT, RELAIS_AAN);
delay(150);
digitalWrite(RELAIS_W_RECHT, RELAIS_UIT);
delay(250);
}
// ---- WISSEL AFBUIGEND ----
if (digitalRead(KNOP_W_AFBUIG) == LOW) {
digitalWrite(LED_W_RECHT, LOW);
digitalWrite(LED_W_AFBUIG, HIGH);
Serial.println("Wisselstand: AFBUIGEND");
digitalWrite(RELAIS_W_AFBUIG, RELAIS_AAN);
delay(150);
digitalWrite(RELAIS_W_AFBUIG, RELAIS_UIT);
delay(250);
}
// ---- SEIN VEILIG (Groen -> Overvloeien van Rood naar Groen) ----
if (digitalRead(KNOP_S_GROEN) == LOW && digitalRead(LED_PANEEL_GROEN) == LOW) {
Serial.println("Seinstand: VEILIG -> Lichtsein vloeit over naar Groen...");
// Direct op het paneel omschakelen
digitalWrite(LED_PANEEL_GROEN, HIGH);
digitalWrite(LED_PANEEL_ROOD, LOW);
// Trein mag direct vertrekken
digitalWrite(RELAIS_STOP, RELAIS_UIT);
digitalWrite(RELAIS_REM, RELAIS_UIT);
// Overvloeien buiten op de baan
for (int i = 0; i <= 255; i += 5) {
analogWrite(SEIN_BUITEN_GROEN, i);
analogWrite(SEIN_BUITEN_ROOD, 255 - i);
delay(10);
}
analogWrite(SEIN_BUITEN_GROEN, 255);
analogWrite(SEIN_BUITEN_ROOD, 0);
}
// ---- SEIN ONVEILIG (Rood -> Overvloeien van Groen naar Rood) ----
if (digitalRead(KNOP_S_ROOD) == LOW && digitalRead(LED_PANEEL_ROOD) == LOW) {
Serial.println("Seinstand: ONVEILIG -> Lichtsein vloeit over naar Rood...");
// Direct op het paneel omschakelen
digitalWrite(LED_PANEEL_GROEN, LOW);
digitalWrite(LED_PANEEL_ROOD, HIGH);
// Het lichtsein buiten vloeit over
for (int i = 0; i <= 255; i += 5) {
analogWrite(SEIN_BUITEN_ROOD, i);
analogWrite(SEIN_BUITEN_GROEN, 255 - i);
delay(10);
}
analogWrite(SEIN_BUITEN_ROOD, 255);
analogWrite(SEIN_BUITEN_GROEN, 0);
// Rem- en stoplogica inschakelen
digitalWrite(RELAIS_REM, RELAIS_AAN);
delay(500);
digitalWrite(RELAIS_STOP, RELAIS_AAN);
}
}