Hallo ich habe ein Problem, ich möchte per Taster den Alarm unterbrechen. ( Arduino Nano )
Den Taster habe ich auf per Interrupt verbunden, der reagiert, springt aber zurück und das Programm läuft weiter. "Option2" sollte ja sofort beendet werden.
Ich habe auch verschiedene Sachen probiert, z.b. beim Taster drücken Variablen ändern oder Sprung in die leere Loop. Interessiert ihn nicht.
Auch ein einfügen einer Endloschleife oder Exit lässt ihn sofort abstürzen bevor er startet ? Bin etwas ratlos.
#define LEDGRUEN 3
#define RELAIS_ZUENDUNG 5
#define RELAIS_HUPE 6
#define RELAIS_ANLASSER 7
#define TASTER 2
void setup() {
attachInterrupt(digitalPinToInterrupt(2), Option1,RISING);
pinMode(LEDGRUEN, OUTPUT);
pinMode(TASTER, INPUT_PULLUP);
Option2();
}
void loop() {
}
void Option1(void)
{
digitalWrite(RELAIS_ZUENDUNG, HIGH);
digitalWrite(RELAIS_ANLASSER, HIGH);
digitalWrite(RELAIS_HUPE, HIGH);
}
void Option2(void)
{
pinMode(RELAIS_ZUENDUNG, OUTPUT);
pinMode(RELAIS_ANLASSER, OUTPUT);
digitalWrite(RELAIS_ZUENDUNG, HIGH);
digitalWrite(RELAIS_ANLASSER, HIGH);
delay(5000);
digitalWrite(RELAIS_ZUENDUNG, LOW);
digitalWrite(RELAIS_ANLASSER, LOW);
delay(5000);
pinMode(RELAIS_HUPE, OUTPUT);
digitalWrite(RELAIS_HUPE, LOW);
delay(5000);
digitalWrite(RELAIS_HUPE,HIGH);
for ( int i=0 ; i<5 ; i++ )
{
digitalWrite(RELAIS_HUPE, LOW);
delay(300);
digitalWrite(RELAIS_HUPE, HIGH);
delay(300);
}
}
Wirf alle delay raus, mache eine ordentliche Zeitsteuerung mit millis() (Verstehe das Beispielprogramm BlinkWithout Delay) und dann brauchst Du Deinen Taster auch nicht per Interrupt abzufragen.
Interrupt für Taster ist in 99,8% der Fälle eine fehlerhafte Programmgestaltung.
Hast Du den Taster entprellt?
Gruß Tommy
Hi
Ein Interrupt UNTERBRICHT das aktuelle Programm - so weit, so toll.
Danach geht's aber genau da weiter, wo zuvor unterbrochen wurde.
Wenn Du zuvor in einem delay() feststecktest, geht's nach dem Interrupt genau wieder dahin zurück.
Das ist der Nachteil von delay()
Option2() soll ja nur 1x durchlaufen werden - durch die Laufzeit wurde ich Das aber trotzdem in die loop() packen und eine State-Maschine daraus machen.
Siehe Dir bitte das Beispiel 'blink_without_delay' in der IDE an, dort wird mittels millis() bei jedem Durchlauf geprüft, ob's Zeit ist, irgend etwas zu tun.
Ebenfalls die Nachtwächter-Erklärung hier im Forum ist nur einen Klick entfernt.
MfG
PS: STRG+T in der IDE formatiert Dir den Sketch
#define solltest Du gegen const byte tauschen, da so auch der Typ der Variable geprüft wird
Option1 und Option2 würde ich andere, sprechendere Namen geben - es wird wohl einen Grund haben, wieso Option2 nur 1x durchlaufen wird, oder?
Quartoffel:
.....
Auch ein einfügen einer Endloschleife oder Exit lässt ihn sofort abstürzen bevor er startet ? Bin etwas ratlos.
Warum baust du den Sketch nicht so auf, wie es normal jeder macht und verwendest die Loop.
Und in der Loop fragst du den Taster sowie eine Statusvariable ab.
Beispiel:
Ist die Statusvariable HIGH springst du in deine eigenen Funktionen.
Die Taste setzt die Statusvariable auf LOW und damit bleibt der Sketch in der Loop ohne deine Funktionen aufzurufen.
Alles ohne Interrupt !
Hallo, zusammen. Wollte mich mal zurückmelden, sind wieder einige Sachen dazwischen gekommen und bin erst jetzt wieder dazu gekommen weiter zu machen. Danke für die Tipps! Das hat funktioniert!
Ich habe die Zeit mit der Millis Funktion ausgelesen und den Code so angepasst, mit Hilfe einer Statusvariable klappt es nun.
Danke!
Quartoffel:
Hallo, zusammen. Wollte mich mal zurückmelden, sind wieder einige Sachen dazwischen gekommen und bin erst jetzt wieder dazu gekommen weiter zu machen. Danke für die Tipps! Das hat funktioniert!
Ich habe die Zeit mit der Millis Funktion ausgelesen und den Code so angepasst, mit Hilfe einer Statusvariable klappt es nun.
Danke!
Das freut uns, dass es jetzt funktioniert.
Wenn du uns deinen aktuellen Sketch zeigst, haben andere auch etwas davon, wenn sie auf ein ähnliches Problem stoßen.