Eisenbahn Steuern

StartHardware-Forum Eisenbahn Steuern

Ansicht von 2 Beiträgen - 1 bis 2 (von insgesamt 2)
  • Autor
    Beiträge
  • #6603
    Hans-Peter
    Teilnehmer

    Hallo Zusammen,
    hier benötige ich mal Hilfe.

    Dies ist das noch unvollständige Programm:

    //Variablendefinition

    //Gleis bestromen Pin 1 bis 10
    //Gleis 1 im Schattenbahnhof aussen
    int Gleis_1=1;
    //Gleis 2 im Schattenbahnhof innen
    int Gleis_2=2;
    //Gleis 3 im Bahnhof aussen
    int Gleis_3=3;
    //Gleis 4 im Schattenbahnhof innen
    int Gleis_4=4;
    //Gleis 5 Innengleis
    int Gleis_5=5;
    //Gleis 6 Abstellgleis im Schattenbahnhof
    int Gleis_6=6;
    //Ausßengleis bestromen
    int Aussengleis=7;

    //Weichen Schalten Pin 11-15
    //Weichen aus Gleis 1 schalten
    int Weichen_Gleis_1=11;
    //Weichen aus Gleis 2 schalten
    int Weichen_Gleis_2=12;
    //Weichen aus Gleis 3 schalten
    int Weichen_Gleis_3=13;
    //Weichen aus Gleis 4 schalten
    int Weichen_Gleis_4=14;

    //Schaltgleise Pin 21-25
    //Schaltgleis Gleis 1
    int SG_1=21;
    //Schaltgleis Gleis 2
    int SG_2=22;
    //Schaltgleis Gleis 3
    int SG_3=23;
    //Schaltgleis Gleis 4
    int SG_4=24;
    //Schaltgleis Gleis 5
    int SG_5=25;

    void setup() {
    // Pindefinitionen
    pinMode(Gleis_1, OUTPUT);
    pinMode(Gleis_2, OUTPUT);
    pinMode(Gleis_3, OUTPUT);
    pinMode(Gleis_4, OUTPUT);
    pinMode(Gleis_5, OUTPUT);
    pinMode(Gleis_6, OUTPUT);
    pinMode(Aussengleis, OUTPUT);
    pinMode(Weichen_Gleis_1, OUTPUT);
    pinMode(Weichen_Gleis_2, OUTPUT);
    pinMode(Weichen_Gleis_3, OUTPUT);
    pinMode(Weichen_Gleis_4, OUTPUT);
    pinMode(SG_1, INPUT);
    pinMode(SG_2, INPUT);
    pinMode(SG_3, INPUT);
    pinMode(SG_4, INPUT);
    pinMode(SG_5, INPUT);

    //Startkonfiguartion
    //Gleis 1 und 2 im Schattenbahnhof belegt
    //Gleis 3 belegt
    //Gleis 5 im Bahnhof belegt

    // Weichen Grundstellung schalten
    //Weichen zum befahren von Gleis 1 schalten
    digitalWrite(Weichen_Gleis_1, HIGH);
    delay(500);
    //Weichen zum befahren von Gleis 4 schalten
    digitalWrite(Weichen_Gleis_4, HIGH);
    delay(500);
    //Gleis 5 bestromen
    digitalWrite(Gleis_5, HIGH);
    //Aussengleis 7 bestromen
    digitalWrite(Aussengleis, HIGH);

    //Startaktion
    //Gleis 1 für 2 sek. bestromen
    digitalWrite(Gleis_1, HIGH);
    delay(2000);
    //Gleid 4 für einfahrenden Zug bestromen
    digitalWrite(Gleis_4, HIGH);

    }

    void loop() {

    // Programmablauf:

    //(1) Zur läuft in Gleis 4 ein, bleibt stehen, schaltet die Weichen für Gleis 2 und 3 und bestromt Gleis 2
    if (digitalRead(SG_4)==HIGH){
    digitalWrite(Gleis_4, LOW);
    digitalWrite(Weichen_Gleis_3, HIGH);
    delay(500);
    digitalWrite(Weichen_Gleis_2, HIGH);
    delay(500);
    digitalWrite(Gleis_3, HIGH);
    digitalWrite(Gleis_2, HIGH);
    } else {
    digitalWrite(Gleis_6, LOW);
    }
    //warten, bis der Zug auf Gleis 2 hält
    for (int SG_2=LOW; SG_2=HIGH; SG_2=LOW){
    delay(250);
    }

    //Status: Gleis 1 – 1
    // Gleis 2 – 0
    // Gleis 3 – 1
    // Gleis 4 – 1

    //(2) Zur läuft in Gleis 2 ein, bleibt stehen, schaltet die Weichen für Gleis 1 und 3 und bestromt Gleis 3
    if (digitalRead(SG_2)==HIGH){
    digitalWrite(Gleis_2, LOW);
    digitalWrite(Weichen_Gleis_1, HIGH);
    delay(500);
    digitalWrite(Weichen_Gleis_3, HIGH);
    delay(500);
    digitalWrite(Gleis_3, HIGH);
    digitalWrite(Gleis_1, HIGH);
    } else {
    digitalWrite(Gleis_6, LOW);
    }
    //Status: Gleis 1 – 1
    // Gleis 2 – 1
    // Gleis 3 – 0
    // Gleis 4 – 1

    //(3) Zur läuft in Gleis 3 ein, bleibt stehen, schaltet die Weichen für Gleis 1 und 4 und bestromt Gleis 3
    if (digitalRead(SG_3)==HIGH){
    digitalWrite(Gleis_3, LOW);
    digitalWrite(Weichen_Gleis_4, HIGH);
    delay(500);
    digitalWrite(Weichen_Gleis_2, HIGH);
    delay(500);
    digitalWrite(Gleis_4, HIGH);
    digitalWrite(Gleis_1, HIGH);
    } else {
    digitalWrite(Gleis_6, LOW);
    }
    //Status: Gleis 1 – 1
    // Gleis 2 – 1
    // Gleis 3 – 0
    // Gleis 4 – 1

    //(4) Zur läuft in Gleis 1 ein, bleibt stehen, schaltet die Weichen für Gleis 2 und 4 und bestromt Gleis 43
    if (digitalRead(SG_1)==HIGH){
    digitalWrite(Gleis_1, LOW);
    digitalWrite(Weichen_Gleis_2, HIGH);
    delay(500);
    digitalWrite(Weichen_Gleis_4, HIGH);
    delay(500);
    digitalWrite(Gleis_1, HIGH);
    digitalWrite(Gleis_4, HIGH);
    } else {
    digitalWrite(Gleis_6, LOW);
    }
    //Status: Gleis 1 – 1
    // Gleis 2 – 1
    // Gleis 3 – 1
    // Gleis 4 – 0

    }

    es gibt dort eine Programmzeile:
    //warten, bis der Zug auf Gleis 2 hält
    for (int SG_2=LOW; SG_2=HIGH; SG_2=LOW){
    delay(250);

    Ich möchte das Programm so lange an der stelle halten, bis SG_2 HIGH wird.
    Kann das so funktionieren oder gibt es eine bessere Lösung?

    Danke für eure hilfe.

    #6608
    Stefan Hermann
    Keymaster

    Hallo Hans-Peter,

    ich benutze für solche Aufgaben gern State-Machines. Das habe ich hier mal näher beschrieben: Tee-Timer mit Arduino.

    Das ist ganz ähnlich zu den if-Abfragen, die du verwendest, gibt aber etwas mehr Struktur. Ich hoffe, das hilft dir ein bisschen.

    Liebe Grüße

    Stefan

Ansicht von 2 Beiträgen - 1 bis 2 (von insgesamt 2)
  • Du musst angemeldet sein, um auf dieses Thema antworten zu können.