/* Interrupcion externa: pulsador -> control parpadeo led */
const int LED = 23; //GPIO led externo activo a nivel bajo LOW => encendido
const int pulsador = 22; // GPIO pin interrupcion
volatile int t_parpadeo; // tiempo de parpadeo configurable
volatile int nveces_ISR=0;// contador numero de veces se ejecuta la ISR_pulsador
int nveces_loop=0; // contador numero de veces se ejecuta loop
/* IRAM_ATTR attribute => compiled code placed in Internal RAM of the ESP32.
Otherwise the code is in Flash memory of ESP32 much slower than internal RAM. */
void IRAM_ATTR ISR_pulsador(){
if(t_parpadeo >= 1000) t_parpadeo = 500;
else t_parpadeo += 25;
nveces_ISR++; // acumula el numero de veces que se entra en la ISR
}
void setup()
{
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW); // encendido
pinMode(pulsador, INPUT);
// modo INPUT_PULLUP no hace falta resistencia externa, configurada internamente
t_parpadeo = 500; // valor inicial de temporizacion parpadeo
Serial.begin(115200); // se configura el canal de comunicacion serie
Serial.println("Ejemplo interrupciones - control parpadeo led con pulsador");
// asociamos la función de interrupcion al pulsador
attachInterrupt(digitalPinToInterrupt(pulsador), ISR_pulsador, FALLING);
// mode: LOW / HIGH / CHANGE / FALLING / RISING
}
void loop()
{
// se genera la secuencia - encendido/apagado
digitalWrite(LED, LOW); // encendido
delay(t_parpadeo);
digitalWrite(LED, HIGH); // apagado
delay(t_parpadeo);
if(nveces_ISR>0){ // si ha pulsado => muestra número veces ha ejecutado la ISR
Serial.printf("Tiempo parpadeo: %d, nveces_ISR: %d\n", t_parpadeo,nveces_ISR);
// se ponen a 0 los contadores
nveces_ISR=0;
}
}