Files
JIMRI/jython/serialinput/Turnout_Channel_from_JMRI/JMRITurnoutScanUno.ino
T
2026-06-17 14:00:51 +02:00

62 lines
3.4 KiB
Arduino

// Receive Bulk Data from the Turnout Table via Serial Transmission from JMRI
// Author: Geoff Bunza 2018
// Version 1.1
// This is preconfigured for an Arduino Uno, Pro Mini, or Nano, pins 2-19, no inversion, no offset
// Transmission is of the form "ATxxx.S where AT is the user name prefix from the JMRI turnout table
// xxx is the number of the turnout (User name is built of the form AT123,
// and "S" is the "State" of the turnout where Closed=0 and Thrown=1
// Transmission is received from JMRI via TurnoutDataTransfer.py Python Script
// It is assumed that the Arduino starts up before the Python Script
// The script will set up listeners for all its turnouts and only update them when they change
// The Arduino will update the appropriate pin, which can have an offset, and be o[ptionally inverted
// The serial port assigned to this Arduino must correspond to the Serial Port in the corresponding TurnoutDataTransfer.py Script
//
#define Data_Pin_Max 20 // Max sensor pin NUMBER (plus one) Mega=70,UNO,Pro Mini,Nano=20
#define Data_Pin_Start 2 // Starting Sensor Pin number (usually 2 as 0/1 are TX/RX
#define Data_Pin_Offset 0 // This Offset will be ADDED to the value of each Turnout number to determine the Data pin
// number used by the Arduino, so pin AT12 will set pin 12+Data_Offset)
// This would allow one Arduino Turnout Data channel to use AT2-69 set pins 2-69 and another to
// use AT70-137 to set its pins 2-69 for example; this offset can also be negative
#define Data_Invert 0 // Set Data_Active_Low to 1 to invert incomin Turnout data Closed=1 Thrown=0
// Set Data_Active_Low to 0 to leave incoming data untouched Closed=0 Thrown=1
#define open_delay 15 // longer delay to get past script initialization - leave this alone
#define delta_delay 4 // Short delay to allow the script to get all the characters - leave this alone
int i;
char firstByte ; // temp to process the possible state change
char secondByte ;
char incomingByte = 0; // working temp for character processing
int turnout = 99;
#define port_delay 600 // Serial Port delay (microsec) for error compensation - increase this if you get funny data at high speeds
void setup(){
Serial.begin(19200); // Open serial connection.
for (i=Data_Pin_Start; i< Data_Pin_Max; i++) { // Set up all the output pins
pinMode (i, OUTPUT);
digitalWrite (i, LOW);
}
}
void loop() {
if (Serial.available() > 0) { // wait until we get a charater from JMRI
// get the first character
firstByte = Serial.read();
delayMicroseconds(port_delay);
while (firstByte != 'A') {
firstByte = Serial.read();
delayMicroseconds(port_delay);
}
secondByte = Serial.read(); // get the second character
if ((firstByte=='A') && (secondByte == 'T')) {
i=0;
turnout = Serial.parseInt();
turnout = turnout + Data_Pin_Offset ;
incomingByte=Serial.read();
delayMicroseconds(port_delay);
incomingByte=Serial.read();
if (incomingByte =='1') digitalWrite (turnout, 1 ^ Data_Invert);
if (incomingByte =='0') digitalWrite (turnout, 0 ^ Data_Invert);
//Serial.print (turnout);
//Serial.print (" ");
//Serial.println (incomingByte);
}
}
}