Ganz simpel würde ich das auf Anhieb so lösen:
Code:
void loop() {
if(digitalRead(input) == HIGH && lastread == false){
digitalWrite(ledpin, HIGH);
delay(4000);
digitalWrite(ledpin, LOW);
lastread = true;
}
else if(digitalRead(input) == LOW && lastread == true){
lastread = false;
}
}
Erklärung:
Bei der ersten if-Bedingung wird abgefragt, ob am Eingangs-Pin eine Spannung anliegt und ob ein Wechsel stattgefunden hat. (von Low auf High)
Trifft das zu, wird der Ausgangs-Pin auf HIGH gesetzt, eine beliebige Zeit gewartet und wieder ausgestellt.
Die Variable "lastread" wird auf "true" gesetzt, was in dem Fall den Sinn hat, das das Programm weiß, dass beim aktuellen Status des Eingangs-Pins die Led schon an war - sprich es muss erst mal
so lange gewartet werden bis das Signal wieder 0 ist.
Trifft das zu (wir sind nun bei der "else if"), wird erst geprüft, ob zuletzt die Led an war, sonst würde die else-if-Bedingung bei nicht anliegendem Signal dauerhaft ausgeführt werden.
War der Ausgangs-Pin vor dem Wechsel High -> Low an, wird die 'lastread' wieder zurückgesetzt und bei erneutem Anlegen eines Spannungspegels fängt das Ganze von vorne an.
Anmerkung: Wie Picojetflyer schon sagte, ist ein 'delay' nicht wirklich sinnvoll, da es den kompletten Programmfluss anhält, für den Anfang reicht es aber.
Lesezeichen