#include <Arduino.h>
#include <stdint.h>
const int LEDS1[4] = {12, 13, 14, 15};
const int LEDS2[4] = {27, 26, 25, 33};
const int LedAlarma = 18;
const int sensor = 2;
struct Button {
const uint8_t PIN;
volatile bool pressed;
};
Button btn1 = {4, 0};
Button btn2 = {5, 0};
volatile uint8_t LEDS1_value = 0b00000001;
volatile uint8_t LEDS2_value = 0b00000000;
unsigned long button_time = 0;
unsigned long last_button_time = 0;
volatile uint32_t interruptContador = 0;
volatile bool cantidadPresionada;
// Configuración del timer
hw_timer_t * timer = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
void IRAM_ATTR handlerTimerISR() {
portENTER_CRITICAL_ISR(&timerMux);
interruptContador++;
portEXIT_CRITICAL_ISR(&timerMux);
}
void IRAM_ATTR handlerBT1ISR() {
portENTER_CRITICAL_ISR(&timerMux);
button_time = 250;
if (button_time - last_button_time > 250) {
cantidadPresionada++;
btn1.pressed = true;
last_button_time = button_time;
}
portEXIT_CRITICAL_ISR(&timerMux);
}
void IRAM_ATTR handlerBT2ISR() {
portENTER_CRITICAL_ISR(&timerMux);
button_time = 250;
if (button_time - last_button_time > 250) {
cantidadPresionada++;
btn2.pressed = true;
last_button_time = button_time;
}
portEXIT_CRITICAL_ISR(&timerMux);
}
void setup() {
Serial.begin(115200);
pinMode(btn1.PIN, INPUT_PULLUP);
pinMode(btn2.PIN, INPUT_PULLUP);
pinMode(LedAlarma, OUTPUT);
for (int i = 0; i < 4; i++) {
pinMode(LEDS1[i], OUTPUT);
pinMode(LEDS2[i], OUTPUT);
}
timer = timerBegin(0, 80, true);
timerAttachInterrupt(timer, &handlerTimerISR, true);
timerAlarmWrite(timer, 250000, true);
timerAlarmEnable(timer);
attachInterrupt(btn1.PIN, handlerBT1ISR, FALLING);
attachInterrupt(btn2.PIN, handlerBT2ISR, FALLING);
}
void loop() {
if (interruptContador > 0) {
portENTER_CRITICAL(&timerMux);
interruptContador--;
portEXIT_CRITICAL(&timerMux);
cantidadPresionada++;
LEDS2_value++;
LEDS2_value & 0x0F;
}
uint8_t valoresLedsContador1 = LEDS1_value & 0x0F;
uint8_t valoresLedsContador2 = LEDS2_value & 0x0F;
for (int i = 0; i < 4; i++) {
digitalWrite(LEDS1[i], valoresLedsContador1 & (1 << i));
}
for (int i = 0; i < 4; i++) {
digitalWrite(LEDS2[i], valoresLedsContador2 & (1 << i));
}
//Programación de la alarma en forma de LED
if (LEDS1_value == LEDS2_value) {
digitalWrite(LedAlarma, HIGH);
delay(2000);
digitalWrite(LedAlarma, LOW);
LEDS2_value = 0b00000000;
}
uint8_t touchSensor = touchRead(4);
if (touchSensor < 30) {
for (int i = 0; i < 4; i++) {
digitalWrite(LEDS2[i], LOW);
}
} else {
for (int i = 0; i < 4; i++) {
digitalWrite(LEDS2[i], HIGH);
}
}
delay(5000);
}