fbpixel
Etiquetas: ,

Las interrupciones permiten al microcontrolador ejecutar una función cuando se produce un evento en uno de los pines de interrupción. En lugar de leer constantemente el valor de un sensor, el programa sólo se activará cuando el valor del sensor cambie. Esto resuelve muchos problemas de distribución de tareas.

Material

  • Arduino UNO
  • botón pulsador (u otro sensor)
  • Cable USB A/ USB B

Esquema

En la placa Arduino UNO, hay dos pines que soportan interrupciones: los pines 2 y 3. Así que conectaremos la salida del botón al pin 2 del Arduino.

Arduino-pushbutton-interrupt_bb Uso de las interrupciones con Arduino

Recordatorio de los pines digitales compatibles con las interrupciones

Uno, Nano, Mini, other 328-based2, 3
Uno WiFi Rev.2, Nano Everyall digital pins
Mega, Mega2560, MegaADK2, 3, 18, 19, 20, 21
Micro, Leonardo, other 32u4-based0, 1, 2, 3, 7
Zeroall digital pins, except 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 Senseall pins
Dueall digital pins
101all digital pins (Only pins 2, 5, 7, 8, 10, 11, 12, 13 work with CHANGE)

Código de gestión de interrupciones

La sintaxis para inicializar una interrupción es la siguiente:

attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)

Con pin, el pin utilizado, ISR, la función a activar cuando se detecta el evento y mode, el modo de detección utilizado.

  • LOW para permitir la detección cuando el cabezal está en estado LOW
  • CHANGE para activar la detección cuando el estado del cabezal cambia
  • RISING para permitir la detección cuando el estado del pin cambia de LOW a HIGH
  • FALLING para permitir la detección cuando el estado del pin cambia de HIGH a LOW

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"));
  }
}

Advertencia: En la función onEvent(), las funciones millis() y delay(), que dependen de las interrupciones, no funcionarán.

Funciones que hay que conocer para ir más allá en la gestión de las interrupciones

  • attachInterrupts
  • detachInterrupt(digitalPinToInterrupt(pin))desactiva la interrupción especificada
  • interrupts() reactiva las interrupciones
  • noInterrupts() para desactivar las interrupciones

Resultado

Una vez cargado el código, si pulsas el botón, el LED del Arduino debería encenderse y apagarse.

Arduino-pushbutton-interrupt-result Uso de las interrupciones con Arduino

Fuentes

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