บทเรียน ESP32 47/55 - WS2812 CheerLights โดยใช้ MQTT ผ่านอินเทอร์เน็ต | ชุด IoT ESP32 ของ SunFounder
ในบทช่วยสอนนี้ เราจะสร้างระบบไฟประสานงานโดยใช้ ESP32 และ LED WS2812 ที่สามารถควบคุมจากระยะไกลผ่าน MQTT ระบบนี้ช่วยให้ผู้ใช้หลายคนเปลี่ยนสีของไฟพร้อมกันได้ สร้างประสบการณ์การเชื่อมต่อโดยไม่คำนึงถึงสถานที่ โปรเจกต์นี้ใช้ชุดอุปกรณ์ IoT SunFounder ESP32 ซึ่งรวมไมโครคอนโทรลเลอร์ที่ทรงพลังพร้อมความสามารถ Wi-Fi ทำให้เหมาะสำหรับการใช้งาน IoT
ตลอดทั้งวิดีโอ เราจะแนะนำการตั้งค่า การเดินสายไฟ และการเขียนโค้ดที่จำเป็นเพื่อให้ได้เอฟเฟกต์นี้ หากคุณต้องการคำอธิบายเพิ่มเติม โปรดตรวจสอบวิดีโอที่ไทม์สแตมป์เฉพาะ (ในวิดีโอที่ mm:ss)
อธิบายฮาร์ดแวร์
ส่วนประกอบหลักของโปรเจกต์นี้ประกอบด้วยไมโครคอนโทรลเลอร์ ESP32 แถบ LED WS2812 และตัวกลาง MQTT ESP32 เป็นไมโครคอนโทรลเลอร์อเนกประสงค์ที่มีความสามารถ Wi-Fi และ Bluetooth ในตัว ทำให้เชื่อมต่ออินเทอร์เน็ตได้ง่าย มันทำหน้าที่เป็นสมองของโปรเจกต์เรา จัดการการสื่อสารและควบคุมแถบ LED
แถบ LED WS2812 ประกอบด้วย LED RGB ที่สามารถระบุตำแหน่งได้ทีละดวง ซึ่งสามารถควบคุมให้แสดงสีได้หลากหลาย LED แต่ละดวงสามารถเปิดหรือปิดและตั้งค่าเป็นสีใดก็ได้โดยใช้สายข้อมูลเส้นเดียว ทำให้เหมาะสำหรับเอฟเฟกต์แสงแบบไดนามิก ตัวกลาง MQTT อำนวยความสะดวกในการสื่อสารระหว่างไคลเอนต์ต่างๆ ทำให้ผู้ใช้สามารถเผยแพร่และสมัครรับหัวข้อที่ควบคุมสี LED ได้
รายละเอียดดาต้าชีต
| ผู้ผลิต | Adafruit |
|---|---|
| หมายเลขชิ้นส่วน | WS2812B |
| แรงดันไฟฟ้าลอจิก/IO | 3.5 - 5.5 V |
| แรงดันไฟฟ้าจ่าย | 5 V |
| กระแสเอาต์พุต (ต่อช่อง) | 20 mA |
| กระแสสูงสุด (ต่อช่อง) | 60 mA |
| คำแนะนำความถี่ PWM | 400 Hz |
| เกณฑ์ลอจิกอินพุต | 0.2Vcc (ต่ำ), 0.7Vcc (สูง) |
| แรงดันตก / RDS(on) / ความอิ่มตัว | 0.5 V |
| ขีดจำกัดความร้อน | อุณหภูมิการทำงาน: -25 ถึง 85 °C |
| แพ็คเกจ | SMD 5050 แต่ละดวง |
| หมายเหตุ / รุ่นต่างๆ | มีให้เลือกหลายความยาวและการกำหนดค่า |
- ตรวจสอบให้แน่ใจว่าแหล่งจ่ายไฟเพียงพอสำหรับแถบ WS2812 เพื่อหลีกเลี่ยงแรงดันตก
- ใช้กราวด์ร่วมระหว่าง ESP32 และแถบ LED
- รักษาสายข้อมูลให้สั้นเพื่อป้องกันการเสื่อมคุณภาพของสัญญาณ
- พิจารณาใช้ตัวเก็บประจุ (1000μF) ข้ามแหล่งจ่ายไฟเพื่อปรับแรงดันไฟกระชากให้เรียบ
- ใช้ตัวต้านทานที่เหมาะสมบนสายข้อมูลเพื่อป้องกันการสะท้อนของสัญญาณ
- ระวังปริมาณกระแสไฟรวมของแถบ LED ใช้แหล่งจ่ายไฟภายนอกเมื่อจำเป็น
คำแนะนำการเดินสายไฟ
ในการเดินสายไฟ ESP32 กับแถบ LED WS2812 ให้เริ่มต้นด้วยการเชื่อมต่อแหล่งจ่ายไฟ เชื่อมต่อสายสีแดงจากแถบ LED เข้ากับแหล่งจ่ายไฟ 5V และสายสีดำเข้ากับกราวด์ จากนั้น เชื่อมต่อสายข้อมูล (สายสีเหลือง) จากแถบ WS2812 เข้ากับพิน 14 บน ESP32 ตรวจสอบให้แน่ใจว่า ESP32 เชื่อมต่อกับกราวด์เดียวกันกับแถบ LED เพื่อรักษาการอ้างอิงร่วม
หลังจากตั้งค่าการเชื่อมต่อไฟและข้อมูลแล้ว ให้เชื่อมต่อ ESP32 เข้ากับคอมพิวเตอร์ของคุณโดยใช้สายไมโคร USB เพื่อการเขียนโปรแกรม คุณจะต้องตรวจสอบให้แน่ใจว่า ESP32 เปิดอยู่ขณะเขียนโปรแกรมเพื่อสร้างการเชื่อมต่อ เมื่อเดินสายเสร็จแล้ว คุณสามารถดำเนินการอัปโหลดโค้ดและทดสอบการตั้งค่าได้

ตัวอย่างโค้ดและคำอธิบาย
โค้ดเริ่มต้นด้วยการรวมไลบรารีที่จำเป็นสำหรับฟังก์ชัน Wi-Fi และ MQTT ตัวระบุ ssid และ password ใช้เพื่อเก็บข้อมูลรับรอง Wi-Fi ของคุณ ในขณะที่ mqtt_server เก็บที่อยู่ของตัวกลาง MQTT
const char* ssid = "SSID";
const char* password = "PASSWORD";
const char* mqtt_server = "mqtt.cheerlights.com";
ถัดไป เรากำหนดสี CheerLights ที่รองรับและค่า RGB ที่สอดคล้องกันโดยใช้อาร์เรย์ ซึ่งช่วยให้โปรแกรมเข้าถึงการตั้งค่าสีได้ง่ายตามอินพุตของผู้ใช้
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" ...};
ฟังก์ชัน setup() เริ่มต้นการสื่อสารซีเรียล ตั้งค่าการเชื่อมต่อ Wi-Fi และเตรียมไคลเอนต์ MQTT นอกจากนี้ยังเริ่มต้นแถบ LED
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
pixels.begin();
pixels.show();
}
ลูปหลักจะตรวจสอบการเชื่อมต่อ MQTT อย่างต่อเนื่องและประมวลผลข้อความขาเข้าที่ควบคุมสี LED ฟังก์ชัน callback() จะถูกเรียกใช้เมื่อได้รับข้อความบนหัวข้อที่สมัครรับ
การสาธิต / สิ่งที่คาดหวัง
เมื่อตั้งค่าทุกอย่างเสร็จสิ้นและอัปโหลดโค้ดแล้ว คุณควรจะสามารถเปลี่ยนสีของ LED WS2812 ได้โดยการส่งข้อความไปยังหัวข้อ MQTT หากผู้ใช้รายอื่นเปลี่ยนสี อุปกรณ์ที่เชื่อมต่อทั้งหมดจะสะท้อนการเปลี่ยนแปลงพร้อมกัน ระวังปัญหาที่อาจเกิดขึ้น เช่น การกลับขั้วหรือการเชื่อมต่อที่ไม่ถูกต้อง ซึ่งอาจทำให้ LED ทำงานไม่ถูกต้อง (ในวิดีโอที่ mm:ss)
ไทม์สแตมป์วิดีโอ
- 00:00 เริ่มต้น
- 2:00 แนะนำ
- 3:48 หน้าคู่มือ
- 6:33 อธิบายการเดินสายไฟ
- 7:35 อธิบายโค้ด Arduino
- 15:03 เลือกบอร์ด ESP32 และพอร์ต COMP ใน Arduino IDE
- 16:46 สาธิต 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
แหล่งข้อมูลและเอกสารอ้างอิง
-
เอกสารESP32 Tutorial 47/55- SunFounder doc page for cheer lightdocs.sunfounder.com
ไฟล์📁
ไม่มีไฟล์ที่พร้อมใช้งาน