/*
https://playground.arduino.cc/Code/Timer1/
https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/
https://www.arduino.cc/reference/pt/language/functions/external-interrupts/detachinterrupt/
Tratamento de interrupção por borda em pino de entrada
O Arduino uno possui duas entradas de interrupção externa, que estão nos pinos 2 (INT0) e
no pino 3 (INT1)
Nesse exemplo vamos simular um sistema que liga e desliga um alarme utilizando
a interrupção associada a entrada digital, sem uso da função Loop().
Esse botão deve armar e desarmar o alarme
Alarme acionado led Azul piscando
Alarme desacionado led Azul apagado
*/
#include <ESP32Time.h>
#define Led1 14
#define Led2 13
#define Led3 12
#define LED 27
#define Botao1 26 // Interrupção 0
#define Botao2 22 // Interrupção 1
#define debounceDelay 10 // milliseconds to wait until button input stable *
bool bt1_pressionado = 0;
bool bt2_pressionado = 0;
bool bt1_estadoAtual = 0;
bool bt2_estadoAtual = 0;
bool bt1_ultimoEstado = 0;
bool bt2_ultimoEstado = 0;
int ledAlarmeStatus = LOW;
int ledArmadoStatus = LOW;
unsigned long tempoAtual = 0;
unsigned long tempoAnterior1 = 0;
unsigned long tempoAnterior2 = 0;
unsigned long tempoAnterior3 = 0;
hw_timer_t *My_timer = NULL;
boolean debounce(int pin, boolean ultimoEstado) {
boolean atual;
atual = digitalRead(pin); // Armazena o estado da entrada digital
if (ultimoEstado != atual) {
delay(5); // Aguarda 5 milisegundo
atual = digitalRead(pin); // Leitura da entrada digital
}
// Só virá aqui quando o estado da entrada digital estiver estável por mais tempo que o período de debounce
return atual;
}
void IRAM_ATTR onTimer() {
digitalWrite(LED, !digitalRead(LED));
}
void setup() {
Serial.begin(115200);
pinMode(Led1, OUTPUT);
pinMode(Led2, OUTPUT);
pinMode(Led3, OUTPUT);
pinMode(LED, OUTPUT);
pinMode(Botao1, INPUT_PULLUP);
pinMode(Botao2, INPUT_PULLUP);
My_timer = timerBegin(0, 80, true);//timer, prescaler e countUp
timerAttachInterrupt(My_timer, &onTimer, true);
timerAlarmWrite(My_timer, 100000, true);
timerAlarmEnable(My_timer);
}
void loop() {
bt1_estadoAtual = debounce(Botao1, bt1_ultimoEstado);
if (bt1_ultimoEstado == true && bt1_estadoAtual == false) { // verifica se o botão foi pressionado
bt1_pressionado = !bt1_pressionado; // inverte valor da variável
if (bt1_pressionado) {
Serial.println("botao pressionado");
} else {
Serial.println("botao liberado");
}
}
bt1_ultimoEstado = bt1_estadoAtual;
tempoAtual = millis();
// Pisca led3 a cada 250 milisegundos
if (bt1_pressionado) {
if (tempoAtual >= (tempoAnterior3 + 250)) {
tempoAnterior3 = tempoAtual;
digitalWrite(Led3, !digitalRead(Led3));
Serial.print("tempoAnterior3:"); // imprime o timer desde quando o programa foi iniciado
Serial.println(tempoAnterior3); // imprime o timer desde quando o programa foi iniciado
}
} else {
digitalWrite(Led3, LOW);
}
// Pisca led2 a cada 5 segundos
if (tempoAtual >= (tempoAnterior2 + 5000)) {
tempoAnterior2 = tempoAtual;
digitalWrite(Led2, !digitalRead(Led2));
Serial.print("tempoAnterior2:"); // imprime o timer desde quando o programa foi iniciado
Serial.println(tempoAnterior2); // imprime o timer desde quando o programa foi iniciado
}
// Pisca led1 a cada 1 segundos
if (tempoAtual >= (tempoAnterior1 + 1000)) {
tempoAnterior1 = tempoAtual;
digitalWrite(Led1, !digitalRead(Led1));
Serial.print("tempoAnterior1:"); // imprime o timer desde quando o programa foi iniciado
Serial.println(tempoAnterior1); // imprime o timer desde quando o programa foi iniciado
}
}