Steuerung Bahnübergang mit LED

Hallo Zusammen,

Ich bin neu hier und auch im Arduino Bereich.
Ich bin an etwas ähnlichem dran...
Bitte seid gnädig, ich schaffe damit erst seit 2 Wochen... und möchte eine Weichensteuerung (Wegesteuerung an Kreuzweiche mit 3 Taster) "läuft", sowie eine 1 Taster Schrankensteuerung (Servo hoch_runter) mit Blinkleds (Andreaskreuz) "hier hackts".
Im Start -> Schranke unten blinkt... "OK"...Taste 1x Schranke hoch blinkt aber noch... "n. OK" ... nach mehrmaligen drücken geht auch mal die LED aus nicht nachvollziehbar... dann teilweise Taste 1x Schranke runter, blinkt nicht -> noch mal Taste 1x Schranke bleibt unten aber blinkt nun auch...


#include <Servo.h>

Servo Weiche1;

Servo Weiche2;

Servo Weiche3;

Servo Weiche4;

Servo Schranke;

int Grad;

const int T_W = 53;

const int T_O = 52;

const int T_G1 = 51;

const byte T_S= 50;                 // Taster an Pin 1 und GND

const long interval = 500;               // Blinkintervall

const byte entprellzeit = 20;     // Zeitintervall der Tasterabfrage

boolean taster_gedrueckt = 0;     // Speichervariable für den Tasterzustand

boolean last_tasterzustand = 0;   // zur Erkennung der Flanke

// Leds

const int Pin_LED2_Rot = A0;         // LED Gerade an PIN A0 high

const int Pin_LED3_Gruen = A0;         // LED Gerade an PIN A0 low

const int Pin_LED6_Gruen = A1;         // LED Gerade an PIN A1 high

const int Pin_LED7_Rot = A1;         // LED Gerade an PIN A1 low

const int Pin_LED4_Rot = A2;         // LED Gerade an PIN A0 high

const int Pin_LED5_Gruen = A2;         // LED Gerade an PIN A0 low

const int Pin_LED8_Gruen = A3;         // LED Gerade an PIN A1 high

const int Pin_LED9_Rot = A3;         // LED Gerade an PIN A1 low

// Blinkleds

int ledState = LOW;                       // Led-Status

uint8_t TasterValue = 0;                  // Taster-Status

uint8_t BlinkValue = 0;                   // Blink-Status    

uint8_t status = 0;

unsigned long previousMillis = 0;        

//___________________VOID SETUP______________

void setup()

{

  pinMode(T_W, INPUT_PULLUP);

  pinMode(T_O, INPUT_PULLUP);

  pinMode(T_G1, INPUT_PULLUP);

  pinMode(T_S, INPUT_PULLUP);

 

// BlinkLed

 

  pinMode(LED_BUILTIN, OUTPUT);           // Led Pin13

// Leds definieren

  pinMode(Pin_LED3_Gruen, OUTPUT);  

  digitalWrite(Pin_LED3_Gruen, HIGH);    // Initialisieren der LED auf Grundstellung, LED Gerade leuchtet

  pinMode(Pin_LED2_Rot, OUTPUT);

  digitalWrite(Pin_LED2_Rot, LOW);     // Initialisieren der LED auf Grundstellung, LED Abzweig ist aus

  pinMode(Pin_LED5_Gruen, OUTPUT);  

  digitalWrite(Pin_LED5_Gruen, LOW);    // Initialisieren der LED auf Grundstellung, LED Gerade leuchtet

  pinMode(Pin_LED4_Rot, OUTPUT);

  digitalWrite(Pin_LED4_Rot, HIGH);     // Initialisieren der LED auf Grundstellung, LED Abzweig ist aus

  pinMode(Pin_LED6_Gruen, OUTPUT);  

  digitalWrite(Pin_LED6_Gruen, HIGH);    // Initialisieren der LED auf Grundstellung, LED Gerade leuchtet

  pinMode(Pin_LED7_Rot, OUTPUT);

  digitalWrite(Pin_LED7_Rot, LOW);     // Initialisieren der LED auf Grundstellung, LED Abzweig ist aus

  pinMode(Pin_LED8_Gruen, OUTPUT);  

  digitalWrite(Pin_LED8_Gruen, LOW);    // Initialisieren der LED auf Grundstellung, LED Gerade leuchtet

  pinMode(Pin_LED9_Rot, OUTPUT);

  digitalWrite(Pin_LED9_Rot, HIGH);     // Initialisieren der LED auf Grundstellung, LED Abzweig ist aus

}

//___________FUNKTION "schalten"________________

void schalten (Servo Weiche, int PIN, int Winkel)

{

  Weiche.attach(PIN);

  Weiche.write(Winkel);

  delay(200);

  Weiche.detach();

}

//___________FUNKTION "W1"___________________

void W1(int Stellung)                //0=gerade - 1=abbiegen

{  if(Stellung == 0)                  //Stellung gerade aus

  {

    Grad = 0;                         //Position in Grad      

  }

  if(Stellung == 1)                  //Stellung abbiegend

  {

    Grad = 90;                        //Position in Grad

  }

  schalten(Weiche1, 2, Grad);         //(Servo, Anschlusspin, Position)

}

//___________FUNKTION "W2"___________________

void W2(int Stellung)               //0=gerade - 1=abbiegen

{  if(Stellung == 0)                  //Stellung gerade aus

  {

    Grad = 0;                         //Position in Grad      

  }

    if(Stellung == 1)                  //Stellung abbiegend

  {

    Grad = 90;                        //Position in Grad

  }

  schalten(Weiche2, 3, Grad);         //(Servo, Anschlusspin, Position)

}

//___________FUNKTION "W3"___________________

void W3(int Stellung)                //0=gerade - 1=abbiegen

{  if(Stellung == 0)                  //Stellung gerade aus

  {

    Grad = 0;                         //Position in Grad      

  }

  if(Stellung == 1)                  //Stellung abbiegend

  {

    Grad = 90;                        //Position in Grad

  }

  schalten(Weiche3, 2, Grad);         //(Servo, Anschlusspin, Position)

}

//___________FUNKTION "W4"___________________

void W4(int Stellung)                //0=gerade - 1=abbiegen

{  if(Stellung == 0)                  //Stellung gerade aus

  {  

    Grad = 0;                         //Position in Grad      

  }

  if(Stellung == 1)                  //Stellung abbiegend

  {

    Grad = 90;                        //Position in Grad

  }

  schalten(Weiche4, 3, Grad);         //(Servo, Anschlusspin, Position)

}

  //___________FUNKTION "Schranke"___________________

void S(int Stellung)   //void S(int Stellung) //0=offen - 1=geschlossen

{              

  if(Stellung == 0)                  //Stellung gerade aus

  {

    Grad = 0;                         //Position in Grad      

  }

  if(Stellung == 1)                  //Stellung abbiegend

  {

    Grad = 90;                        //Position in Grad

  }

  schalten(Schranke, 4, Grad);        //(Servo, Anschlusspin, Position)

}

 

//_____________VOID LOOP______________________

void loop()

{

  while(digitalRead(T_W) == LOW)        //Start Weiche 1 zu 3

    {

      W1(1);

      digitalWrite(Pin_LED3_Gruen, HIGH);

      digitalWrite(Pin_LED8_Gruen, LOW);

      W2(0);

      digitalWrite(Pin_LED4_Rot, HIGH);

      digitalWrite(Pin_LED7_Rot, LOW);

    }

 

  while(digitalRead(T_O) == LOW)        //Start Weiche 1/2 und 3/4

    {

      W1(0);

      digitalWrite(Pin_LED3_Gruen, HIGH);

      digitalWrite(Pin_LED6_Gruen, HIGH);

      W2(0);

      digitalWrite(Pin_LED5_Gruen, LOW);

      digitalWrite(Pin_LED8_Gruen, LOW);

    }

 

  while(digitalRead(T_G1) == LOW)       //Start Weiche 3 zu 4

    {

      W2(1);

      digitalWrite(Pin_LED2_Rot, LOW);

      digitalWrite(Pin_LED9_Rot, HIGH);

      W1(0);

      digitalWrite(Pin_LED5_Gruen, LOW);

      digitalWrite(Pin_LED6_Gruen, HIGH);

    }

  while(digitalRead(T_S) == LOW)      //Start Schranke schließen

    {

      S(0);

     

    }

  while(digitalRead(T_S) == LOW)       //Start Schranke öffnen

    {

      S(1);

   

    }

 

    // Blinkled

 

  // BlinkWithoutDelay....

  unsigned long currentMillis = millis();

  if (BlinkValue == HIGH)

  {                  

    if (currentMillis - previousMillis >= interval)

    {

      previousMillis = currentMillis;

      if (ledState == LOW)

        ledState = HIGH;

      else

        ledState = LOW;

      digitalWrite(LED_BUILTIN, ledState);

    }

  }

  else

    digitalWrite(LED_BUILTIN, LOW);            

  // Ende BlinkWithoutDelay....

   

  TasterValue = digitalRead (T_S);        // Tasterstatus einlesen

  if (status != TasterValue)                 // Aenderung des Taster ?

  {

    if (TasterValue)                     // geschaltet

    {                          

      BlinkValue = !BlinkValue;                 // ...und wird gewechselt.

    }

    status = TasterValue;                       // Status merken

  }

}

ich hoffe es ist schick so... ich teste mit Wokwi

Ich hoffe ihr könnt einem Anfänger weiterhelfen.
Sagt wenn ihr noch was braucht,
mir raucht schon der KOPF.

Vielen Dank schon mal im Voraus... Steve