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.
Recordatorio de los pines digitales compatibles con las interrupciones
Uno, Nano, Mini, other 328-based | 2, 3 |
Uno WiFi Rev.2, Nano Every | all digital pins |
Mega, Mega2560, MegaADK | 2, 3, 18, 19, 20, 21 |
Micro, Leonardo, other 32u4-based | 0, 1, 2, 3, 7 |
Zero | all digital pins, except 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 | all pins |
Due | all digital pins |
101 | all 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 especificadainterrupts()
reactiva las interrupcionesnoInterrupts()
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.
Fuentes
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie