// =========================================================================
// STABIELE MASTER CODE - FIX VOOR DE ZWEVENDE RESETPIN (PIN 7)
// =========================================================================
// Pinnen gesynchroniseerd met jouw diagram.json
const int ledRood[] = {0, 2, 4, 6, 8, 10, 12, 14, 16, 22, 20, 44};
const int ledGroen[] = {0, 3, 5, 7, 9, 11, 46, 15, 17, 25, 21, 45};
// Handmatige groene knoppen (sg1 t/m sg11)
const int knopGroen[] = {0, A8, A9, A10, A11, A12, A13, A14, A15, 47, 48, 49};
bool vorigeStatusKnopGroen[] = {0, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH};
// Handmatige rode knoppen (sr1 t/m sr11)
const int knopRood[] = {0, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43};
bool vorigeStatusKnopRood[] = {0, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH};
// De 11 Bezetmelder-LEDs onderin jouw scherm
const int ledBezetmelder[] = {0, 27, 26, 28, A7, A6, A5, A4, A3, A2, A1, A0};
// Timerschakelaars (T1, T2, T5, T6)
const int pinT1 = 53;
const int pinT2 = 52;
const int pinT5 = 51;
const int pinT6 = 50;
bool statusT1 = HIGH, statusT2 = HIGH, statusT5 = HIGH, statusT6 = HIGH;
// Speciale knoppen op het paneel
const int pin_stopKnop = 24;
// const int pin_startKnop = 7; // Tijdelijk uitgeschakeld tegen zwevende pin rimpelingen
bool noodstopActief = false;
void verwerkCommando(String cmd) {
cmd.trim();
if (cmd.length() == 0) return;
Serial.print("[RX COMMANDO]: "); Serial.println(cmd);
if (cmd == "STOP") {
Serial.println("⚠️ EMERGENCY STOP! Systeem VERGRENDELD. Alle paneel-LEDs naar ROOD!");
noodstopActief = true;
for (int i = 1; i <= 11; i++) {
digitalWrite(ledGroen[i], HIGH);
digitalWrite(ledRood[i], LOW);
}
return;
}
if (cmd == "START") {
Serial.println("▶️ Systeem vrijgegeven.");
noodstopActief = false;
return;
}
if (cmd.startsWith("B")) {
int nummer = cmd.substring(1).toInt();
if (nummer >= 1 && nummer <= 11) {
digitalWrite(ledBezetmelder[nummer], HIGH);
}
return;
}
if (cmd.startsWith("V")) {
int nummer = cmd.substring(1).toInt();
if (nummer >= 1 && nummer <= 11) {
digitalWrite(ledBezetmelder[nummer], LOW);
}
return;
}
if (!noodstopActief) {
if (cmd.startsWith("M_R")) {
int nummer = cmd.substring(3).toInt();
if (nummer >= 1 && nummer <= 11) {
digitalWrite(ledGroen[nummer], HIGH);
digitalWrite(ledRood[nummer], LOW);
}
}
else if (cmd.startsWith("M_G")) {
int nummer = cmd.substring(3).toInt();
if (nummer >= 1 && nummer <= 11) {
digitalWrite(ledRood[nummer], HIGH);
digitalWrite(ledGroen[nummer], LOW);
}
}
}
}
void setup() {
Serial.begin(9600);
Serial1.begin(9600);
pinMode(pin_stopKnop, INPUT_PULLUP);
// pinMode(pin_startKnop, INPUT_PULLUP); // Uitgevinkt
pinMode(pinT1, INPUT_PULLUP);
pinMode(pinT2, INPUT_PULLUP);
pinMode(pinT5, INPUT_PULLUP);
pinMode(pinT6, INPUT_PULLUP);
statusT1 = digitalRead(pinT1);
statusT2 = digitalRead(pinT2);
statusT5 = digitalRead(pinT5);
statusT6 = digitalRead(pinT6);
for (int i = 1; i <= 11; i++) {
pinMode(knopGroen[i], INPUT_PULLUP);
vorigeStatusKnopGroen[i] = digitalRead(knopGroen[i]);
pinMode(knopRood[i], INPUT_PULLUP);
vorigeStatusKnopRood[i] = digitalRead(knopRood[i]);
}
for (int i = 1; i <= 11; i++) {
pinMode(ledRood[i], OUTPUT);
pinMode(ledGroen[i], OUTPUT);
digitalWrite(ledRood[i], LOW);
digitalWrite(ledGroen[i], HIGH);
}
for (int i = 1; i <= 11; i++) {
pinMode(ledBezetmelder[i], OUTPUT);
digitalWrite(ledBezetmelder[i], LOW);
}
Serial.println("=== MASTER PANEEL ONLINE ===");
}
void checkSchakelaar(int pin, bool &huidigeStatus, String timerNaam) {
bool poortMeting = digitalRead(pin);
if (poortMeting != huidigeStatus) {
delay(50);
if (digitalRead(pin) == poortMeting) {
huidigeStatus = poortMeting;
if (huidigeStatus == LOW) {
Serial.print("⏱️ "); Serial.print(timerNaam); Serial.println(" INGESCHAKELD (AAN)");
Serial1.println(timerNaam + "_AAN");
} else {
Serial.print("⏱️ "); Serial.print(timerNaam); Serial.println(" UITGESCHAKELD (UIT)");
Serial1.println(timerNaam + "_UIT");
}
}
}
}
void loop() {
if (Serial.available()) { verwerkCommando(Serial.readStringUntil('\n')); }
if (Serial1.available()) { verwerkCommando(Serial1.readStringUntil('\n')); }
// Noodknop controleren
if (digitalRead(pin_stopKnop) == LOW) {
Serial1.println("STOP");
verwerkCommando("STOP");
delay(250);
}
// De fysieke check op pin 7 is hier weggehaald om het herhalen te stoppen.
// Je herstart nu puur door "START" te typen in de monitor.
// Controleer de 4 schakelaars
checkSchakelaar(pinT1, statusT1, "T1");
checkSchakelaar(pinT2, statusT2, "T2");
checkSchakelaar(pinT5, statusT5, "T5");
checkSchakelaar(pinT6, statusT6, "T6");
if (noodstopActief) return;
// Handmatige GROENE knoppen scannen
for (int i = 1; i <= 11; i++) {
bool actueleStatus = digitalRead(knopGroen[i]);
if (actueleStatus != vorigeStatusKnopGroen[i]) {
delay(20);
if (digitalRead(knopGroen[i]) == actueleStatus && actueleStatus == LOW) {
Serial1.print("M_G"); Serial1.println(i);
verwerkCommando("M_G" + String(i));
}
vorigeStatusKnopGroen[i] = actueleStatus;
}
}
// Handmatige RODE knoppen scannen
for (int i = 1; i <= 11; i++) {
bool actueleStatus = digitalRead(knopRood[i]);
if (actueleStatus != vorigeStatusKnopRood[i]) {
delay(20);
if (digitalRead(knopRood[i]) == actueleStatus && actueleStatus == LOW) {
Serial1.print("M_R"); Serial1.println(i);
verwerkCommando("M_R" + String(i));
}
vorigeStatusKnopRood[i] = actueleStatus;
}
}
}