Hľadať kód

Návod ESP32 52/55 - WS2812 CheerLights MQTT Globálna synchronizácia s LCD | SunFounder ESP32 IoT kit

Návod ESP32 52/55 - WS2812 CheerLights MQTT Globálna synchronizácia s LCD | SunFounder ESP32 IoT kit

V tomto návode vytvoríme projekt CheerLights pomocou ESP32, ktorý bude globálne synchronizovať farby cez MQTT. Tento projekt nebude meniť farby len na základe vstupov od iných používateľov, ale tiež zobrazí aktuálnu farbu a počet jej aktualizácií na LCD obrazovke. Výsledkom je zábavná demonštrácia možností IoT, ktorá ukazuje, ako môžu zariadenia interagovať a udržiavať používateľov v spojení na diaľku. Pre ďalšie objasnenie si pozrite video (vo videu o 00:00).

esp32-52-cheer-light-lcd-main

Vysvetlenie hardvéru

Na zostavenie tohto projektu budete potrebovať mikrokontrolér ESP32, LED pás WS2812 a LCD displej. ESP32 slúži ako mozog operácie, pričom využíva svoje vstavané Wi-Fi schopnosti na pripojenie k internetu a príjem MQTT správ. To umožňuje aktualizácie farieb LED v reálnom čase na základe globálneho vstupu od iných používateľov.

LED pás WS2812 je obľúbenou voľbou pre projekty vyžadujúce adresovateľné RGB LED. Každá LED môže byť ovládaná nezávisle, čo umožňuje bohaté farebné zobrazenia. LCD poskytne vizuálne potvrdenie aktuálnej farby a počtu jej zmien, čím zvyšuje interakciu s používateľom.

cheeLights_LCD

Podrobnosti z datasheetu

Výrobca SunFounder
Označenie dielu ESP32
Logické/IO napätie 3,3 V
Napájacie napätie 5 V
Výstupný prúd (na kanál) 20 mA
Špičkový prúd (na kanál) 60 mA
Odporúčaná PWM frekvencia 400 Hz
Vstupné logické úrovne 0,15 V (nízka), 0,8 V (vysoká)
Pokles napätia / RDS(on) / saturácia 0,2 V
Tepelné limity 85 °C
Puzdro Modul ESP32
Poznámky / varianty Zahŕňa vstavané Wi-Fi a Bluetooth

 

  • Zabezpečte správne napájanie ESP32 (5 V) a pásu WS2812 (5 V).
  • Použite spoločnú zem medzi ESP32 a LED pásom.
  • Implementujte správny MQTT broker na synchronizáciu farieb.
  • Venujte pozornosť pripojeniu dátového pinu pre WS2812 (pin 14 podľa kódu).
  • Buďte opatrní s počtom LED; prekročenie výkonových limitov vyžaduje ďalšie zdroje napájania.

Pokyny na zapojenie

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

Na zapojenie komponentov začnite pripojením LED pásu WS2812. Pripojte uzemňovací pin (zvyčajne čierny) LED pásu k uzemňovaciemu pinu na ESP32. Ďalej pripojte VCC pin (zvyčajne červený) LED pásu k 5V výstupu na ESP32. Nakoniec pripojte dátový pin (často žltý) na GPIO pin 14 na ESP32.

Pre LCD pripojte uzemňovací pin (často čierny) k zemi na ESP32. VCC pin (zvyčajne červený) by mal byť pripojený k 5V výstupu. SDA pin (zvyčajne sivý) sa pripája na GPIO pin 21, zatiaľ čo SCL pin (zvyčajne biely) sa pripája na GPIO pin 22. Toto nastavenie umožňuje ESP32 komunikovať s LCD a zobrazovať informácie podľa potreby.

Príklady kódu a vysvetlenie

Vo funkcii setup inicializujeme LCD a pripojíme sa k Wi-Fi. Kód nižšie ukazuje, ako definovať potrebné knižnice a nastaviť LCD:

#include  
#include 
LiquidCrystal_I2C lcd(0x27, 16,2);  // nastavenie adresy LCD
void setup() {
  Serial.begin(115200);
  lcd.init(); // inicializácia LCD 
  lcd.backlight(); // Zapne podsvietenie LCD.
}

Toto inicializuje LCD na použitie, čo mu umožňuje zobrazovať správy. Nasledujúci výňatok ukazuje, ako sa vytvorí Wi-Fi pripojenie:

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

Táto funkcia vytvorí pripojenie k určenej Wi-Fi sieti, pričom počas pripájania zobrazuje správu na LCD. Nakoniec je logika zmeny farby spracovaná vo funkcii 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);
  }
}

Táto funkcia počúva prichádzajúce správy na téme "cheerlights" a podľa toho aktualizuje farbu. Celý kód sa načíta nižšie pod článkom, takže si ho určite preštudujte pre úplnú implementáciu.

Demonštrácia / Čo očakávať

Po dokončení projektu môžete očakávať, že LED pás bude meniť farby na základe vstupov z globálneho MQTT kanála. LCD zobrazí aktuálny názov farby a počet jej zmien. Ak odpojíte internet, LCD zobrazí "Pripájam sa..." (Connecting...), kým sa neobnoví pripojenie (vo videu o 12:30).

Medzi bežné úskalia patrí zabezpečenie správnych pinov pre dátové pripojenia a overenie presnosti prihlasovacích údajov Wi-Fi. Ak sa v SSID alebo hesle vyskytnú nezrovnalosti, ESP32 sa nepripojí a LCD bude naďalej zobrazovať správu o pripájaní.

Časové značky videa

  • 00:00 Štart
  • 1:59 Úvod do projektu
  • 6:16 Vysvetlenie zapojenia
  • 8:13 Vysvetlenie kódu pre Arduino
  • 14:26 Výber dosky ESP32 a COM portu v Arduino IDE
  • 16:07 Ukážka CheerLight s LCD

Obrázky

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






}

Zdroje a referencie

Súbory📁

Žiadne súbory nie sú k dispozícii.