Ausschaltverzögerung bei Arduino?
hallo,
ich habe folgendes vor:
Wenn man einen Taster drückt, dann soll ein Fließband angehen und 10s lang (ab dem loslassen des Tasters) laufen. Dazu brauche ich eine Ausschaltverzögerung. Wird der Taster wieder gedrückt, bevor die Zeit abgelaufen ist, sollen wieder 10s von neuem gezählt werden.
Ich habe schon nach einem passenden Sketch im Internet geschaut, doch ich habe keinen gefunden.
Das habe ich bereits fertig, leider funktioniert es nicht so wie ich es mir vorstelle.
void loop()
{
if (digitalRead(Taster, HIGH))
{digitalWrite(Band, HIGH);
currentMillis = millis();//Zeitstempel
while (millis() - currentMillis < 10000); //warten xxx millis
digitalWrite(Bans, LOW);
currentMillis = millis();//Zeitstempel
while (millis() - currentMillis < 1000); //warten xxx millis
}
}
Vielen Dank für die Antwort
2 Antworten
Ja nee, so macht man das nicht. Die "loop" Funktion darf nicht stillstehen.
Du musst es so machen, dass wenn der Taster auf HIGH geht, Band auf HIGH geht und Du Dir die aktuelle Zeit merkst (so wie jetzt auch). Aber dann machst Du keine Schleife, sondern einen zweiten IF-Block, in welchem Du prüfst, ob die Zeit abgelaufen ist.
So etwa
if (digitalRead(Taster, HIGH))
{
digitalWrite(Band, HIGH);
currentMillis = millis();
}
if (digitalRead(Band, HIGH) && millis() - currentMillis >= 10000)
{
digitalWrite(Band, LOW);
}
Ja, hatte ich auch überlegt (insbesondere auch für die Umsetzung der Verzögerung nach dem Abschalten), aber ich dachte, als Ansatzpunkt genügt das erstmal ;-)
Generell aber natürlich richtig. Entsprechende Flags (und ein vernünftiger Initialwert für currentMillis) machen es übersichtlicher und flexibler.
Ich habe bereits eine Lösung, die gut funktioniert gefunden - trotzdem Danke für die Antworten
/*
by noiasca
http://werner.rothschopf.net
*/
const byte buttonPin = A0;
const byte outputPin = 2;
uint32_t previousMillis = 0;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(outputPin, OUTPUT);
}
void loop() {
if (digitalRead(buttonPin) == LOW) {
digitalWrite(outputPin, HIGH);
previousMillis = millis(); // save the time when we switched on the output
}
if (millis() - previousMillis > 3 * 1000UL && digitalRead(outputPin) == HIGH)
{
digitalWrite(outputPin, LOW);
}
}
Habe zwar keinen Arduino zum testen aber vielleicht funktioniert das hier:
void loop() {
digitalWrite(Band, currentMillis + 10000 < millis() ? LOW : HIGH);
if(digitalRead(Taster, HIGH) {
currentMillis = millis();
}
}
Ich hätte da evtl. Probleme mit digitalRead auf einem Output-PIN, das könnte ggf. schief gehen. Ich würde eher eine 2. Variable nehmen, z.B. "aktiv", die beim Einschalten true setzen, statt dem digitalRead in dem if benutzen und beim Abschalten wieder false setzen.