// --- MASTER BINNENBAAN: COMPLETE CODE MET TIMER DISPLAY ---
const int DS_PIN = 53; const int STCP_PIN = 52; const int SHCP_PIN = 51;
byte regData[4] = {0, 0, 0, 0};
bool bezetStatus[7] = {false, false, false, false, false, false, false};
int activeGroepSein = 0;
unsigned int schakelPauze = 2000;
unsigned long overstapTimerStart = 0;
bool overstapTimerActief = false;
int actiefWachtSpoor = 0;
// Cijfers voor het 8-segment display (Common Anode: 0=AAN, 1=UIT)
const byte cijfers[] = {
B11000000, // 0
B11111001, // 1
B10100100, // 2
B10110000, // 3
B10011001, // 4
B10010010, // 5
B10000010, // 6
B11111000, // 7
B10000000, // 8
B10010000 // 9
};
void setup() {
Serial.begin(9600);
pinMode(DS_PIN, OUTPUT); pinMode(STCP_PIN, OUTPUT); pinMode(SHCP_PIN, OUTPUT);
pinMode(A15, INPUT_PULLUP);
for(int i=2; i<=11; i++) pinMode(i, INPUT_PULLUP);
pinMode(12, INPUT_PULLUP);
for(int i=22; i<=39; i++) pinMode(i, INPUT_PULLUP);
for(int i=40; i<=49; i++) { pinMode(i, OUTPUT); digitalWrite(i, HIGH); }
for(int i=A0; i<=A3; i++) { pinMode(i, OUTPUT); digitalWrite(i, HIGH); }
regData[3] = B11111111; // Display uit bij start
for(int w=4; w<=10; w++) { setWisselInitial(w, true); }
updateRegisters();
for(int s=5; s<=11; s++) { setSeinInitial(s, false); }
Serial.println("Binnenbaan Mega gestart");
}
void loop() {
if (digitalRead(12) == LOW) { resetSysteem(); delay(500); }
// Wissels en Seinen
if (digitalRead(2) == LOW) { setWissel(4, true); }
if (digitalRead(3) == LOW) { setWissel(4, false); }
if (digitalRead(4) == LOW) { setWissel(5, true); }
if (digitalRead(5) == LOW) { setWissel(5, false); }
if (digitalRead(6) == LOW) { setWissel(6, true); }
if (digitalRead(7) == LOW) { setWissel(6, false); }
if (digitalRead(8) == LOW) { setWissel(7, true); }
if (digitalRead(9) == LOW) { setWissel(7, false); }
if (digitalRead(10) == LOW) { setWissel(8, true); }
if (digitalRead(11) == LOW) { setWissel(8, false); }
if (digitalRead(22) == LOW) { setWissel(9, true); }
if (digitalRead(23) == LOW) { setWissel(9, false); }
if (digitalRead(24) == LOW) { setWissel(10, true); }
if (digitalRead(25) == LOW) { setWissel(10, false); }
if (digitalRead(26) == LOW) { setSeinDirect(5, true); }
if (digitalRead(27) == LOW) { setSeinDirect(5, false); }
if (digitalRead(28) == LOW) { setSeinDirect(6, true); }
if (digitalRead(29) == LOW) { setSeinDirect(6, false); }
if (digitalRead(30) == LOW) { setSeinDirect(7, true); }
if (digitalRead(31) == LOW) { setSeinDirect(7, false); }
if (digitalRead(32) == LOW) { setSeinDirect(8, true); }
if (digitalRead(33) == LOW) { setSeinDirect(8, false); }
if (digitalRead(34) == LOW) { setSeinDirect(9, true); }
if (digitalRead(35) == LOW) { setSeinDirect(9, false); }
if (digitalRead(36) == LOW) { setSeinDirect(10, true); }
if (digitalRead(37) == LOW) { setSeinDirect(10, false); }
if (digitalRead(38) == LOW) { setSeinDirect(11, true); }
if (digitalRead(39) == LOW) { setSeinDirect(11, false); }
if (Serial.available() > 0) {
String input = Serial.readStringUntil('\n'); input.trim();
if (input.startsWith("BM")) setBezetmelder(input.substring(2).toInt());
if (input == "REED5_M") startMasterTimer(5);
if (input == "REED6_N") startMasterTimer(6);
}
// Timer afhandeling met display update
if (overstapTimerActief) {
unsigned long verstreken = millis() - overstapTimerStart;
int rest = 5 - (verstreken / 1000);
if (rest >= 0) {
regData[3] = cijfers[rest];
updateRegisters();
}
if (verstreken >= 5000) {
setSeinDirect(actiefWachtSpoor, true);
regData[3] = B11111111; // Display uit
updateRegisters();
overstapTimerActief = false;
}
}
}
void startMasterTimer(int spoor) {
if (digitalRead(A15) == LOW) { overstapTimerStart = millis(); overstapTimerActief = true; actiefWachtSpoor = spoor; }
else { setSeinDirect(spoor, true); }
}
void setWissel(int nr, bool recht) { setWisselInitial(nr, recht); updateRegisters(); }
void setSeinDirect(int nr, bool groen) {
bool isWisselStraatSein = (nr >= 5 && nr <= 11);
if (groen) {
if (isWisselStraatSein && activeGroepSein != 0 && activeGroepSein != nr) return;
switch(nr) {
case 5: setWissel(4, false); delay(schakelPauze); setWissel(5, true); delay(schakelPauze); setWissel(6, false); break;
case 6: setWissel(4, true); delay(schakelPauze); setWissel(5, true); delay(schakelPauze); setWissel(6, true); break;
case 7: setWissel(9, false); delay(schakelPauze); setWissel(10, false); break;
case 8: setWissel(9, true); delay(schakelPauze); setWissel(10, true); break;
case 9: setWissel(5, false); delay(schakelPauze); setWissel(8, false); delay(schakelPauze); setWissel(7, true); break;
case 10: setWissel(5, false); delay(schakelPauze); setWissel(7, true); delay(schakelPauze); setWissel(8, true); break;
case 11: setWissel(5, false); delay(schakelPauze); setWissel(7, false); break;
}
delay(schakelPauze);
activeGroepSein = nr;
setSeinInitial(nr, true);
} else {
if (nr == activeGroepSein) activeGroepSein = 0;
setSeinInitial(nr, false);
}
}
void resetSysteem() {
for(int i = 5; i <= 11; i++) { setSeinDirect(i, false); }
activeGroepSein = 0;
}
void setWisselInitial(int nr, bool recht) {
switch(nr) {
case 4: setReg(0, 0, recht); setReg(0, 1, !recht); break;
case 5: setReg(0, 2, recht); setReg(0, 3, !recht); break;
case 6: setReg(0, 4, recht); setReg(0, 5, !recht); break;
case 7: setReg(0, 6, recht); setReg(0, 7, !recht); break;
case 8: setReg(1, 1, !recht); setReg(1, 0, recht); break;
case 9: setReg(1, 3, !recht); setReg(1, 2, recht); break;
case 10: setReg(1, 5, !recht); setReg(1, 4, recht); break;
}
}
void setSeinInitial(int nr, bool groen) {
int pinG = 0, pinR = 0;
switch(nr) {
case 5: pinG = 40; pinR = 41; break;
case 6: pinG = 42; pinR = 43; break;
case 7: pinG = 44; pinR = 45; break;
case 8: pinG = 46; pinR = 47; break;
case 9: pinG = 48; pinR = 49; break;
case 10: pinG = A0; pinR = A1; break;
case 11: pinG = A2; pinR = A3; break;
}
if(pinG != 0) {
if(groen) { digitalWrite(pinR, HIGH); digitalWrite(pinG, LOW); }
else { digitalWrite(pinR, LOW); digitalWrite(pinG, HIGH); }
}
}
void updateRegisters() {
digitalWrite(STCP_PIN, LOW);
shiftOut(DS_PIN, SHCP_PIN, MSBFIRST, regData[3]); // Display
shiftOut(DS_PIN, SHCP_PIN, MSBFIRST, regData[2]); // SR3
shiftOut(DS_PIN, SHCP_PIN, MSBFIRST, regData[1]); // SR2
shiftOut(DS_PIN, SHCP_PIN, MSBFIRST, regData[0]); // SR1
digitalWrite(STCP_PIN, HIGH);
}
void setReg(int reg, int bitNum, bool aan) {
if (aan) regData[reg] |= (1 << bitNum);
else regData[reg] &= ~(1 << bitNum);
}
void setBezetmelder(int nr) {
if (nr >= 5 && nr <= 11) {
int index = nr - 5;
bezetStatus[index] = !bezetStatus[index];
setReg(2, index, bezetStatus[index]);
updateRegisters();
}
}