Puede hacer esto usando interrupciones externas. Sin embargo, la mayoría de los Arduinos solo admiten esto en un número limitado de pines. Para más detalles, consulte la documentación en attachInterrupt()
.
Suponiendo que esté usando un Uno, podría hacerlo así:
void pinChanged()
{
//...
}
void setup()
{
pinMode(2, INPUT);
attachInterrupt(0, pinChanged, CHANGE);
}
void loop()
{
}
Esto llamará pinChanged()
cada vez que se detecte un cambio en la interrupción externa 0. En el Uno, que corresponde al pin 2 de GPIO. La numeración de la interrupción externa es diferente en otras tarjetas, por lo que es importante verificar la documentación relevante.
Sin embargo, hay limitaciones para este enfoque. La pinChanged()
función personalizada se está utilizando como una Rutina de servicio de interrupción (ISR). Eso significa que el resto del código (todo en loop()
) se detiene temporalmente mientras se ejecuta la llamada. Para evitar la interrupción de cualquier momento importante, debe intentar hacer que los ISR sean lo más rápidos posible.
También es importante tener en cuenta que no se ejecutarán otras interrupciones durante su ISR. Eso significa que cualquier cosa que dependa de interrupciones (como el núcleo delay()
y las millis()
funciones) puede no funcionar correctamente dentro de él.
Por último, si su ISR necesita cambiar alguna variable global en el boceto, generalmente debe declararse como volatile
, por ejemplo:
volatile int someNumber;
Eso es importante porque le dice al compilador que el valor puede cambiar inesperadamente, por lo que debe tener cuidado de no usar copias / cachés desactualizadas.