Soek Kode

ESP32 Tutoriaal 52/55 - WS2812 CheerLights MQTT Globale Sinchronisasie met LCD | SunFounder ESP32 IoT-kit

ESP32 Tutoriaal 52/55 - WS2812 CheerLights MQTT Globale Sinchronisasie met LCD | SunFounder ESP32 IoT-kit

In hierdie tutoriaal gaan ons 'n CheerLights-projek skep met behulp van die ESP32, wat kleure wêreldwyd deur MQTT sal sinkroniseer. Hierdie projek sal nie net kleure verander op grond van insette van ander gebruikers nie, maar ook die huidige kleur en hoeveel keer dit opgedateer is op 'n LCD-skerm vertoon. Die uitkoms is 'n prettige demonstrasie van IoT-vermoëns, wat wys hoe toestelle kan interaksie en gebruikers verbind hou oor afstande. Vir addisionele verduideliking, kyk die video by (in video by 00:00).

esp32-52-cheer-light-lcd-main

Hardeware Verduidelik

Om hierdie projek te bou, sal jy 'n ESP32-mikrobeheerder, 'n WS2812-LED-strook en 'n LCD-skerm nodig hê. Die ESP32 dien as die brein van die operasie, en gebruik sy ingeboude Wi-Fi-vermoëns om aan die internet te koppel en MQTT-boodskappe te ontvang. Dit maak intydse opdaterings aan die LED-kleure moontlik op grond van 'n globale inset van ander gebruikers.

Die WS2812-LED-strook is 'n gewilde keuse vir projekte wat adresseerbare RGB-LED's vereis. Elke LED kan onafhanklik beheer word, wat ryk kleurvertonings moontlik maak. Die LCD sal 'n visuele bevestiging van die huidige kleur en die aantal kere wat dit verander is, verskaf, wat gebruikersinteraksie verbeter.

cheeLights_LCD

Datablad Besonderhede

Vervaardiger SunFounder
Deelnommer ESP32
Logika/IO-spanning 3.3 V
Toevoerspanning 5 V
Uitsetstroom (per kanaal) 20 mA
Piekstroom (per kanaal) 60 mA
PWM-frekwensie riglyn 400 Hz
Inset logika drempels 0.15 V (laag), 0.8 V (hoog)
Spanningsval / RDS(on) / versadiging 0.2 V
Termiese limiete 85 °C
Pakket ESP32-module
Notas / variante Sluit ingeboude Wi-Fi en Bluetooth in

 

  • Verseker behoorlike kragtoevoer na die ESP32 (5 V) en WS2812-strook (5 V).
  • Gebruik 'n gemeenskaplike grond tussen die ESP32 en die LED-strook.
  • Implementeer 'n behoorlike MQTT-broker vir kleursinkronisasie.
  • Let op die data-penverbinding vir die WS2812 (pen 14 soos per die kode).
  • Wees versigtig met die aantal LED's; die oorskry van kraglimiete vereis addisionele kragbronne.

Bedradingsinstruksies

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

Om die komponente te bedraad, begin deur die WS2812-LED-strook te koppel. Koppel die grondpen (gewoonlik swart) van die LED-strook aan die grondpen op die ESP32. Koppel dan die VCC-pen (gewoonlik rooi) van die LED-strook aan die 5V-uitset op die ESP32. Laastens, koppel die data-pen (dikwels geel) aan GPIO-pen 14 op die ESP32.

Vir die LCD, koppel die grondpen (dikwels swart) aan die grond op die ESP32. Die VCC-pen (gewoonlik rooi) moet aan die 5V-uitset gekoppel word. Die SDA-pen (tipies grys) koppel aan GPIO-pen 21, terwyl die SCL-pen (gewoonlik wit) aan GPIO-pen 22 koppel. Hierdie opstelling laat die ESP32 toe om met die LCD te kommunikeer en inligting soos nodig te vertoon.

Kode Voorbeelde & Deurloop

In die opstellingsfunksie initialiseer ons die LCD en koppel aan Wi-Fi. Die kode hieronder demonstreer hoe om die nodige biblioteke te definieer en die LCD op te stel:

#include  
#include 
LiquidCrystal_I2C lcd(0x27, 16,2);  // stel die LCD-adres
void setup() {
  Serial.begin(115200);
  lcd.init(); // initialiseer die lcd 
  lcd.backlight(); // Skakel die LCD-agterlig aan.
}

Dit initialiseer die LCD vir gebruik, wat dit toelaat om boodskappe te vertoon. Die volgende uittreksel wys hoe die Wi-Fi-verbinding tot stand gebring word:

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

Hierdie funksie stel 'n verbinding tot die gespesifiseerde Wi-Fi-netwerk, en vertoon 'n boodskap op die LCD terwyl dit koppel. Laastens word die kleurveranderingslogika in die terugroepfunksie hanteer:

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);
  }
}

Hierdie funksie luister vir inkomende boodskappe op die "cheerlights"-onderwerp en werk die kleur dienooreenkomstig op. Die volledige kode laai onder die artikel, so maak seker om dit te hersien vir die volledige implementering.

Demonstrasie / Wat om te Verwacht

By voltooiing van die projek kan jy verwag dat die LED-strook kleure sal verander op grond van insette van 'n globale MQTT-voer. Die LCD sal die huidige kleurnaam en hoeveel keer dit verander is, vertoon. As jy die internet ontkoppel, sal die LCD "Connecting..." aandui totdat 'n verbinding hervestig word (in video by 12:30).

Algemene slaggate sluit in om te verseker dat die korrekte penne vir dataverbindings gebruik word en dat die Wi-Fi-geloofsbriewe akkuraat is. As daar enige teenstrydighede in die SSID of wagwoord is, sal die ESP32 nie koppel nie, en die LCD sal aanhou om die koppelboodskap te vertoon.

Video Tydstempels

  • 00:00 Begin
  • 1:59 Inleiding tot die projek
  • 6:16 Bedrading verduidelik
  • 8:13 Arduino-kode verduidelik
  • 14:26 Kies ESP32-bord en COM-poort op Arduino IDE
  • 16:07 CheerLight-demonstrasie met LCD

Beelde

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
Taal: 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
  






}

Hulpbronne en verwysings

Lêers📁

Geen lêers beskikbaar.