While command digitalPin

Hallo,
ich hab ein Problem mit meinem Code.
Vorweggenommen ich bin noch nicht solange am programmieren.

Es geht um einen Motor der durch Tastendruck vorwärts fährt, danach durch das berühren eines anderen tasters wieder zurück und durch das berühren nächsten Tasters am Startpunkt stehen bleibt.

Hier der Code...

const int VOR = 7;        //Pin D7 am arduino
const int HINTER = 6;
const int SCHALTERPin = 3 ;
const int STOPPERVORNPin = 4;
const int STOPPERHINTENPin = 5;
int STOPPERVORN = 0;
int STOPPERHINTEN = 0;
int SCHALTER = 0;

void setup() {
  pinMode(VOR, OUTPUT);
  pinMode(HINTER, OUTPUT);
  pinMode(SCHALTERPin, INPUT);
  pinMode(STOPPERVORNPin, INPUT);
  pinMode(STOPPERHINTENPin, INPUT);

  Serial.begin(9600);
}

void loop() {

  STOPPERVORN = digitalRead(STOPPERVORNPin);
  STOPPERHINTEN = digitalRead(STOPPERHINTENPin) ;
  SCHALTER = digitalRead(SCHALTERPin);

  Serial.println(STOPPERVORN);    // 0
  Serial.println(STOPPERHINTEN) ; // 0
  Serial.println(SCHALTER);       // 0


  if  (SCHALTER == HIGH) {
    Serial.println("Knopf gedrückt");


    digitalWrite(VOR, HIGH);
    Serial.println("Motor fährt vor");
    delay(30);


    while (STOPPERVORN == LOW) {
      Serial.println("while");
      Serial.println(STOPPERVORN); // 0 selbst bei drücken des Tasters
      digitalWrite(VOR, HIGH);

    }
    digitalWrite(VOR, LOW);

    while (STOPPERHINTEN == LOW) {
      Serial.println("while 2");
      digitalWrite(HINTER, HIGH);
    }


    digitalWrite(HINTER, LOW);

  }



  else {
    Serial.println("Knopf nicht gedrückt");
  }
}

Er funktioniert bis zum ersten while command ab da zeigt derr Serial.print nur noch 0 selbst wenn ich den Taster drücke.
Den Taster hab ich durch andere Sketches geprüft da funktioniert alles.

Vielen Dank für die Hilfe!

Du liest den Taster auch nie neu ein. Wie soll sich das was ändern?

while-Schleifen sind da aber der falsche Weg. Du hast in loop() schon eine Schleife. Wenn man dann pro Durchlauf nur if-Abfragen macht kann man auch mehrere Dinge quasi-gleichzeitig tun. z.B. mehrere Taster abfragen.

Die Taster sind auch nicht richtig entprellt

Er funktioniert bis zum ersten while command ab da zeigt derr Serial.print nur noch 0 selbst wenn ich den Taster drücke.

Wenn du Tasten in einer Schleife auswerten möchtest, dann solltest du das auch tun.

Denn:

while (STOPPERHINTEN == LOW)
Eine Variable namens STOPPERHINTEN wird sich ohne Anlass nicht ändern.

while (STOPPERVORN == LOW) {
      Serial.println("while");
      Serial.println(STOPPERVORN); // 0 selbst bei drücken des Tasters
      digitalWrite(VOR, HIGH);

    }

While ist eine Schleife die solange ausgeführt wird, solange die Bedingung wahr ist. Da Du niemals die Variable in der Schleife änderst, bleibt der Sketch immer in dieser Schleife.

Grüße Uwe

Vielen Dank für die ganzen Antworten,
Das Problem mit einem If command ist, das wenn die Bedingung nicht erfüllt ist, der Sketch weiterläuft.
Das könnte man evtl mit goto im else beheben aber da fand ich while besser.

Dann müsste ich also ... in die while schleife packen?

STOPPERVORN = digitalRead(STOPPERVORNPin);

Oder ist do while besser:

do  {
      STOPPERVORN = digitalRead(STOPPERVORNPin);
      Serial.println("while");
      Serial.println(STOPPERVORN); 
      digitalWrite(VOR, HIGH);

    } while (STOPPERVORN == LOW)

Dann müsste ich also ... in die while schleife packen?

STOPPERVORN = digitalRead(STOPPERVORNPin);

Oder ist do while besser:

do  {

STOPPERVORN = digitalRead(STOPPERVORNPin);
      Serial.println("while");
      Serial.println(STOPPERVORN);
      digitalWrite(VOR, HIGH);

} while (STOPPERVORN == LOW)

Ohhh
Okay vielen Dank, hab es gerade ausprobiert und so funktioniert es.

Grüße Marvin

marfbuilds:
Das könnte man evtl mit goto im else beheben aber da fand ich while besser.

Oh nein. Vergiss goto ganz schnell. Es gibt ein paar sehr spezielle Anwendungen dafür, aber generell verwendet man das nicht. Vor allem wenn man nicht weiß was man tut.

Das loop() dann weiterläuft ist ok. In der Regel ist das auch dringend nötig. Es gibt Wege um genau zu bestimmen was zu jedem Zeitpunkt gemacht wird. Und man kann auch sagen dass sonst nichts getan werden soll

Und im übrigen blockiert deine do while Schleife solange der Motor nicht am Anschlag ankommt. Das ist garantiert kontraproduktiv.