Interrupt mit senseBox MCU


#1

Wie kann man mit dem Taster SW1 einen Interrupt auslösen? In einem längeren Programm ist eine Abfrage mit digitalRead ja schlecht möglich,da müsste man ja genau wissen an welcher Stelle im Programm man sich befindet.


#2

Hallo @altprog,

Der SW1 Schalter ist über den Digitalen Pin 0 anwählbar. Er funktioniert so dass er eine 1 ausgibt wenn der Button nicht gedrückt ist und eine 0 wenn er gedrückt wird (also so lange man den Finger auf dem Knopf hat). Um den Status des Buttons zu überwachen bzw. bei Button Klick etwas anderes auszuführen kannst du mit dem attachInterrupt() Befehl von Arduino arbeiten (https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/).

Ich habe dir mal einen Sketch als Beispiel erstellt in welchem die LED auf der MCU immer blinkt. Sobald du den Switch Button drückst hört das Blinken auf. Das sollte dir einen guten Einstieg in die Logik des attachInterrupt() Befehl geben.

Grüße
Eric


#3

Danke für die Info und das Beispielsprogramm. Ich habe nur gezögert weil bei den Original-Arduino-Bords der Interrupteingang fest verdrahtet ist (Pin 2 und 3). Dass man bei der MCU den Interrupteingang frei festlegen kann, ist mir neu.
Umso besser

Gruß Altprog


#4

@Thiemann96

habe mit Deinem Programm etwas gespielt und dabei ist folgendes herausgekommen:

/* digitalRead(0)
1 - Nix
0 - Button ist gedrückt

*/
bool interrupted = false;
int zeit1=250;
int zeit2=1000;
void setup(){

Serial.begin(9600);
pinMode(0,INPUT);
pinMode(7,OUTPUT);
attachInterrupt(digitalPinToInterrupt(0), interrupt, CHANGE);

}

void loop(){
if(!interrupted){
digitalWrite(8,HIGH);
delay(zeit2);
digitalWrite(8,LOW);
delay(zeit2);
interrupted=!interrupted;
attachInterrupt(digitalPinToInterrupt(0), interrupt, CHANGE);
}
if(interrupted){
digitalWrite(8,HIGH);
delay(zeit1);
digitalWrite(8,LOW);
delay(zeit1);

  }

}

void interrupt(){
detachInterrupt(0);
interrupted = false;
Serial.print(“Interrupting here”);

}

Der Interrupteingang scheint so empfindlich zu sein, dass es manchmal reicht, wenn man mit dem Finger nur in die Nähe kommt.


#5

Hi @altprog

Ändere mal folgende Zeile

pinMode(0,INPUT);

zu

pinMode(0,INPUT_PULLUP);

Das schaltet einen internen Widerstand dazu und die der Button sollte auch wirklich nur noch über Knopfdruck reagieren.


#6

HI @mario

danke für den Tipp, werde ich gleich mal ausprobieren.