Search Code

Tutorial ESP32 52/55 - Sincronizare globală WS2812 CheerLights MQTT cu LCD | Kit IoT ESP32 SunFounder

Tutorial ESP32 52/55 - Sincronizare globală WS2812 CheerLights MQTT cu LCD | Kit IoT ESP32 SunFounder

În acest tutorial, vom crea un proiect CheerLights folosind ESP32, care va sincroniza culorile la nivel global prin MQTT. Acest proiect nu doar că va schimba culorile pe baza intrărilor de la alți utilizatori, dar va afișa și culoarea curentă și de câte ori a fost actualizată pe un ecran LCD. Rezultatul este o demonstrație distractivă a capacităților IoT, evidențiind modul în care dispozitivele pot interacționa și pot menține utilizatorii conectați pe distanțe. Pentru clarificări suplimentare, urmăriți videoclipul la (în videoclip la 00:00).

esp32-52-cheer-light-lcd-main

Hardware Explicat

Pentru a construi acest proiect, veți avea nevoie de un microcontroler ESP32, o bandă LED WS2812 și un afișaj LCD. ESP32 servește ca creier al operațiunii, utilizând capacitățile sale Wi-Fi integrate pentru a se conecta la internet și a primi mesaje MQTT. Acest lucru permite actualizări în timp real ale culorilor LED pe baza unei intrări globale de la alți utilizatori.

Banda LED WS2812 este o alegere populară pentru proiectele care necesită LED-uri RGB adresabile. Fiecare LED poate fi controlat independent, permițând afișaje bogate în culori. LCD-ul va oferi o confirmare vizuală a culorii curente și a numărului de modificări, îmbunătățind interacțiunea utilizatorului.

cheeLights_LCD

Detalii din Fișa Tehnică

Producător SunFounder
Număr de piesă ESP32
Tensiune logică/IO 3,3 V
Tensiune de alimentare 5 V
Curent de ieșire (pe canal) 20 mA
Curent de vârf (pe canal) 60 mA
Ghid frecvență PWM 400 Hz
Praguri logice de intrare 0,15 V (jos), 0,8 V (sus)
Cădere de tensiune / RDS(on) / saturație 0,2 V
Limite termice 85 °C
Pachet Modul ESP32
Note / variante Include Wi-Fi și Bluetooth integrate

 

  • Asigurați o alimentare adecvată pentru ESP32 (5 V) și banda WS2812 (5 V).
  • Utilizați o masă comună între ESP32 și banda LED.
  • Implementați un broker MQTT adecvat pentru sincronizarea culorilor.
  • Acordați atenție conexiunii pinului de date pentru WS2812 (pinul 14 conform codului).
  • Fiți atenți la numărul de LED-uri; depășirea limitelor de putere necesită surse de alimentare suplimentare.

Instrucțiuni de Cablare

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

Pentru a cabla componentele, începeți prin conectarea benzii LED WS2812. Conectați pinul de masă (de obicei negru) al benzii LED la pinul de masă de pe ESP32. Apoi, conectați pinul VCC (de obicei roșu) al benzii LED la ieșirea de 5V de pe ESP32. În final, conectați pinul de date (adesea galben) la pinul GPIO 14 de pe ESP32.

Pentru LCD, conectați pinul de masă (adesea negru) la masa de pe ESP32. Pinul VCC (de obicei roșu) ar trebui conectat la ieșirea de 5V. Pinul SDA (de obicei gri) se conectează la pinul GPIO 21, în timp ce pinul SCL (de obicei alb) se conectează la pinul GPIO 22. Această configurare permite ESP32 să comunice cu LCD-ul și să afișeze informații după cum este necesar.

Exemple de Cod & Explicații

În funcția de configurare, inițializăm LCD-ul și ne conectăm la Wi-Fi. Codul de mai jos demonstrează cum să definiți bibliotecile necesare și să configurați LCD-ul:

#include  
#include 
LiquidCrystal_I2C lcd(0x27, 16,2);  // setați adresa LCD
void setup() {
  Serial.begin(115200);
  lcd.init(); // inițializați LCD-ul 
  lcd.backlight(); // Pornește lumina de fundal a LCD-ului.
}

Aceasta inițializează LCD-ul pentru utilizare, permițându-i să afișeze mesaje. Următorul extras arată cum se stabilește conexiunea Wi-Fi:

void setup_wifi() {
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    lcdConnect(); //pentru LCD
    delay(500);
  }
  Serial.println("WiFi conectat");
}

Această funcție stabilește o conexiune la rețeaua Wi-Fi specificată, afișând un mesaj pe LCD în timpul conectării. În cele din urmă, logica de schimbare a culorii este gestionată în funcția 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);
  }
}

Această funcție ascultă mesajele primite pe subiectul "cheerlights" și actualizează culoarea în consecință. Codul complet este încărcat mai jos în articol, așa că asigurați-vă că îl revizuiți pentru implementarea completă.

Demonstrație / Ce să Vă Așteptați

La finalizarea proiectului, vă puteți aștepta ca banda LED să schimbe culorile pe baza intrărilor dintr-un flux MQTT global. LCD-ul va afișa numele culorii curente și de câte ori a fost schimbată. Dacă deconectați internetul, LCD-ul va indica "Connecting..." până când conexiunea este restabilită (în videoclip la 12:30).

Capcanele comune includ asigurarea că pinii corecți sunt utilizați pentru conexiunile de date și verificarea că acreditările Wi-Fi sunt corecte. Dacă există discrepanțe în SSID sau parolă, ESP32 nu se va conecta, iar LCD-ul va continua să afișeze mesajul de conectare.

Marcaje Temporale din Videoclip

  • 00:00 Start
  • 1:59 Introducere în proiect
  • 6:16 Conexiunile explicate
  • 8:13 Codul Arduino explicat
  • 14:26 Selectarea plăcii ESP32 și a portului COM în Arduino IDE
  • 16:07 Demonstrație CheerLight cu LCD

Imagini

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
Limba: C++
/*********
This is the origianl code from Examples->iot_5_cheerlight of SunFounder
full video instrucions https://youtu.be/xEqmxMiF-E8
📚⬇️ Download and resource page https://robojax.com/RJT685

I have added LCD to display:
1-Color name
2-Count the number of times the color is updated
3-Showon LCD if wifi is connected
4-Show connecting if not connected or disconnected

Written by Ahmad Shamshiri
www.Robojax.com
Dec 29, 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);  // set the LCD address to 0x27 for a 16 chars and 2 line display

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>



// Replace the next variables with your SSID/Password combination
const char* ssid = "dars";
const char* password = "5152535455";

// Add your MQTT Broker address:
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;


// Define the supported CheerLights colors and their RGB values
String colorName[] = {"red", "pink", "green", "blue", "cyan", "white", "warmwhite", "oldlace", "purple", "magenta", "yellow", "orange"};

int colorRGB[][3] = { 255,   0,   0,  // "red"
                      255, 192, 203,  // "pink"
                        0, 255,   0,  // "green"
                        0,   0, 255,  // "blue"
                        0, 255, 255,  // "cyan"
                      255, 255, 255,  // "white"
                      255, 223, 223,  // "warmwhite"
                      255, 223, 223,  // "oldlace"
                      128,   0, 128,  // "purple"
                      255,   0, 255,  // "magenta"
                      255, 255,   0,  // "yellow"
                      255, 165,   0}; // "orange"

// init rgb strip 
#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();// initialize the lcd 
  lcd.backlight(); // Turns on the LCD backlight.

  // wifi default settings
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);

  // rgb strip begin
  pixels.begin();
  pixels.show(); 

}

void setup_wifi() {
  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    lcdConnect();//for 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();

  // If a message is received on the topic, you will check this message.
  // Changes the output state according to the message
  if (String(topic) == "cheerlights") {
    Serial.print("Changing color to ");
    Serial.println(messageTemp);
    setColor(messageTemp);
  }
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
  lcdConnect();
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect(unique_identifier)) {
      Serial.println("connected");
      // Subscribe
      client.subscribe("cheerlights");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setColor(String color) {
  // Loop through the list of colors to find the matching color
  for (int colorIndex = 0; colorIndex < 12; colorIndex++) {
    if (color == colorName[colorIndex]) {
        lastColor = colorIndex;//remeber the last color
        colorCount++;//increment the count
      // Set the color of each NeoPixel on the strip
      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); //line 0
    lcd.print("Connecting...");   
    lcd.setCursor(0, 1); 
    lcd.print("SSID:"); //line 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();


  //first row
  lcd.setCursor(0, 0);
  lcd.print("Color: ");  
  lcd.print(colorName[lastColor]);

  //second row
  lcd.setCursor(0, 1);
  lcd.print("Changed ");  
  lcd.print(colorCount);
  lcd.print(" times");

  delay(1000);//we must have delay to able to read the display
  






}

Resurse și referințe

Fișiere📁

Nu sunt disponibile fișiere.