Hallo, ich habe ein seltsames Verhalten und finde den Fehler nicht! Im sketch in der If Anweisung in Zeile 104 wenn alle Bedingungen erfüllt sind wird nur der Port 8 auf high gesetzt aber Port 7 bleibt low. Ich habe schon andere Ports probiert aber es ändert sich nichts. Ich verwende einen Arduino Mega. Im Wokwi funktioniert es.
// Definition of output PINs für Relays:
int Rel_W11_right=2;
int Rel_W11_left=3;
int Rel_W12_right=4;
int Rel_W12_left=5;
int Rel_W13_right=6;
int Rel_W13_left=7;
int Rel_W14_right=8;
int Rel_W14_left=9;
//Definition of input PINs for kontakte
#define SK1 23 // Schaltkontakt SBHf Einfahrt von B4
#define SK2 24 // Schaltkontakt S13 Halt/Zugerkennung
#define SK3 25 // Schaltkontakt S11 Halt
#define SK4 26 // Schaltkontakt S14 Halt
#define SK5 27 // Schaltkontakt S12 Halt
#define SK6 28 // Schaltkontakt S15 Halt Ausfahrt B3 Gleis 13
#define SK7 29 // Schaltkontakt S16 Halt
#define SK8 30 // Schaltkontakt Einfahrt von B3
int G1_besetzt = 1;
int G2_besetzt = 1;
int G3_besetzt = 1;
int G1_res = 1;
int G2_res = 1;
int G3_res = 1;
int Fahrstrasse_1 = 1;
int Fahrstrasse_2 = 1;
int Fahrstrasse_3 = 1;
int Fahrstrasse_4 = 1;
int SK1_B4_Ein = 1;
int G1_if = false;
int G2_if = false;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200); // Any baud rate should work
// initialize the Gleiskontakte pin as an input:
pinMode(SK1, INPUT_PULLUP);
pinMode(SK2, INPUT_PULLUP);
pinMode(SK3, INPUT_PULLUP);
pinMode(SK4, INPUT_PULLUP);
pinMode(SK5, INPUT_PULLUP);
pinMode(SK6, INPUT_PULLUP);
pinMode(SK7, INPUT_PULLUP);
pinMode(SK8, INPUT_PULLUP);
//pinMode(W1_EL_Re, INPUT_PULLUP); //PINS Weiche
pinMode(Rel_W11_left, OUTPUT);
pinMode(Rel_W11_right, OUTPUT);
pinMode(Rel_W12_left, OUTPUT);
pinMode(Rel_W12_right, OUTPUT);
pinMode(Rel_W13_left, OUTPUT);
pinMode(Rel_W13_right, OUTPUT);
pinMode(Rel_W14_left, OUTPUT);
pinMode(Rel_W14_right, OUTPUT);
}
void loop() {
//int SK1_B4_Ein = digitalRead(SK1);
if (digitalRead(SK1) == LOW ) { SK1_B4_Ein = 0; }
else{SK1_B4_Ein = 1; }
//Status Gleis besetzt
if (digitalRead(SK3) == LOW || digitalRead(SK2) == LOW) { G1_besetzt = 0; } //PIN 25/24
else{G1_besetzt = 1; }
if (digitalRead(SK4) == LOW || digitalRead(SK5) == LOW) { G2_besetzt = 0; } //PIN 27/26
else{G2_besetzt = 1; }
if (digitalRead(SK6) == LOW || digitalRead(SK7) == LOW) { G3_besetzt = 0; } //PIN29/28
else{G3_besetzt = 1; }
//Fahrstraßen besetzen und Status ändenr
if ((G1_besetzt == 0) || (G1_res == 0)) {Fahrstrasse_1 = 0; }
else { Fahrstrasse_1 = 1; }
if ((G2_besetzt == 0) || (G2_res == 0)) {Fahrstrasse_2 = 0;}
else {Fahrstrasse_2 = 1;}
if ((G3_besetzt == 1) && (G3_res == 1)) { Fahrstrasse_3 = 1;}
if ((G3_besetzt == 0) || (G3_res == 0)) { Fahrstrasse_3 = 0;}
else { Fahrstrasse_3 = 1; }
//*********************************************************************************
//Einfahrt von B4
if ((SK1_B4_Ein == 0) && (Fahrstrasse_1 == 1)) {
digitalWrite(Rel_W13_right, HIGH);
}
else { digitalWrite(Rel_W13_right, LOW);
digitalWrite(Rel_W13_left, LOW);}
if ((SK1_B4_Ein == 0) && (Fahrstrasse_1 == 0) && (Fahrstrasse_2 == 1)) {
digitalWrite(8, HIGH);
digitalWrite(7, HIGH);
}
else{
digitalWrite(Rel_W13_left, LOW);
digitalWrite(Rel_W14_right, LOW);
}
if ((SK1_B4_Ein == 0) && (Fahrstrasse_1 == 0) && (Fahrstrasse_2 == 0) && (Fahrstrasse_3 == 1)) {
digitalWrite(Rel_W14_left, HIGH);
digitalWrite(Rel_W13_left, HIGH);
}
else{
digitalWrite(Rel_W13_left, LOW);
digitalWrite(Rel_W14_left, LOW);
}
Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.
Danke, hast recht so wird es übersichtlicher. Zu deinen Ausrufezeichen, das macht schon Sinn denn der Zustand der Fahrstrassen kann von mehreren Variablen beeinflusst werden daher muss im 3ten if Rel_W13_left high sein. Zum besseren Verständnis, Ich bin dabei bei meiner Modeleisenbahn einen automatischen Schattenbahnhof mit 3 Gleisen in beide Richtungen zu realisieren. Es soll, egal von welcher Richtung der Zug kommt, immer auf ein freies Gleis geführt werden, so der Plan
Kannst Du mal - einfach nur mit Stift malen auf nem Zettel - den Plan und die Weichenbezeichnungen und die Position der Schaltkontakte einzeichnen?
Ich habe noch nicht die Logik verstanden.
Mir fehlt z.B. warum Du die "Gleis besetzt" Meldung aufhebst, wenn nur ein Schaltkontakt ausgelöst ist.
Das ganze if/else Konstrukt von vorne nach hinten ist mir zu sehr Geraffel.
Und es sind mir zu viele Variablen dabei. Es braucht nur die Konstanten für die Pins. Den Rest kann man sicher einstampfen.
So ist der Plan bin noch ziemlich am Anfang:
Einfahrt B4-- Halt bei SK3, SK5 oder SK7
Einfahrt B3-- Halt bei SK2, SK4 oder SK6
Wenn Zug von B4 einfährt, dann prüfe welches Gleis frei ist und stelle die Weichen dementsprechend. Das selbe soll von Richtung B3 erfolgen.
Angenommen Zug kommt von B4 G1 frei und weichen sind gestellt aber Zug ist noch nicht eingefahren und hat den Haltebereich noch nicht erreicht, deswegen muss diese G1 reserviert werden damit von Richtung B3 das G1 nicht verwendet werden kann. Mit SK3 wird das G1 besetzt und zukünftig einen wartenden Zug ausfahren lassen.
Die Weichen bekommen eine Rückmelder welcher die Weichenlage signalisiert.
Das Bild sieht eher so aus, als wolltest du Automaten bauen, endliche Automaten.
Aber dein Programm mit den vielen und komplizierten if, ist eher Kontrollfluss orientiert.
Computer können das leicht ausführen, ist aber für Menschen eher keine natürliche Form/Art zu denken.
Das macht es sehr Fehlerträchtig.
Ja der Fahrstrom wird über Relais geschaltet PINs habe ich noch nicht vergeben, es ist aber auch notwendig in Gegenrichtung den Haltebereich stromführen zu schalten.