Hướng dẫn ESP32 52/55 - Đồng bộ toàn cầu WS2812 CheerLights MQTT với LCD | Bộ kit IoT ESP32 SunFounder
Trong hướng dẫn này, chúng ta sẽ tạo một dự án CheerLights sử dụng ESP32, giúp đồng bộ màu sắc trên toàn cầu thông qua MQTT. Dự án này không chỉ thay đổi màu sắc dựa trên đầu vào từ những người dùng khác mà còn hiển thị màu hiện tại và số lần màu đã được cập nhật trên màn hình LCD. Kết quả là một minh chứng thú vị về khả năng của IoT, cho thấy các thiết bị có thể tương tác và giữ kết nối giữa người dùng qua khoảng cách địa lý. Để hiểu rõ hơn, hãy xem video tại (trong video ở phút 00:00).
Giải thích về Phần cứng
Để xây dựng dự án này, bạn cần một vi điều khiển ESP32, một dải đèn LED WS2812 và một màn hình LCD. ESP32 đóng vai trò là bộ não của hoạt động, sử dụng khả năng Wi-Fi tích hợp để kết nối internet và nhận các tin nhắn MQTT. Điều này cho phép cập nhật màu LED theo thời gian thực dựa trên đầu vào toàn cầu từ những người dùng khác.
Dải đèn LED WS2812 là lựa chọn phổ biến cho các dự án cần đèn LED RGB có thể định địa chỉ. Mỗi đèn LED có thể được điều khiển độc lập, cho phép hiển thị màu sắc phong phú. LCD sẽ cung cấp xác nhận trực quan về màu hiện tại và số lần màu đã được thay đổi, tăng cường tương tác với người dùng.
Chi tiết Datasheet
| Nhà sản xuất | SunFounder |
|---|---|
| Số bộ phận | ESP32 |
| Điện áp Logic/IO | 3.3 V |
| Điện áp cấp nguồn | 5 V |
| Dòng điện đầu ra (mỗi kênh) | 20 mA |
| Dòng điện đỉnh (mỗi kênh) | 60 mA |
| Hướng dẫn tần số PWM | 400 Hz |
| Ngưỡng logic đầu vào | 0.15 V (thấp), 0.8 V (cao) |
| Sụt áp / RDS(on) / bão hòa | 0.2 V |
| Giới hạn nhiệt | 85 °C |
| Đóng gói | Module ESP32 |
| Ghi chú / biến thể | Bao gồm Wi-Fi và Bluetooth tích hợp |
- Đảm bảo cấp nguồn đúng cho ESP32 (5 V) và dải WS2812 (5 V).
- Sử dụng chung một điểm nối đất giữa ESP32 và dải đèn LED.
- Triển khai một MQTT broker phù hợp để đồng bộ màu sắc.
- Chú ý đến kết nối chân dữ liệu cho WS2812 (chân 14 theo mã).
- Cẩn thận với số lượng đèn LED; vượt quá giới hạn nguồn yêu cầu thêm nguồn điện phụ.
Hướng dẫn Đấu dây


Để đấu dây các thành phần, bắt đầu bằng cách kết nối dải đèn LED WS2812. Kết nối chân đất (thường màu đen) của dải đèn LED với chân đất trên ESP32. Tiếp theo, kết nối chân VCC (thường màu đỏ) của dải đèn LED với đầu ra 5V trên ESP32. Cuối cùng, kết nối chân dữ liệu (thường màu vàng) với chân GPIO 14 trên ESP32.
Đối với LCD, kết nối chân đất (thường màu đen) với chân đất trên ESP32. Chân VCC (thường màu đỏ) nên được kết nối với đầu ra 5V. Chân SDA (thường màu xám) kết nối với chân GPIO 21, trong khi chân SCL (thường màu trắng) kết nối với chân GPIO 22. Thiết lập này cho phép ESP32 giao tiếp với LCD và hiển thị thông tin khi cần.
Ví dụ Mã & Hướng dẫn Chi tiết
Trong hàm setup, chúng ta khởi tạo LCD và kết nối Wi-Fi. Mã dưới đây minh họa cách định nghĩa các thư viện cần thiết và thiết lập LCD:
#include
#include
LiquidCrystal_I2C lcd(0x27, 16,2); // đặt địa chỉ LCD
void setup() {
Serial.begin(115200);
lcd.init(); // khởi tạo LCD
lcd.backlight(); // Bật đèn nền LCD.
}
Điều này khởi tạo LCD để sử dụng, cho phép hiển thị thông điệp. Đoạn trích tiếp theo cho thấy cách thiết lập kết nối Wi-Fi:
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
lcdConnect(); //cho LCD
delay(500);
}
Serial.println("WiFi connected");
}
Hàm này thiết lập kết nối đến mạng Wi-Fi đã chỉ định, hiển thị thông điệp trên LCD trong khi kết nối. Cuối cùng, logic thay đổi màu được xử lý trong hàm 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);
}
}
Hàm này lắng nghe các tin nhắn đến trên chủ đề "cheerlights" và cập nhật màu tương ứng. Mã đầy đủ được tải xuống bên dưới bài viết, vì vậy hãy đảm bảo xem lại để có phần triển khai hoàn chỉnh.
Trình diễn / Điều gì sẽ xảy ra
Sau khi hoàn thành dự án, bạn có thể mong đợi dải đèn LED thay đổi màu sắc dựa trên đầu vào từ nguồn cấp MQTT toàn cầu. LCD sẽ hiển thị tên màu hiện tại và số lần màu đã được thay đổi. Nếu bạn ngắt kết nối internet, LCD sẽ hiển thị "Connecting..." cho đến khi kết nối được thiết lập lại (trong video ở phút 12:30).
Các lỗi thường gặp bao gồm đảm bảo sử dụng đúng chân cho kết nối dữ liệu và xác minh thông tin đăng nhập Wi-Fi chính xác. Nếu có bất kỳ sai lệch nào trong SSID hoặc mật khẩu, ESP32 sẽ không kết nối được và LCD sẽ tiếp tục hiển thị thông điệp kết nối.
Mốc thời gian Video
- 00:00 Bắt đầu
- 1:59 Giới thiệu về dự án
- 6:16 Giải thích cách đấu dây
- 8:13 Giải thích mã Arduino
- 14:26 Chọn bo mạch ESP32 và cổng COM trên Arduino IDE
- 16:07 Trình diễn CheerLight với LCD
/*********
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
}
Common Course Links
Common Course Files
Tài nguyên & tài liệu tham khảo
-
Tài liệuESP32 Tutorial 52/55- SunFounder doc page for CheerLightdocs.sunfounder.com
Tập tin📁
Không có tệp nào khả dụng.