//---------------------------------------------// // WWW.ARDUINORAILWAYCONTROL.COM // //---------------------------------------------// // app_layout_mega1.ino // // ARDUINO MEGA // // EX.1 ARDUINO RAILWAY LAYOUT CONTROL APP // // PROTOCOL 2.5 // // V.1.2021 Steve Massikker // //---------------------------------------------// void(* resetFunc) (void) = 0; #include // I/O PINS #define JUNCTION_EN 5 #define KATO_A 6 #define KATO_B 7 #define PEM_A 8 // Point Electric Motor (PEM) #define PEM_B 9 #define RELAY_IN1 10 // Relays for crossing #define RELAY_IN2 11 Servo J1; // VARIABLES unsigned long millisJunction_switch_A, millisJunction_switch_B, millisJunction_switch_I, millisJunction_switch_J; bool stringComplete = false; String inputString = ""; bool switch_A = true, switch_B = true, switch_I = true, switch_J = true; bool flag_change_junc = false; void setup() { // Initializing COMM Serial.begin(9600); // Serial - USB Serial1.begin(9600); // RX - D19 | TX - D18 inputString.reserve(4); // Initializing PINs J1.attach(4); pinMode(JUNCTION_EN, OUTPUT); pinMode(KATO_A, OUTPUT); pinMode(KATO_B, OUTPUT); pinMode(PEM_A, OUTPUT); pinMode(PEM_B, OUTPUT); pinMode(RELAY_IN1, OUTPUT); pinMode(RELAY_IN2, OUTPUT); // Set default directions for junctions J1.write(180); millisJunction_switch_A = millis(); millisJunction_switch_B = millis(); millisJunction_switch_I = millis(); millisJunction_switch_J = millis(); digitalWrite(KATO_A, HIGH); digitalWrite(PEM_A, HIGH); digitalWrite(RELAY_IN1, HIGH); digitalWrite(JUNCTION_EN, HIGH); } void loop() { // ---- START PARSING INCOMING APP COMMANDS if (stringComplete) { // RESET if (inputString =="999z") resetFunc(); // JUNCTIONS if (inputString.charAt(0) =='j') { // App buttons //1 2 3 4 5 6 7 8 9 Crossing 10 11 12 13 14 Three-way 15 16 17 DSS-1 DSS-2 18 //A B C D E F G H I J K L M N O P2 P3 P4 Q R S T5 T6 T7 T8 U5 U6 U7 U8 V // Switch A if (inputString.charAt(1) =='a') { // Branch direction if (inputString.charAt(2) =='0') { switch_A = false; digitalWrite(PEM_A, LOW); // Unnecessary command - only to prevent opposite switching digitalWrite(PEM_B, HIGH); } if (inputString.charAt(2) =='1') { // Throw direction switch_A = true; digitalWrite(PEM_B, LOW); // Unnecessary command - only to prevent opposite switching digitalWrite(PEM_A, HIGH); } millisJunction_switch_A = millis(); } // Switch B if (inputString.charAt(1) =='a') { // Branch direction if (inputString.charAt(2) =='0') { switch_B = false; digitalWrite(KATO_A, LOW); // Unnecessary command - only to prevent opposite switching digitalWrite(KATO_B, HIGH); } if (inputString.charAt(2) =='1') { // Throw direction switch_B = true; digitalWrite(KATO_B, LOW); // Unnecessary command - only to prevent opposite switching digitalWrite(KATO_A, HIGH); } millisJunction_switch_B = millis(); } // Switch I - Servo if (inputString.charAt(1) =='i') { if (inputString.charAt(2) =='0') { switch_J = false; J1.write(0); delay(50); digitalWrite(JUNCTION_EN, HIGH); } if (inputString.charAt(2) =='1') { switch_J = true; J1.write(180); delay(50); digitalWrite(JUNCTION_EN, HIGH); } millisJunction_switch_I = millis(); } // Switch J - Crossing if (inputString.charAt(1) =='j') { if (inputString.charAt(2) =='0') { switch_J = false; digitalWrite(RELAY_IN1, LOW); // Unnecessary command - only to prevent opposite switching digitalWrite(RELAY_IN2, HIGH); } if (inputString.charAt(2) =='1') { switch_J = true; digitalWrite(RELAY_IN2, LOW); // Unnecessary command - only to prevent opposite switching digitalWrite(RELAY_IN1, HIGH); } millisJunction_switch_J = millis(); } flag_change_junc = false; } // LIGHTS if (inputString.charAt(0) =='l') { // Code for Lights control } // GEARS if (inputString.charAt(0) =='g') { // Code for Gears control } inputString = ""; stringComplete = false; } // ---- MAIN LOGIC BLOCK if (flag_change_junc) { // Algorithm flag_change_junc = false; } // ---- AUTO-OFF if (millis() > (millisJunction_switch_A + 700)) { // Delay 0.7s for Switch A digitalWrite(PEM_A, LOW); digitalWrite(PEM_B, LOW); } if (millis() > (millisJunction_switch_B + 600)) { // Delay 0.6s for Switch B digitalWrite(KATO_A, LOW); digitalWrite(KATO_B, LOW); } if (millis() > (millisJunction_switch_I + 800)) { // Delay 0.8s for Switch I digitalWrite(JUNCTION_EN, LOW); } if (millis() > (millisJunction_switch_J + 900)) { // Delay 0.9s for Switch J digitalWrite(RELAY_IN1, LOW); digitalWrite(RELAY_IN2, LOW); } serial1Event(); } //// FUNCTIONS //// void serial1Event() { // Commands from app if (Serial1.available()) { char inChar = (char)Serial1.read(); inputString += inChar; if (inChar == 'z') { stringComplete = true; } } } void serialEvent() { if (Serial.available()) { char inChar = (char)Serial.read(); inputString += inChar; if (inChar == 'z') { stringComplete = true; } } }