#include <Arduino.h>
#define rojo 14
#define ambar 13
#define verde 12
#define canal1 0
#define canal2 1
#define canal3 2
#define Freq 1000
#define Resolucion 10
volatile bool toggle = true;
void IRAM_ATTR onTimer();
hw_timer_t *timer = NULL;
int cont = 1;
//este bool es para imprimir 1 sola vez el color del led
boolean b = true;
//este int para variar las intensidades de los led
int i = 0;
void setup() {
Serial.begin(9600);
pinMode(rojo,OUTPUT);
pinMode(ambar,OUTPUT);
pinMode(verde,OUTPUT);
ledcSetup(canal1, Freq, Resolucion);
ledcSetup(canal2, Freq, Resolucion);
ledcSetup(canal3, Freq, Resolucion);
ledcAttachPin(rojo, canal3);
ledcAttachPin(ambar, canal2);
ledcAttachPin(verde, canal1);
timer = timerBegin(0, 80, true);
timerAttachInterrupt(timer, &onTimer, true);
//el timer definido cada 2s debido a que por el PWM tengo 2s de apagado y 2s de encendido por cada led
timerAlarmWrite(timer, 1000000, true);
timerAlarmEnable(timer);
}
void loop() {
if(cont==1){ //prendo el led verde
ledcWrite(canal3,0);
ledcWrite(canal1,i);
i+=2;
i>=760?i=758:i=i;
}else if(cont==2){ //apago el led verde
ledcWrite(canal1,i);
i-=2;
i<=0?i=2:i=i;
}else if(cont==3){ //prendo el led ambar
ledcWrite(canal1,0);
ledcWrite(canal2,i);
i+=2;
i>=760?i=758:i=i;
}else if(cont==4){ //apago el led ambar
ledcWrite(canal2,i);
i-=2;
i<=0?i=2:i=i;
}else if(cont==5){ //prendo el led rojo
ledcWrite(canal2,0);
ledcWrite(canal3,i);
i+=2;
i>=760?i=758:i=i;
}else if(cont==6){ //apago el led rojo
ledcWrite(canal3,i);
i-=2;
i<=0?i=2:i=i;
}else{ //reinicio el ciclo
cont=1;
}
//imprimo una sola vez el nombre, ni bien se prende el led correspondiente
if(cont==1&&b){
Serial.println("Verde");
b=false;
}else if(cont==3&&b){
Serial.println("Ambar");
b=false;
}else if(cont==5&&b){
Serial.println("Rojo");
b=false;
}
}
//función de interrupción
void IRAM_ATTR onTimer() {
cont++;
b=true;
}