Hallo guten Abend zusammen,
anhand eines erneuten Tastendrucks soll die laufende Ausführung beendet und die Schleife verlassen werden.
Anhand von anderen Beiträgen hier habe ich eigentlich gedacht die Lösung gefunden zu haben, aber leider funktioniert es nicht.
Im Grunde gibt bereits die Verify/Upload Funktion in der Arduino IDE schon einen Fehler aus, dieser lautet:
exit status 1
Compilation error: 'digitalPinToInterrupt' was not declared in this scope
Bei dem Code handelt es sich um das Beispiel aus der Dokumentation zu attachInterrupt()
const byte ledPin = 1;
const byte interruptPin = 2;
volatile byte state = LOW;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(interruptPin, INPUT);
attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
}
void loop() {
digitalWrite(ledPin, state);
}
void blink() {
state = !state;
}
Die nicht empfohlene Variante nur mit attachInterrupt(interruptPin, blink, CHANGE) gibt zwar keinen Fehler mehr aus, scheint aber überhaupt nicht zu klappen, hier tut sich bei Tastendruck überhaupt nichts. Auch die Modis low, rising und falling machen keinen Unterschied.
Verwendet wird das Digispark Rev.3 (ATTiny85) und die Arduino IDE v2.3.2
Das eigentliche Ziel bezieht sich natürlich nicht auf den Beispielcode oben, sondern auf folgendes Muster gekürzt mit Beispielroutinen.
Per Taster sollen die Schleifen durchgesprungen werden. Während eine Case-Schleife läuft, soll mittels erneutem drücken der laufende Code beendet werden. Das Problem ist dass erst nachdem der Fade abgeschlossen ist überhaupt ein erneutes drücken wahrgenommen wird und nicht schon während die Funktion noch läuft.
int buttonPin = 2; // PB2
int led_red = 0; // PB0
int led_green = 1; // PB1 (pb1 also builtin_led)
int led_blue = 4; // PB4
int buttonPushCounter = 0; // counter for the number of button presses
int buttonState = 0; // current state of the button
int lastButtonState = 0; // previous state of the button
void setup() {
pinMode(buttonPin, INPUT);
pinMode(led_red, OUTPUT);
pinMode(led_green, OUTPUT);
pinMode(led_blue, OUTPUT);
}
void loop() {
// read the pushbutton input pin:
buttonState = digitalRead(buttonPin);
// compare the buttonState to its previous state
if (buttonState != lastButtonState) {
// if the state has changed, increment the counter
if (buttonState == HIGH) {
// if the current state is HIGH then the button went from off to on:
buttonPushCounter++;
led_off_all();
blink(led_green, buttonPushCounter);
switch (buttonPushCounter) {
case 1:
fadein(led_red);
break;
case 2:
fadein(led_green);
break;
case 3:
fadein(led_blue);
break;
default:
buttonPushCounter = 0;
break;
}
}
delay(50);
}
lastButtonState = buttonState;
}
void blink(int LEDNAME, int amount) {
for (int i = 1; i <= amount; i++) {
digitalWrite(LEDNAME, HIGH);
delay(100);
digitalWrite(LEDNAME, LOW);
delay(100);
}
}
void fadein(int PIN) {
for (int brightness = 0; brightness <= 255; brightness += 5) {
analogWrite(PIN, brightness);
delay(30);
}
}
...
Gibt es noch eine andere Möglichkeit zeitgleich abzufragen ob der Taster erneut gedrückt wurde während noch eine Routine läuft? oder ist hier der Interrupt schon genau das richtige und das Einzige?
Besten Dank im Voraus für jegliche Hilfe