fbpixel
Etiquetas: ,

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.

Arduino-pushbutton-interrupt_bb Usar interrupções com o Arduino

Lembrete dos pinos digitais compatíveis com interrupções:

Uno, Nano, Mini, other 328-based2, 3
Uno WiFi Rev.2, Nano Everytodos os pinos digitais
Mega, Mega2560, MegaADK2, 3, 18, 19, 20, 21
Micro, Leonardo, other 32u4-based0, 1, 2, 3, 7
Zerotodos os pinos digitais, exceto o 4
MKR Family boards0, 1, 4, 5, 6, 7, 8, 9, A1, A2
Nano 33 IoT2, 3, 9, 10, 11, 13, 15, A5, A7
Nano 33 BLE, Nano 33 BLE Sensetodos os pinos
Duetodos os pinos digitais
101todos 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.

Arduino-pushbutton-interrupt-result Usar interrupções com o Arduino

Fontes

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