Hướng dẫn ESP32 47/55 - WS2812 CheerLights sử dụng MQTT qua Internet | Bộ kit IoT ESP32 của SunFounder
Trong hướng dẫn này, chúng ta sẽ tạo một hệ thống chiếu sáng đồng bộ sử dụng ESP32 và đèn LED WS2812 có thể được điều khiển từ xa qua MQTT. Hệ thống này cho phép nhiều người dùng thay đổi màu sắc của đèn cùng một lúc, tạo ra trải nghiệm kết nối bất kể vị trí địa lý. Dự án sử dụng bộ kit IoT SunFounder ESP32, bao gồm một vi điều khiển mạnh mẽ với khả năng Wi-Fi, lý tưởng cho các ứng dụng IoT.
Trong suốt video, chúng ta sẽ đi qua các bước thiết lập cần thiết, đấu dây và triển khai mã để đạt được hiệu ứng này. Nếu bạn cần làm rõ thêm, hãy xem video tại các mốc thời gian cụ thể (trong video tại mm:ss).
Giải thích về Phần cứng
Các thành phần chính của dự án này bao gồm vi điều khiển ESP32, dải đèn LED WS2812 và một broker MQTT. ESP32 là một vi điều khiển đa năng với Wi-Fi và Bluetooth tích hợp, cho phép kết nối Internet dễ dàng. Nó đóng vai trò là bộ não của dự án, xử lý giao tiếp và điều khiển dải đèn LED.
Dải đèn LED WS2812 bao gồm các đèn LED RGB có thể định địa chỉ riêng lẻ, có thể được điều khiển để hiển thị nhiều màu sắc khác nhau. Mỗi đèn LED có thể được bật hoặc tắt và đặt thành bất kỳ màu nào bằng một đường dữ liệu duy nhất, làm cho nó hoàn hảo cho các hiệu ứng ánh sáng động. Broker MQTT tạo điều kiện giao tiếp giữa các máy khách khác nhau, cho phép người dùng xuất bản và đăng ký các chủ đề điều khiển màu đèn LED.
Chi tiết Datasheet
| Nhà sản xuất | Adafruit |
|---|---|
| Số bộ phận | WS2812B |
| Điện áp Logic/IO | 3.5 - 5.5 V |
| Điện áp cung cấp | 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.2Vcc (thấp), 0.7Vcc (cao) |
| Sụt áp / RDS(on) / bão hòa | 0.5 V |
| Giới hạn nhiệt | Nhiệt độ hoạt động: -25 đến 85 °C |
| Đóng gói | SMD 5050 riêng lẻ |
| Ghi chú / biến thể | Có sẵn với nhiều chiều dài và cấu hình khác nhau |
- Đảm bảo nguồn điện đầy đủ cho dải WS2812 để tránh sụt áp.
- Sử dụng một điểm nối đất chung giữa ESP32 và dải đèn LED.
- Giữ các đường dữ liệu ngắn để ngăn suy giảm tín hiệu.
- Cân nhắc sử dụng tụ điện (1000μF) trên nguồn điện để làm mượt các xung điện áp.
- Sử dụng điện trở phù hợp trên đường dữ liệu để ngăn phản xạ tín hiệu.
- Lưu ý đến tổng dòng điện tiêu thụ của dải đèn LED; sử dụng nguồn ngoài khi cần thiết.
Hướng dẫn Đấu dây
Để đấu dây ESP32 với dải đèn LED WS2812, hãy bắt đầu bằng cách kết nối nguồn điện. Kết nối dây màu đỏ từ dải đèn LED với nguồn 5V và dây màu đen với đất. Tiếp theo, kết nối đường dữ liệu (dây màu vàng) từ dải WS2812 với chân 14 trên ESP32. Đảm bảo rằng ESP32 cũng được kết nối với cùng một điểm đất như dải đèn LED để duy trì một tham chiếu chung.
Sau khi thiết lập các kết nối nguồn và dữ liệu, kết nối ESP32 với máy tính của bạn bằng cáp micro USB để lập trình. Bạn sẽ cần đảm bảo ESP32 được bật nguồn trong khi lập trình để thiết lập kết nối. Sau khi đấu dây xong, bạn có thể tiến hành tải mã lên và kiểm tra thiết lập.

Ví dụ Mã & Hướng dẫn Chi tiết
Mã bắt đầu bằng việc bao gồm các thư viện cần thiết cho chức năng Wi-Fi và MQTT. Các định danh ssid và password được sử dụng để lưu trữ thông tin đăng nhập Wi-Fi của bạn, trong khi mqtt_server giữ địa chỉ của broker MQTT.
const char* ssid = "SSID";
const char* password = "PASSWORD";
const char* mqtt_server = "mqtt.cheerlights.com";
Tiếp theo, chúng ta định nghĩa các màu CheerLights được hỗ trợ và giá trị RGB tương ứng của chúng bằng cách sử dụng mảng. Điều này cho phép chương trình dễ dàng truy cập cài đặt màu dựa trên đầu vào của người dùng.
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" ...};
Hàm setup() khởi tạo giao tiếp nối tiếp, thiết lập kết nối Wi-Fi và chuẩn bị máy khách MQTT. Nó cũng bắt đầu dải đèn LED.
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
pixels.begin();
pixels.show();
}
Vòng lặp chính liên tục kiểm tra kết nối MQTT và xử lý các tin nhắn đến điều khiển màu đèn LED. Hàm callback() được kích hoạt khi một tin nhắn được nhận trên chủ đề đã đăng ký.
Trình diễn / Điều gì sẽ xảy ra
Sau khi mọi thứ được thiết lập và mã được tải lên, bạn sẽ có thể thay đổi màu của đèn LED WS2812 bằng cách gửi tin nhắn đến chủ đề MQTT. Nếu một người dùng khác thay đổi màu, tất cả các thiết bị được kết nối sẽ phản ánh sự thay đổi đó cùng một lúc. Hãy cẩn thận với các sự cố tiềm ẩn như đảo cực hoặc kết nối không đúng, có thể ngăn đèn LED hoạt động chính xác (trong video tại mm:ss).
Mốc thời gian Video
- 00:00 Bắt đầu
- 2:00 Giới thiệu
- 3:48 Trang tài liệu
- 6:33 Giải thích cách đấu dây
- 7:35 Giải thích mã Arduino
- 15:03 Chọn bo mạch ESP32 và cổng COMP trong Arduino IDE
- 16:46 Trình diễn CheerLights
/*********
: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 <WiFi.h>
#include <PubSubClient.h>
//#include <Wire.h>
#include <Adafruit_NeoPixel.h>
// Replace the next variables with your SSID/Password combination
const char* ssid = "SSID";
const char* password = "PASSWORD";
// 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);
// 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) {
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()) {
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]) {
// 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]));
}
pixels.show();
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
}
Common Course Links
Common Course Files
Tài nguyên & tài liệu tham khảo
-
Tài liệuESP32 Tutorial 47/55 - SunFounder doc page for cheer lightdocs.sunfounder.com
Tập tin📁
Không có tệp nào khả dụng.