Search Code

ESP32 Упатство 52/55 - WS2812 CheerLights MQTT Глобална синхронизација со LCD | SunFounder ESP32 IoT комплет

ESP32 Упатство 52/55 - WS2812 CheerLights MQTT Глобална синхронизација со LCD | SunFounder ESP32 IoT комплет

Во ова упатство, ќе креираме CheerLights проект користејќи ESP32, кој глобално ќе синхронизира бои преку MQTT. Овој проект не само што ќе менува бои врз основа на влезови од други корисници, туку и ќе ја прикажува моменталната боја и колку пати е ажурирана на LCD екран. Резултатот е забавна демонстрација на IoT можностите, прикажувајќи како уредите можат да комуницираат и да ги одржуваат корисниците поврзани на далечина. За дополнително појаснување, погледнете го видеото на (во видеото на 00:00).

esp32-52-cheer-light-lcd-main

Објаснување на хардверот

За да го изградите овој проект, ќе ви требаат ESP32 микроконтролер, WS2812 LED лента и LCD дисплеј. ESP32 служи како мозок на операцијата, користејќи ги своите вградени Wi-Fi можности за да се поврзе на интернет и да прима MQTT пораки. Ова овозможува ажурирања во реално време на LED боите врз основа на глобален влез од други корисници.

WS2812 LED лентата е популарен избор за проекти кои бараат адресирани RGB LED диоди. Секоја LED диода може да се контролира независно, овозможувајќи богати прикази на бои. LCD-то ќе обезбеди визуелна потврда на моменталната боја и бројот на пати кога е променета, подобрувајќи ја интеракцијата со корисникот.

cheeLights_LCD

Детали од техничката документација

Производител SunFounder
Број на дел ESP32
Логички/IO напон 3.3 V
Напон на напојување 5 V
Излезна струја (по канал) 20 mA
Врвна струја (по канал) 60 mA
Насоки за PWM фреквенција 400 Hz
Прагови на влезна логика 0.15 V (ниско), 0.8 V (високо)
Пад на напон / RDS(on) / заситување 0.2 V
Термички граници 85 °C
Пакет ESP32 модул
Белешки / варијанти Вклучува вграден Wi-Fi и Bluetooth

 

  • Обезбедете соодветно напојување на ESP32 (5 V) и WS2812 лентата (5 V).
  • Користете заедничка земја помеѓу ESP32 и LED лентата.
  • Имплементирајте соодветен MQTT брокер за синхронизација на боите.
  • Обрнете внимание на поврзувањето на пиног за податоци за WS2812 (пин 14 според кодот).
  • Бидете внимателни со бројот на LED диоди; надминувањето на границите на моќност бара дополнителни извори на напојување.

Инструкции за поврзување

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

За да ги поврзете компонентите, започнете со поврзување на WS2812 LED лентата. Поврзете го пинот за земја (обично црн) од LED лентата со пинот за земја на ESP32. Потоа, поврзете го VCC пинот (обично црвен) од LED лентата со 5V излезот на ESP32. Конечно, поврзете го пинот за податоци (често жолт) со GPIO пин 14 на ESP32.

За LCD-то, поврзете го пинот за земја (често црн) со земјата на ESP32. VCC пинот (обично црвен) треба да се поврзе со 5V излезот. SDA пинот (обично сив) се поврзува со GPIO пин 21, додека SCL пинот (обично бел) се поврзува со GPIO пин 22. Оваа поставка му овозможува на ESP32 да комуницира со LCD-то и да прикажува информации по потреба.

Примери на код и објаснување

Во функцијата за поставување, го иницијализираме LCD-то и се поврзуваме на Wi-Fi. Кодот подолу демонстрира како да ги дефинирате потребните библиотеки и да го поставите LCD-то:

#include  
#include 
LiquidCrystal_I2C lcd(0x27, 16,2);  // поставете ја LCD адресата
void setup() {
  Serial.begin(115200);
  lcd.init(); // иницијализирајте го LCD-то 
  lcd.backlight(); // Го вклучува LCD позадинското осветлување.
}

Ова го иницијализира LCD-то за употреба, овозможувајќи му да прикажува пораки. Следниот извадок покажува како се воспоставува Wi-Fi врската:

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

Оваа функција воспоставува врска со одредената Wi-Fi мрежа, прикажувајќи порака на LCD-то додека се поврзува. Конечно, логиката за промена на бојата се обработува во функцијата за повратен повик:

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

Оваа функција слуша за дојдовни пораки на темата "cheerlights" и соодветно ја ажурира бојата. Целосниот код се вчитува под статијата, затоа проверете го за целосната имплементација.

Демонстрација / Што да очекувате

По завршувањето на проектот, можете да очекувате LED лентата да менува бои врз основа на влезови од глобален MQTT довод. LCD-то ќе го прикажува името на моменталната боја и колку пати е променета. Ако го исклучите интернетот, LCD-то ќе прикажува "Connecting..." додека не се воспостави повторна врска (во видеото на 12:30).

Вообичаени грешки вклучуваат осигурување дека се користат точните пинови за поврзување на податоци и проверка дека Wi-Fi акредитивите се точни. Ако има какви било несогласувања во SSID или лозинката, ESP32 нема да успее да се поврзе, и LCD-то ќе продолжи да ја прикажува пораката за поврзување.

Временски ознаки на видеото

  • 00:00 Почеток
  • 1:59 Вовед во проектот
  • 6:16 Објаснување на жиците
  • 8:13 Објаснување на Arduino кодот
  • 14:26 Избор на ESP32 плоча и COM порта во Arduino IDE
  • 16:07 Демонстрација на CheerLight со LCD

Images

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






}

Resources & references

Files📁

No files available.