ich bin neu hier im Forum und generell auch erst seit einem Monat mit dem Arduino am basteln.
Ich habe folgendes Problem und es wäre schön wenn mir jemand helfen könnte. Es würde mir auch reichen, wenn mir jemand einfach ein Stichwort nennt.
Ich baue derzeit einen Slider für eine DSLR. Die Teile sind gedruckt und alles verkabelt. Der Stepper etc. funktioniert einwandfrei. Nun habe ich noch zwei Endstops hinzugefügt. Der eine wird mittels einer WHILE-Schleiße im setup() abgefragt um den Wagen zu "homen". Jetzt soll sobald der Wagen über die Schiene gefahren ist und den anderen Endstop berührt der Loop() beendet werden und das Setup() wieder aufgerufen werden. Also erneut homen und beenden. Wie bekomme ich es hin, dass sobald der Endstop berührt wird, es auf Setup() umschält? Eine If anweisuing wird ja zum Beispiel einmal pro Loop abgefragt. Ich dachte an eine while-schleife, doch auch damit bekomme ich es nicht hin. Erst nachdem der Loop durchgelaufen ist erkennt der Arduino, dass der Endstop betätigt wurde.
Hier der Loop meines Code:
void loop() {
while (!digitalRead(end_switch)){ //Schalter nicht betätigt -> weiter loop
digitalWrite(ms1Pin,HIGH);
digitalWrite(ms2Pin,HIGH);
digitalWrite(ms3Pin,HIGH);
digitalWrite(dirPin,LOW); //aktiviert richtung des motors
//200 pulse für eine umdrehung
for(int x = 0; x < s_berechnung ; x++) {
digitalWrite(stepPin,HIGH);
delayMicroseconds(500);
digitalWrite(stepPin,LOW);
delayMicroseconds(500);
}
delay(1000);
digitalWrite(2,HIGH);
delay(b_berechnung);
digitalWrite(2,LOW);
delay(intervall * 1000 - 1000);
if (intervall < 3){
delay(3000);
}
}
while (digitalRead(end_switch)){ [color=red]Wenn Schalter betätigt soll sofort setup() eingeleitet werden.[/color]
setup();
}
}
loop() ist wie der Name sagt schon eine Schleife. Wenn diese schnell genug durchläuft dann wird auch sowas langsames wie ein Tastendruck "sofort" registriert. Dazu musst du aber die Sekunden-langen delay() Aufrufe entfernen und das nicht-blockierend schreiben
catchup12:
Ich hoffe ihr könnt mir ein paar Hinweise geben.
Serenifly hat ja schon einen guten Hinweis gegeben.
Du solltest Dir außerdem angewöhnen, „schönen“ Code zu schreiben. Also so, dass man die Struktur schon erkennen kann, ohne den Code selbst lesen zu müssen. Das erreichst Du z. B. durch passende (und einheitliche) Einrückungen und Klammerungen. Eine gute Starthilfe ist auf jeden Fall Strg-T. Bei der Fehlersuche ist Übersichtlichkeit Gold wert.
Was Deine eigentliche Frage angeht: Ändere die „Programmierstrategie“ und orientiere Dich am Muster eines „endlichen Automaten“. Dann kannst Du mehrere Dinge quasi gleichzeitig tun (gleichzeitig bewegen und einen Kontakt abfragen). Was mir dazu eingefallen ist, steht hier.
Davon ab, daß eine WHILE-Schleife, Die setup() aufrufen soll, eh keinen höheren Nährwert hat - was macht Da ein WHILE, wenn Du bei passender Bedingung (also die WHILE-Schleife würde laufen) ins setup() springen willst?
WENN man so was vorhätte, würde hier ein IF reichen - Du willst aber NICHT ins setup() springen.
Im Arduino wird setup() als Erstes abgearbeitet und Das genau 1x.
Danach wird in loop() gesprungen und Diese abgearbeitet.
Wenn loop() beendet wird, wird erneut nach loop() gesprungen - deshalb hat man diese Funktion auch so benannt, loop.
WHILE-Schleifen zum Warten oder delay sind 'böse' - suche nach der Nachtwächter-Erklärung, wird ungefähr zweihundert Mal hier im Forum verlinkt sein.
wow vielen lieben Dank!
habe nicht erwartet, dass mir so schnell so gut geholfen wird.
Ihr habt Recht ich muss definitiv mehr Struktur in den Code bringen.
Muss da noch ein bischen an meiner Disziplin arbeiten.
So wie ich das nun raushöre ist delay() Gift. Also werde ich wohl die Tage nochmal ranglotzen und ein wenig lernen, wie ich es umgehe.
Danke gregorss für den Link und danke euch allen.
delay() ist nicht 100% Gift, aber wenn mehrere Dinge (fast) gleichzeitig gemacht werden sollen darf delay() nicht verwendet werden. Gleiches gilt bedingt für for Schleifen, while bzw do while, pulseIn(), Serial.print() und andere.
Deine Frage heisst Zustand eines Endstops während Loop abfragen?
Das geht, wie du weisst, mit digitalRead().
Wie oft willst du den Endstop abfragen? Das begrenzt die Laufzeit eines loop() - Durchlaufs.
Die Grundidee:
loop() hat nur die Aufgabe, den aktuellen Zustand zu erkennen und daraus zu ermitteln ob an den Ausgängen irgend was verändert werden muss.
Das dauert praktisch keine Zeit und loop() wird so ohne innere Schleifen auch einfacher.
delay() und andere blockierenden Funktionen können da nur sehr begrenzt eingesetzt werden, jedenfalls nicht um damit einen "Programmablauf" zeitlich zu kontrollieren. Das geht nur mit einem Vergleich der aktuellen Zeit mit einem früheren Wert. (BlinkWithoutDelay)