// Interrupciones externas o interrupciones por hardware
// Ejemplo KY-010 - Fotointerruptor. Sensor que da un HIGH cuando se
// coloca algo opaco que obstruya el paso de luz en el medio del sensor.
// Se usa este interruptor solo a modo de ejemplo.
// Las interrupciones permiten ejecutar la tarea principal y solo
// cuando ocurre el evento interrumpe la tarea actual para atender el evento y luego volver desde donde estaba.
// Los pines para interrupciones del arduino1 son los pines digitales 2 y 3
// Se pueden programar para disparar una interrupción con la señal de un dispositivo externo (por ejemplo sensor)
// La función ISR es muy útil por ejemplo para determinar el instante exacto donde se produce una interrupción o evento
// Debe estar diseñada para que interrumpa el menor tiempo posible al flujo normal del programa
// Es muy importante tener en cuenta esto de que sea una función corta
// Se define la variable "CONTADOR" como una variable global.
// Esto por que se usa tanto en el "loop" como en "sensor".
volatile int CONTADOR = 0; // Se almacena el valor que se incrementa con cada interrupción
int ANTERIOR = 0; // Valor previo a contador. Se escribe en el monitor serial, solo cuando exista un cambio en la variable contador.
void setup() {
Serial.begin(9600);
// Se define la interrupción
// "digitalPinToInterrupt(2)" con el número de pin donde entrará la señal.
// "sensor" es la función (ISR) que se ejecutará cuando suceda la interrupción
// "RISING" es el modo con el cual se detectará la interrupción. Se detecta cuando la señal pasa de estado bajo a estado alto. Esto dependerá del sensor.
attachInterrupt(digitalPinToInterrupt(2), sensor, RISING);
}
void loop() {
// Se cuenta cada vez que suceda una interrupción y se muestra en el monito serial
// Solo se evalúa verdadero cuando anterior es distinta de contador.
// Contador se incrementa cada vez que llega una interrupción
if (ANTERIOR != CONTADOR){
Serial.println(CONTADOR);
ANTERIOR = CONTADOR;
}
}
// A esta función se llega solamente cuando halla una interrupción en el pin digital 2
// Cuando eso sucede esta función solamente incrementa contador en 1
void sensor() {
CONTADOR++
}