#include <NoDelay.h>
#include <Bounce2.h>
// Pin a la que esta conectado el LED, GPIO16
const unsigned int PIN_LED_R = 16;
// Pin a la que esta conectado el LED, GPIO17
const unsigned int PIN_LED_V = 17;
//Pin al que esta conectado el boton rojo
const unsigned int PIN_BOTON_R = 19;
const unsigned int PIN_BOTON_V = 18;
// PAUSA en ms que dura encendido el LED en una
// determinada intensidad
const long PAUSA = 100;
// Parametros de la señal PWM
const int FRECUENCIA = 5000;
const int CANAL_PWM_V = 0;
const int CANAL_PWM_R = 1;
const int RESOLUCION = 8;
// Valor minimo del ciclo de trabajo
const unsigned int CT_MIN = 0;
// Valor maximo del ciclo de trabajo. 2**RESOLUCION - 1
const unsigned int CT_MAX = 255;
// Ciclo de trabajo de la forma de onda PWM
unsigned int cicloTrabajo_V;
unsigned int cicloTrabajo_R;
// Incremento/decremento en el ciclo de trabajo
unsigned int paso;
// Define los posibles estados del ciclo de trabajo
typedef enum {
CICLO_TRABAJO_MIN,
CICLO_TRABAJO_INT,
CICLO_TRABAJO_MAX
} estadoCT;
//Define los posibles estados de un led
typedef enum {
AUMENTANDO_LUZ,
DISMINUYENDO_LUZ
} estadoLED;
//variable que guarda el estado del led verde
estadoLED estadoLED_V;
//variable que guarda el estado del led rojo
estadoLED estadoLED_R;
// Variable que guarda el estado del ciclo de trabajo
estadoCT edoCT;
// Crea una instancia de la clase Bounce para el boton verde
Bounce debouncer_V = Bounce();
// Crea una instancia de la clase Bounce para el boton rojo
Bounce debouncer_R = Bounce();
void actualizaCicloTrabajo();
void setup() {
//SET UP LEDS
// Configura los parametros de la señal PWM
ledcSetup(CANAL_PWM_V, FRECUENCIA, RESOLUCION);
ledcSetup(CANAL_PWM_R, FRECUENCIA, RESOLUCION);
// Establece el canal PWM al pin PIN_LED_R (GPIO16).
ledcAttachPin(PIN_LED_R, CANAL_PWM_R);
// Establece el canal PWM al pin PIN_LED_R (GPIO17).
ledcAttachPin(PIN_LED_V, CANAL_PWM_V);
// Valor inicial del Ciclo de trabajo de la forma de onda PWM
cicloTrabajo_V = CT_MAX; //LED A
cicloTrabajo_R = CT_MIN; //LED B
estadoLED_R = DISMINUYENDO_LUZ;
estadoLED_V = AUMENTANDO_LUZ;
// Valor inicial del Incremento/decremento en el ciclo de
// trabajo
paso = 1;
// Establece el estado inicial
//SET UP BOTONES
// Establece los pines de los botones como de entrada.
pinMode(PIN_BOTON_R, INPUT);
pinMode(PIN_BOTON_V, INPUT);
debouncer_V.attach(PIN_BOTON_V);
debouncer_R.attach(PIN_BOTON_R);
// Establece el intervalo (en ms) de espera para eliminar
// el ruido
debouncer_V.interval(15);
debouncer_R.interval(15);
}
void loop() {
debouncer_V.update();
debouncer_R.update();
//Valor del boton verde
int valor_B_V = debouncer_V.read();
//Valor del boton rojo
int valor_B_R = debouncer_R.read();
ledcWrite(CANAL_PWM_V, cicloTrabajo_V);
ledcWrite(CANAL_PWM_R, cicloTrabajo_R);
//Si se presiona el boton verde
if (valor_B_V == HIGH) {
if (cicloTrabajo_R < CT_MAX) {
cicloTrabajo_R += paso;
cicloTrabajo_V -= paso;
}
}
else {
if (valor_B_R == HIGH) {
if (cicloTrabajo_V < CT_MAX) {
cicloTrabajo_R -= paso;
cicloTrabajo_V += paso;
}
}
}
}
/**
Esa función incrementa o decrementa el valor del ciclo de
trabajo
de la señal PWM y actualiza dependiendo de su valor, el estado
del ciclo de trabajo
*/
void actualizaCicloTrabajo() {
// Incrementa o decrementa el ciclo de trabajo
cicloTrabajo_R -= paso;
cicloTrabajo_V += paso;
// Cambia el estado dependiendo del valor del ciclo de trabajo
}
/**
Esta funcion cambia de decrementar a incrementar el
ciclo de trabajo o viceversa.
*/
void invierteIntensidad() {
// Cambia de decrementar a incrementar el ciclo de trabajo
paso = -paso;
}