const int SERIAL_BUFFER_SIZE = 11;
char serialBuffer[SERIAL_BUFFER_SIZE];
int G66 = A0; //G60, 63 bis 69(Einfahrt E1,E3) Grunstellung bei 0
int G64 = A1;
int G65 = A2;
int G60 = A3;
int G69 = A4;
const int A58 = A5;
const int G58 = A6;
const int G68 = A7;
const int A68 = A8;
const int A63 = 2; //63 bis 69, Weichestellung in Grundstellung bei 0
const int A64 = 3;
const int A65 = 5;
const int A66 = 6;
const int A69 = 4;
const int G71 = 7; //Alle in jeweliger Stellung geschlossen/gestellt( =1 );
const int A71 = 8;
const int G72 = 9;
const int A72 = 10;
const int G73 = 11;
const int A73 = 12;
//spannung da, relais schliesst kontakt sende eine 1, taster/schalter geschlossen (==0 wegen pullup) sende eine 1
const int OEbene = 22;
const int bremsschalter_oben = 24;
const int bremsschalter_unten = 26;
const int gruener_modus_zwang = 28;
const int gelber_leuchtdruckschalter_input = 30;
const int trafo_gleich = 32; //ohne funktion, kein Anschluss
const int trafo_wechsel = 34;
const int VORGT = 42;
bool SP_TRAFO_V;
bool SP_TRAFO_R;
bool SP_AUSF;
//COM
static unsigned long terminc = 0;
int le5 = 0;
byte val;
void setup() {
pinMode(G66, INPUT);
pinMode(G64, INPUT);
pinMode(G65, INPUT);
pinMode(G60, INPUT);
pinMode(G69, INPUT);
pinMode(A58, INPUT);
pinMode(G58, INPUT);
pinMode(A68, INPUT);
pinMode(G68, INPUT);
pinMode(A63, INPUT);
pinMode(A64, INPUT);
pinMode(A65, INPUT);
pinMode(A66, INPUT);
pinMode(A69, INPUT);
pinMode(G71, INPUT); pinMode(A71, INPUT);
pinMode(G72, INPUT); pinMode(A72, INPUT);
pinMode(G73, INPUT); pinMode(A73, INPUT);
pinMode(OEbene, INPUT_PULLUP);
pinMode(bremsschalter_oben, INPUT_PULLUP);
pinMode(bremsschalter_unten, INPUT_PULLUP);
pinMode(gruener_modus_zwang, INPUT_PULLUP);
pinMode(gelber_leuchtdruckschalter_input, INPUT_PULLUP);
pinMode(trafo_gleich, INPUT_PULLUP);
pinMode(trafo_wechsel, INPUT_PULLUP);
pinMode(36, INPUT_PULLUP);
pinMode(38, INPUT_PULLUP);
pinMode(40, INPUT_PULLUP);
pinMode(VORGT, INPUT_PULLUP);
//Relais welches anzieht wenn vmodus==1 und rm oder vgt gedrückt welches verwendet wird für die beiden schrottgleise vor der tram BW
pinMode(49, OUTPUT); digitalWrite(49, LOW);
//Fahrstromwahl auf von U3 trafo oder von u2 trafo auf die einfach kreuzungsweiche 65,66
pinMode(51, OUTPUT); digitalWrite(51, LOW);
//umpolrelais für Fahrstromauswahl "Von U2 Trafo" bei var_ump_u3==0, bzw. "nach U1/U3 Trafo" wird in den Bereich zwischen weiche 57 und der Tunneleinfahrt nach U3 ausgewählt
pinMode(53, OUTPUT); digitalWrite(53, LOW);
Serial1.begin(9600);
Serial.begin(9600);
Serial.println("GALLO");
}
void loop() {
COM();
COM_IN_NEU();
}
void COM()
{
bool taster_input_gelber_leuchtdruckschalter = digitalRead(gelber_leuchtdruckschalter_input);
static bool alt_taster_gelb = !taster_input_gelber_leuchtdruckschalter;
if (millis() >= terminc) {
//----------------------------------Weichenrückmeldung----------------------------------------
if (le5 == 0)
{
bitSet(val, 7); bitClear(val, 6); bitClear(val, 5);//100
if (digitalRead(OEbene) == 0)bitClear(val, 0);
if (digitalRead(OEbene) == 1)bitSet(val, 0);
if (analogRead(G64) < 100) {
bitSet(val, 1);
}
if (analogRead(G64) > 460) {
bitClear(val, 1);
}
if (analogRead(G65) < 100) {
bitSet(val, 2);
}
if (analogRead(G65) > 460) {
bitClear(val, 2);
}
if (analogRead(G66) < 100) {
bitSet(val, 3);
}
if (analogRead(G66) > 460) {
bitClear(val, 3);
}
if (analogRead(G69) < 100) {
bitSet(val, 4);
}
if (analogRead(G69) > 460) {
bitClear(val, 4);
}
Serial1.write(val); bitsloschen();
}
//------------------------------------------------------------------
if (le5 == 1)
{
bitClear(val, 7); bitClear(val, 6); bitSet(val, 5); //001
if (digitalRead(A63) == 0) {
bitClear(val, 0);
}
if (digitalRead(A64) == 0) {
bitClear(val, 1);
}
if (digitalRead(A65) == 0) {
bitClear(val, 2);
}
if (digitalRead(A66) == 0) {
bitClear(val, 3);
}
if (digitalRead(A69) == 0) {
bitClear(val, 4);
}
if (digitalRead(A63) == 1) {
bitSet(val, 0); //in ablenkung wird eine 1 ubertragen
}
if (digitalRead(A64) == 1) {
bitSet(val, 1);
}
if (digitalRead(A65) == 1) {
bitSet(val, 2);
}
if (digitalRead(A66) == 1) {
bitSet(val, 3);
}
if (digitalRead(A69) == 1) {
bitSet(val, 4);
}
Serial1.write(val); bitsloschen();
}
if (le5 == 2)
{
bitClear(val, 7); bitSet(val, 6); bitClear(val, 5); //010
if (digitalRead(G71) == 1) {
bitClear(val, 0);
} else {
bitSet(val, 0);
}
if (digitalRead(A71) == 1) {
bitSet(val, 1) ;
} else {
bitClear(val, 1);
}
if (digitalRead(G72) == 1) {
bitClear(val, 2);
} else {
bitSet(val, 2);
}
if (digitalRead(A72) == 1) {
bitSet(val, 3);
} else {
bitClear(val, 3);
}
//Gleis 5,6,7 mind. ein Gleis mit Fahrstrom im Haltabschnitt in Vorwärtsrichtung setzte bit 4
if (SP_AUSF) {
bitSet(val, 4);
} else {
bitClear(val, 4);
}
Serial1.write(val); bitsloschen();
}
if (le5 == 3)
{
bitClear(val, 7); bitSet(val, 6); bitSet(val, 5); //011
if (digitalRead(G73) == 1) {
bitClear(val, 0);
} else {
bitSet(val, 0);
}
if (digitalRead(A73) == 1) {
bitSet(val, 1);
} else {
bitClear(val, 1);
}
if (analogRead(G60) < 100) {
bitSet(val, 4);
} if (analogRead(G60) > 460) {
bitClear(val, 4);
}
Serial1.write(val); bitsloschen();
}
if (le5 == 3)
{
bitSet(val, 7); bitSet(val, 6); bitClear(val, 5); //110
//optokoppler des ausgangssignal ==1 wenn Spannung da (Trafo nach U1/U3 aufgeregelt - vorwärts!)
if (SP_TRAFO_V)bitSet(val, 0);
//spannung da, relais schliesst kontakt setzte bit 1
if (!digitalRead(trafo_wechsel))bitSet(val, 1);
//taster gedrückt = 1 bit set
if (!digitalRead(gruener_modus_zwang))bitSet(val, 2); //linker großer schwarzer taster neben dem roten notaustaster (gedrückt -> setzte bit 2)
if (!digitalRead(bremsschalter_oben))bitSet(val, 3); //schalter 4 in oberer position setzte bit 3
if (!digitalRead(bremsschalter_unten))bitSet(val, 4); //schalter 4 in unterer position setzte bit 4, wenn bit 3 und 4 nicht gesetzt dann in mittelstellung
Serial1.write(val); bitsloschen();
}
if (le5 == 1)
{
bitSet(val, 7); bitSet(val, 6); bitSet(val, 5); //111
//spannung da, gelbe wrm led der weiche leuchtet heißt > 99 und daher sende eine 1/bitSet
if (analogRead(G58) > 99)bitSet(val, 0);
if (analogRead(A58) > 99)bitSet(val, 1);
if (analogRead(G68) > 99)bitSet(val, 2);
if (analogRead(A68) > 99)bitSet(val, 3);
//gelber leuchtdruckschalter setze bit 4 (auf 1) wenn der Schalter einmal bewegt wurde (reaktion nur auf Zustandsäderung) sonst bit 4 nicht gesetzt
if (alt_taster_gelb != taster_input_gelber_leuchtdruckschalter)bitSet(val, 4);
alt_taster_gelb = taster_input_gelber_leuchtdruckschalter;
Serial1.write(val); bitsloschen();
}
if (le5 == 2)
{
bitSet(val, 7); bitClear(val, 6); bitSet(val, 5); //101
//optokoppler des ausgangssignal ==1 wenn Spannung da (Trafo nach U1/U3 aufgeregelt - vorwärts!)
if (SP_TRAFO_V)bitSet(val, 0);
//optokoppler des ausgangssignal ==1 wenn Spannung da (Trafo nach U1/U3 aufgeregelt - rückwärts!)
if (SP_TRAFO_R)bitSet(val, 1);
//vorruecken - GT (0=gedrückt dann wird eine 0 übertragen)
if (digitalRead(VORGT))bitSet(val, 2);
Serial1.write(val); bitsloschen();
}
le5++;
if (le5 > 3) {
le5 = 0;
}
terminc = terminc + 20;
}
}
void bitsloschen()
{
bitClear(val, 7); bitClear(val, 6); bitClear(val, 5); bitClear(val, 4); bitClear(val, 3); bitClear(val, 2); bitClear(val, 1); bitClear(val, 0);
}
bool readSerial(Stream& stream)
{
static byte index;
while (stream.available())
{
char c = stream.read();
if (c >= 32 && index < SERIAL_BUFFER_SIZE - 1)
{
serialBuffer[index++] = c;
}
else if (c == '\n' && index > 0)
{
serialBuffer[index] = '\0';
index = 0;
return true;
}
}
return false;
}
void COM_IN_NEU()
{
if (readSerial(Serial) == true)
{
/*Serial.print(" --- input: ");
Serial.print(serialBuffer);*/
if (serialBuffer[0] == 'A' && serialBuffer[8] == 'Z')
{
static bool var_ump_u3 = 0;
bool vmod_vgt_rm = 0;
if (serialBuffer[1] == '1')var_ump_u3 = 0; //E1 weiße led blinkt oder VM aktiv+Weiche 57 in Grundst. dann wird hier var_ump_u3 = 0; definiert
if (serialBuffer[2] == '1')digitalWrite(51, HIGH); else digitalWrite(51, LOW); //Fahrstromwahl auf von U3 trafo oder von u2 trafo auf die einfach kreuzungsweiche 65,66
if (serialBuffer[3] == '1')var_ump_u3 = 1; //weiche 57 auf Ablenkung dann wird hier var_ump_u3 = 1; definiert
if (serialBuffer[4] == '1')SP_TRAFO_V = 1; else SP_TRAFO_V = 0; //SP_TRAFO_V = 1; dann "nach u1/u3 trafo" vorwärts gepolt und mind. leicht aufgeregelt
if (serialBuffer[5] == '1')SP_TRAFO_R = 1; else SP_TRAFO_R = 0; //SP_TRAFO_R = 1; dann "nach u1/u3 trafo" rückwärts gepolt und mind. leicht aufgeregelt
if (serialBuffer[6] == '1')SP_AUSF = 1; else SP_AUSF = 0; //Gleis 5,6,7 mind. ein Gleis mit Fahrstrom in Haltabschnitt in Vorwärtsrichtung
if (serialBuffer[7] == '1')vmod_vgt_rm = 1; else vmod_vgt_rm = 0; //Verschubmodus ein plus vgt der rm gedrück dann ==1;
digitalWrite(49, vmod_vgt_rm);
//umpolrelais auf pin 53 für Fahrstromauswahl "Von U2 Trafo" bei var_ump_u3==0, bzw. "nach U1/U3 Trafo" wird in den Bereich zwischen weiche 57 und der Tunneleinfahrt nach U3 ausgewählt
digitalWrite(53, var_ump_u3);
Serial.print("COM-IN: "); Serial.println(serialBuffer);
for (int i=22; i<43; i+=2)
{
Serial.print("->Pin: ");
Serial.print(i);
Serial.print(": ");
Serial.print(digitalRead(i));
if(i==30)Serial.println();
}
Serial.println();
}
}
}