#include <Ticker.h>
//Definicion de pines del Led
#define pinDelLed1 27 // Amarillo
#define pinDelLed2 17 // Azul
#define pinDelLed3 16 // Morado
//Definicion de botones
#define pinBoton1 14
#define pinBoton2 4
//definición de estado de boton
bool estadoBoton1;
bool estadoBoton2;
//Definición de booleano para el uso del botón
bool canUseBoton1 = true;
bool canUseBoton2 = true;
//definición del número de leds
const int numLeds = 3;
int LedsAEncender[numLeds] = {pinDelLed1, pinDelLed2, pinDelLed3};
// Array de Tickers para cada LED
Ticker tickers[numLeds];
//Función de parpadear con parámetro
void parpadearLed(int pinDelLed) {
//booleano estatico para mantenerlo dentro del contexto de la función
//funciona cada que se llama
static bool estadoLed = false;
//Cambio de estado de led utilizando operadores ternarios
digitalWrite(pinDelLed, estadoLed ? HIGH : LOW);
//cambio de estado de led
estadoLed = !estadoLed;
}
void setup() {
//Inicialización comunicación Serial
Serial.begin(115200);
//bucle de inicialización de salidas
for (int i = 0; i < numLeds; i++) {
pinMode(LedsAEncender[i], OUTPUT);
}
//definición botones en pull_up
pinMode(pinBoton1, INPUT_PULLUP); // 1 siempre, pulsado 0
pinMode(pinBoton2, INPUT_PULLUP);
}
void loop() {
//lectura del estado de botones
estadoBoton1 = digitalRead(pinBoton1);
estadoBoton2=digitalRead(pinBoton2);
//uso de boton con su respectivo uso
if (estadoBoton1 == LOW && canUseBoton1) {
Serial.println("Empezando animación");
canUseBoton1=false;
//bucle de iteración de tickers
for (int i = 0; i < numLeds; i++) {
//Bucle de attach de todos los ticker, pasando como parámetr una
//variable externa [i]
tickers[i].attach(0.5+i/2, [i]() { parpadearLed(LedsAEncender[i]); });
}
}
//reinicio estado boton
if (!estadoBoton1 == LOW && !canUseBoton1) {
canUseBoton1=true;
}
//Función de apagado de leds y detach de tickers
if (estadoBoton2 == LOW && canUseBoton2) {
Serial.println("Deteniendo la animación");
canUseBoton2 = false;
for (int i = 0; i < numLeds; i++) {
digitalWrite(LedsAEncender[i],LOW);
tickers[i].detach();
}
}
//reinicio estado boton 2
if (!estadoBoton2 == LOW && !canUseBoton2) {
canUseBoton2=true;
}
//delay de lectura de botones.
delay(100);
}