Interrupt nach Zeitspanne automatisch beenden

Hallo zusammen,

ich komme bei einem Thema mit Interrupts nicht weiter. Ich habe einen Taster, der bei Drücken einen Interrupt auslöst.
Jetzt möchte ich gerne, dass der Interrupt bei nicht erneuter Betätigung des Tasters nach 2min beendet wird. Hat da jemand eine Idee, wie ich das realisieren könnte?

Vielen Dank schonmal im Voraus für die Hilfe
Grüße Felix :slight_smile:

Das Beenden eines Interrupts zu blockieren ist eine ganz dumme Idee!

Hier gibts natürlich das Problem, dass bei aktiven Interrupt, die Zeit nicht weiter läuft. Somit verdirbst du dir die Möglichkeit die 2 Minute abzumessen.

Also noch mal zurück auf "Start", und neu überlegen.

Also ich habe ehrlich gesagt die Frage gar nicht verstanden !
Ulli

Du hast ein Verständnisproblem.
Ein Interrupt soll eine kurze und außerordentliche Unterbrechung des restlichen Programms sein.

Ein Ereignis wie eine Tasterbetätigung ist weder ein zeitkritisches noch kurzes Ereignis. Darum braucht man für einen Tastendruck keinen Interruptaufruf. Auch ist das Prellen des Tasters ein Problem das eine mehrfache Auslösung des Interrups auslöst.

Du brauchst nur eine kurze Loopschleife und eine Abfrage des Zustandes des Tasters. Zeitkontrollen über millis().

Grüße Uwe

Hallo,

Ich hab noch nicht so ganz verstanden was Du eigendlich willst, und Du selbst sicher auch nicht. Meine Vermutung ist allerdings in Etwa so. Wenn Du einen Taster betätigst willst du für 2 Minuten etwas machen. Wenn innerhalb der zwei Minuten erneut der Taster betätigt wird soll die Zeit erneut starten.? Ebenso sollest Du Dir noch überlegen was pasieren soll wenn der Taster länger als die zwei Minuen betätigt sein soll. Gilt die Bedingung dann ebenfalls nur für 2 Minuen oder dauerhaft solange der Taster betätigt ist plus die zwei Minuten.

Dazu benötigst Du in jedem Fall jedoch millis() Beispiele dazu gibts unter Beispiele in der IDE. Delay kannst Du nicht nehmen, da bei einem Delay der Programmablauf für die angegebene Zeit angehalten wird und Du somit nicht mitbekommen würdest wenn der Taster erneut betätigt wird.

Heinz

Ein Taster soll betätigt werden und einen digitalen Ausgang auf HIGH setzen. Wenn der Taster nicht erneut betätigt wird, soll der Pin automatisch nach zwei Minuten wieder auf LOW gesetzt werden. Wenn der Taster vor Ablauf der Zeit betätigt wird, soll ebenfalls der Pin auf LOW gesetzt werden.

Bahner1997:
Ein Taster soll betätigt werden und einen digitalen Ausgang auf HIGH setzen. Wenn der Taster nicht erneut betätigt wird, soll der Pin automatisch nach zwei Minuten wieder auf LOW gesetzt werden. Wenn der Taster vor Ablauf der Zeit betätigt wird, soll ebenfalls der Pin auf LOW gesetzt werden.

Wunderbar!
Eine ganz normale Ablaufsteuerung!

Ablaufsteuerung
Meine Standardantwort zu Ablaufsteuerungen:

Eine Stichworte Sammlung für Google Suchen:
Endlicher Automat,
State Machine,
Multitasking,
Coroutinen,
Ablaufsteuerung,
Schrittkette,
BlinkWithoutDelay,

Blink Without Delay
Der Wachmann

Multitasking Macros
Intervall Macro

Bahner1997:
Ein Taster soll betätigt werden und einen digitalen Ausgang auf HIGH setzen. Wenn der Taster nicht erneut betätigt wird, soll der Pin automatisch nach zwei Minuten wieder auf LOW gesetzt werden. Wenn der Taster vor Ablauf der Zeit betätigt wird, soll ebenfalls der Pin auf LOW gesetzt werden.

Und dazu brauchst du def. keinen Interrupt, sonder wie schon geschrieben verwendest du millis.
Beispiele dafür findest du in der IDE. Da ist BlinkWithoutDelay das richtige Beispiel.

Hallo,

schön , jetzt siehst Du Dir die angesprochenen Beispiele an , und wenn Du sie verstanden hast sollte der Rest kein Problem mehr sein.

Heinz

Du musst bei Tastern das "zwei mal betätigen" vom Prellen unterscheiden. Ein Arduino ist (auch ohne Interrupt-Routinen) viel zu schnell für einen handbetätigten Taster und kriegt sowohl beim Drücken wie beim Loslassen einen ganzen Haufen Signalwechsel innerhalb weniger Millisekunden, die dich (fast) alle nicht interessieren bzw. stören.

Ob du Entprellen mit einem kleinen delay(5) , der Bounce oder einer anderen Bibliothek, oder strikt mit entsprechenden millis() Aufrufen hinkriegst, ist dir überlassen.

Nur Warten auf das Ende der 2 Minuten geht definitiv nicht mit delay(2*60*1000)