Tutorial ESP32 34/55 - Gradiente de color con LED RGB y perilla | Kit de aprendizaje IoT ESP32 de SunFounder
En este tutorial, crearemos un efecto de gradiente de color utilizando un LED RGB que se ajusta según la posición de un potenciómetro (perilla). El proyecto utiliza un microcontrolador ESP32, que ofrece capacidades de Wi-Fi y Bluetooth integradas, lo que lo convierte en una opción versátil para proyectos de IoT. Al girar el potenciómetro, podemos hacer una transición suave entre diferentes colores, demostrando tanto la funcionalidad del LED RGB como la capacidad de leer valores analógicos del potenciómetro.

Este proyecto es ideal para aprender sobre PWM (Modulación por Ancho de Pulso) y cómo controlar dispositivos analógicos con un microcontrolador. A lo largo de este tutorial, discutiremos los componentes de hardware necesarios, las instrucciones de cableado y proporcionaremos fragmentos de código para ayudarte a implementar el proyecto. Para una explicación más visual, asegúrate de ver el video asociado (en el video a las 02:15).
Hardware Explicado
Los componentes principales utilizados en este proyecto incluyen el microcontrolador ESP32, un LED RGB y un potenciómetro. El ESP32 es un microcontrolador potente que puede manejar diversas tareas, incluida la comunicación inalámbrica, lo que lo hace adecuado para aplicaciones de IoT. El LED RGB consta de tres LED individuales (rojo, verde y azul) que se pueden mezclar para producir una amplia gama de colores. El potenciómetro actúa como un resistor ajustable que proporciona una salida de voltaje variable basada en su posición.
El LED RGB se puede conectar en dos configuraciones: ánodo común o cátodo común. En este proyecto, utilizaremos una configuración de ánodo común, donde todos los ánodos están conectados entre sí a una tensión positiva, lo que nos permite controlar el brillo de cada LED individualmente con PWM. El potenciómetro se conectará a una entrada analógica en el ESP32 para leer su posición y ajustar los valores RGB en consecuencia.
Detalles de la hoja de datos
| Fabricante | SunFounder |
|---|---|
| Número de parte | LED RGB |
| Voltaje de lógica/IO | 3.3 V |
| Tensión de suministro | 5 V |
| Corriente de salida (por canal) | 20 mA |
| Corriente pico (por canal) | 30 mA |
| Guía de frecuencia PWM | 5 kHz |
| Umbrales de lógica de entrada | 0.3 V (bajo) / 2.7 V (alto) |
| Caída de tensión / RDS(on)/ saturación | 1.8 V (típ.) |
| Límites térmicos | Temperatura de operación: -40°C a +85°C |
| Paquete | Agujero pasante |
| Notas / variantes | Configuración de ánodo común |
- Utiliza una resistencia de 220 Ohmios para cada canal LED para limitar la corriente.
- Asegúrate de que la tensión de suministro de energía sea la adecuada (5V) para el LED RGB.
- Conecte el ánodo común a la fuente de voltaje positivo.
- Utiliza PWM para controlar el brillo de cada color de LED.
- Ten cuidado con la conexión del potenciómetro para evitar entradas flotantes.
- Verifica que el ESP32 esté correctamente alimentado antes de cargar el código.
Instrucciones de cableado
Para conectar el LED RGB y el potenciómetro al ESP32, empieza conectando el pin de cátodo común del LED RGB al pin de alimentación de 3.3V en el ESP32. Los pines rojo, verde y azul del LED RGB se conectarán a los pines27,26, y25respectivamente. Asegúrate de colocar una resistencia de 220 Ohmios en serie con cada pin de color del LED para limitar la corriente y proteger el LED.
A continuación, conecta el potenciómetro al ESP32 uniendo el pin izquierdo al pin de alimentación de 3.3V, el pin derecho a tierra y el pin del medio a14en el ESP32. Esta configuración permite que el ESP32 lea la tensión analógica del potenciómetro, que se utilizará para ajustar el color del LED RGB según su posición.
Ejemplos de código y guía paso a paso
En la función de configuración, definimos los pines para el LED RGB y el potenciómetro, así como inicializamos la configuración de PWM. El siguiente fragmento de código muestra cómo configuramos los pines del LED RGB:
const int redPin = 27;
const int greenPin = 26;
const int bluePin = 25;
void setup() {
ledcAttach(redPin, freq, resolution);
ledcAttach(greenPin, freq, resolution);
ledcAttach(bluePin, freq, resolution);
}En este fragmento, definimos los pines para los LEDs rojo, verde y azul, y los conectamos a canales PWM con una frecuencia y resolución definidas.
La función de bucle lee el valor del potenciómetro y lo convierte en un valor de tono, que luego se utiliza para determinar los valores RGB. El siguiente extracto demuestra este proceso:
void loop() {
int knobValue = analogRead(KNOB_PIN);
float hueValue = (float)knobValue / 4095.0;
int hue = (int)(hueValue * 360);
int red, green, blue;
HUEtoRGB(hue, &red, &green, &blue);
setColor(red, green, blue);
}Este código lee el valor analógico del potenciómetro, lo normaliza y calcula el matiz correspondiente. Luego llama a laHUEtoRGBfunción para convertir el matiz en valores RGB, que se pasan a lasetColorfunción para actualizar el LED.
Demostración / Qué esperar
Al completar la conexión y subir el código, deberías poder girar el potenciómetro para cambiar el color del LED RGB de manera suave. A medida que giras la perilla, el LED cambiará a través de varios colores según el valor de matiz calculado a partir de la posición de la perilla. Si el LED no se enciende o se comporta de manera inesperada, revisa la conexión y asegúrate de que el potenciómetro esté conectado correctamente (en el video a las 10:45).
Marcas de tiempo del video
- 00:00 Inicio
- 2:11 Introducción al proyecto
- 4:31 LED RGB
- 8:18 Color RGB
- 12:18 Explicación del cableado
- 17:59 Código de Arduino explicado
- 24:12 Seleccionando la placa ESP32 y el puerto COM en Arduino IDE
- 25:54 Demostración
/*
* // Definir los pines del LED RGB
*/
const int redPin = 27;
const int greenPin = 26;
const int bluePin = 25;
// Definir la frecuencia y la resolución del PWM
const int freq = 5000;
const int resolution = 8;
// Define el pasador para el pomo.
#define KNOB_PIN 14
void setup() {
Serial.begin(115200);
ledcAttach(redPin, freq, resolution);
ledcAttach(greenPin, freq, resolution);
ledcAttach(bluePin, freq, resolution);
}
void loop() {
// Lee el valor del botón.
int knobValue = analogRead(KNOB_PIN);
Serial.println(knobValue);
// Normaliza el valor del knob al rango de 0 a 1.
float hueValue = (float)knobValue / 4095.0;
// Convierte el valor normalizado a un valor de TÓNALIDAD (0-360)
int hue = (int)(hueValue * 360);
// Convierte el valor de HUE a valores RGB.
int red, green, blue;
HUEtoRGB(hue, &red, &green, &blue);
// Actualiza el LED RGB con los nuevos valores de color.
setColor(red, green, blue);
}
void setColor(int red, int green, int blue) {
ledcWrite(redPin, red);
ledcWrite(greenPin, green);
ledcWrite(bluePin, blue);
}
// Convierte un valor HUE a valores RGB.
void HUEtoRGB(int hue, int* red, int* green, int* blue) {
float h = (float)hue / 60.0;
float c = 1.0;
float x = c * (1.0 - fabs(fmod(h, 2.0) - 1.0));
float r, g, b;
if (h < 1.0) {
r = c;
g = x;
b = 0;
} else if (h < 2.0) {
r = x;
g = c;
b = 0;
} else if (h < 3.0) {
r = 0;
g = c;
b = x;
} else if (h < 4.0) {
r = 0;
g = x;
b = c;
} else if (h < 5.0) {
r = x;
g = 0;
b = c;
} else {
r = c;
g = 0;
b = x;
}
float m = 1.0 - c;
*red = (int)((r + m) * 255);
*green = (int)((g + m) * 255);
*blue = (int)((b + m) * 255);
}
Common Course Links
Common Course Files
Recursos y referencias
-
Documentación
Archivos📁
No hay archivos disponibles.