volatile int cuenta; // variable se incrementa en la ISR y se decrementa en main
int total_interrupciones; // número total de interrupciones -> segundos
#define PULS_PIN 34
#define LED_PIN 23
hw_timer_t * timer = NULL; // estructura de datos del timer
volatile uint32_t freqT;
volatile int pulsado;
void IRAM_ATTR ISR_pulsador() {
pulsado=1;
digitalWrite(LED_PIN, HIGH); //encendido
detachInterrupt(digitalPinToInterrupt(PULS_PIN)); // no entra más-> elimina rebotes
//uint64_t alarm_value, bool autoreload, uint64_t reload_count);
timerAlarm(timer, 25e5, false, 0); // se ejecuta cuando hayan pasado 2.5 segundos una sola vez
timerRestart(timer);
}
volatile int tiempo;
void IRAM_ATTR ISR_timer() {
tiempo=1;
digitalWrite(LED_PIN, LOW); //apagado
attachInterrupt(digitalPinToInterrupt(PULS_PIN), ISR_pulsador, FALLING);
}
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW); //apagado
// Interrupción en flanco descendente
attachInterrupt(digitalPinToInterrupt(PULS_PIN), ISR_pulsador, FALLING);
freqT=1e6;
timer = timerBegin(freqT); // cuenta useg
timerAttachInterrupt(timer, &ISR_timer);
// timerAlarm(timer, 2.5*freqT, true); // se ejecuta cuando hayan pasado 2.5 segundos
}
void loop() {
if(pulsado){
Serial.printf("Se enciende led 2.5 seg - valor contador timer actual: %d\n", timerRead(timer));
pulsado=0;
}
if(tiempo){
Serial.printf("Salto alarma timer - cuenta %d\n", timerRead(timer));
tiempo=0;
}
delay(10);
}