Ausschaltverzögerung bei Arduino?

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);
}

Jako13245 
Beitragsersteller
 22.01.2021, 18:29

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);
  }
}
0
iQa1x  22.01.2021, 15:16

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.

1
ohwehohach  22.01.2021, 15:17
@iQa1x

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.

0

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();
  }
}