Intreruperile se folosesc in Arduino pentru a executa o bucata de cod la momentul producerii unui eveniment.
De exemplu avem un ceas cu afisaj digital dar si un buton legat la soneria de la usa. La fiecare apasare a butonului soneriei noi vom putea incrementa un contor in mod independent de functionarea ceasului.
Pentru acest articol vom folosi 2 butoane si 2 leduri. La fiecare apasare de buton starea ledului se va schimba.
Schema de conectare este urmatoarea:

Cand folosim intreruperile vom folosi urmatoarea instructiune:
attachInterrupt(digitalPinToInterrupt(pinIntrerupere), functieIntrerupere, EVENIMENT);
unde la pinIntrerupere setam pinul care va fi monitorizat de catre Arduino, functieIntrerupere este o functie care va fi executata la momentul oportun iar EVENIMENT inseamna tipul de eveniment care va declansa executarea functiei.
Important: in functia apelata de catre o intrerupere nu se vor folosi urmatorele instructiuni:
-millis();
-delay();
-micros();
-delayMicroseconds();
Pentru EVENIMENT putem folosi urmatorii parametri:
-LOW - in momentul in care pinul trece in nivel logic zero;
-CHANGE - schimbarea starii unui pin;
-RISING - trecerea unui pin de la nivel logic 0 la nivel logic 1;
-FALLING - trecrea unui pin de la nivel logic 1 la nivel logic 0.
Sketchul folosit in acest articol este urmatorul:
int buton1 = 2;
int buton2 = 3;
int led1 = 11;
int led2 = 12;
void setup() {
pinMode(buton1, INPUT);
pinMode(buton2, INPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
attachInterrupt(digitalPinToInterrupt(buton1),butonApasat1,RISING);
attachInterrupt(digitalPinToInterrupt(buton2),butonApasat2,RISING);
}
void loop() {
}
void butonApasat1() {
int buf = digitalRead(led1);
if (buf == 1) {
digitalWrite(led1, LOW);
} else {
digitalWrite(led1, HIGH);
}
}
void butonApasat2() {
int buf2 = digitalRead(led2);
if (buf2 == 1) {
digitalWrite(led2, LOW);
} else {
digitalWrite(led2, HIGH);
}
}