ESP32 บทเรียน 50/55 - ควบคุม RGB LED จากที่ใดก็ได้ในโลก | ชุด ESP32 ของ SunFounder
ในบทช่วยสอนนี้ เราจะเรียนรู้วิธีควบคุมสีของ RGB LED โดยใช้ไมโครคอนโทรลเลอร์ ESP32 ผ่าน Wi-Fi โดยใช้โปรโตคอล MQTT และบริการ Adafruit IO การตั้งค่านี้ช่วยให้คุณเปลี่ยนสีของ RGB LED ได้จากทุกที่ในโลก ซึ่งเป็นการประยุกต์ใช้เทคโนโลยี IoT ในทางปฏิบัติ เราจะสำรวจวิธีใช้แถบเลื่อนและตัวเลือกสีเพื่อเลือกสีที่ต้องการด้วย

ESP32 เป็นไมโครคอนโทรลเลอร์ที่มีประสิทธิภาพซึ่งมี Wi-Fi และ Bluetooth ในตัว ทำให้เหมาะสำหรับโปรเจกต์ IoT ในการสร้างนี้ เราจะเชื่อมต่อ RGB LED เข้ากับ ESP32 และควบคุมสีผ่านตัวกลาง MQTT ที่ให้บริการโดย Adafruit บทช่วยสอนนี้จะแนะนำคุณเกี่ยวกับการตั้งค่าฮาร์ดแวร์ คำแนะนำการเดินสายไฟ และโค้ดที่จำเป็นเพื่อให้ทุกอย่างทำงานได้อย่างราบรื่น (ในวิดีโอที่เวลา 00:00)
อธิบายฮาร์ดแวร์
สำหรับโปรเจกต์นี้ ส่วนประกอบหลักที่เราจะใช้คือไมโครคอนโทรลเลอร์ ESP32 และ RGB LED ESP32 สามารถเชื่อมต่อกับเครือข่าย Wi-Fi ทำให้สามารถสื่อสารกับบริการ Adafruit IO ได้ RGB LED ประกอบด้วย LED สามดวงแยกกัน (แดง เขียว และน้ำเงิน) ซึ่งสามารถผสมกันเพื่อสร้างสีได้หลากหลาย
RGB LED ทำงานบนหลักการแอโนดร่วมหรือแคโทดร่วม ซึ่งหมายความว่าขาแอโนด (บวก) หรือแคโทด (ลบ) ของ LED แต่ละดวงต้องเชื่อมต่ออย่างถูกต้องเพื่อให้ทำงานได้ แต่ละสีสามารถควบคุมได้โดยใช้การมอดูเลตความกว้างพัลส์ (PWM) ซึ่งปรับความสว่างของ LED แต่ละดวงโดยการเปลี่ยนรอบการทำงาน
รายละเอียดจาก Datasheet
| ผู้ผลิต | SunFounder |
|---|---|
| หมายเลขชิ้นส่วน | RGB LED |
| แรงดันไปข้างหน้า (VF) | 2.0–3.4 V |
| กระแสไปข้างหน้า (IF) | 20 mA |
| ความยาวคลื่นสูงสุด (nm) | แดง: 620, เขียว: 525, น้ำเงิน: 465 |
| แพ็คเกจ | มาตรฐาน 4 ขา |
| หมายเหตุ / รุ่นต่างๆ | มีตัวเลือกแอโนดร่วมหรือแคโทดร่วม |
- ใช้ตัวต้านทาน 220 โอห์มสำหรับแต่ละสีของ LED เพื่อจำกัดกระแส
- ตรวจสอบการเดินสายไฟให้ถูกต้องสำหรับการกำหนดค่าแอโนดร่วมหรือแคโทดร่วม
- ตรวจสอบแหล่งจ่ายไฟของ ESP32 เพื่อหลีกเลี่ยงปัญหาแรงดันตก
- รักษาความถี่ PWM ให้อยู่ในขีดจำกัดเพื่อการเปลี่ยนสีที่ราบรื่น
- ตรวจสอบให้แน่ใจว่าข้อมูลรับรอง Wi-Fi ถูกต้องเพื่อเชื่อมต่อกับบริการ Adafruit IO
คำแนะนำการเดินสายไฟ

ในการเดินสายไฟ RGB LED เข้ากับ ESP32 ให้เริ่มต้นโดยระบุขาบน RGB LED ขาที่ยาวที่สุดคือขาร่วม สำหรับการกำหนดค่าแอโนดร่วม ให้เชื่อมต่อขานี้เข้ากับแหล่งจ่ายแรงดันบวก (3.3V) ขาอีกสามขาที่เหลือ correspond กับ LED สีแดง เขียว และน้ำเงิน เชื่อมต่อขาสีแดงเข้ากับ GPIO 27 ขาสีเขียวเข้ากับ GPIO 26 และขาสีน้ำเงินเข้ากับ GPIO 25 การเชื่อมต่อแต่ละจุดเหล่านี้ควรผ่านตัวต้านทาน 220 โอห์มเพื่อจำกัดกระแสที่ไหลผ่าน LED
จากนั้น เชื่อมต่อกราวด์ (GND) ของ ESP32 เข้ากับสายกราวด์ของวงจรของคุณ ตรวจสอบให้แน่ใจว่าการเดินสายไฟแน่นหนาเพื่อป้องกันการเชื่อมต่อที่ไม่ต่อเนื่อง หากใช้ RGB LED แบบแคโทดร่วม ให้เชื่อมต่อขาร่วมเข้ากับกราวด์แทน และเชื่อมต่อขาสีแต่ละสีเข้ากับแหล่งจ่ายบวกผ่านตัวต้านทาน ตรวจสอบการเชื่อมต่อทั้งหมดอีกครั้งก่อนจ่ายไฟให้วงจร
ตัวอย่างโค้ดและคำอธิบาย
ในโค้ด Arduino เราเริ่มต้นด้วยการกำหนดขาสำหรับ LED สีแดง เขียว และน้ำเงิน โดยใช้ตัวระบุ redPin, greenPin และ bluePin นอกจากนี้ เรากำหนดช่อง PWM สำหรับแต่ละสีโดยใช้ redChannel, greenChannel และ blueChannel ความถี่ PWM ถูกตั้งไว้ที่ 5000 Hz ด้วยความละเอียด 8 บิต
const int redPin = 27;
const int greenPin = 26;
const int bluePin = 25;
const int redChannel = 0;
const int greenChannel = 1;
const int blueChannel = 2;
ในฟังก์ชัน setup() เราจะเริ่มต้นช่อง PWM และแนบขาที่เกี่ยวข้อง เรายังเชื่อมต่อกับเครือข่าย Wi-Fi โดยใช้ข้อมูลรับรองที่กำหนดไว้ และตั้งค่าไคลเอนต์ MQTT สำหรับการสื่อสารกับ Adafruit IO
void setup() {
ledcSetup(redChannel, freq, resolution);
ledcAttachPin(redPin, redChannel);
// เชื่อมต่อกับ WiFi
WiFi.begin(WLAN_SSID, WLAN_PASS);
}
ลูปหลักจะตรวจสอบการเชื่อมต่อ MQTT และประมวลผลข้อความที่เข้ามา นอกจากนี้ยังพิมพ์ค่า RGB ปัจจุบันไปยังซีเรียลมอนิเตอร์ สีของ LED จะถูกอัปเดตตามค่าที่ได้รับผ่านการสมัครสมาชิก MQTT
void loop() {
MQTT_connect();
mqtt.processPackets(500);
setColor();
}
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับโค้ดทั้งหมด โปรดอ้างอิงโค้ดที่สมบูรณ์ซึ่งแสดงไว้ด้านล่างบทความนี้
การสาธิต / สิ่งที่คาดหวัง
เมื่อทุกอย่างถูกตั้งค่าและอัปโหลดโค้ดเรียบร้อยแล้ว คุณควรเห็นไฟ LED RGB ตอบสนองต่อการเปลี่ยนสีที่ทำผ่านแดชบอร์ด Adafruit IO เมื่อคุณปรับแถบเลื่อนสำหรับสีแดง เขียว และน้ำเงิน ไฟ LED ควรเปลี่ยนสีตามไปด้วย หากคุณพบปัญหาใดๆ ให้ตรวจสอบว่าการเชื่อมต่อ Wi-Fi มีความเสถียร และชื่อหัวข้อ MQTT ตรงกับที่กำหนดไว้ในโค้ด (ในวิดีโอที่ 17:30)
ข้อผิดพลาดทั่วไป ได้แก่ การเดินสายไฟไม่ถูกต้อง ชื่อหัวข้อไม่ตรงกัน และการลืมตั้งค่าข้อมูลประจำตัว Wi-Fi ที่ถูกต้อง หากไฟ LED ไม่สว่างขึ้น ให้ตรวจสอบการเชื่อมต่อตัวต้านทานอีกครั้ง และตรวจสอบให้แน่ใจว่า ESP32 ได้รับพลังงานอย่างถูกต้อง
ไทม์สแตมป์ในวิดีโอ
- 00:00 เริ่มต้น
- 2:23 แนะนำโปรเจกต์
- 4:43 MQTT คืออะไร
- 7:55 การตั้งค่า Adafruit IO
- 14:09 อธิบายการเดินสายไฟ
- 16:07 อธิบายโค้ด
- 27:03 การเลือกบอร์ด ESP32 และพอร์ต COM ใน Arduino IDE
- 29:12 การสาธิตโปรเจกต์
- 31:25 RGB LED คืออะไร?
- 35:26 สี RGB
/***********************************************************************
This is Arduino sketch for ESP32 to control RGB LED using MQTT service of Adafruit
video instruction https://youtu.be/-9q1GfGsnr0
📚⬇️ Download and resource page https://robojax.com/RJT672
Written By Ahamd Shamshiri
on Feb 18, 2024
Adafruit MQTT Library ESP32 Adafruit IO SSL/TLS example
/// ref: https://www.electronicwings.com/esp32/esp32-mqtt-client
*/
// Define RGB LED pins
const int redPin = 27;
const int greenPin = 26;
const int bluePin = 25;
// Define PWM channels
const int redChannel = 0;
const int greenChannel = 1;
const int blueChannel = 2;
// Define PWM frequency and resolution
const int freq = 5000;
const int resolution = 8;
int colorR, colorG, colorB;
#include <WiFi.h>
#include "WiFiClientSecure.h"
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
/************************* WiFi Access Point *********************************/
#define WLAN_SSID "Book"
#define WLAN_PASS "888-888"
/************************* Adafruit.io Setup *********************************/
#define AIO_SERVER "io.adafruit.com"
// Using port 8883 for MQTTS
#define AIO_SERVERPORT 8883
// Adafruit IO Account Configuration
// (to obtain these values, visit https://io.adafruit.com and click on Active Key)
// #define AIO_USERNAME "YOUR_ADAFRUIT_IO_USERNAME"
// #define AIO_KEY "YOUR_ADAFRUIT_IO_KEY"
#define AIO_USERNAME "robojax"
#define AIO_KEY "aio_NBQQ75Rn7liRNcRn5uGUBMsBYmjD"
/************ Global State (you don't need to change this!) ******************/
// WiFiFlientSecure for SSL/TLS support
WiFiClientSecure client;
// Setup the MQTT client class by passing in the WiFi client and MQTT server and login details.
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
// io.adafruit.com root CA
const char* adafruitio_root_ca = \
"-----BEGIN CERTIFICATE-----\n"
"MIIEjTCCA3WgAwIBAgIQDQd4KhM/xvmlcpbhMf/ReTANBgkqhkiG9w0BAQsFADBh\n"
"MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n"
"d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\n"
"MjAeFw0xNzExMDIxMjIzMzdaFw0yNzExMDIxMjIzMzdaMGAxCzAJBgNVBAYTAlVT\n"
"MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\n"
"b20xHzAdBgNVBAMTFkdlb1RydXN0IFRMUyBSU0EgQ0EgRzEwggEiMA0GCSqGSIb3\n"
"DQEBAQUAA4IBDwAwggEKAoIBAQC+F+jsvikKy/65LWEx/TMkCDIuWegh1Ngwvm4Q\n"
"yISgP7oU5d79eoySG3vOhC3w/3jEMuipoH1fBtp7m0tTpsYbAhch4XA7rfuD6whU\n"
"gajeErLVxoiWMPkC/DnUvbgi74BJmdBiuGHQSd7LwsuXpTEGG9fYXcbTVN5SATYq\n"
"DfbexbYxTMwVJWoVb6lrBEgM3gBBqiiAiy800xu1Nq07JdCIQkBsNpFtZbIZhsDS\n"
"fzlGWP4wEmBQ3O67c+ZXkFr2DcrXBEtHam80Gp2SNhou2U5U7UesDL/xgLK6/0d7\n"
"6TnEVMSUVJkZ8VeZr+IUIlvoLrtjLbqugb0T3OYXW+CQU0kBAgMBAAGjggFAMIIB\n"
"PDAdBgNVHQ4EFgQUlE/UXYvkpOKmgP792PkA76O+AlcwHwYDVR0jBBgwFoAUTiJU\n"
"IBiV5uNu5g/6+rkS7QYXjzkwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsG\n"
"AQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMDQGCCsGAQUFBwEB\n"
"BCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEIGA1Ud\n"
"HwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEds\n"
"b2JhbFJvb3RHMi5jcmwwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEW\n"
"HGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwDQYJKoZIhvcNAQELBQADggEB\n"
"AIIcBDqC6cWpyGUSXAjjAcYwsK4iiGF7KweG97i1RJz1kwZhRoo6orU1JtBYnjzB\n"
"c4+/sXmnHJk3mlPyL1xuIAt9sMeC7+vreRIF5wFBC0MCN5sbHwhNN1JzKbifNeP5\n"
"ozpZdQFmkCo+neBiKR6HqIA+LMTMCMMuv2khGGuPHmtDze4GmEGZtYLyF8EQpa5Y\n"
"jPuV6k2Cr/N3XxFpT3hRpt/3usU/Zb9wfKPtWpoznZ4/44c1p9rzFcZYrWkj3A+7\n"
"TNBJE0GmP2fhXhP1D/XVfIW/h0yCJGEiV9Glm/uGOa3DXHlmbAcxSyCRraG+ZBkA\n"
"7h4SeM6Y8l/7MBRpPCz6l8Y=\n"
"-----END CERTIFICATE-----\n";
/****************************** Feeds ***************************************/
// Setup a feed called 'test' for publishing and 'test2' for subscription.
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
Adafruit_MQTT_Subscribe COLOR_R = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/rgb-led-color.red");
Adafruit_MQTT_Subscribe COLOR_G = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/rgb-led-color.green");
Adafruit_MQTT_Subscribe COLOR_B = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/rgb-led-color.blue");
Adafruit_MQTT_Subscribe COLOR_RGB = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/color-picker");
/*************************** Sketch Code ************************************/
void setup() {
// Set up PWM channels
ledcSetup(redChannel, freq, resolution);
ledcSetup(greenChannel, freq, resolution);
ledcSetup(blueChannel, freq, resolution);
// Attach pins to corresponding PWM channels
ledcAttachPin(redPin, redChannel);
ledcAttachPin(greenPin, greenChannel);
ledcAttachPin(bluePin, blueChannel);
Serial.begin(115200);
delay(10);
Serial.println(F("Adafruit IO MQTTS (SSL/TLS) Example"));
// Connect to WiFi access point.
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(WLAN_SSID);
delay(1000);
WiFi.begin(WLAN_SSID, WLAN_PASS);
delay(2000);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
// Set Adafruit IO's root CA
client.setCACert(adafruitio_root_ca);
// register callback for feed
COLOR_R.setCallback(color_R_Callback);
// Setup MQTT subscription for time feed.
mqtt.subscribe(&COLOR_R);
// register callback for feed
COLOR_G.setCallback(color_G_Callback);
// Setup MQTT subscription for time feed.
mqtt.subscribe(&COLOR_G);
// register callback for feed
COLOR_B.setCallback(color_B_Callback);
// Setup MQTT subscription for time feed.
mqtt.subscribe(&COLOR_B);
// register callback for feed
COLOR_RGB.setCallback(color_RGB_Callback);
// Setup MQTT subscription for time feed.
mqtt.subscribe(&COLOR_RGB);
}
// uint32_t x=0;
void loop() {
// Ensure the connection to the MQTT server is alive (this will make the first
// connection and automatically reconnect when disconnected). See the MQTT_connect
// function definition further below.
MQTT_connect();
Serial.print("R: ");
Serial.print (colorR);
Serial.print(" G: ");
Serial.print (colorG);
Serial.print(" B: ");
Serial.println(colorB);
// wait 0.5 seconds for subscription messages
mqtt.processPackets(500);
setColor();
// wait a couple seconds to avoid rate limit
//delay(2000);
}
void color_R_Callback(char* message, uint16_t len) {
char messageBuffer[40];
//snprintf(messageBuffer, sizeof(messageBuffer), "Color status is :: %s, len :: %u", message, len);
//Serial.println(messageBuffer);
Serial.println(message);
String inString = message;//sotre the message to String
colorR = inString.toInt();//convert the message to Integer
if(colorR >255 || colorR < 0)
{
colorR = 0;
}
}
void color_G_Callback(char* message, uint16_t len) {
char messageBuffer[40];
//snprintf(messageBuffer, sizeof(messageBuffer), "Color status is :: %s, len :: %u", message, len);
//Serial.println(messageBuffer);
Serial.println(message);
String inString = message;//sotre the message to String
colorG = inString.toInt();//convert the message to Integer
if(colorG >255 || colorG < 0)
{
colorG = 0;
}
}
void color_B_Callback(char* message, uint16_t len) {
char messageBuffer[40];
//snprintf(messageBuffer, sizeof(messageBuffer), "Color status is :: %s, len :: %u", message, len);
//Serial.println(messageBuffer);
Serial.println(message);
String inString = message;//sotre the message to String
colorB = inString.toInt();//convert the message to Integer
if(colorB >255 || colorB < 0)
{
colorB = 0;
}
}
void color_RGB_Callback(char* message, uint16_t len) {
char messageBuffer[40];
//snprintf(messageBuffer, sizeof(messageBuffer), "Color status is :: %s, len :: %u", message, len);
//Serial.println(messageBuffer);
Serial.println(message);
String newColor = String( message);//
if(newColor.length() == 7)
{
String theColorR = newColor.substring(1, 3);//extract B2 from #B2a48d for example
String theColorG = newColor.substring(3, 5);//extract a4 from #B2a48d for example
String theColorB = newColor.substring(5, 7);//extract 8d from #B2a48d for example
colorR = StrToHex(theColorR.c_str());//convert String to HEX for R
colorG = StrToHex(theColorG.c_str());//convert String to HEX for G
colorB = StrToHex(theColorB.c_str());//convert String to HEX for B
}
}
//from https://stackoverflow.com/questions/44683071/convert-string-as-hex-to-hexadecimal
uint64_t StrToHex(const char* str)
{
return (uint64_t) strtoull(str, 0, 16);
}
void setColor() {
// For common-anode RGB LEDs, use 255 minus the color value
ledcWrite(redChannel, colorR);
ledcWrite(greenChannel, colorG);
ledcWrite(blueChannel, colorB);
}
// Function to connect and reconnect as necessary to the MQTT server.
// Should be called in the loop function and it will take care if connecting.
void MQTT_connect() {
int8_t ret;
// Stop if already connected.
if (mqtt.connected()) {
return;
}
Serial.print("Connecting to MQTT... ");
uint8_t retries = 3;
while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
Serial.println(mqtt.connectErrorString(ret));
Serial.println("Retrying MQTT connection in 5 seconds...");
mqtt.disconnect();
delay(5000); // wait 5 seconds
retries--;
if (retries == 0) {
// basically die and wait for WDT to reset me
while (1)
;
}
}
Serial.println("MQTT Connected!");
}
Common Course Links
Common Course Files
สิ่งที่คุณอาจต้องการ
-
อาลีเอ็กซ์เพรสESP32-S3 N16R8 on AliExpresss.click.aliexpress.com
แหล่งข้อมูลและเอกสารอ้างอิง
ยังไม่มีทรัพยากรเลย
ไฟล์📁
แผ่นข้อมูล (pdf)
-
ESP32 C3 Datasheet English
esp32-c3_datasheet_en[1].pdf0.86 MB