Código de Pesquisa

Tutorial ESP32 52/55 - Sincronização Global WS2812 CheerLights MQTT com LCD | Kit IoT SunFounder ESP32

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).

esp32-52-luz-anímica-lcd-principal

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.

cheeLights_LCD

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

ESP32-11_LCD-wiring
esp32-47-cheer-light-wiring

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

Imagens

ESP32-11_LCD-wiring
ESP32-11_LCD-wiring
esp32-47-cheer-light-wiring
esp32-47-cheer-light-wiring
esp32-52-cheer-light-lcd-main
esp32-52-cheer-light-lcd-main
cheeLights_LCD
cheeLights_LCD
853-ESP32 Tutorial 52/55- CheerLight MQTT and LCD
Idioma: C++
/*
 * 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







}

Recursos e referências

Arquivos📁

Nenhum arquivo disponível.