As interrupções permitem que o microcontrolador execute uma função quando um evento ocorre num dos pinos de interrupção. Em vez de ler constantemente o valor de um sensor, o programa só dispara quando o valor do sensor se altera. Isso resolve muitos problemas de disposição de tarefas.
Material
- Arduino UNO
- Botão de pressão (ou outro sensor)
- Cabo USB A/ USB B
Esquema
Na placa Arduino UNO, existem dois pinos que suportam interrupções: os pinos 2 e 3. Assim, vamos ligar a saída do botão ao pino 2 do Arduino.

Lembrete dos pinos digitais compatíveis com interrupções:
| Uno, Nano, Mini, other 328-based | 2, 3 |
| Uno WiFi Rev.2, Nano Every | todos os pinos digitais |
| Mega, Mega2560, MegaADK | 2, 3, 18, 19, 20, 21 |
| Micro, Leonardo, other 32u4-based | 0, 1, 2, 3, 7 |
| Zero | todos os pinos digitais, exceto o 4 |
| MKR Family boards | 0, 1, 4, 5, 6, 7, 8, 9, A1, A2 |
| Nano 33 IoT | 2, 3, 9, 10, 11, 13, 15, A5, A7 |
| Nano 33 BLE, Nano 33 BLE Sense | todos os pinos |
| Due | todos os pinos digitais |
| 101 | todos os pinos digitais (Somente os pinos 2, 5, 7, 8, 10, 11, 12, 13 funcionam com CHANGE) |
Código para gestão de interrupções
A sintaxe para inicializar uma interrupção é a seguinte:
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)
Sendo: pin o pino utilizado; ISR, a função a ser ativada quando o evento é detectado; e modo, o modo de detecção utilizado.
- LOW para ativar a detecção quando o pino está no estado BAIXO
- CHANGE para ativar a detecção quando o estado do pino muda
- RISING para ativar a detecção quando o estado do pino muda de BAIXO para ALTO
- FALLING para ativar a detecção quando o estado do pino muda de ALTO para BAIXO
const byte ledPin = 13;
const byte interruptPin = 2;
volatile byte state = LOW;
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), onEvent, CHANGE);
Serial.println(F("Système intialisé"));
}
void loop() {
digitalWrite(ledPin, state);
}
void onEvent() {
state = !state;
Serial.print(F("Switch LED 13 : "));
if(state){
Serial.println(F("ON"));
}else{
Serial.println(F("OFF"));
}
}
Atenção: Na função onEvent(), as funções millis() e delay(), que dependem de interrupções, não funcionarão.
Funções a saber para ir mais longe na gestão das interrupções:
- attachInterrupts
- detachInterrupt(digitalPinToInterrupt(pin)) para desativar a interrupção especificada
- interrupts() para reativar as interrupções
- noInterrupts() para desativar as interrupções
Resultado
Uma vez carregado o código, o LED do Arduino deverá acender e apagar quando o botão é pressionado.

Fontes
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie