int stat10old = 0;  // Fahrstrassen-Variable
int stat10new = 0;
int stat20old = 0;
int stat20new = 0;
int stat30old = 0;
int stat30new = 0;
int stat80old = 0;
int stat80new = 0;
int stat01old = 0;
int stat01new = 0;
int stat02old = 0;
int stat02new = 0;
int stat03old = 0;
int stat03new = 0;
int stat08old = 0;
int stat08new = 0;
int stat16old = 0;
int stat16new = 0;
int stat17old = 0;
int stat17new = 0;
int stat26old = 0;
int stat26new = 0;
int stat27old = 0;
int stat27new = 0;
int stat61old = 0;
int stat61new = 0;
int stat62old = 0;
int stat62new = 0;
int stat71old = 0;
int stat71new = 0;
int stat72old = 0;
int stat72new = 0;
int stat12class = 0;  // Fahrstrassen-Klassen
int stat38class = 0;
int stat67class = 0;
int signalpin = 0;    // Workpins
int weichenpin1 = 0;
int weichenpin2 = 0;
int weichenpin3 = 0;

//Setup
void setup()
{
pinMode(54,INPUT);  // Fahrstrasse 10
pinMode(55,INPUT);  // Fahrstrasse 16
pinMode(56,INPUT);  // Fahrstrasse 17
pinMode(57,INPUT);  // Fahrstrasse 20
pinMode(58,INPUT);  // Fahrstrasse 26
pinMode(59,INPUT);  // Fahrstrasse 27
pinMode(60,INPUT);  // Fahrstrasse 30
pinMode(61,INPUT);  // Fahrstrasse 80
pinMode(62,INPUT);  // Fahrstrasse 01
pinMode(63,INPUT);  // Fahrstrasse 61
pinMode(64,INPUT);  // Fahrstrasse 71
pinMode(65,INPUT);  // Fahrstrasse 02
pinMode(66,INPUT);  // Fahrstrasse 71
pinMode(67,INPUT);  // Fahrstrasse 72
pinMode(68,INPUT);  // Fahrstrasse 03
pinMode(69,INPUT);  // Fahrstrasse 08
pinMode(22,OUTPUT);     // Relais an fuer Signal A Hp2
pinMode(24,OUTPUT);     // Relais an fuer Signal A Sh1
pinMode(26,OUTPUT);     // Relais an fuer Signal B Hp2
pinMode(28,OUTPUT);     // Relais an fuer Signal B Sh2
pinMode(30,OUTPUT);     // Relais an fuer Signal C Hp1
pinMode(32,OUTPUT);     // Relais an Fahrstrom Signal D
pinMode(34,OUTPUT);     // Relais an fuer Signal E Hp2
pinMode(36,OUTPUT);     // Relais an fuer Signal 6 Sh1
pinMode(38,OUTPUT);     // Relais an fuer Signal 7 Sh1
pinMode(40,OUTPUT);     // Relais an fuer Fahrstrom 2 zu 1
pinMode(23,OUTPUT);     // Impuls Signal D auf Hp2
pinMode(25,OUTPUT);     // Impuls Signal D auf Hp0
pinMode(27,OUTPUT);     // Impuls Weiche - 1g, 4r
pinMode(29,OUTPUT);     // Impuls Weiche - 1r, 3g
pinMode(31,OUTPUT);     // Impuls Weiche - 2g, 6r
pinMode(33,OUTPUT);     // Impuls Weiche - 2r, 3r
pinMode(35,OUTPUT);     // Impuls Weiche - 4g
pinMode(37,OUTPUT);     // Impuls Weiche - 5g
pinMode(39,OUTPUT);     // Impuls Weiche - 5r
pinMode(41,OUTPUT);     // Impuls Weiche - 6g
pinMode(43,OUTPUT);     // Impuls Weiche - 7g
pinMode(45,OUTPUT);     // Impuls Weiche - 7r
pinMode(47,OUTPUT);     // Dummy-Output, wenn nur 2 Weichenpins
}

//  LOOP prueft, ob irgendeine Fahrstrasse geaendert wurde
void loop()
{
 stat10new = digitalRead(54);
 if (stat10new != stat10old)
 {
  changefahr10 ();
 }
  stat16new = digitalRead(55);
 if (stat16new != stat16old)
 {
  changefahr16 ();
 }
  stat17new = digitalRead(56);
 if (stat17new != stat17old)
 {
  changefahr17 ();
 }
  stat20new = digitalRead(57);
 if (stat20new != stat20old)
 {
  changefahr20 ();
 }
  stat26new = digitalRead(58);
 if (stat26new != stat26old)
 {
  changefahr26 ();
 }
  stat27new = digitalRead(59);
 if (stat27new != stat27old)
 {
  changefahr27 ();
 }
  stat30new = digitalRead(60);
 if (stat30new != stat30old)
 {
  changefahr30 ();
 }
  stat80new = digitalRead(61);
 if (stat80new != stat80old)
 {
  changefahr80 ();
 }
  stat01new = digitalRead(62);
 if (stat01new != stat01old)
 {
  changefahr01 ();
 }
  stat02new = digitalRead(63);
 if (stat02new != stat02old)
 {
  changefahr02 ();
 }
  stat03new = digitalRead(64);
 if (stat03new != stat03old)
 {
  changefahr03 ();
 }
  stat10new = digitalRead(65);
 if (stat08new != stat08old)
 {
  changefahr08 ();
 }
  stat61new = digitalRead(66);
 if (stat61new != stat61old)
 {
  changefahr61 ();
 }
  stat62new = digitalRead(67);
 if (stat62new != stat62old)
 {
  changefahr62 ();
 }
  stat71new = digitalRead(68);
 if (stat71new != stat71old)
 {
  changefahr71 ();
 }
  stat72new = digitalRead(69);
 if (stat72new != stat72old)
 {
  changefahr72 ();
 }
 delay(500);     // wenn ungeaendert, kurze Pause
}

void changefahr10 ()      // Fahrstrasse 10 wird geprueft
{
  signalpin = 22;   //schon mal vorsorglich
  if (stat10new < stat10old)    // dann Fahrstraße ausgestellt
  {
    stat10old = 0;      // Fahrstraße auf frei
    stat12class = 0;    // Klasse freigegeben
    setback ();             // dort Signalpin auf LOW
  }
  if (stat12class = 1)  // konkurrierende Fahrstraße
  {
    beepy ();  
  }
   if (stat38class = 1)  // konkurrierende Fahrstraße
  {
    beepy ();  
  }
   if (stat67class = 1)  // konkurrierende Fahrstraße
  {
    beepy ();  
  }
  stat10old = 1;     // Fahrstrasse neu einstellen
  stat12class = 1;   // konkurrierende sperren
  weichenpin1 = 27;
  weichenpin2 = 45;
  weichenpin3 = 47;  // dummy
  worker ();
  }

  void changefahr16 ()
{
  signalpin = 24;   //schon mal vorsorglich
  if (stat16new < stat16old)    // dann Fahrstraße ausgestellt
  {
    stat16old = 0;      // Fahrstraße auf frei
    stat67class = 0;    // Klasse freigegeben
    setback ();             // dort Signalpin auf LOW
  }
  if (stat12class = 1)  // konkurrierende Fahrstraße
  {
    beepy (); 
  } 
   if (stat67class = 1)  // konkurrierende Fahrstraße
  {
    beepy ();  
  }
  stat16old = 1;     // Fahrstrasse neu einstellen
  stat67class = 1;   // konkurrierende sperren
  weichenpin1 = 33;
  weichenpin2 = 39;
  weichenpin3 = 47;  // dummy
  worker ();
  }

   void changefahr17 ()
{
  signalpin = 24;   //schon mal vorsorglich
  if (stat17new < stat17old)    // dann Fahrstraße ausgestellt
  {
    stat17old = 0;      // Fahrstraße auf frei
    stat67class = 0;    // Klasse freigegeben
    setback ();             // dort Signalpin auf LOW
  }
  if (stat12class = 1)  // konkurrierende Fahrstraße
  {
    beepy (); 
  } 
   if (stat67class = 1)  // konkurrierende Fahrstraße
  {
    beepy ();  
  }
  stat17old = 1;     // Fahrstrasse neu einstellen
  stat67class = 1;   // konkurrierende sperren
  weichenpin1 = 33;
  weichenpin2 = 37;
  weichenpin3 = 47;  // dummy
  worker ();
  }
void changefahr20 ()
{
  signalpin = 26;   //schon mal vorsorglich
  if (stat20new < stat20old)    // dann Fahrstraße ausgestellt
  {
    stat20old = 0;      // Fahrstraße auf frei
    stat12class = 0;    // Klasse freigegeben
    digitalWrite (40,LOW);  // Spezialrelais 02/20 aus
    setback ();             // dort Signalpin auf LOW
  }
  if (stat12class = 1)  // konkurrierende Fahrstraße
  {
    beepy ();  
  }
   if (stat38class = 1)  // konkurrierende Fahrstraße
  {
    beepy ();  
  }
   if (stat67class = 1)  // konkurrierende Fahrstraße
  {
    beepy ();  
  }
  stat20old = 1;     // Fahrstrasse neu einstellen
  stat12class = 1;   // konkurrierende sperren
  digitalWrite (40,HIGH);  // Spezialrelais 02/20 an
  weichenpin1 = 31;
  weichenpin2 = 42;
  weichenpin3 = 47;  // dummy
  worker ();
  }

  void changefahr26 ()
{
  signalpin = 28;   //schon mal vorsorglich
  if (stat26new < stat26old)    // dann Fahrstraße ausgestellt
  {
    stat26old = 0;      // Fahrstraße auf frei
    stat67class = 0;    // Klasse freigegeben
    setback ();             // dort Signalpin auf LOW
  }
  if (stat12class = 1)  // konkurrierende Fahrstraße
  {
    beepy (); 
  } 
   if (stat67class = 1)  // konkurrierende Fahrstraße
  {
    beepy ();  
  }
  stat26old = 1;     // Fahrstrasse neu einstellen
  stat67class = 1;   // konkurrierende sperren
  weichenpin1 = 29;
  weichenpin2 = 39;
  weichenpin3 = 47;  // dummy
  worker ();
  }

   void changefahr27 ()
{
  signalpin = 28;   //schon mal vorsorglich
  if (stat27new < stat27old)    // dann Fahrstraße ausgestellt
  {
    stat27old = 0;      // Fahrstraße auf frei
    stat67class = 0;    // Klasse freigegeben
    setback ();             // dort Signalpin auf LOW
  }
  if (stat12class = 1)  // konkurrierende Fahrstraße
  {
    beepy (); 
  } 
   if (stat67class = 1)  // konkurrierende Fahrstraße
  {
    beepy ();  
  }
  stat27old = 1;     // Fahrstrasse neu einstellen
  stat67class = 1;   // konkurrierende sperren
  weichenpin1 = 33;
  weichenpin2 = 37;
  weichenpin3 = 47;  // dummy
  worker ();
  }

  void changefahr30 ()
{
  signalpin = 30;   //schon mal vorsorglich
  if (stat30new < stat30old)    // dann Fahrstraße ausgestellt
  {
    stat30old = 0;      // Fahrstraße auf frei
    stat38class = 0;    // Klasse freigegeben
    setback ();             // dort Signalpin auf LOW
  }
  if (stat12class = 1)  // konkurrierende Fahrstraße
  {
    beepy ();  
  }
   if (stat38class = 1)  // konkurrierende Fahrstraße
  {
    beepy ();  
  }
  stat30old = 1;     // Fahrstrasse neu einstellen
  stat38class = 1;   // konkurrierende sperren
  weichenpin1 = 35;
  weichenpin2 = 41;
  weichenpin3 = 43;
  worker ();
  }

 void changefahr80 ()
{
  signalpin = 32;   //schon mal vorsorglich
  if (stat80new < stat80old)    // dann Fahrstraße ausgestellt
  {
    stat80old = 0;      // Fahrstraße auf frei
    stat38class = 0;    // Klasse freigegeben
    setback ();             // dort Signalpin auf LOW
  }
  if (stat12class = 1)  // konkurrierende Fahrstraße
  {
    beepy ();  
  }
   if (stat38class = 1)  // konkurrierende Fahrstraße
  {
    beepy ();  
  }
  stat80old = 1;     // Fahrstrasse neu einstellen
  stat38class = 1;   // konkurrierende sperren
  weichenpin1 = 23;  // Signal D auf Hp2
  weichenpin2 = 45;
  weichenpin3 = 47;  // dummy
  worker ();

  void changefahr01 ()
{
  signalpin = 34;   //schon mal vorsorglich
  if (stat01new < stat01old)    // dann Fahrstraße ausgestellt
  {
    stat01old = 0;      // Fahrstraße auf frei
    stat12class = 0;    // Klasse freigegeben
    setback ();             // dort Signalpin auf LOW
  }
  if (stat12class = 1)  // konkurrierende Fahrstraße
  {
    beepy ();  
  }
   if (stat38class = 1)  // konkurrierende Fahrstraße
  {
    beepy ();  
  }
   if (stat67class = 1)  // konkurrierende Fahrstraße
  {
    beepy ();  
  }
  stat01old = 1;     // Fahrstrasse neu einstellen
  stat12class = 1;   // konkurrierende sperren
  weichenpin1 = 27;
  weichenpin2 = 45;
  weichenpin3 = 47;  // dummy
  worker ();
  }

  void changefahr61 ()
{
  signalpin = 36;   //schon mal vorsorglich
  if (stat61new < stat61old)    // dann Fahrstraße ausgestellt
  {
    stat61old = 0;      // Fahrstraße auf frei
    stat67class = 0;    // Klasse freigegeben
    setback ();             // dort Signalpin auf LOW
  }
  if (stat12class = 1)  // konkurrierende Fahrstraße
  {
    beepy (); 
  } 
   if (stat67class = 1)  // konkurrierende Fahrstraße
  {
    beepy ();  
  }
  stat61old = 1;     // Fahrstrasse neu einstellen
  stat67class = 1;   // konkurrierende sperren
  weichenpin1 = 33;
  weichenpin2 = 39;
  weichenpin3 = 47;  // dummy
  worker ();
  }

   void changefahr71 ()
{
  signalpin = 38;   //schon mal vorsorglich
  if (stat71new < stat71old)    // dann Fahrstraße ausgestellt
  {
    stat71old = 0;      // Fahrstraße auf frei
    stat67class = 0;    // Klasse freigegeben
    setback ();             // dort Signalpin auf LOW
  }
  if (stat12class = 1)  // konkurrierende Fahrstraße
  {
    beepy (); 
  } 
   if (stat67class = 1)  // konkurrierende Fahrstraße
  {
    beepy ();  
  }
  stat71old = 1;     // Fahrstrasse neu einstellen
  stat67class = 1;   // konkurrierende sperren
  weichenpin1 = 33;
  weichenpin2 = 37;
  weichenpin3 = 47;  // dummy
  worker ();
  }
void changefahr02 ()
{
  signalpin = 34;   //schon mal vorsorglich
  if (stat02new < stat02old)    // dann Fahrstraße ausgestellt
  {
    stat02old = 0;      // Fahrstraße auf frei
    stat12class = 0;    // Klasse freigegeben
    digitalWrite (40,LOW);  // Spezialrelais 02/20 aus
    setback ();             // dort Signalpin auf LOW
  }
  if (stat12class = 1)  // konkurrierende Fahrstraße
  {
    beepy ();  
  }
   if (stat38class = 1)  // konkurrierende Fahrstraße
  {
    beepy ();  
  }
   if (stat67class = 1)  // konkurrierende Fahrstraße
  {
    beepy ();  
  }
  stat02old = 1;     // Fahrstrasse neu einstellen
  stat12class = 1;   // konkurrierende sperren
  digitalWrite (40,HIGH);  // Spezialrelais 02/20 an
  weichenpin1 = 31;
  weichenpin2 = 42;
  weichenpin3 = 47;  // dummy
  worker ();
  }

  void changefahr62 ()
{
  signalpin = 36;   //schon mal vorsorglich
  if (stat62new < stat62old)    // dann Fahrstraße ausgestellt
  {
    stat62old = 0;      // Fahrstraße auf frei
    stat67class = 0;    // Klasse freigegeben
    setback ();             // dort Signalpin auf LOW
  }
  if (stat12class = 1)  // konkurrierende Fahrstraße
  {
    beepy (); 
  } 
   if (stat67class = 1)  // konkurrierende Fahrstraße
  {
    beepy ();  
  }
  stat62old = 1;     // Fahrstrasse neu einstellen
  stat67class = 1;   // konkurrierende sperren
  weichenpin1 = 29;
  weichenpin2 = 39;
  weichenpin4 = 47;  // dummy
  worker ();
  }

   void changefahr72 ()
{
  signalpin = 38;   //schon mal vorsorglich
  if (stat72new < stat72old)    // dann Fahrstraße ausgestellt
  {
    stat72old = 0;      // Fahrstraße auf frei
    stat67class = 0;    // Klasse freigegeben
    setback ();             // dort Signalpin auf LOW
  }
  if (stat12class = 1)  // konkurrierende Fahrstraße
  {
    beepy (); 
  } 
   if (stat67class = 1)  // konkurrierende Fahrstraße
  {
    beepy ();  
  }
  stat72old = 1;     // Fahrstrasse neu einstellen
  stat67class = 1;   // konkurrierende sperren
  weichenpin1 = 33;
  weichenpin2 = 37;
  weichenpin4 = 47;  // dummy
  worker ();
  }

  void changefahr03 ()
{
  signalpin = 34:   //schon mal vorsorglich
  if (stat03new < stat03old)    // dann Fahrstraße ausgestellt
  {
    stat03old = 0;      // Fahrstraße auf frei
    stat38class = 0;    // Klasse freigegeben
    setback ();             // dort Signalpin auf LOW
  }
  if (stat12class = 1)  // konkurrierende Fahrstraße
  {
    beepy ();  
  }
   if (stat38class = 1)  // konkurrierende Fahrstraße
  {
    beepy ();  
  }
  stat03old = 1;     // Fahrstrasse neu einstellen
  stat38class = 1;   // konkurrierende sperren
  weichenpin1 = 35;
  weichenpin2 = 41;
  weichenpin4 = 43;
  worker ();
  }

 void changefahr08 ()
{
  signalpin = 34;   //schon mal vorsorglich
  if (stat08new < stat08old)    // dann Fahrstraße ausgestellt
  {
    stat08old = 0;      // Fahrstraße auf frei
    stat38class = 0;    // Klasse freigegeben
    setback ();             // dort Signalpin auf LOW
  }
  if (stat12class = 1)  // konkurrierende Fahrstraße
  {
    beepy ();  
  }
   if (stat38class = 1)  // konkurrierende Fahrstraße
  {
    beepy ();  
  }
  stat08old = 1;     // Fahrstrasse neu einstellen
  stat38class = 1;   // konkurrierende sperren
  weichenpin1 = 23;  // Signal D auf Hp2
  weichenpin2 = 45;
  weichenpin4 = 47;  // dummy
  worker ();
  }

 void setback ()
 {
digitalWrite(signalpin, LOW);
goto loop ()
}
 }

 void beepy ()
 {
  delay (500);
  goto loop ()
 }

 void worker ()
 {
digitalWrite(weichenpin1,HIGH);
delay(400);
digitalWrite(weichenpin1, LOW);
digitalWrite(weichenpin2,HIGH);
delay(400);
digitalWrite(weichenpin2, LOW);
digitalWrite(weichenpin3,HIGH);
delay(400);
digitalWrite(weichenpin3, LOW);
delay(400);
digitalWrite(signalpin, HIGH);  // erst Weichen, dann das Signal
 }