#include <Arduino.h>
#include <stdint.h>
//Definimos los piner utilizados del ESP32 para cada led y botón implementado
const int btnB1 = 4;
const int btnB2 = 5;
const int LED1 = 12;
const int LED2 = 13;
const int LED3 = 14;
const int LED4 = 15;
const int LED5 = 27;
const int LED6 = 26;
const int LED7 = 25;
const int LED8 = 33;
const int LedAlarm = 18;
uint8_t contador_botones = 0;
uint8_t contador_timer = 0;
volatile uint8_t contador = 0; //Indica el estado inicial del contador y valor que cambia constantemente
unsigned long IncrementTimer = 0;
const unsigned long intervalo = 250; //Configurado en milisegundos
void IRAM_ATTR handleB1Interrupt() { //Asegurar que las rutinas de las interrupciones se guarden en la memoria RAM
contador = (contador + 1) & 0x0F; //Incremente el contador en uno cada vez que se presiona B1
digitalWrite(LED1, contador & 0x01);
digitalWrite(LED2, (contador >> 1) & 0x01);
digitalWrite(LED3, (contador >> 2) & 0x01);
digitalWrite(LED4, (contador >> 3) & 0x01);
}
void IRAM_ATTR handleB2Interrupt() {
contador = (contador - 1) & 0x0F; //Decrementa el contador en uno cada vez que se presiona B2
digitalWrite(LED1, contador & 0x01);
digitalWrite(LED2, (contador >> 1) & 0x01);
digitalWrite(LED3, (contador >> 2) & 0x01);
digitalWrite(LED4, (contador >> 3) & 0x01);
}
void setup() {
pinMode(btnB1, INPUT_PULLUP);
pinMode(btnB2, INPUT_PULLUP);
IncrementTimer = millis();
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LedAlarm, OUTPUT);
pinMode(LED5, OUTPUT);
pinMode(LED6, OUTPUT);
pinMode(LED7, OUTPUT);
pinMode(LED8, OUTPUT);
attachInterrupt(digitalPinToInterrupt(btnB1), handleB1Interrupt, FALLING);
attachInterrupt(digitalPinToInterrupt(btnB2), handleB2Interrupt, FALLING);
}
void loop() {
unsigned long currentTime = millis();
if(currentTime - IncrementTimer >= intervalo) {
//Máscaras bit a bit para cada valor individual de las salidas
digitalWrite(LED5, contador & 0x01);
digitalWrite(LED6, (contador >> 1) & 0x01);
digitalWrite(LED7, (contador >> 2) & 0x01);
digitalWrite(LED8, (contador >> 3) & 0x01);
IncrementTimer = currentTime;
}
if(digitalRead(btnB1) == LOW) {
contador_botones = (contador_botones + 1) & 0x0F;
}
if(digitalRead(btnB2) == LOW) {
contador_botones = (contador_botones - 1) & 0x0F;
}
if(contador_timer == contador_botones) {
digitalWrite(LedAlarm, digitalRead(LedAlarm));
contador_timer = 0;
digitalWrite(LED1, 0);
digitalWrite(LED2, 0);
digitalWrite(LED3, 0);
digitalWrite(LED4, 0);
digitalWrite(LedAlarm, 1);
}
}