Code läuft nicht immer durch?

Hallo zusammen, ich habe folgendes Problem:
es geht um eine Modellbahn Kehrschleifenschaltung. Sie läuft teilweise super durch, mehrfach hintereinander. Manchmal läuft sie einmal komplett durch und beim 2. Durchlauf reagieren die Hallsensoren nicht mehr. Das betrifft dann alle Sensoren.
Zur Erklärung: die Lok in Kehrschleife 1 mit Magnet überfährt Hallsensor 3_4 die Spannung zwischen den Kehrschleifen wir umgeschalten, danach kommt Sensor 1 und die Weiche 1 (rel1) wird für 15min umgeschalten. dann kommt sie in die 2. Kehrschleife Sensor 3_4 schaltet Fahrspannung wieder zurück und dann Sensor 2 der schaltet Weiche 2 (rel2) für 15sec. um.
Auf rel3_4 wirken 2 Sensoren, das gleiche umgeschaltet wird.
könnt ihr bitte mal über den Code schauen ob er so okay ist oder etwas verbessert werden könnte.
Danke

// Programm Kehrschleife

int rel1 = 7 ; // PIN für Relais1
int rel2 = 8 ; // PIN für Relais2
int rel3 = 9;
int mhSensor1 =  2 ; // PIN für den Magnetischen Hall Sensors 1
int mhSensor2 =  3 ; // PIN für den Magnetischen Hall Sensors 2
int mhSensor3_4 = 4;

int buttonstatus = 0;
int buttonZaehler = 0;
int letzterStatus = 0;

void setup () {
  pinMode (rel1, OUTPUT) ; // definieren des PIN's für Relais1 als Ausgangssignal
  pinMode (rel2, OUTPUT) ; // definieren des PIN's für Relais2 als Ausgangssignal
  pinMode (mhSensor1, INPUT) ;  // definieren des PIN's für den Sensor1 als Eingangssignal
  pinMode (mhSensor2, INPUT) ;  // definieren des PIN's für den Sensor2 als Eingangssignal
}

void loop () {
  int val = digitalRead (mhSensor1) ; // Lesen des Zustandes des Sensors1.
  if (val == LOW) { //Wenn dieser AN ist dann soll Relais1 anziehen.
    digitalWrite (rel1, LOW);
    delay (15000);

  } else { //Wenn dieser AUS ist dann soll Relais1 NICHT anziehen.
    digitalWrite (rel1, HIGH);
  }


  {
    int val = digitalRead (mhSensor2) ; // Lesen des Zustandes des Sensors2.
    if (val == LOW) { //Wenn dieser AN ist dann soll Relais2 anziehen.
      digitalWrite (rel2, LOW);
      delay (15000);

    } else { //Wenn dieser AUS ist dann soll Relais2 NICHT anziehen.
      digitalWrite (rel2, HIGH);
    }

  }
  {

    Serial.begin(9600);
    pinMode(rel3, OUTPUT);
    pinMode(mhSensor3_4, INPUT);

  }

  {

    buttonstatus = digitalRead(mhSensor3_4);

    if (buttonstatus != letzterStatus)
    {
      if (buttonstatus == 1)
      {
        buttonZaehler++;
      }

      else
      {
        digitalWrite(rel3, HIGH);
      }
    }

    if (buttonZaehler % 2 == 0)
    {
      digitalWrite(rel3, LOW);
      buttonZaehler = 0;
    }

    else
    {
      digitalWrite(rel3, HIGH);
    }
    letzterStatus = buttonstatus;
    Serial.println(buttonZaehler);
    delay(10);
  }
}

Wenn du den Eindruck hast, etwas "läuft nicht durch", kann das an den 2 * 15 Sekunden delay liegen, in denen dein Sketch absichtlich tot ist, oder eine elektromagnetische Störung, wenn die Relais keine Freilaufdioden haben.

Das "manchmal" lässt sich natürlich leichter eingrenzen, wenn man weiß worauf man achten könnte, ist mir schon klar, wäre aber sicher hilfreich :slight_smile:

Wie du zwei Sensoren an 1 Pin angeschlossen hast, wäre evtl. auch interessant...

Ich Tippe auch auf die fehlenden Freilaufdioden.

Welche Relais (Link posten) verwendest du ?
Wie versorgst du die Schaltung (Schaltbild posten) mit Spannung ?

Evtl. hast du auch ein Problem mit deiner Spannungsversorgung.

Hallo,
du könntest an geeigneten Stellen noch ein paar Serial.println("xx") einbauen um zu sehen wo es hängt. Zudem gehört das nicht in den Loop

 Serial.begin(9600);
 pinMode(rel3, OUTPUT);
 pinMode(mhSensor3_4, INPUT);

Heinz

Generell hast du in loop() ein paar seltsame {} Blöcke. Das ist zwar nicht falsch, aber es ist etwas verwirrend zu lesen

Hallo Michael,

Also mit nicht durchlaufen meinte ich den gesamten Code und nicht die 2x 15 sec. Pause.
Hier der Link zum Relais:

Gruß Uwe

Manchmal bedeutet, läuft 5x reibungslos und manchmal nur 2 oder 1 mal. 1 mal nach dem Einschalten aber bis jetzt immer.
Die Sensoren haben GND, VCC und halt den S der an PIN 2, 3, bzw. 4


Hallo Heinz, die 3 Zeilen müssten dann wohl ins Setup?
Gruß Uwe

Hallo Serenifly,
Wie kann ich das ändern?
Gruß Uwe

Hallo
gebe mal den Relais eine eigene Stromversorgung.
Gemäß der Beschreibung benötigt jedes Relais 70mA.

Einfach die überflüssigen Klammern entfernen. Und dann neu formatieren lassen damit die Einrückung stimmt

z.B. hier:

  {
    int val = digitalRead (mhSensor2) ; // Lesen des Zustandes des Sensors2.
    if (val == LOW) { //Wenn dieser AN ist dann soll Relais2 anziehen.
      digitalWrite (rel2, LOW);
      delay (15000);

    } else { //Wenn dieser AUS ist dann soll Relais2 NICHT anziehen.
      digitalWrite (rel2, HIGH);
    }

  }

Was sollen da die äußeren Klammern?

Das ändert aber nichts am Ablauf. Nur Kosmetik

Aus deiner Schaltung entnehme ich, du hast die 5Volt an VCC angeschlossen.
Welcher Pin ist es am Nano ?
Es gibt da nur den Vin oder 5V.
Wenn es der Vin ist, kann das nicht sauber funktionieren, da hier 5V zu wenig ist. Der braucht min. 6,5 Volt.
Und an dem 7805 brauchst du zwingend noch ker. Kondensatoren 0,1 μF auf jeder Seite. Ohne die wird der Regler sehr leicht schwingen und dann hast du auch Probleme.

Die Relais hängen ja parallel an der zentralen Stromversorgung.

Hängt an 5V.

Ok, dann hoffe ich nur, du hast den 7805 ausreichend gekühlt.
Der mus eine Menge an Leistung verbraten.

Hallo,
an dem 7805 kannst Du ja mal mit dem Fingerchen die Temperatur messen ( Brandsalbe bereithalten :wink:). Ich würde allerdings erst mal die beiden Sensoren 3_4 elektrisch voneinander trennen und auf zwei Eingänge verteilen. Eventuell bekommen sich die beiden H/L Pegel ins Gehege und der Pegel ist ein Mix aus ???. Dann kannst Du auch auf den Zähler verzichten und schaltest mit dem einen das relay 3 ein und mit dem anderen wieder aus .
Dann nimm auch noch das delay(15000) raus und ersetze es ein Konstrukt aus millis(), damit das Ding nicht hängt und Du auch noch wärend der Zeit die anderen Sensoren mitbekommst.
Das ist in dem Fall ganz einfach
schau Dir dazu mal das Beispiel an.
Heinz

const byte mhSensor1=2;
const byte rel1=13;
bool val1;
uint32_t altzeit1;


void setup() {
  // put your setup code here, to run once:
Serial.begin(115200);
pinMode(mhSensor1,INPUT_PULLUP);
pinMode (rel1,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:


  val1 = digitalRead (mhSensor1) ; // Lesen des Zustandes des Sensors1.
  if (!val1) { //Wenn dieser AN ist dann soll Relais1 anziehen.
    digitalWrite (rel1, LOW);
    altzeit1 = millis();
    //delay (15000);
  }
  else {
    if ( millis() - altzeit1 >= 3000)digitalWrite (rel1, HIGH);
  }
}