Hallo liebe Arduino-Gemeinde!
Ich habe mein erstes Projekt mit dem Arduino Uno nun schon sehr weit gebracht: Eine Schattenbahnhofssteuerung auf unserer Märklin-Anlage. Sowohl hardware- als auch softwareseitig hat bisher alles bestens funktioniert. Aber nun habe ich zwei neue Funktionen eingebaut (Funktionen nicht im programmiertechnischen Sinn) und der Arduino Uno dreht völlig durch. Das äußert sich vor allem darin, dass über die serielle Schnittstelle nur verworrene Zeichenfolgen auf dem PC ankommen und ich wohl irgendwie im void setup stecken bleibe (obwohl die neuen Features gar nichts mit der void setup zu tun haben). Wenn ich dann die Serial.print() aus dem neuen Teil auskommentiere, dann startet das Programm auf dem Arduino Uno zunächst normal, jedoch springt er irgendwann mitten im Betrieb wieder in die void setup, ähnlich einem Reset. Bin damit wirklich am verzweifeln, denn wenn ich den neuen Teil komplett auskommentiere, läuft alles bestens!
Ich poste hier mal den Code, welcher nur den neuen Teil beinhaltet. Den gesamten Code hänge ich in den Anhang.
An dieser Stelle entschuldige ich mich direkt mal für meine wahrscheinlich stümperhafte Programmierung. Ich habe teilweise viel Copy-Paste nutzen müssen und hätte sicherlich die ein oder andere Funktion anlegen können. Nun ist alles in der "void setup" und "void loop" untergebracht.
Code (nur neuer Teil):
//beim Drücken des roten Tasters: Durchfahrtsmodus (neu in Version 1.1)
else if (digitalRead(buttonR)==LOW){ //wenn Rot gedrückt wird...
delay(100);//Entprellen
Serial.println("Rot gedrueckt. Durchfahrtsmodus gestartet.");
Serial.print("Durchfahrt auf gleis: ");
Serial.println(einfahrender);
while(digitalRead(buttonR)==HIGH){ //solange Rot nicht wieder gedrückt wird..
switch(einfahrender){ //je nachdem, welches Gleis frei ist
case 1:
digitalWrite(gleis1,HIGH); //Schalte Fahrstrom auf Gleis 1 dauerhaft ein
digitalWrite(LED1,LOW); // LED 1 blinkt
delay(50);
digitalWrite(LED1,HIGH);
delay(50);
break;
case 2:
digitalWrite(gleis2,HIGH); //Schalte Fahrstrom auf Gleis 2 dauerhaft ein
digitalWrite(LED2,LOW); // LED 2 blinkt
delay(50);
digitalWrite(LED2,HIGH);
delay(50);
break;
case 3:
digitalWrite(gleis3,HIGH); //Schalte Fahrstrom auf Gleis 3 dauerhaft ein
digitalWrite(LED3,LOW); // LED 3 blinkt
delay(50);
digitalWrite(LED3,HIGH);
delay(50);
break;
}
}
delay(100);//Entprellen
Serial.println("Rot erneut gedrueckt. Durchfahrtsmodus beendet.");
digitalWrite(gleis1,LOW); //nach erneutem Drücken von Rot, überall Fahrstrom abschalten
digitalWrite(gleis2,LOW);
digitalWrite(gleis3,LOW);
Serial.println("Fahrstrom auf allen Gleisen deaktiviert");
Serial.print("naechstes einfahrendes gleis: "); Serial.println(einfahrender);
Serial.print("naechstes ausfahrendes gleis: "); Serial.println(ausfahrender);
Serial.println("Warte auf einfahrenden Zug...");
}//zurück in kontinuierlichen Betrieb
//beim Drücken des grünen Tasters: Zug abfahren lassen. (neu in Version 1.1)
else if (digitalRead(buttonG)==LOW){ //wenn Grün gedrückt wird...
delay(100);//Entprellen
Serial.println("Grün gedrückt. Lasse Zug ausfahren...");
ausfahrender++; //Ausfahrtsgleis wird erhöht, damit nahtlos im kontinuierlichen Betrieb weiter gemacht werden kann
if (ausfahrender>3)
ausfahrender=1;
switch(ausfahrender){
case 1:
Serial.println("Zug von Gleis 1 faehrt ab...");
digitalWrite(gleis1,HIGH); //Zug von Gleis 1 fährt ab
delay(4000);
digitalWrite(gleis1,LOW);
digitalWrite(LED1,LOW); //LED 1 aus
gleisBelegt[0]=false;
Serial.println("Zug von Gleis 1 abgefahren");
Serial.println("Stelle Weichen fuer einfahrt auf Gleis 1...");
digitalWrite(weicheA_L,HIGH); // Weichen werden für Einfahrt auf Gleis 1 gestellt
delay(200);
digitalWrite(weicheA_L,LOW);
Serial.println("Weiche A auf links gestellt");
einfahrender = 1; //Lege dieses Gleis für nächste Einfahrt fest
ausfahrender = 2; //Lege nächstes Gleis für nächste Abfahrt fest
break;
case 2:
Serial.println("Zug von Gleis 2 faehrt ab...");
digitalWrite(gleis2,HIGH); //Zug von Gleis 2 fährt ab
delay(4000);
digitalWrite(gleis2,LOW);
digitalWrite(LED2,LOW); //LED 2 aus
gleisBelegt[1]=false;
Serial.println("Zug von Gleis 2 abgefahren");
Serial.println("Stelle Weichen fuer einfahrt auf Gleis 2...");
digitalWrite(weicheA_G,HIGH); // Weichen werden für Einfahrt auf Gleis 2 gestellt
delay(200);
digitalWrite(weicheA_G,LOW);
digitalWrite(weicheB_L,HIGH);
delay(200);
digitalWrite(weicheB_L,LOW);
Serial.println("Weiche A auf gerade gestellt, Weiche B auf links gestellt");
einfahrender = 2; //Lege dieses Gleis für nächste Einfahrt fest
ausfahrender = 3; //Lege nächstes Gleis für nächste Abfahrt fest
break;
case 3:
Serial.println("Zug von Gleis 3 faehrt ab...");
digitalWrite(gleis3,HIGH); //Zug von Gleis 3 fährt ab
delay(4000);
digitalWrite(gleis3,LOW);
digitalWrite(LED3,LOW); //LED 3 aus
gleisBelegt[2]=false;
Serial.println("Zug von Gleis 3 abgefahren");
Serial.println("Stelle Weichen fuer einfahrt auf Gleis 3...");
digitalWrite(weicheA_G,HIGH); // Weichen werden für Einfahrt auf Gleis 3 gestellt
delay(200);
digitalWrite(weicheA_G,LOW);
digitalWrite(weicheB_G,HIGH);
delay(200);
digitalWrite(weicheB_G,LOW);
Serial.println("Weiche A auf gerade gestellt, Weiche B auf gerade gestellt");
einfahrender = 3; //Lege dieses Gleis für nächste Einfahrt fest
ausfahrender = 1; //Lege nächstes Gleis für nächste Abfahrt fest
break;
}
Serial.println("Zugausfahrt beendet. Rueckkehr in kontinuierlichen Betrieb.");
Serial.print("naechstes einfahrendes gleis: ");Serial.println(einfahrender);
Serial.print("naechstes ausfahrendes gleis: ");Serial.println(ausfahrender);
Serial.println("Warte auf einfahrenden Zug...");
}//Rückkehr in kontinuierlichen Betrieb
Ich hoffe, ihr könnt mir helfen! =(
Vielen Dank schon mal für eure Tipps,
lg
SBhf_gesamtV1_1.ino (17.5 KB)