//ALUMNO: MORENO DAMIAN JORGE ANDRES
#include <Arduino.h>
//Definimos los numeros de pines donde se conectan los leds
#define Led_Rojo 27
#define Led_Amarillo 14
#define Led_Verde 12
//Definimos el numero de canales PWM a usar, un canal por cada led.
//La intensidad del led será controlada por el periferico PWM
#define Canal1 0
#define Canal2 1
#define Canal3 2
//Definimos la frecuencia de la señal PWM
#define Freq 1000
//Resolucion de 10 bits, 1024 valores posibles entre 0 y 100% del ciclo
//de trabajo de la señal PWM
#define Resolucion 10
//Nos piden que la señal PWM trabaje a la mitad del ciclo de trabajo
//como 0 es 0% y 1023 es 100%,la mitad 511 represetará el 50%
int Duty_cycle=511;
//Definimos la variable que representa el led encendido
volatile int led=0;
//Definimos un array de strings que contenga el nombre de los colores
String nombre_led[3]={"ROJO","AMARILLO","VERDE"};
//Para el periférico timer, inicializamos un objeto mediante declaración
//puntero
hw_timer_t * timer = NULL;
//ISR del periferico timer, es la funcion que se activará cada vez que
//pasen los 4 segundos (interrupción).
//Cada vez que haya una interrupción, se pasará al siguiente led, se
//prenderá y se indicará el nuevo led encendido en el monitor serial.
void IRAM_ATTR onTimer() {
led++; //Si esta en verde(led=2), el siguiente en prenderse es rojo(led=0).
if(led==3){
led=0;
}
Serial.print("Luz prendida del semáforo: ");
Serial.println(nombre_led[led]);
//Con un selector, dependiendo de que led se va a prender (variable volatile led)
//se le suministra una señal PWM del ciclo de trabaja 50% para prender el led
switch(led){
case 0: //Se prende led rojo por 4 segundos
ledcWrite(Canal1, Duty_cycle);
ledcWrite(Canal2, 0);
ledcWrite(Canal3, 0);
break;
case 1: //Se prende led amarillo por 4 segundos
ledcWrite(Canal1, 0);
ledcWrite(Canal2, Duty_cycle);
ledcWrite(Canal3, 0);
break;
case 2: //Se prende led verde por 4 segundos
ledcWrite(Canal1, 0);
ledcWrite(Canal2, 0);
ledcWrite(Canal3, Duty_cycle);
break;
}
}
void setup() {
//Defino los pines que conectan a los leds como salidas
pinMode(Led_Rojo, OUTPUT);
pinMode(Led_Amarillo, OUTPUT);
pinMode(Led_Verde, OUTPUT);
//Inicializamos la comunicación Serial
Serial.begin(9600);
//El led rojo es el que se prende primero
Serial.print("Luz prendida del semáforo: ");
Serial.println(nombre_led[led]);
//Configuramos el periferico timer, tal que la interrupción
//que es el que el siguiente led se prenda y se indique en el monitor
//dure 4 segundos.
timer = timerBegin(0, 80, true);//Timer 0, prescaler 80
timerAttachInterrupt(timer, &onTimer, true);
timerAlarmWrite(timer, 2000000, true);//Contador hasta 2000000 para 4 segundos
timerAlarmEnable(timer);//Habilitamos el periferico timer con su interrupcion
//Configuramos los canales PWM
ledcSetup(Canal1, Freq, Resolucion);
ledcSetup(Canal2, Freq, Resolucion);
ledcSetup(Canal3, Freq, Resolucion);
//Asignamos los canales PWM a cada uno de los pines que operan con cada led
ledcAttachPin(Led_Rojo, Canal1);
ledcAttachPin(Led_Amarillo, Canal2);
ledcAttachPin(Led_Verde, Canal3);
//Inicializamos el ciclo de trabajo para cada canal de señal PWM
//Empezamos por el led rojo.
ledcWrite(Canal1, Duty_cycle);
ledcWrite(Canal2, 0);
ledcWrite(Canal3, 0);
}
void loop() {
}