#define ledA 5
#define ledV 18
#define ledN 17
#define botonA 27
#define botonB 26
#define botonC 25
#define botonD 14
volatile bool botonA_pressed = false;
volatile bool botonB_pressed = false;
volatile bool botonC_pressed = false;
volatile bool botonD_pressed = false;
hw_timer_t*timerLedA = NULL;
hw_timer_t*timerLedN = NULL;
int state = 0; //
TaskHandle_t HandleTask1; //handle de la tarea
void IRAM_ATTR parpadeoAzul() {
digitalWrite(ledA, !digitalRead(ledA));
}
void IRAM_ATTR parpadeoNaranja() {
digitalWrite(ledN, !digitalRead(ledN));
}
void IRAM_ATTR botonA_pulsado() {
botonA_pressed = true;
}
void IRAM_ATTR botonB_pulsado() {
botonB_pressed = true;
}
void IRAM_ATTR botonC_pulsado() {
botonC_pressed = true;
}
void IRAM_ATTR botonD_pulsado() {
botonD_pressed = true;
}
void setup() {
Serial.begin(115200);
pinMode(ledA, OUTPUT);
pinMode(ledV, OUTPUT);
pinMode(ledN, OUTPUT);
pinMode(botonA, INPUT_PULLUP);
pinMode(botonB, INPUT_PULLUP);
pinMode(botonC, INPUT_PULLUP);
pinMode(botonD, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(botonA), botonA_pulsado, RISING);
attachInterrupt(digitalPinToInterrupt(botonB), botonB_pulsado, RISING);
attachInterrupt(digitalPinToInterrupt(botonC), botonC_pulsado, RISING);
attachInterrupt(digitalPinToInterrupt(botonD), botonD_pulsado, RISING);
digitalWrite(ledV, LOW);
digitalWrite(ledN, LOW);
//timer del led azul
timerLedA = timerBegin(0, 80, true);
timerAttachInterrupt(timerLedA, &parpadeoAzul, true);
timerAlarmWrite(timerLedA, 500000, true); //500ms
//timer del led naranja
timerLedN = timerBegin(1, 80, true);
timerAttachInterrupt(timerLedN, &parpadeoNaranja, true);
timerAlarmWrite(timerLedN, 500000, true); //500ms
xTaskCreatePinnedToCore(
estados, // Function en la que se implementa la tarea
"Tarea que controla los estados", // Nombre de la tarea
100000, // Memoria (en Bytes) asignados a esta tarea
NULL, // Parámetro de entrada de la tarea (no hay ningún parámetro)
5, // Prioridad de la tarea (cuanto más alto, más prioridad)
&HandleTask1, // Handle de la tarea 1
0); // Core donde va a correr la tarea 1
}
void loop() {
Serial.println(state);
delay(10); // this speeds up the simulation
}
void estados(void *parameter) {
while (1) {
switch (state) {
case 0: //DESARMADA
timerAlarmEnable(timerLedA);
timerAlarmDisable(timerLedN);
if (botonA_pressed) {
timerAlarmDisable(timerLedA);
state = 1; //pasa a armada
botonA_pressed = false;
digitalWrite(ledA, HIGH);
digitalWrite(ledV, LOW);
digitalWrite(ledN, LOW);
}
else if (botonD_pressed) {
timerAlarmDisable(timerLedA);
state = 3; //pasa a alarma
botonD_pressed = false;
digitalWrite(ledA, LOW);
digitalWrite(ledV, LOW);
digitalWrite(ledN, LOW);
}
break;
case 1: //ARMADA
if (botonB_pressed) {
state = 2; //pasa a funcionamiento
botonB_pressed = false;
digitalWrite(ledA, LOW);
digitalWrite(ledV, HIGH);
}
else if (botonA_pressed) {
state = 0; //pasa a desarmada
botonA_pressed = false;
digitalWrite(ledA, LOW);
digitalWrite(ledV, LOW);
}
else if (botonD_pressed) {
state = 3; //pasa a alarma
botonD_pressed = false;
digitalWrite(ledA, LOW);
digitalWrite(ledV, LOW);
digitalWrite(ledN, LOW);
}
break;
case 2: //FUNCIONAMIENTO
if (botonB_pressed) {
state = 1; //pasa a armada
botonB_pressed = false;
digitalWrite(ledA, HIGH);
digitalWrite(ledV, LOW);
}
else if (botonD_pressed) {
state = 3; //pasa a alarma
botonD_pressed = false;
digitalWrite(ledA, LOW);
digitalWrite(ledV, LOW);
digitalWrite(ledN, LOW);
}
break;
case 3: //ALARMA
timerAlarmEnable(timerLedA);
timerAlarmEnable(timerLedN);
if (botonC_pressed) {
timerAlarmDisable(timerLedN);
botonC_pressed = false;
state = 0;
}
break;
}
}
}