/****************************************************************************************/
/****************************************************************************************/
/***** PONTIFICIA UNIVERSIDAD CATÓLICA DEL PERÚ *****/
/***** FACULTAD DE CIENCIAS E INGENIERÍA *****/
/***** SISTEMAS DIGITALES B *****/
/****************************************************************************************/
/***** Tema: PWM *****/
/***** Proyecto: PWM_LedRGB *****/
/****************************************************************************************/
/***** EvalBoard: ESP32 S3 DevKitC C1 *****/
/***** Autor: Rolando Sánchez Ponce *****/
/***** Fecha: Octubre 2024 *****/
/****************************************************************************************/
/***** Enunciado: *****/
/***** Tenemos conectado al módulo ESP32-S3 un led RGB, tres potenciómetros y una *****/
/***** pantalla LCD. El control del led RGB es mediante tres señales PWM, los ciclos*****/
/***** de trabajo son controlados por cada uno de los potenciómetros, mientras en *****/
/***** la pantalla LCD se muestran los ciclos de trabajo de cada una de las señales *****/
/***** PWM; además, solo cuando el valor de alguno de los potenciómetros cambia se *****/
/***** actualiza el ciclo de trabajo correspondiente en la pantalla. *****/
/****************************************************************************************/
/****************************************************************************************/
// Incluimos las bibliotecas Wire y LiquidCrystal_I2C
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Definiciones para pines
#define ledRojo 45
#define ledVerde 47
#define ledAzul 20
#define potRojo 4
#define potVerde 5
#define potAzul 6
#define I2C_SDA 1
#define I2C_SCL 2
// Declaramos variables y objetos
int rojo255, verde255, azul255;
int antRojo, antVerde, antAzul;
int dutyRojo, dutyVerde, dutyAzul;
LiquidCrystal_I2C miLCD(0x27, 16, 2);
void setup() {
// Reconfiguramos pines para I2C
Wire.begin(I2C_SDA, I2C_SCL);
// Configuramos pines para led RGB
pinMode(ledRojo, OUTPUT);
pinMode(ledVerde, OUTPUT);
pinMode(ledAzul, OUTPUT);
// Inicializamos la pantalla LCD
miLCD.init();
miLCD.backlight();
miLCD.setCursor(1, 0);
miLCD.print("R: ");
miLCD.setCursor(6, 0);
miLCD.print("%");
miLCD.setCursor(9, 0);
miLCD.print("G: ");
miLCD.setCursor(14, 0);
miLCD.print("%");
miLCD.setCursor(5, 1);
miLCD.print("B: ");
miLCD.setCursor(10, 1);
miLCD.print("%");
// Inicializamos variables
antRojo = 256;
antVerde = 256;
antAzul = 256;
}
void loop() {
// Calculamos ciclo de trabajo para el led rojo según el potenciómetro
rojo255 = map(analogRead(potRojo), 0, 4095, 0, 255);
if(rojo255 != antRojo){ // Si hay cambio :
analogWrite(ledRojo, rojo255); // actualizamos ciclo de trabajo
dutyRojo = rojo255*100/255; // calculamos ciclo de trabajo en porcentaje
miLCD.setCursor(3, 0); // mostramos en pantalla
miLCD.printf("%03d", dutyRojo);
}
antRojo = rojo255;
// Calculamos ciclo de trabajo para el led verde según el potenciómetro
verde255 = map(analogRead(potVerde), 0, 4095, 0, 255);
if(verde255 != antVerde){
analogWrite(ledVerde, verde255);
dutyVerde = verde255*100/255;
miLCD.setCursor(11, 0);
miLCD.printf("%03d", dutyVerde);
}
antVerde = verde255;
// Calculamos ciclo de trabajo para el led azul según el potenciómetro
azul255 = map(analogRead(potAzul), 0, 4095, 0, 255);
if(azul255 != antAzul){
analogWrite(ledAzul, azul255);
dutyAzul = azul255*100/255;
miLCD.setCursor(7, 1);
miLCD.printf("%03d", dutyAzul);
}
antAzul = azul255;
delay(10); // this speeds up the simulation
}