DC Motor Software

Hallo, ich bin auch noch relativ neu dabei hier und habe eine frage zur Software.

Genauer geht es darum einen Schieber in einer Führung hin und her fahren zu lassen, dabei kann er aber manchmal klemmen und das Zahnrad würde durchdrehen... Ich habe links und rechts einen End Schalter verbaut (PullUp) der mir die Signale gibt wann ich eben am ende bin.
Ich will meinen Code jetzt so haben, dass ich eben den Motor solange drehen lasse bis der Schalter high zurückgibt oder bis eine bestimmte zeit überschritten wurde seit Start, womit ich dann erkennen kann der er klemmt.

void einmalFahren() {

erneut:

  while (digitalRead(anschlag_rechts) == 0) { // wenn er noch nicht ganz rechts ist
    rechtsFahren();
  }



  if (digitalRead(anschlag_rechts) == 1) { // wenn er ganz rechts ist
    linksFahren();

    unsigned long currentMillis;
    currentMillis = millis();

    while (millis() - currentMillis <= 5000) {

      if (digitalRead(anschlag_links) == 1) {
        /*wenn er in diese schleife kommt, dh wenn der Anschlag gedrückt ist soll er die Funktion
          verlassen, den Motor abstellen und weiter im loop gehen */
        stop_();
        break; // oder wie komm ich ganz raus?
      }

      linksFahren();
    }

  }

  /* wenn er die while schleife nach 5 Sekunden verlassen hat ohne anzukommen soll
    er die Funktion nicht verlassen sondern die Funktion vom Anfang an erneut ausführen*/

  goto erneut; //ich weis goto ist nicht toll;)

}

Um es zu verstehen, wenn die Funktion aufgerufen wird soll er immer als erstes ganz nach rechts, wenn das passiert ist geht er los nach links, auf diesem Weg kann er klemmen.
Das komplizierte ist nun wenn er eben klemmt soll er von oben erneut anfangen, wenn nicht direkt ins loop zurück....

wenn ich den Code ausführe funktioniert das nur bedingt, der Motor fährt immer vom einen zum anderen Anschlag, wenn er klemmt fährt er aber weiter und er kommt nicht aus der Funktion heraus. eigentlich soll er, wenn die Funktion aufgerufen wird nur einmal nach ganz rechts und nach links.

Ich hoffe die Informationen reichen einigermaßen wenn mehr benötigt aber mehr wären auch kein Problem.

Ich würde mich mega freuen wenn jemand eine Lösung hat!
LG Hannes

Hallo,

überlege einmal wie ein Programm aus der Nummer wieder rauskommen soll?

erneut:
...
...
...
goto erneut; 

loop() ist deine Hauptschleife die ständig läuft.
Was du brauchst ist eine Ablaufsteuerung bzw. Zustandsautomat.
Gewöhnlich mit enums und switch case aufgebaut.