En este artículo vamos a "jugar" un poco con los diodos led RGB.
Un LED RGB es en realidad la unión de tres LEDs de los colores básicos (Red-Green-Blue), en un encapsulado común, compartiendo el Ground (cátodo). En función de la tensión que pongamos en cada pin podemos conseguir la mezcla de color que deseemos con relativa sencillez.
El montaje supone sencillamente conectar el negativo (el pin más largo) a Ground mediante una resistencia que limite la intensidad, y luego identificar los pines de colores:
- El pin más largo en estos LED es el GND.
- Al lado de GND hay dos pines a un lado y uno solitario al otro. Por lo normal el solitario es el rojo R.
- Así pues el pin out (patillaje) de un RGB LED suele ser R, GND, G, B.
Nota: Utilizo un led con ánodo común A+ por lo que si utilizas otro tipo de led (por ejemplo de cátodo común C-) tendrás que adaptar la programación del mismo. Gracias Víctor Aca por el apunte.
El esquema de nuestras pruebas será el siguiente:
El código para estas primeras pruebas es muy simple, simplemente iremos variado el color de led en sus tres colores primarios haciendo una pausa con cada color de 1 segundo.
void setup() {
// Definimos los pins
pinMode(2, OUTPUT); // Red: D4
pinMode(4, OUTPUT); // Green: D2
pinMode(5, OUTPUT); // Blue: D1
}
void color (int R, int G, int B) {
analogWrite(2, R);
analogWrite(4, G);
analogWrite(5, B);
}
void loop() {
color(1023, 0, 0);
delay(1000);
color(0, 1023, 0);
delay(1000);
color(0, 0, 1023);
delay(1000);
}
// Definimos los pins
pinMode(2, OUTPUT); // Red: D4
pinMode(4, OUTPUT); // Green: D2
pinMode(5, OUTPUT); // Blue: D1
}
void color (int R, int G, int B) {
analogWrite(2, R);
analogWrite(4, G);
analogWrite(5, B);
}
void loop() {
color(1023, 0, 0);
delay(1000);
color(0, 1023, 0);
delay(1000);
color(0, 0, 1023);
delay(1000);
}
Una variación de este código sería el ir variando la intensidad de cada color de forma progresiva. El código sería el siguiente:
void setup() {
// Definimos los pins
pinMode(2, OUTPUT); // Red: D4
pinMode(4, OUTPUT); // Green: D2
pinMode(5, OUTPUT); // Blue: D1
}
void fade (int pin) {
for (int u = 0; u < 1024; u++) {
analogWrite(pin, u);
delay(1);
}
for (int u = 0; u < 1024; u++) {
analogWrite(pin, 1023 - u);
delay(1);
}
}
void loop() {
fade(2); // R
fade(4); // G
fade(5); // B
}
// Definimos los pins
pinMode(2, OUTPUT); // Red: D4
pinMode(4, OUTPUT); // Green: D2
pinMode(5, OUTPUT); // Blue: D1
}
void fade (int pin) {
for (int u = 0; u < 1024; u++) {
analogWrite(pin, u);
delay(1);
}
for (int u = 0; u < 1024; u++) {
analogWrite(pin, 1023 - u);
delay(1);
}
}
void loop() {
fade(2); // R
fade(4); // G
fade(5); // B
}
Utilizando un servidor web para controlar los colores
En este segundo ejemplo vamos configurar el módulo ESP8266 como un servidor web al que nos conectaremos e iremos vairando su color utilizando el navegador de nuestro smartphone.
El esquema será el mismo pero modificaremos el código
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
// Definimos los pins
const int R = 2; // Red: D4
const int G = 4; // Green: D2
const int B = 5; // Blue: D1
// Red WiFi
const char* ssid = "WLAN_E17C";
const char* password = "ced0ccb58c84e525e35f";
ESP8266WebServer server(80);
// Página Web que mostrará el servidor
String webpage = ""
"<!DOCTYPE html><html><head><title>RGB control</title><meta name='mobile-web-app-capable' content='yes' />"
"<meta name='viewport' content='width=device-width' /></head><body style='margin: 0px; padding: 0px;'>"
"<canvas id='colorspace'></canvas></body>"
"<script type='text/javascript'>"
"(function () {"
" var canvas = document.getElementById('colorspace');"
" var ctx = canvas.getContext('2d');"
" function drawCanvas() {"
" var colours = ctx.createLinearGradient(0, 0, window.innerWidth, 0);"
" for(var i=0; i <= 360; i+=10) {"
" colours.addColorStop(i/360, 'hsl(' + i + ', 100%, 50%)');"
" }"
" ctx.fillStyle = colours;"
" ctx.fillRect(0, 0, window.innerWidth, window.innerHeight);"
" var luminance = ctx.createLinearGradient(0, 0, 0, ctx.canvas.height);"
" luminance.addColorStop(0, '#ffffff');"
" luminance.addColorStop(0.05, '#ffffff');"
" luminance.addColorStop(0.5, 'rgba(0,0,0,0)');"
" luminance.addColorStop(0.95, '#000000');"
" luminance.addColorStop(1, '#000000');"
" ctx.fillStyle = luminance;"
" ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height);"
" }"
" var eventLocked = false;"
" function handleEvent(clientX, clientY) {"
" if(eventLocked) {"
" return;"
" }"
" function colourCorrect(v) {"
" return Math.round(1023-(v*v)/64);"
" }"
" var data = ctx.getImageData(clientX, clientY, 1, 1).data;"
" var params = ["
" 'r=' + colourCorrect(data[0]),"
" 'g=' + colourCorrect(data[1]),"
" 'b=' + colourCorrect(data[2])"
" ].join('&');"
" var req = new XMLHttpRequest();"
" req.open('POST', '?' + params, true);"
" req.send();"
" eventLocked = true;"
" req.onreadystatechange = function() {"
" if(req.readyState == 4) {"
" eventLocked = false;"
" }"
" }"
" }"
" canvas.addEventListener('click', function(event) {"
" handleEvent(event.clientX, event.clientY, true);"
" }, false);"
" canvas.addEventListener('touchmove', function(event){"
" handleEvent(event.touches[0].clientX, event.touches[0].clientY);"
"}, false);"
" function resizeCanvas() {"
" canvas.width = window.innerWidth;"
" canvas.height = window.innerHeight;"
" drawCanvas();"
" }"
" window.addEventListener('resize', resizeCanvas, false);"
" resizeCanvas();"
" drawCanvas();"
" document.ontouchmove = function(e) {e.preventDefault()};"
" })();"
"</script></html>";
void handleRoot() {
// Leemos los argumentos RGB
String red = server.arg(0);
String green = server.arg(1);
String blue = server.arg(2);
analogWrite(R, red.toInt());
analogWrite(G, green.toInt());
analogWrite(B, blue.toInt());
Serial.println(red.toInt());
Serial.println(green.toInt());
Serial.println(blue.toInt());
server.send(200, "text/html", webpage);
}
// Error en la url solicitada
void handleNotFound() {
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET) ? "GET" : "POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i = 0; i < server.args(); i++) {
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
}
void setup() {
// Definimos los pins
pinMode(R, OUTPUT);
pinMode(G, OUTPUT);
pinMode(B, OUTPUT);
// Valores iniciales
analogWrite(R, 0);
analogWrite(G, 0);
analogWrite(B, 0);
// Inicializamos el puerto serie y nos conectamos a la red wifi
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("");
// Esperamos a que se conecte a la red wifi
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Conectado a ");
Serial.println(ssid);
Serial.print("IP: ");
Serial.println(WiFi.localIP());
// Con server.on indicamos una función como respuesta del servidor
// cuando el navegador solicita cierta URL
server.on("/", handleRoot);
// El método server.onNotFound() definiremos la función que
// queremos que actúe cuando la petición que recibimos no la
// tenemos definida server.onNotFound(handleNotFound);
server.begin();
Serial.println("HTTP server started");
}
void loop() {
server.handleClient();
}
Confieso que la parte de javascript no la entiendo pero muestra en el navegador una degradación de colores que al ir variando la posición en la que nos movemos en la pantalla va variando el color del diodo RGB. Este código lo he obtenido del artículo ESP8266 WiFi Module Control RGBLED.
La parte del código del servidor web ya se ha explicado en el artículo Librería ESP8266WebServer.
La salida del puerto seríe es la siguiente:
La verdad es que no me coinciden los colores de la pantalla con los colores del Led y no sé exactamente por qué.
Existen otros muchos proyectos que utilizan los módulos ESP8266 para controlar leds RGB. Algunos ejemplos:
- ESP8266 RGB Color Picker
- RGB Lamp using the ESP8266 running a custom Wi-Fi web server and WS2812B LED strip.
- LED’s Control Through ESP8266 + Arduino Web Page
- RGB control over wifi (with ESP8266 ESP-01)
- NodeMCU/ESP8266 implement WebSocketsServer to control RGB LED
- WiFiRGB - A WiFi-enabled RGB high-power LED
Fuentes:
No hay comentarios:
Publicar un comentario
Nota: solo los miembros de este blog pueden publicar comentarios.