Mafunzo ya ESP32 50/55 - Dhibiti LED ya RGB kutoka popote duniani | Kifurushi cha ESP32 cha SunFounder
Katika mafunzo haya, tutajifunza jinsi ya kudhibiti rangi ya LED ya RGB kwa kutumia microcontroller ya ESP32 kupitia Wi-Fi, kwa kutumia itifaki ya MQTT na huduma ya Adafruit IO. Mpangilio huu unakuruhusu kubadilisha rangi ya LED ya RGB kutoka popote duniani, ikitoa matumizi ya vitendo ya teknolojia ya IoT. Pia tutachunguza jinsi ya kutumia slaida na kichagua rangi kuchagua rangi unayotaka.

ESP32 ni microcontroller yenye nguvu ambayo ina uwezo wa Wi-Fi na Bluetooth uliojengewa ndani, na kuifanya kuwa bora kwa miradi ya IoT. Katika ujenzi huu, tutaunganisha LED ya RGB kwenye ESP32 na kudhibiti rangi yake kupitia broker ya MQTT inayotolewa na Adafruit. Mafunzo yatakuongoza kupitia mpangilio wa vifaa, maagizo ya wiring, na msimbo unaohitajika kufanya kila kitu kifanye kazi vizuri (katika video saa 00:00).
Vifaa Vimeelezwa
Kwa mradi huu, vipengele vikuu tutakavyotumia ni microcontroller ya ESP32 na LED ya RGB. ESP32 ina uwezo wa kuunganisha kwenye mitandao ya Wi-Fi, ikiruhusu kuwasiliana na huduma ya Adafruit IO. LED ya RGB ina LED tatu za kibinafsi (nyekundu, kijani, na bluu) ambazo zinaweza kuchanganywa kuunda rangi nyingi.
LED ya RGB inafanya kazi kwa kanuni ya anode ya kawaida au cathode ya kawaida, ambayo inamaanisha kwamba anode (chanya) au cathode (hasi) ya LED za kibinafsi lazima ziunganishwe vizuri ili zifanye kazi. Kila rangi inaweza kudhibitiwa kwa kutumia Pulse Width Modulation (PWM), ambayo inarekebisha mwangaza wa kila LED kwa kubadilisha mzunguko wa wajibu.
Maelezo ya Datasheet
| Mtengenezaji | SunFounder |
|---|---|
| Nambari ya sehemu | RGB LED |
| Voltage ya mbele (VF) | 2.0–3.4 V |
| Mkondo wa mbele (IF) | 20 mA |
| Urefu wa wimbi la kilele (nm) | Nyekundu: 620, Kijani: 525, Bluu: 465 |
| Kifurushi | Kiwango cha pin 4 |
| Vidokezo / lahaja | Chaguo za anode ya kawaida au cathode ya kawaida zinapatikana |
- Tumia resistors za ohm 220 kwa kila rangi ya LED ili kupunguza mkondo.
- Hakikisha wiring sahihi kwa usanidi wa anode ya kawaida au cathode.
- Angalia usambazaji wa nguvu wa ESP32 ili kuepuka brownouts.
- Weka mzunguko wa PWM ndani ya mipaka kwa mabadiliko laini ya rangi.
- Hakikisha vitambulisho vya Wi-Fi ni sahihi ili kuunganisha kwenye huduma ya Adafruit IO.
Maagizo ya Wiring

Ili kuunganisha LED ya RGB kwenye ESP32, anza kwa kutambua pini kwenye LED ya RGB. Pini ndefu zaidi ni pini ya kawaida. Kwa usanidi wa anode ya kawaida, unganisha pini hii kwenye usambazaji wa voltage chanya (3.3V). Pini nyingine tatu zinalingana na LED nyekundu, kijani, na bluu. Unganisha pini nyekundu kwenye GPIO 27, pini ya kijani kwenye GPIO 26, na pini ya bluu kwenye GPIO 25. Kila moja ya viunganisho hivi inapaswa kufanywa kupitia resistor ya ohm 220 ili kupunguza mkondo unaopita kupitia LED.
Ifuatayo, unganisha ardhi (GND) ya ESP32 kwenye mstari wa ardhi wa mzunguko wako. Hakikisha wiring ni salama ili kuzuia viunganisho vya mara kwa mara. Ikiwa unatumia LED ya RGB ya cathode ya kawaida, unganisha pini ya kawaida kwenye ardhi badala yake na unganisha pini za rangi za kibinafsi kwenye usambazaji chanya kupitia resistors. Angalia mara mbili viunganisho vyote kabla ya kuwasha mzunguko.
Mifano ya Msimbo & Maelekezo
Katika msimbo wa Arduino, tunaanza kwa kufafanua pini za LED nyekundu, kijani, na bluu kwa kutumia vitambulisho redPin, greenPin, na bluePin. Zaidi ya hayo, tunafafanua njia za PWM kwa kila rangi kwa kutumia redChannel, greenChannel, na blueChannel. Mzunguko wa PWM umewekwa kwa 5000 Hz na azimio la biti 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;
Katika kazi ya setup(), tunaanzisha njia za PWM na kuambatanisha pini zinazolingana. Pia tunaunganisha kwenye mtandao wa Wi-Fi kwa kutumia vitambulisho vilivyofafanuliwa na kuanzisha mteja wa MQTT kwa mawasiliano na Adafruit IO.
void setup() {
ledcSetup(redChannel, freq, resolution);
ledcAttachPin(redPin, redChannel);
// Unganisha kwenye WiFi
WiFi.begin(WLAN_SSID, WLAN_PASS);
}
Kitanzi kikuu kinaangalia muunganisho wa MQTT na kuchakata ujumbe unaoingia. Pia kinachapisha thamani za sasa za RGB kwenye mfuatiliaji wa serial. Rangi ya LED inasasishwa kulingana na thamani zinazopokelewa kupitia usajili wa MQTT.
void loop() {
MQTT_connect();
mqtt.processPackets(500);
setColor();
}
Kwa maelezo zaidi kuhusu msimbo kamili, tafadhali rejea msimbo kamili uliopakiwa chini ya makala.
Maonyesho / Nini cha Kutarajia
Mara kila kitu kimewekwa vizuri na msimbo umepakiwa, unapaswa kuona LED ya RGB ikijibu mabadiliko ya rangi yanayofanywa kupitia dashibodi ya Adafruit IO. Unaporekebisha slaida za nyekundu, kijani, na bluu, LED inapaswa kubadilisha rangi yake ipasavyo. Iwapo utapata matatizo yoyote, hakikisha kwamba muunganisho wa Wi-Fi ni thabiti na kwamba majina ya mada ya MQTT yanalingana na yale yaliyofafanuliwa kwenye msimbo (katika video saa 17:30).
Makosa ya kawaida ni pamoja na wiring usio sahihi, majina ya mada yasiyolingana, na kusahau kuweka vitambulisho sahihi vya Wi-Fi. Iwapo LED haitawaka, angalia mara mbili miunganisho ya resistor na uhakikishe kwamba ESP32 ina nishati ipasavyo.
Vidokezo vya Muda kwenye Video
- 00:00 Mwanzo
- 2:23 Utangulizi wa mradi
- 4:43 MQTT ni nini
- 7:55 Usanidi wa Adafruit IO
- 14:09 Ufafanuzi wa wiring
- 16:07 Ufafanuzi wa msimbo
- 27:03 Kuchagua bodi ya ESP32 na mlango wa COM kwenye Arduino IDE
- 29:12 Maonyesho ya mradi
- 31:25 LED ya RGB ni nini?
- 35:26 Rangi ya 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
Tänker att du kanske behöver
-
AliExpressESP32-S3 N16R8 on AliExpresss.click.aliexpress.com
Resurser och referenser
Inga resurser än.
Filer📁
Datablad (pdf)
-
ESP32 C3 Datasheet English
esp32-c3_datasheet_en[1].pdf0.86 MB