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.
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.
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.
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)
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