#include <Arduino.h>
int incrementar= 34;
int decrementar =35;
int alarma =5; //Pin para el indicador
int binario1=0;
unsigned long button_time = 0;
unsigned long last_button_time = 0;
volatile bool presionado1= false;
unsigned long button_time1 = 0;
unsigned long last_button_time1 = 0;
volatile bool presionado2= false;
volatile int interruptCounter;
int totalInterruptCounter;
hw_timer_t * timer = NULL; //Instalamos el timer
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
void IRAM_ATTR handlerTimerISR() {
portENTER_CRITICAL_ISR(&timerMux);
interruptCounter++;
portEXIT_CRITICAL_ISR(&timerMux);
}
portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED;
void IRAM_ATTR incrementarBinario1() //Interrupción que incrementa el contador Binario1
{
portENTER_CRITICAL_ISR(&mux);
button_time = xTaskGetTickCount(); //millis();
if (button_time - last_button_time > 250)
{
binario1++;
presionado1 = true;
last_button_time = button_time;
if(binario1>15){
binario1=15;
}
}
portEXIT_CRITICAL_ISR(&mux);
}
void IRAM_ATTR decrementarBinario1() //Interrupción que decrementa el contador Binario1
{
portENTER_CRITICAL_ISR(&mux);
button_time1 = xTaskGetTickCount(); //millis();
if (button_time1 - last_button_time1 > 250)
{
binario1--;
presionado2 = true;
last_button_time1 = button_time1;
if(binario1<0){
binario1=0;
}
}
portEXIT_CRITICAL_ISR(&mux);
}
void setup()
{
Serial.begin(115200);
pinMode(incrementar, INPUT_PULLDOWN);//Botón que incrementa el contador binario1
pinMode(decrementar, INPUT_PULLDOWN);//Botón que decrementa el contador binario1
//Salidas del Contador Binario1
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
pinMode(14, OUTPUT);
pinMode(15, OUTPUT);
//Salidas del contador Binario2
pinMode(18, OUTPUT);
pinMode(19, OUTPUT);
pinMode(21, OUTPUT);
pinMode(22, OUTPUT);
//Alarma
pinMode(alarma, OUTPUT);
//Timer contador binario2
timer = timerBegin(0, 80, true);
timerAttachInterrupt(timer, &handlerTimerISR, true);
timerAlarmWrite(timer, 250000, true);
timerAlarmEnable(timer);
//Interrupción externa para incrementar contador binario1
attachInterrupt(incrementar, incrementarBinario1, RISING);
//Interrupción externa para decrementar contador binario1
attachInterrupt(decrementar, decrementarBinario1, RISING);
}
void loop()
{
//Parte 1 - Contador Binario Con interrupciones Externas
portENTER_CRITICAL_ISR(&mux);
if(presionado1==true || presionado2==true ){
Serial.printf("Contador Binario1 %d \n",binario1);
switch(binario1){ //Activación de las salidas en binario
case 0:
digitalWrite(12, LOW);
digitalWrite(13, LOW);
digitalWrite(14, LOW);
digitalWrite(15, LOW);
break;
case 1:
digitalWrite(12, HIGH);
digitalWrite(13, LOW);
digitalWrite(14, LOW);
digitalWrite(15, LOW);
break;
case 2:
digitalWrite(12, LOW);
digitalWrite(13, HIGH);
digitalWrite(14, LOW);
digitalWrite(15, LOW);
break;
case 3:
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
digitalWrite(14, LOW);
digitalWrite(15, LOW);
break;
case 4:
digitalWrite(12, LOW);
digitalWrite(13, LOW);
digitalWrite(14, HIGH);
digitalWrite(15, LOW);
break;
case 5:
digitalWrite(12, HIGH);
digitalWrite(13, LOW);
digitalWrite(14, HIGH);
digitalWrite(15, LOW);
break;
case 6:
digitalWrite(12, LOW);
digitalWrite(13, HIGH);
digitalWrite(14, HIGH);
digitalWrite(15, LOW);
break;
case 7:
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
digitalWrite(14, HIGH);
digitalWrite(15, LOW);
break;
case 8:
digitalWrite(12, LOW);
digitalWrite(13, LOW);
digitalWrite(14, LOW);
digitalWrite(15, HIGH);
break;
case 9:
digitalWrite(12, HIGH);
digitalWrite(13, LOW);
digitalWrite(14, LOW);
digitalWrite(15, HIGH);
break;
case 10:
digitalWrite(12, LOW);
digitalWrite(13, HIGH);
digitalWrite(14, LOW);
digitalWrite(15, HIGH);
break;
case 11:
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
digitalWrite(14, LOW);
digitalWrite(15, HIGH);
break;
case 12:
digitalWrite(12, LOW);
digitalWrite(13, LOW);
digitalWrite(14, HIGH);
digitalWrite(15, HIGH);
break;
case 13:
digitalWrite(12, HIGH);
digitalWrite(13, LOW);
digitalWrite(14, HIGH);
digitalWrite(15, HIGH);
break;
case 14:
digitalWrite(12, LOW);
digitalWrite(13, HIGH);
digitalWrite(14, HIGH);
digitalWrite(15, HIGH);
break;
case 15:
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
digitalWrite(14, HIGH);
digitalWrite(15, HIGH);
break;
}
if(presionado1==true){
presionado1=false;
}
if(presionado2==true){
presionado2=false;
}
}
//Parte 2 - Contador Binario con Timer
portEXIT_CRITICAL_ISR(&mux);
if (interruptCounter > 0) {
portENTER_CRITICAL(&timerMux);
interruptCounter--;
portEXIT_CRITICAL(&timerMux);
totalInterruptCounter++;
switch(totalInterruptCounter){ //Activación de las salidas en binario
case 0:
digitalWrite(18, LOW);
digitalWrite(19, LOW);
digitalWrite(21, LOW);
digitalWrite(22, LOW);
break;
case 1:
digitalWrite(18, HIGH);
digitalWrite(19, LOW);
digitalWrite(21, LOW);
digitalWrite(22, LOW);
break;
case 2:
digitalWrite(18, LOW);
digitalWrite(19, HIGH);
digitalWrite(21, LOW);
digitalWrite(22, LOW);
break;
case 3:
digitalWrite(18, HIGH);
digitalWrite(19, HIGH);
digitalWrite(21, LOW);
digitalWrite(22, LOW);
break;
case 4:
digitalWrite(18, LOW);
digitalWrite(19, LOW);
digitalWrite(21, HIGH);
digitalWrite(22, LOW);
break;
case 5:
digitalWrite(18, HIGH);
digitalWrite(19, LOW);
digitalWrite(21, HIGH);
digitalWrite(22, LOW);
break;
case 6:
digitalWrite(18, LOW);
digitalWrite(19, HIGH);
digitalWrite(21, HIGH);
digitalWrite(22, LOW);
break;
case 7:
digitalWrite(18, HIGH);
digitalWrite(19, HIGH);
digitalWrite(21, HIGH);
digitalWrite(22, LOW);
break;
case 8:
digitalWrite(18, LOW);
digitalWrite(19, LOW);
digitalWrite(21, LOW);
digitalWrite(22, HIGH);
break;
case 9:
digitalWrite(18, HIGH);
digitalWrite(19, LOW);
digitalWrite(21, LOW);
digitalWrite(22, HIGH);
break;
case 10:
digitalWrite(18, LOW);
digitalWrite(19, HIGH);
digitalWrite(21, LOW);
digitalWrite(22, HIGH);
break;
case 11:
digitalWrite(18, HIGH);
digitalWrite(19, HIGH);
digitalWrite(21, LOW);
digitalWrite(22, HIGH);
break;
case 12:
digitalWrite(18, LOW);
digitalWrite(19, LOW);
digitalWrite(21, HIGH);
digitalWrite(22, HIGH);
break;
case 13:
digitalWrite(18, HIGH);
digitalWrite(19, LOW);
digitalWrite(21, HIGH);
digitalWrite(22, HIGH);
break;
case 14:
digitalWrite(18, LOW);
digitalWrite(19, HIGH);
digitalWrite(21, HIGH);
digitalWrite(22, HIGH);
break;
case 15:
digitalWrite(18, HIGH);
digitalWrite(19, HIGH);
digitalWrite(21, HIGH);
digitalWrite(22, HIGH);
break;
}
if(totalInterruptCounter>15){
totalInterruptCounter = 15;
}
Serial.print("Contador Binario2: ");
Serial.println(totalInterruptCounter);
}
//Parte 3 - Reiniciar Contador de Timer
//Al llegar al mismo valor del contador con interrupciones externas
if(totalInterruptCounter==binario1){ //Permite reiniciar el Contador del Timer
digitalWrite(alarma, HIGH);
timerRestart(timer);
digitalWrite(18, LOW);
digitalWrite(19, LOW);
digitalWrite(21, LOW);
digitalWrite(22, LOW);
totalInterruptCounter=0;
}
if(totalInterruptCounter!=binario1){
digitalWrite(alarma, LOW);
}
//Parte 4 - Sensor Capacitivo
/*uint8_t touchSensor = touchRead(4);
Serial.printf("Sensor Capacitivo: %d\n", touchSensor);
if (touchSensor > 20)
{
digitalWrite(alarma, HIGH);
timerRestart(timer);
digitalWrite(18, LOW);
digitalWrite(19, LOW);
digitalWrite(21, LOW);
digitalWrite(22, LOW);
totalInterruptCounter=0;
}
delay(500);*/
}