Problem mit Eisenbahnsteuerung via Arduino Mega und Motor-Shield

Moin Moin,
ich tüftel gerade an einem Messemodell herum. Darauf lasse ich eine Eisenbahn kreisen und an festen Punkten (Haltestelle A, B, C, D, E"Bahnhof") im Bedarfsfall halten. Ausgelöst wird dieser Bedarf über Drucktaster. Messebesucher drückt z.B. Taster B und dann C → LED geht an Haltestelle B und C an → Zug hält an B → Wartet einen Augenblick → Zug fährt wieder an → Das gleiche dann an C. Der Zug merkt, dass er an A/B/C/D/E ist, weil er mit einem im Anhänger befindlichen Magneten über einen Reed-Kontakt unter den Schinen fährt.

Problem:
Alle LEDs Blinken auf einmal. An “1Sek”–> Aus"1Sek"–>… Das so lange, bis ich den E.ON Reset mache (Stecker ziehen). Ich habe pro LED am Pin 3mA gemessen. Das Labornetzteil zeigt mir unter Vollast 0,88A an.

Zu meinem Aufbau:
1x Arduino Mega
1x Arduino Motor-Shield
1x Labornetzteil mit eingestellten 11,5V
5x TIP120 zur Ansteuerung der LEDs (12V)
6x Standard Drucktaster
Optokoppler zur Ansteuerung eines Raspberry PI (Momentan nicht angeschlossen)

Anbei noch der Quellcode. Tut mir leid, wenn das ganze ein bisschen Konfus erscheint, ich Programmiere erst seit einem Jahr und das auch immer nur alle paar Wochen Wochen. Die Verkabelung wurde von einem befreundeten Elektroniker/Elektrotechniker vor in Betriebnahme überprüft. Hat irgendwer das selbe Problem vielleicht schonmal gehabt? Ist das zu viel Leistung für den Arduino?

//---Buttons auf dem Schaltpult
int starttaster = 24;
int buttonApin = 26;
int buttonBpin = 28;
int buttonCpin = 30;
int buttonDpin = 32;

//---Pins Raspberry
int buttonRBpin = 23;
int buttonRDpin = 25;
int inputR1 = 27;
int inputR2 = 29;

int haltestelleRB = 41;
int haltestelleRD = 43;
int outputR1 = 45;
int outputR2 = 47;

//---LEDs auf dem Modell
int haltestelleA = 44;
int haltestelleB = 46;
int haltestelleC = 48;
int haltestelleD = 50;
int haltestelleE = 52;

//---Reedkontakte unter dem Modell
int reedhaltestelleA = 31;
int reedhaltestelleB = 33;
int reedhaltestelleC = 35;
int reedhaltestelleD = 37;
int reedhaltestelleE = 39;

//---Variable aktueller Bedarf
int bedarfanA = 0;
int bedarfanB = 0;
int bedarfanC= 0;
int bedarfanD = 0;
int bahnhoferreicht = 0;

//---Variable nächste Runde Bedarf
int bedarfanA_N = 0;
int bedarfanB_N = 0;
int bedarfanC_N = 0;
int bedarfanD_N = 0;

//---Variable zufallsbedarf
int bedarfanA_Z = 0;
int bedarfanB_Z = 0;
int bedarfanC_Z = 0;
int bedarfanD_Z = 0;

//---Variablen Autostart
int autostart=0;
int zufall[4];
int zufallcounter = 100;

//---Haltezeiten
int haltezeit = 500;
int counter = 0;


void setup()
{
  Serial.begin(9600);
  Serial.println("Programm gestartet:\n");

  //---Raspberry
  pinMode(haltestelleRB, OUTPUT);
  pinMode(haltestelleRD, OUTPUT);
  pinMode(outputR1, OUTPUT);
  pinMode(outputR2, OUTPUT);
  pinMode(buttonRBpin, INPUT_PULLUP);
  pinMode(buttonRDpin, INPUT_PULLUP);
  pinMode(inputR1, INPUT_PULLUP);
  pinMode(inputR2, INPUT_PULLUP);

  //---Modell
  pinMode(haltestelleA, OUTPUT);
  pinMode(haltestelleB, OUTPUT);
  pinMode(haltestelleC, OUTPUT);
  pinMode(haltestelleD, OUTPUT);
  pinMode(haltestelleE, OUTPUT);
  pinMode(starttaster, INPUT_PULLUP);
  pinMode(buttonApin, INPUT_PULLUP);
  pinMode(buttonBpin, INPUT_PULLUP);
  pinMode(buttonCpin, INPUT_PULLUP);
  pinMode(buttonDpin, INPUT_PULLUP);
  pinMode(starttaster, INPUT_PULLUP);
  pinMode(reedhaltestelleA, INPUT_PULLUP);
  pinMode(reedhaltestelleB, INPUT_PULLUP);
  pinMode(reedhaltestelleC, INPUT_PULLUP);
  pinMode(reedhaltestelleD, INPUT_PULLUP);
  pinMode(reedhaltestelleE, INPUT_PULLUP);

  Serial.println("Inputs und Outputs initialisiert\n");
  //---Initialisierung des Motor-Kanals A
  pinMode(12, OUTPUT); //Initiates Motor Channel A pin
  pinMode(9, OUTPUT); //Initiates Brake Channel A pin
  Serial.println("Motor initialisiert\n");
  Serial.println("LED-Test\n");
  digitalWrite(haltestelleA, HIGH);
  digitalWrite(haltestelleB, HIGH);
  digitalWrite(haltestelleC, HIGH);
  digitalWrite(haltestelleD, HIGH);
  digitalWrite(haltestelleE, HIGH);
  delay(3000);
  Serial.println("LED-Test abgeschlossen\n");
  digitalWrite(haltestelleA, LOW);
  digitalWrite(haltestelleB, LOW);
  digitalWrite(haltestelleC, LOW);
  digitalWrite(haltestelleD, LOW);
  digitalWrite(haltestelleE, HIGH);

  Serial.println("Raspberry-Pins auf LOW");
  digitalWrite(haltestelleRB, LOW);
  digitalWrite(haltestelleRD, LOW);
  digitalWrite(outputR1, LOW);
  digitalWrite(outputR2, LOW);
}

void loop()

{
  //---------------------------autostart-----------------
  if(autostart==zufallcounter){
    bedarfanA = bedarfanA_Z;
    if(bedarfanA==HIGH){
      digitalWrite(haltestelleA, HIGH);
      //Serial.println("Bedarf an Punkt A");
    }
    else {
      //Serial.println("Kein Bedarf an Punkt A");
      digitalWrite(haltestelleB, LOW);
    }

    bedarfanB = bedarfanB_Z;
    if(bedarfanB==HIGH){
      digitalWrite(haltestelleB, HIGH);
      //Serial.println("Bedarf an Punkt B");
    }
    else {
      //Serial.println("Kein Bedarf an Punkt B");
      digitalWrite(haltestelleB, LOW);
    }

    bedarfanC = bedarfanC_Z;
    if(bedarfanC==HIGH){
      digitalWrite(haltestelleC, HIGH);
      //Serial.println("Bedarf an Punkt C");
    }
    else {
      //Serial.println("Kein Bedarf an Punkt C");
      digitalWrite(haltestelleC, LOW);
    }

    bedarfanD = bedarfanD_Z;
    if(bedarfanD==HIGH){
      digitalWrite(haltestelleD, HIGH);
      //Serial.println("Bedarf an Punkt D");
    }
    else {
      //Serial.println("Kein Bedarf an Punkt D");
      digitalWrite(haltestelleD, LOW);
    }
  }
  //---------------------------nächste Runde-----------------
  else if ((bedarfanA_N == 1) || (bedarfanB_N == 1) || (bedarfanC_N == 1) || (bedarfanD_N == 1)){
    bedarfanA = bedarfanA_N;
    Serial.println("Bedarf an Punkt A nächste Runde =");
    Serial.println(bedarfanA);
    bedarfanA_N = 0;
    bedarfanB = bedarfanB_N;
    Serial.println("Bedarf an Punkt B nächste Runde =");
    Serial.println(bedarfanB);
    bedarfanB_N = 0;
    bedarfanC = bedarfanC_N;
    Serial.println("Bedarf an Punkt C nächste Runde =");
    Serial.println(bedarfanC);
    bedarfanC_N = 0;
    bedarfanD = bedarfanD_N;
    Serial.println("Bedarf an Punkt D nächste Runde =");
    Serial.println(bedarfanD);
    bedarfanD_N = 0;
  }

  bahnhoferreicht = 0;
  if(autostart<zufallcounter){
    Serial.println("Autostart-Counter gestartet");
  }
  while ((digitalRead(starttaster) == HIGH) && (autostart<zufallcounter)){
    if (digitalRead(buttonApin) == LOW)
    {
      digitalWrite(haltestelleA, HIGH);
      Serial.println("Bedarf an Punkt A\n");
      bedarfanA = 1;
      //delay(500);
    }
    if ((digitalRead(buttonBpin) == LOW)||(digitalRead(buttonRBpin)== LOW))
    {
      digitalWrite(haltestelleB, HIGH);
      Serial.println("Bedarf an Punkt B\n");
      bedarfanB = 1;
      //delay(500);
    }
    if (digitalRead(buttonCpin) == LOW)
    {
      digitalWrite(haltestelleC, HIGH);
      Serial.println("Bedarf an Punkt C\n");
      bedarfanC = 1;
      //delay(500);
    }
    if ((digitalRead(buttonDpin) == LOW)||(digitalRead(buttonRDpin)== LOW))
    {
      digitalWrite(haltestelleD, HIGH);
      Serial.println("Bedarf an Punkt D\n");
      bedarfanD = 1;
      //delay(500);
    }
    autostart ++;
    Serial.println(autostart);
    if (autostart==zufallcounter){
      Serial.println("Autostart-Counter erreicht");
    }
  }
  delay(500);

  if ((bedarfanA == 1) || (bedarfanB == 1) || (bedarfanC == 1) || (bedarfanD == 1)) {

    if(bedarfanA==HIGH){ 
      Serial.println("Bedarf an Punkt A");
    }
    else {
      Serial.println("Kein Bedarf an Punkt A");
    } 
    if(bedarfanB==HIGH){
      Serial.println("Bedarf an Punkt B");
    }
    else {
      Serial.println("Kein Bedarf an Punkt B");
    }
    if(bedarfanC==HIGH){
      Serial.println("Bedarf an Punkt C");
    }
    else {
      Serial.println("Kein Bedarf an Punkt C");
    }
    if(bedarfanD==HIGH){
      Serial.println("Bedarf an Punkt D");
    }
    else {
      Serial.println("Kein Bedarf an Punkt D");
    } 
    anfahren();
    vollgas();
 while ((digitalRead(reedhaltestelleE) == HIGH)) {
     if ((bedarfanA == 1) && (digitalRead(reedhaltestelleA) == LOW)) {
       halten(3);
       Serial.println("Bedarf wird gedeckt an A\n");
       warten();
       digitalWrite(haltestelleA, LOW);
       bedarfanA = 0;
       Serial.println("Bedarf wurde gedeckt an A\n");
       anfahren();
       vollgas();
     }
     if ((bedarfanB == 1) && (digitalRead(reedhaltestelleB) == LOW)) {
       halten(3);
       Serial.println("Bedarf wird gedeckt an B\n");
       warten();
       digitalWrite(haltestelleB, LOW);
       bedarfanB = 0;
       Serial.println("Bedarf wurde gedeckt an B\n");
       digitalWrite(haltestelleRB, HIGH);
       delay(100);
       digitalWrite(haltestelleRB, LOW);
       anfahren();
       vollgas();
     }
     if ((bedarfanC == 1) && (digitalRead(reedhaltestelleC) == LOW)) {
       halten(5);
       Serial.println("Bedarf wird gedeckt an C\n");
       warten();
       digitalWrite(haltestelleC, LOW);
       bedarfanC = 0;
       Serial.println("Bedarf wurde gedeckt an C\n");
       anfahren();
       vollgas();
     }
     if ((bedarfanD == 1) && (digitalRead(reedhaltestelleD) == LOW)) {
       halten(5);
       Serial.println("Bedarf wird gedeckt an D\n");
       warten();
       digitalWrite(haltestelleD, LOW);
       bedarfanD = 0;
       Serial.println("Bedarf wurde gedeckt an D\n");
       digitalWrite(haltestelleRD, HIGH);
       delay(100);
       digitalWrite(haltestelleRD, LOW);
       anfahren();
       vollgas();
     }
     delay(100);

     //---Nächste Runde
     if((bedarfanA==0)&&(digitalRead(buttonApin)==LOW)){
       bedarfanA_N=1;
       digitalWrite(haltestelleA, HIGH);
     }
     if(((bedarfanB==0)&&(digitalRead(buttonBpin)==LOW))||((bedarfanB==0)&&(digitalRead(buttonRBpin)==LOW))){
       bedarfanB_N=1;
       digitalWrite(haltestelleB, HIGH);
     }
     if((bedarfanC==0)&&(digitalRead(buttonCpin)==LOW)){
       bedarfanC_N=1;
       digitalWrite(haltestelleC, HIGH);
     }
     if(((bedarfanD==0)&&(digitalRead(buttonDpin)==LOW))||((bedarfanD==0)&&(digitalRead(buttonRDpin)==LOW))){
       bedarfanD_N=1;
       digitalWrite(haltestelleD, HIGH);
     }
   }
   halten(5);
   Serial.println("Bahnhof erreicht!\n");
   digitalWrite(outputR1, HIGH);
   delay(500);
   digitalWrite(outputR1, LOW);
   Serial.println("Warte auf neuen Bedarf!\n");
   autostart=0;
 }
 if(autostart==zufallcounter){
   int zufallszahl = random(1, 16);
   bedarfanA_Z = (zufallszahl &1)/1;
   bedarfanB_Z = (zufallszahl &2)/2;
   bedarfanC_Z = (zufallszahl &4)/4;
   bedarfanD_Z = (zufallszahl &8)/8;
   Serial.println(zufallszahl);
   Serial.println(bedarfanA_Z);
   Serial.println(bedarfanB_Z);
   Serial.println(bedarfanC_Z);
   Serial.println(bedarfanD_Z);
 }
 else {
   Serial.println("Es besteht kein Bedarf, Zug faehrt nicht los!\n");
 }
}

// Funktionen
void vollgas() {
 digitalWrite(12, HIGH); //Establishes forward direction of Channel A
 digitalWrite(9, LOW);   //Disengage the Brake for Channel A
 analogWrite(3, 255);   //Spins the motor on Channel A at full speed
 Serial.print("Vollgas\n");
}

void anfahren() {
 warten();
 digitalWrite(12, HIGH); //Establishes forward direction of Channel A
 digitalWrite(9, LOW);   //Disengage the Brake for Channel A
 Serial.print("Anfahren\n");
 for (int i = 150; i <= 255; i++) {
   analogWrite(3, i);
   delay(10);
 }
}

void halten(int doll) {
 Serial.print("Bremsen\n");
 for (int i = 255; i >= 100; i--) {
   analogWrite(3, i);
   delay(doll);
 }
 digitalWrite(9, HIGH);
}

void warten(){
 while(counter<haltezeit){
   if((bedarfanA==0)&&(digitalRead(buttonApin)==LOW)){
     bedarfanA_N=1;
     digitalWrite(haltestelleA, HIGH);
   }
   if(((bedarfanB==0)&&(digitalRead(buttonBpin)==LOW))||((bedarfanB==0)&&(digitalRead(buttonRBpin)==LOW))){
     bedarfanB_N=1;
     digitalWrite(haltestelleB, HIGH);
   }
   if((bedarfanC==0)&&(digitalRead(buttonCpin)==LOW)){
     bedarfanC_N=1;
     digitalWrite(haltestelleC, HIGH);
   }
   if(((bedarfanD==0)&&(digitalRead(buttonDpin)==LOW))||((bedarfanD==0)&&(digitalRead(buttonRDpin)==LOW))){
     bedarfanD_N=1;
     digitalWrite(haltestelleD, HIGH);
   }
   counter++;
   Serial.println(counter);
 }
 counter=0;
}

Ohne das genau anzusehen:
Interaktiv ( Taster ) und delay() / while Schleifen passt grundsätzlich nicht zusammen.

loop() ist nicht dafür gedacht, bei einem Durchlauf ein "Tagesprogramm" abzuarbeiten.
Sondern sollte bei jedem Durchlauf nur den Momentanzustand erfassen, verarbeiten und merken, evtl. neue Ausgangszustände setzen.

Ist das zu viel Leistung für den Arduino?

Arduino - Pins sind nicht für "Leistung" gemacht. Um nicht für jede LED mit ein paar mA einen Transistor zu brauchen, kann man trotzdem aus SignalPins ca. 20 mA ziehen oder reinfliessen lassen. Am 5V Pin etwas mehr, wobei das davon abhängt, ob an Vin (Stromversorgungsbuchse) 7, 9 oder 11.5V (12V) anliegen. ( Weil die Differenz verheizt wird. )

Aber ich verstehe das so, dass du sowieso dicke TIP120 ( mit Vorwiderstand ) verwendest um deine Verbraucher anzusteuern.

1x Arduino Motor-Shield

kannst du mal abziehen, wenn du es nicht brauchst.

Generell lassen sich Fehler leichter finden, wenn man erstmal alles unnötige rausschmeisst, dann den Rest soweit reduziert, bis der Fehler entweder klar wird oder weg ist.
Serial.println() verwendest du ja schon, das hilft dann auch...

Dank dir für die Anmerkungen, dass werde ich mal versuchen umzusetzen.
Es hat sich herausgestellt, dass eine winzige Faser einer Leitung die Schaltung kurz geschlossen hat.
Ich habe die Platine neu gelötet und nun passt es. Hust Vorwiderstände habe ich auch seit heute drin Hust