Tutorial ESP32 52/55 - Sincronização Global WS2812 CheerLights MQTT com LCD | Kit IoT SunFounder ESP32
Neste tutorial, criaremos um projeto CheerLights usando o ESP32, que irá sincronizar cores globalmente através do MQTT. Este projeto não apenas mudará de cor com base nas entradas de outros usuários, mas também exibirá a cor atual e quantas vezes foi atualizada em uma tela LCD. O resultado é uma demonstração divertida das capacidades de IoT, mostrando como os dispositivos podem interagir e manter os usuários conectados através de distâncias. Para esclarecimentos adicionais, assista ao vídeo (no vídeo em 00:00).
Hardware Explicado
Para construir este projeto, você precisará de um microcontrolador ESP32, uma fita de LED WS2812 e um display LCD. O ESP32 serve como o cérebro da operação, utilizando suas funcionalidades de Wi-Fi integradas para se conectar à internet e receber mensagens MQTT. Isso permite atualizações em tempo real nas cores dos LEDs com base em uma entrada global de outros usuários.
A fita LED WS2812 é uma escolha popular para projetos que exigem LEDs RGB endereçáveis. Cada LED pode ser controlado independentemente, permitindo exibições de cores ricas. O LCD fornecerá uma confirmação visual da cor atual e do número de vezes que foi alterada, melhorando a interação com o usuário.
Detalhes da Ficha Técnica
| Fabricante | SunFounder |
|---|---|
| Número da peça | ESP32 |
| Tensão de Lógica/IO | 3,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 |
| Limiares de lógica de entrada | 0,15 V (baixo), 0,8 V (alto) |
| Queda de tensão / RDS(on)/ saturação | 0,2 V |
| Limites térmicos | 85 °C |
| Pacote | módulo ESP32 |
| Notas / variantes | Inclui Wi-Fi e Bluetooth integrados. |
- Garanta um fornecimento de energia adequado para o ESP32 (5 V) e a fita WS2812 (5 V).
- Use um terra comum entre o ESP32 e a fita de LED.
- Implemente um broker MQTT apropriado para sincronização de cores.
- Preste atenção à conexão do pino de dados para o WS2812 (pino 14 conforme o código).
- Tenha cuidado com o número de LEDs; exceder os limites de potência requer fontes de energia adicionais.
Instruções de Fiação


Para conectar os componentes, comece ligando a fita de LED WS2812. Conecte o pino de terra (geralmente preto) da fita de LED ao pino de terra no ESP32. Em seguida, conecte o pino VCC (geralmente vermelho) da fita de LED à saída de 5V no ESP32. Por fim, conecte o pino de dados (frequentemente amarelo) ao pino GPIO 14 no ESP32.
Para o LCD, conecte o pino de terra (geralmente preto) ao terra do ESP32. O pino VCC (normalmente vermelho) deve ser conectado à saída de 5V. O pino SDA (tipicamente cinza) conecta-se ao pino GPIO 21, enquanto o pino SCL (geralmente branco) conecta-se ao pino GPIO 22. Esta configuração permite que o ESP32 se comunique com o LCD e exiba informações conforme necessário.
Exemplos de Código e Passo a Passo
Na função de configuração, inicializamos o LCD e conectamos ao Wi-Fi. O código abaixo demonstra como definir as bibliotecas necessárias e configurar o LCD:
#include
#include
LiquidCrystal_I2C lcd(0x27, 16,2); // set the LCD address
void setup() {
Serial.begin(115200);
lcd.init(); // initialize the lcd
lcd.backlight(); // Turns on the LCD backlight.
}Isso inicializa o LCD para uso, permitindo que exiba mensagens. O próximo trecho mostra como a conexão Wi-Fi é estabelecida:
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
lcdConnect(); //for LCD
delay(500);
}
Serial.println("WiFi connected");
}Esta função estabelece uma conexão com a rede Wi-Fi especificada, exibindo uma mensagem no LCD enquanto se conecta. Por fim, a lógica de mudança de cor é tratada na função de callback:
void callback(char* topic, byte* message, unsigned int length) {
String messageTemp;
for (int i = 0; i < length; i++) {
messageTemp += (char)message[i];
}
if (String(topic) == "cheerlights") {
setColor(messageTemp);
}
}Esta função escuta por mensagens recebidas no tópico "cheerlights" e atualiza a cor de acordo. O código completo está carregado abaixo do artigo, então certifique-se de revisá-lo para a implementação completa.
Demonstração / O que Esperar
Após a conclusão do projeto, você pode esperar que a fita de LED mude de cores com base nas entradas de um feed MQTT global. O LCD exibirá o nome da cor atual e quantas vezes ela foi alterada. Se você desconectar a internet, o LCD indicará "Conectando..." até que uma conexão seja restabelecida (no vídeo às 12:30).
Erros comuns incluem garantir que os pinos corretos sejam usados para as conexões de dados e verificar se as credenciais do Wi-Fi estão corretas. Se houver qualquer discrepância no SSID ou na senha, o ESP32 não conseguirá se conectar, e o LCD continuará exibindo a mensagem de conexão.
Timestamps de Vídeo
- 00:00 Início
- 1:59 Introdução ao projeto
- 6:16 Fiação explicada
- 8:13 Código Arduino explicado
- 14:26 Selecionando a placa ESP32 e a porta COM no Arduino IDE
- 16:07 Demonstração CheerLight com LCD
/*
* Este é o código original do Examples->iot_5_cheerlight da SunFounder
* instruções em vídeo completas https://youtu.be/xEqmxMiF-E8
* 📚⬇️ Página de download e recursos https://robojax.com/RJT685
*
* Adicionei um LCD para exibir:
* 1-Nome da cor
* 2-Contar o número de vezes que a cor é atualizada
* 3-Exibir no LCD se o wifi estiver conectado
* 4-Exibir conectando se não estiver conectado ou desconectado
*
* Escrito por Ahmad Shamshiri
* www.Robojax.com
* 29 de dezembro de 2023
*
* :ref: https://randomnerdtutorials.com/esp32-mqtt-publish-subscribe-arduino-ide/
* https://docs.sunfounder.com/projects/kepler-kit/en/latest/iotproject/5.mqtt_pub.html
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// SDA->21,SCL->22
LiquidCrystal_I2C lcd(0x27, 16,2); // defina o endereço LCD como 0x27 para um display de 16 caracteres e 2 linhas
int colorCount = 0;
int lastColor=0;
byte connected[] = {
B00001,
B00001,
B00011,
B00111,
B00111,
B01111,
B01111,
B11111
};
#include <WiFi.h>
#include <PubSubClient.h>
// #include <Wire.h>
#include <Adafruit_NeoPixel.h>
// Substitua as próximas variáveis pela sua combinação de SSID/Senha
const char* ssid = "dars";
const char* password = "5152535455";
// Adicione o endereço do seu Broker MQTT:
const char* mqtt_server = "mqtt.cheerlights.com";
const char* unique_identifier = "sunfounder-client-sdgvsasdda";
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
int value = 0;
// Defina as cores CheerLights suportadas e seus valores RGB.
String colorName[] = {"red", "pink", "green", "blue", "cyan", "white", "warmwhite", "oldlace", "purple", "magenta", "yellow", "orange"};
int colorRGB[][3] = { 255, 0, 0, // vermelho
255, 192, 203, // "rosa"
0, 255, 0, // verde
0, 0, 255, // azul
0, 255, 255, // ciano
255, 255, 255, // branco
255, 223, 223, // branco quente
255, 223, 223, // "bege velho"
128, 0, 128, // "roxo"
255, 0, 255, // magenta
255, 255, 0, // amarelo
255, 165, 0}; // laranja
// iniciar fita rgb
#define LED_PIN 13
#define NUM_LEDS 8
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
Serial.begin(115200);
lcd.init(); // inicializar o lcd
lcd.backlight(); // Liga a luz de fundo do LCD.
// configurações padrão do wifi
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
// início da faixa rgb
pixels.begin();
pixels.show();
}
void setup_wifi() {
delay(10);
// Começamos conectando a uma rede WiFi.
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
lcdConnect(); // para LCD
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* message, unsigned int length) {
Serial.print("Message arrived on topic: ");
Serial.print(topic);
Serial.print(". Message: ");
String messageTemp;
for (int i = 0; i < length; i++) {
Serial.print((char)message[i]);
messageTemp += (char)message[i];
}
Serial.println();
// Se uma mensagem for recebida sobre o tópico, você verificará esta mensagem.
// Muda o estado de saída de acordo com a mensagem
if (String(topic) == "cheerlights") {
Serial.print("Changing color to ");
Serial.println(messageTemp);
setColor(messageTemp);
}
}
void reconnect() {
// Loop até estarmos reconectados
while (!client.connected()) {
lcdConnect();
Serial.print("Attempting MQTT connection...");
// Tentar conectar
if (client.connect(unique_identifier)) {
Serial.println("connected");
// Inscreva-se
client.subscribe("cheerlights");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Aguarde 5 segundos antes de tentar novamente.
delay(5000);
}
}
}
void setColor(String color) {
// Percorra a lista de cores para encontrar a cor correspondente.
for (int colorIndex = 0; colorIndex < 12; colorIndex++) {
if (color == colorName[colorIndex]) {
lastColor = colorIndex; // lembre-se da última cor
colorCount++; // aumentar a contagem
// Defina a cor de cada NeoPixel na fita
for (int pixel = 0; pixel < NUM_LEDS; pixel++) {
pixels.setPixelColor(pixel, pixels.Color (colorRGB [colorIndex][0], colorRGB [colorIndex][1], colorRGB [colorIndex][2]));
delay(100);
}
pixels.show();
}
}
}
void lcdConnect()
{
lcd.clear();
lcd.setCursor(0, 0); // linha 0
lcd.print("Connecting...");
lcd.setCursor(0, 1);
lcd.print("SSID:"); // linha 1
lcd.print(ssid);
}
void loop() {
lcd.clear();
if (!client.connected()) {
reconnect();
}else{
lcd.createChar(0, connected);
lcd.setCursor(15, 0);
lcd.write(byte(0));
}
client.loop();
// primeira linha
lcd.setCursor(0, 0);
lcd.print("Color: ");
lcd.print(colorName[lastColor]);
// segunda fila
lcd.setCursor(0, 1);
lcd.print("Changed ");
lcd.print(colorCount);
lcd.print(" times");
delay(1000); // devemos ter um atraso para conseguir ler o display
}
Common Course Links
Common Course Files
Recursos e referências
-
DocumentaçãoTutorial ESP32 52/55 - Página do documento SunFounder para CheerLightdocs.sunfounder.com
Arquivos📁
Nenhum arquivo disponível.