Tutorial ESP32 54/55 - Defina a Cor da Fita de LED WS2812 via Wifi | Kit de Aprendizado IoT ESP32 da SunFounder
Neste tutorial, aprenderemos como controlar a cor de uma fita de LED RGB WS2812 usando um microcontrolador ESP32 via Wi-Fi. Ao utilizar um seletor de cores, você pode escolher diferentes cores do seu dispositivo móvel ou desktop e enviar essas informações para a fita de LED. Este projeto demonstra as capacidades do ESP32, permitindo uma interação fluida com a iluminação LED através de uma interface web.
O microcontrolador ESP32 é equipado com Wi-Fi e Bluetooth, tornando-o uma escolha versátil para aplicações IoT. Neste projeto, vamos nos concentrar na funcionalidade do Wi-Fi para controlar a fita de LED. Os usuários poderão escolher cores dinamicamente, criando uma experiência visualmente envolvente. Para mais clareza sobre este projeto, não deixe de conferir o vídeo (no vídeo em 00:00).
Hardware Explicado
Os componentes principais deste projeto incluem o microcontrolador ESP32 e a fita de LED WS2812. O ESP32 é um microcontrolador poderoso com capacidades de Wi-Fi integradas, permitindo comunicação e controle sem fio.
A fita LED WS2812 consiste em LEDs RGB endereçáveis individualmente, permitindo que você defina a cor de cada LED de forma independente. Cada LED incorpora um circuito de controle e um LED RGB dentro de um único pacote, o que simplifica a fiação e o controle de múltiplos LEDs.
Detalhes da Ficha Técnica
| Fabricante | Worldsemi |
|---|---|
| Número da peça | WS2812B |
| Tensão de lógica/entrada e saída | 3,5-5,3 V |
| Tensão de alimentação | 5 V |
| Corrente de saída (por canal) | 20 mA |
| Corrente de pico (por canal) | 60 mA |
| Orientação sobre a frequência PWM | 400 Hz |
| Lugares de limiar lógico de entrada | 0,3 × VDD (baixo), 0,7 × VDD (alto) |
| Queda de tensão / RDS(on)/ saturação | 0,5 V |
| Limites térmicos | -40 a +80 °C |
| Pacote | 5050 SMD |
| Notas / variantes | Disponível em vários comprimentos e configurações. |
- Garanta uma alimentação elétrica adequada para evitar danos aos LEDs.
- Use um terra comum entre o ESP32 e a fita de LED.
- Mantenha as linhas de dados curtas para evitar a degradação do sinal.
- Considere adicionar um capacitor (1000 µF) entre a fonte de alimentação para estabilidade.
- Use um resistor (470 Ω) na linha de dados para integridade do sinal.
Instruções de Fiação

Para conectar o ESP32 à fita de LED WS2812, conecte os componentes da seguinte forma: Primeiro, conecte o pino de 5V da fita de LED à saída de 5V do ESP32. Em seguida, conecte o pino de terra (GND) da fita de LED a um pino GND no ESP32. Por fim, conecte o pino de dados da fita de LED (geralmente rotulado como DI ou Data In) ao pino GPIO 13 no ESP32. Certifique-se de que todas as conexões estejam seguras para garantir o funcionamento adequado.
No vídeo, métodos alternativos de fiação são brevemente mencionados, mas a configuração descrita aqui é a configuração recomendada para desempenho ideal (no vídeo às 03:00).
Exemplos de Código e Passo a Passo
O código começa incluindo as bibliotecas necessárias para controlar a fita de LED WS2812 e configurar o servidor web. O pino do LED é definido comoLED_PINe o número de LEDs na fita é definido comNUM_LEDS.
#define LED_PIN 13 // NeoPixel LED strip
#define NUM_LEDS 8 // Number of LEDs
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
Este trecho inicializa a biblioteca NeoPixel e configura a fita de LED no pino especificado.Adafruit_NeoPixelobjeto,strip, é o que você usará para controlar as cores do LED.
Em seguida, o código inicializa o Wi-Fi e configura um servidor web para gerenciar solicitações recebidas. O SSID e a senha da rede são definidos, permitindo que o ESP32 se conecte ao Wi-Fi.
const char *ssid = "your_SSID";
const char *password = "your_PASSWORD";
WebServer server(80);
Neste excerto, substituayour_SSIDeyour_PASSWORDcom suas credenciais de Wi-Fi atuais. Essa conexão permite que o ESP32 se comunique com dispositivos na mesma rede, possibilitando o controle remoto da fita de LED.
A função principal para mudar a cor do LED ésetColor(), que itera por cada LED e define sua cor com base nos valores RGB selecionados.
void setColor() {
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, valueR, valueG, valueB); // Set the color of the i-th LED
strip.show(); // Update the LED strip with the new colors
delay(10); // Wait for 10 milliseconds
}
}
Esta função garante que cada LED na fita seja atualizado com a cor selecionada. O atraso permite que os LEDs mudem de cor suavemente. À medida que você interage com a interface web, esta função será chamada para refletir suas escolhas de cor.
Demonstração / O que Esperar
Quando a configuração estiver concluída, você deverá conseguir acessar a interface da web pelo endereço IP do ESP32. Você verá um seletor de cores que permite escolher qualquer cor, que será então enviada para a fita de LED. Se o ESP32 perder a conexão Wi-Fi, a fita irá piscar uma cor de alerta, indicando o problema (no vídeo às 14:30).
Os erros comuns incluem ligações incorretas, que podem fazer com que os LEDs não acendam, ou o uso de combinações incorretas de SSID/senha que impedem o ESP32 de se conectar à rede. Sempre verifique suas conexões e credenciais.
Marcação de tempo do vídeo
- 00:00 Iniciar
- 2:01 Introdução ao projeto
- 3:09 Docs
- 3:47 Explicação da cor RGB
- 7:47 Fiação
- Código Arduino para WS2812 com WIFI explicado às 8:40
- 19:35 Selecionando a placa ESP32 e a porta COM no Arduino IDE
- 21:17 Demonstração de controle de fita de LED via wifi
/*
* Controle o LED RGB via wifi usando ESP32
*
* instruções em vídeo completas https://youtu.be/J_UFHk_T9aE
* 📚⬇️ Página de download e recursos https://robojax.com/RJT687
* Escrito por Ahmad Shamshiri em 18 de dezembro de 2023
*
* Assista à instrução em vídeo para este vídeo:
*
* Combinei a biblioteca DHT da Adafruit com o WebServer ESP8266, ambos os links
* Biblioteca DHT da Adafruit no GitHub: https://github.com/adafruit/DHT-sensor-library
* e
* ESP8266 no GitHub: https://github.com/esp8266/Arduino
*
* Copyright (c) 2015, Majenko Technologies
* Todos os direitos reservados.
*
* A redistribuição e o uso em formas de fonte e binárias, com ou sem modificação,
* são permitidos desde que as seguintes condições sejam atendidas:
*
* As redistribuições do código-fonte devem manter o aviso de copyright acima, esta
* lista de condições e a seguinte isenção de responsabilidade.
*
* As redistribuições em forma binária devem reproduzir o aviso de copyright acima, esta
* lista de condições e a seguinte isenção de responsabilidade na documentação e/ou
* outros materiais fornecidos com a distribuição.
*
* Nem o nome da Majenko Technologies nem os nomes de seus
* colaboradores podem ser usados para endossar ou promover produtos derivados deste
* software sem permissão prévia por escrito.
*
* ESTE SOFTWARE É FORNECIDO PELOS DETENTORES DE DIREITOS AUTORAIS E COLABORADORES "NO ESTADO EM QUE SE ENCONTRA" E
* QUALQUER GARANTIA EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS
* IMPLÍCITAS DE COMERCIABILIDADE E ADEQUAÇÃO A UM PROPÓSITO ESPECÍFICO SÃO
* RENUNCIADAS. EM NENHUMA CIRCUNSTÂNCIA O DETENTOR DOS DIREITOS AUTORAIS OU COLABORADORES SERÃO RESPONSÁVEIS POR
* QUAISQUER DANOS DIRETOS, INDIRETOS, INCIDENTAL, ESPECIAL, EXEMPLAR OU CONSEQUENCIAL
* (INCLUINDO, MAS NÃO SE LIMITANDO À AQUISIÇÃO DE BENS OU SERVIÇOS SUBSTITUTIVOS;
* PERDA DE USO, DADOS OU LUCROS; OU INTERRUPÇÃO DE NEGÓCIOS) AINDA QUE CAUSADOS E EM
* QUALQUER TEORIA DE RESPONSABILIDADE, SEJA EM CONTRATO, RESPONSABILIDADE OBJETIVA OU DELITO
* (INCLUINDO NEGLIGÊNCIA OU OUTERS) QUE SURJAM DE QUALQUER FORMA DO USO DESTE
* SOFTWARE, MESMO SE AVISADO SOBRE A POSSIBILIDADE DE TAL DANO.
*/
#include <Adafruit_NeoPixel.h> // Inclua a biblioteca Adafruit NeoPixel
#define LED_PIN 13 // Fita LED NeoPixel
#define NUM_LEDS 8 // Número de LEDs
// Crie uma instância da classe Adafruit_NeoPixel
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
// cor da luz LED inicial
int valueR = 178; // de 0 a 255 para Vermelho
int valueG = 27; // de 0 a 255 para Verde
int valueB = 84; // de 0 a 255 para Azul
bool showSerialData = false;
String theColorR, theColorG, theColorB;
String theColor ="ff0000";
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>
const char *ssid = "dars";
const char *password = "hhhhhhhhhhh";
WebServer server(80);
void showColorPicker() {
String page = "<!DOCTYPE html>\n";
page +="<html>\n";
page +="<body>\n";
page +="<div style=\"zoom: 300%;\">\n";
page +="<h2>Robojax RGB Color picker</h2>\n";
page +="<p id=\"result\"></p>\n";
page +="<form action=\"/color\">\n";
page +=" <label for=\"favcolor\">Select your favorite color:</label>\n";
page +=" <input type=\"color\" id=\"favcolor\" name=\"favcolor\" value=\"#";
page += theColor;
page +="\"><br><br>\n";
page +=" <input type=\"submit\" value=\"Set Color\" />\n";
page +="</form> \n</div>\n";
page +="</body>\n";
page +="</html>\n";
server.send(200, "text/html", page);
}
// from https://stackoverflow.com/questions/44683071/convert-string-as-hex-to-hexadecimal
uint64_t StrToHex(const char* str)
{
return (uint64_t) strtoull(str, 0, 16);
}
void getColor(){
// server.send(200, "text/plain", mensagem);
if(server.argName(0) == "favcolor")
{
String newColor = String(server.arg(0)); // obtenha o argumento GET 0 e converta-o em string
theColor = newColor.substring(1); // remova o símbolo # do início da cor como #B2a48d
theColorR = newColor.substring(1, 3); // extraia B2 de #B2a48d, por exemplo
theColorG = newColor.substring(3, 5); // extraia a4 de #B2a48d, por exemplo
theColorB = newColor.substring(5, 7); // extraia 8d de #B2a48d, por exemplo
valueR = StrToHex(theColorR.c_str()); // converter String para HEX para R
valueG = StrToHex(theColorG.c_str()); // converter String para HEX para G
valueB = StrToHex(theColorB.c_str()); // converter String para HEX para B
if(showSerialData)
{
Serial.print("valueR: ");
Serial.println(valueR);
Serial.print("valueG: ");
Serial.println(valueG);
Serial.print("valueB: ");
Serial.println(valueB );
}
}
showColorPicker(); // certifique-se de que o seletor de cores esteja exibido
// server.send(200, "text/plain", mensagem);
}
void setColor()
{
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, valueR, valueG, valueB); // Defina a cor do LED de índice i como vermelho.
strip.show(); // Atualize a fita de LED com as novas cores.
delay(10); // Aguarde 100 milissegundos
}
}
void noConnection()
{
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, 255, 45, 0); // Defina a cor do LED de índice i como vermelho.
strip.show(); // Atualize a fita de LED com as novas cores.
delay(50); // Aguarde 100 milissegundos
}
delay(200);
for (int i = NUM_LEDS-1; i >=0; i--) {
strip.setPixelColor(i, 0, 255, 180); // Defina a cor do LED de índice i como vermelho.
strip.show(); // Atualize a fita de LED com as novas cores.
delay(50); // Aguarde 100 milissegundos
}
}
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_wifi() {
delay(10);
// Começamos conectando a uma rede WiFi.
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");
// Aguarde a conexão
while (WiFi.status() != WL_CONNECTED) {
noConnection();
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("Open: http: // ");
Serial.print(WiFi.localIP());
Serial.println(" to read temperature");
if (MDNS.begin("robojaxRGB")) {
Serial.println("MDNS responder started");
}
}
void setup(void) {
Serial.begin(115200);
strip.begin(); // Inicialize a tira NeoPixel
strip.show(); // Defina a cor inicial como preta
setup_wifi();
server.on("/", showColorPicker); // mostre a página principal com seletor de cores
// server.on("/color", setColor);//muda a cor no LED RGB WS2812
server.on("/color", HTTP_GET, getColor);
server.on("/inline", []() {
server.send(200, "text/plain", "this works as well");
});
server.onNotFound(handleNotFound);
server.begin();
Serial.println("HTTP server started");
}
void loop(void) {
// Robojax.com
while (WiFi.status() != WL_CONNECTED) {
setup_wifi();
}
server.handleClient();
// showColorPicker();
setColor();
delay(300); // mude isso para um valor maior (1000 ou mais) se você não precisar ler com frequência
// Código Robojax.com para ESP32 e DHT11 DHT22
}
Common Course Links
Common Course Files
Recursos e referências
Ainda não há recursos.
Arquivos📁
Nenhum arquivo disponível.