Search Code

ESP32 Оқулығы 52/55 - WS2812 CheerLights MQTT жаһандық синхрондау LCD-пен | SunFounder ESP32 IoT жиынтығы

ESP32 Оқулығы 52/55 - WS2812 CheerLights MQTT жаһандық синхрондау LCD-пен | SunFounder ESP32 IoT жиынтығы

Бұл оқулықта біз ESP32 көмегімен CheerLights жобасын жасаймыз, ол MQTT арқылы түстерді жаһандық деңгейде синхрондайды. Бұл жоба басқа пайдаланушылардың енгізулеріне негізделген түстерді өзгертіп қана қоймай, сонымен қатар ағымдағы түсті және оның қанша рет жаңартылғанын LCD экранда көрсетеді. Нәтиже — IoT мүмкіндіктерінің қызықты демонстрациясы, құрылғылардың өзара әрекеттесуін және пайдаланушылардың қашықтыққа қарамастан байланыста болуын көрсетеді. Қосымша түсініктеме алу үшін бейнені қараңыз (бейнеде 00:00).

esp32-52-cheer-light-lcd-main

Аппараттық құрал түсіндірмесі

Бұл жобаны құру үшін сізге ESP32 микроконтроллері, WS2812 жарықдиодты жолағы және LCD дисплей қажет. ESP32 операцияның миы ретінде қызмет етеді, оның кірістірілген Wi-Fi мүмкіндіктерін пайдаланып интернетке қосылады және MQTT хабарламаларын қабылдайды. Бұл басқа пайдаланушылардың жаһандық енгізуіне негізделген жарықдиодты түстерді нақты уақытта жаңартуға мүмкіндік береді.

WS2812 жарықдиодты жолағы — мекенжайланатын RGB жарықдиодтарын қажет ететін жобалар үшін танымал таңдау. Әрбір жарықдиодты тәуелсіз басқаруға болады, бұл бай түс дисплейлерін жасауға мүмкіндік береді. LCD ағымдағы түстің және оның өзгерту санының визуалды растауын қамтамасыз етеді, пайдаланушының өзара әрекеттесуін жақсартады.

cheeLights_LCD

Деректер парағының мәліметтері

Өндіруші SunFounder
Бөлшек нөмірі ESP32
Логика/IO кернеуі 3.3 В
Қоректендіру кернеуі 5 В
Шығыс тогы (арнаға) 20 мА
Ең жоғары ток (арнаға) 60 мА
PWM жиілігі бойынша нұсқау 400 Гц
Кіріс логикалық шектері 0.15 В (төмен), 0.8 В (жоғары)
Кернеу төмендеуі / RDS(on) / қанығу 0.2 В
Жылулық шектер 85 °C
Қаптама ESP32 модулі
Ескертулер / нұсқалар Кірістірілген Wi-Fi және Bluetooth қамтиды

 

  • ESP32 (5 В) және WS2812 жолағына (5 В) дұрыс қоректендіруді қамтамасыз етіңіз.
  • ESP32 мен жарықдиодты жолақ арасында ортақ жерді пайдаланыңыз.
  • Түстерді синхрондау үшін дұрыс MQTT брокерін енгізіңіз.
  • WS2812 үшін деректер істікшесінің қосылымына назар аударыңыз (кодқа сәйкес 14 істікше).
  • Жарықдиодтар санына абай болыңыз; қуат шектерінен асып кету қосымша қуат көздерін қажет етеді.

Сым қосу нұсқаулары

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

Компоненттерді қосу үшін WS2812 жарықдиодты жолағын қосудан бастаңыз. Жарықдиодты жолақтың жер істікшесін (әдетте қара) ESP32-дегі жер істікшесіне қосыңыз. Содан кейін жарықдиодты жолақтың VCC істікшесін (әдетте қызыл) ESP32-дегі 5В шығысына қосыңыз. Соңында, деректер істікшесін (көбінесе сары) ESP32-дегі GPIO 14 істікшесіне қосыңыз.

LCD үшін жер істікшесін (көбінесе қара) ESP32-дегі жерге қосыңыз. VCC істікшесі (әдетте қызыл) 5В шығысына қосылуы керек. 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 қосылды");
}

Бұл функция көрсетілген 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" тақырыбындағы кіріс хабарламаларды тыңдайды және түсті сәйкесінше жаңартады. Толық код мақаланың астында жүктеледі, сондықтан толық іске асыру үшін оны қарап шығуды ұмытпаңыз.

Демонстрация / Не күтуге болады

Жобаны аяқтағаннан кейін, жарықдиодты жолақтың жаһандық MQTT ағынынан енгізулерге негізделген түстерді өзгертетінін күтуге болады. LCD ағымдағы түс атауын және оның қанша рет өзгертілгенін көрсетеді. Егер интернеттен ажыратсаңыз, LCD қайта қосылғанға дейін "Қосылуда..." деп көрсетеді (бейнеде 12:30).

Жиі кездесетін қателіктерге деректер қосылымдары үшін дұрыс істікшелердің қолданылуын қамтамасыз ету және Wi-Fi тіркелгі деректерінің дәлдігін тексеру жатады. Егер SSID немесе құпия сөзде сәйкессіздіктер болса, ESP32 қосыла алмайды және LCD қосылу хабарламасын көрсетуді жалғастырады.

Бейне уақыт белгілері

  • 00:00 Бастау
  • 1:59 Жобаға кіріспе
  • 6:16 Сымдарды қосу түсіндірмесі
  • 8:13 Arduino коды түсіндірмесі
  • 14:26 Arduino IDE-де ESP32 платасын және COM портын таңдау
  • 16:07 LCD-мен CheerLight демонстрациясы

Суреттер

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
Тіл: 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
  






}

Ресурстар мен сілтемелер

Файлдар📁

Файлдар жоқ.