//
// Wascoe Siding - Blaxland Junction Points & signals interlocking
// R. Parnell 8/10/2023
// To determine values for analogue inputs - serial port display. Note: check that
// sensor supply voltage is exactly the same as the Arduino!
// ************************************
//
// *** ***** * **** *****
// * * * * * * *
// *** * ***** **** *
// * * * * * * *
// *** * * * * * *
//
// ***************************************
// inputs - active "low" (except for points levers - analog for 9, 10, 11, 12)
// outputs - acitve "high"
// define outputs
int M1red = 0; // M1 red
int M1yel = 1; // yellow
int M1grn = 2; // green
int M2red = 3;
int M2yel = 4;
int M2grn = 5;
int M2TO = 6;
int M2y1 = 7;
int M2y2 = 8;
int ST11red = 9;
int ST11yel = 10;
int ST11grn = 11;
int ST11TO = 12;
int ST13red = 13;
int ST13yelM = 14;
int ST13yelS = 15;
int ST12red = 16;
int ST12yel = 17;
int ST12grn = 18;
int ST12y1 = 19;
int ST12y2 = 20;
int pts5N = 21; // normal, reverse, track circuit mimic
int pts5R = 22; //
int pts5TC = 23;
// int pts6N = 24;
//int pts6R = 25;
// int pts6TC = 26;
int pts6Nstrt = 24; // inner track - straight through
int pts6Ndiag = 25; // yard to/from main
int pts6TC = 28;
int pts6Rsm = 26; // reversed - station to/from main
int pts6Rsy = 27; // reversed - station to/from yard
//int pts7N = 27;
//int pts7R = 28;
int pts7TC = 29;
int pts7N = 52;
int pts7R = 53;
int pts9N = 30;
int pts9R = 31;
int pts9TC = 32; // not used at this point in time (reserved for possible use later)
int pts10N = 33;
int pts10R = 34;
int pts10TC = 35; // not used at this point in time
int pts11N = 36;
int pts11R = 37;
int pts11TC = 38; // not used at this point in time
int pts12N = 39;
int pts12R = 40;
int pts12TC = 41; // not used at this point in time
int PLRW = 42; // points lever reverse warning
int proximityNvalue = 512;// 2.5V voltage divider
int proximityRvalue = 675;// 3.3V voltage divider
int proxwindow = 41; // analogue proxmity value "window" to set high and low range values
// 41 is equal to +-0.2v range for proximity analog value
// define inputs:
int emerg = 43; // emergency stop input
int M1proceed = 44;
int M2proceed = 45;
int ST12proceed = 46;
int ST1113proceed = 47;
int C2stop = 48; // is next signal C2 at stop?
int C4stop = 49;
int ST15stop = 50;
int M3stop = 51;
int pts5Ndet = A0; // detection of Normal
int pts5Rdet = A1; // detection of Reverse
int pts5block = A2; // track circuit input
int pts6Ndet = A3; // detection of Normal
int pts6Rdet = A4; // detection of Reverse
int pts6block = A5; // track circuit input
int pts7Ndet = A6; // detection of Normal
int pts7Rdet = A7; // detection of Reverse
int pts7block = A8; // track circuit input
// not enough inputs for future block detection of 9, 10, 11 and 12 points
// analogue inputs used for N/R detection of 9-12 points, due to shortage of inputs
int pts9NRdetect = A12; // now analogue 1/4/25
//int pts9normal = A12; // 9-12 temporary for the purpose of displaying mimic and lever reverse warning
int pts10NRdetect = A13;
int pts11NRdetect = A14;
int pts12NRdetect = A15;
int pts9NRvalue = 0;
int pts10NRvalue = 0;
int pts11NRvalue = 0;
int pts12NRvalue = 0;
//int pts10normal = A13;
//int pts11normal = A14;
//int pts12normal = A15;
unsigned long startMillis; // for starting countdown of timer
unsigned long warningONmillis = 600; // on/off 50% duty cycle time period for points lever reversed flash
unsigned long pointslevertimer = 4000; // time allowed to swing a points lever from one position to the other
unsigned long currentMillis; // what will be the current value to compare countdown to
boolean pulseHigh = false; // base rate continuously cycling in the background
bool alertON = false; // if alert lamp is on or not
unsigned long lever5timer; // for starting timer for operating lever from one position to the other
unsigned long lever6timer;
unsigned long lever7timer;
unsigned long lever9timer;
unsigned long lever10timer;
unsigned long lever11timer;
unsigned long lever12timer;
bool warning5 = false; // flag for setting points lever warning alert
bool warning6 = false;
bool warning7 = false;
bool warning8 = false;
bool warning9 = false;
bool warning10 = false;
bool warning11 = false;
bool warning12 = false;
bool block5occ = false;
bool block6occ = false;
bool block7occ = false;
bool block9occ = false; // block 9 to 12 included to "future proof" programming
bool block10occ = false;
bool block11occ = false;
bool block12occ = false;
bool emergstop = false;
bool M1stopVal = false;
bool M2stopVal = false;
bool ST1113stopVal = false;
bool ST12stopVal = false;
bool C4nextstop = false;
bool C2nextstop = false;
bool ST15next = false;
bool M3next = false;
bool pts5Normal = false;
bool pts5Reverse = false;
bool pts6Normal = false;
bool pts6Reverse = false;
bool shuntfromyard = false;
bool shuntfrommain = false;
bool shuntfromstation = false;
bool pts7Normal = false;
bool pts7Reverse = false;
bool pts9Normal = true;
bool pts10Normal = true;
bool pts11Normal = true;
bool pts12Normal = true;
bool pts9Reverse = false;
bool pts10Reverse = false;
bool pts11Reverse = false;
bool pts12Reverse = false;
// remark out the ON/OFF pair below to suit relay modules as required
//*** for active LOW relay modules:
bool relayON = LOW;
bool relayOFF = HIGH;
//*** for active HIGH relay modules:
//bool relayON = HIGH;
//bool relayOFF = LOW; //
bool points5intransit = false;
bool points7intransit = false;
bool points6intransit = false;
bool points9intransit = false;
bool points10intransit = false;
bool points11intransit = false;
bool points12intransit = false;
int route = 100; // 1 of 6 possible combinations of routes with the possible points settings
int STATIONsignalswitchset = 0; // 3 possible combinations of proceed ACW/stop/proceed CW (10, 0 or 1)
int MAINsignalswitchset = 0; // 3 possible combinations of proceed ACW/stop/proceed CW (10, 0 or 1)
bool skippedSTATIONsignals = false;
bool skippedMAINsignals = false;
bool routeA1set = false;
bool routeBset = false;
bool routeCset = false;
bool routeD1set = false;
bool routeEset = false;
bool routeFset = false;
bool routeA2set = false;
bool routeD2set = false;
bool routeMAINset = false;
bool routeAlockedMAIN = false;
bool routeAlockedSTATION = false;
bool routeBlockedMAIN = false;
bool routeBlockedSTATION = false;
bool routeClockedMAIN = false;
bool routeClockedSTATION = false;
bool routeDlockedMAIN = false;
bool routeDlockedSTATION = false;
bool routeElockedMAIN = false;
bool routeElockedSTATION = false;
bool routeFlockedMAIN = false;
bool routeFlockedSTATION = false;
bool routeAlocked = false;
bool routeBlocked = false;
bool routeDlocked = false;
bool routeClocked = false;
bool routeElocked = false;
bool routeFlocked = false;
bool route7Nset = false;
bool points7lockedN = false;
bool points5lockedN = false;
bool points6lockedN = false;
bool points7lockedR = false;
bool points5lockedR = false;
bool points6lockedR = false;
//#########################
void setup() {
Serial.begin(9600); // open the serial port for debugging
startMillis = millis(); //start timer value for alert
pinMode(emerg, INPUT);
pinMode(M1proceed, INPUT);
pinMode(M2proceed, INPUT);
pinMode(ST12proceed, INPUT);
pinMode(ST1113proceed, INPUT);
pinMode(C2stop, INPUT);
pinMode(C4stop, INPUT);
pinMode(ST15stop, INPUT);
pinMode(M3stop, INPUT);
pinMode(pts5Ndet, INPUT);
pinMode(pts5Rdet, INPUT);
pinMode(pts5block, INPUT);
pinMode(pts6Ndet, INPUT);
pinMode(pts6Rdet, INPUT);
pinMode(pts6block, INPUT);
pinMode(pts7Ndet, INPUT);
pinMode(pts7Rdet, INPUT);
pinMode(pts7block, INPUT);
pinMode(M1red, OUTPUT);
pinMode(M1yel, OUTPUT);
pinMode(M1grn, OUTPUT);
pinMode(M2red, OUTPUT);
pinMode(M2yel, OUTPUT);
pinMode(M2grn, OUTPUT);
pinMode(M2TO, OUTPUT);
pinMode(M2y1, OUTPUT);
pinMode(M2y2, OUTPUT);
pinMode(ST11red, OUTPUT);
pinMode(ST11yel, OUTPUT);
pinMode(ST11grn, OUTPUT);
pinMode(ST11TO, OUTPUT);
pinMode(ST13red, OUTPUT);
pinMode(ST13yelM, OUTPUT);
pinMode(ST13yelS, OUTPUT);
pinMode(ST12red, OUTPUT);
pinMode(ST12yel, OUTPUT);
pinMode(ST12grn, OUTPUT);
pinMode(ST12y1, OUTPUT);
pinMode(ST12y2, OUTPUT);
//16/10/23
pinMode(pts5N, OUTPUT); // normal, reverse, track circuit mimic
pinMode(pts5R, OUTPUT);
pinMode(pts5TC, OUTPUT);
pinMode(pts6Nstrt, OUTPUT);
pinMode(pts6Rsm, OUTPUT);
pinMode(pts6Ndiag, OUTPUT);
pinMode(pts6Rsy, OUTPUT);
pinMode(pts6TC, OUTPUT);
pinMode(pts7N, OUTPUT);
pinMode(pts7R, OUTPUT);
pinMode(pts7TC, OUTPUT);
pinMode(pts9N, OUTPUT);
pinMode(pts9R, OUTPUT);
pinMode(pts9TC, OUTPUT); // not used at this point in time (reserved for possible use later)
pinMode(pts10N, OUTPUT);
pinMode(pts10R, OUTPUT);
pinMode(pts10TC, OUTPUT); // not used at this point in time
pinMode(pts11N, OUTPUT);
pinMode(pts11R, OUTPUT);
pinMode(pts11TC, OUTPUT); // not used at this point in time
pinMode(pts12N, OUTPUT);
pinMode(pts12R, OUTPUT);
pinMode(pts12TC, OUTPUT); // not used at this point in time
pinMode(PLRW, OUTPUT); // points lever reverse warning
digitalWrite(M1red, relayOFF);
digitalWrite(M1yel, relayOFF);
digitalWrite(M1grn, relayOFF);
digitalWrite(M2red, relayOFF);
digitalWrite(M2yel, relayOFF);
digitalWrite(M2grn, relayOFF);
digitalWrite(M2TO, relayOFF);
digitalWrite(M2y1, relayOFF);
digitalWrite(M2y2, relayOFF);
digitalWrite(ST11red, relayOFF);
digitalWrite(ST11yel, relayOFF);
digitalWrite(ST11grn, relayOFF);
digitalWrite(ST11TO, relayOFF);
digitalWrite(ST13red, relayOFF);
digitalWrite(ST13yelM, relayOFF);
digitalWrite(ST13yelS, relayOFF);
digitalWrite(ST12red, relayOFF);
digitalWrite(ST12yel, relayOFF);
digitalWrite(ST12grn, relayOFF);
digitalWrite(ST12y1, relayOFF);
digitalWrite(ST12y2, relayOFF);
//16/10/23
digitalWrite(pts5N, relayOFF); // normal, reverse, track circuit mimic
digitalWrite(pts5R, relayOFF);
digitalWrite(pts5TC, relayOFF);
digitalWrite(pts6Nstrt, relayOFF);
digitalWrite(pts6Rsm, relayOFF);
digitalWrite(pts6Ndiag, relayOFF);
digitalWrite(pts6Rsy, relayOFF);
digitalWrite(pts6TC, relayOFF);
digitalWrite(pts7N, relayOFF);
digitalWrite(pts7R, relayOFF);
digitalWrite(pts7TC, relayOFF);
digitalWrite(pts9N, relayOFF);
digitalWrite(pts9R, relayOFF);
digitalWrite(pts9TC, relayOFF); // not used at this point in time (reserved for possible use later)
digitalWrite(pts10N, relayOFF);
digitalWrite(pts10R, relayOFF);
digitalWrite(pts10TC, relayOFF); // not used at this point in time
digitalWrite(pts11N, relayOFF);
digitalWrite(pts11R, relayOFF);
digitalWrite(pts11TC, relayOFF); // not used at this point in time
digitalWrite(pts12N, relayOFF);
digitalWrite(pts12R, relayOFF);
digitalWrite(pts12TC, relayOFF); // not used at this point in time
digitalWrite(PLRW, relayOFF); // points lever reverse warning
// ###################################
/// ### end of initialisation ###
/// ### end of initialisation ###
/// ### end of initialisation ###
// ###################################
}
//#########################
// START LOOP ##
// START LOOP ##
// START LOOP ##
// START LOOP ##
// START LOOP ##
void loop() {
// read all input values
pts9NRvalue = analogRead(pts9NRdetect);
pts10NRvalue = analogRead(pts10NRdetect);
pts11NRvalue = analogRead(pts11NRdetect);
pts12NRvalue = analogRead(pts12NRdetect);
Serial.println("lever 9 value:");
Serial.println(pts9NRvalue);
Serial.println("lever 10 value:");
Serial.println(pts10NRvalue);
Serial.println("lever 11 value:");
Serial.println(pts11NRvalue);
Serial.println("lever 12 value:");
Serial.println(pts12NRvalue);
Serial.println("............................");
delay (5000);
} // <- this is the end of the main loop void
// ##########################################################################################
Points warning indicator
Track circuit - lever 5
Next signals - stop or clear
Emergency stop
Block occupancy - levers 5, 6, 7
Signal M1
Signal M2
Signal ST11
Signal ST13
Signal ST12
12 o'clock = normal
2 o'clock = reverse