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