ESP32 Tutoriaal 50/55 - Beheer RGB-LED van enige plek in die wêreld | SunFounder se ESP32-stel
In hierdie tutoriaal sal ons leer hoe om die kleur van 'n RGB-LED te beheer met behulp van die ESP32-mikrobeheerder oor Wi-Fi, deur gebruik te maak van die MQTT-protokol en Adafruit IO-diens. Hierdie opstelling laat jou toe om die kleur van die RGB-LED van enige plek in die wêreld te verander, wat 'n praktiese toepassing van IoT-tegnologie bied. Ons sal ook ondersoek hoe om skuifbalke en 'n kleurkieser te gebruik om die verlangde kleur te kies.

Die ESP32 is 'n kragtige mikrobeheerder met ingeboude Wi-Fi- en Bluetooth-vermoëns, wat dit ideaal maak vir IoT-projekte. In hierdie bou sal ons 'n RGB-LED aan die ESP32 koppel en sy kleur beheer deur 'n MQTT-broker wat deur Adafruit verskaf word. Die tutoriaal sal jou lei deur die hardeware-opstelling, bedradingsinstruksies, en die kode wat nodig is om alles naatloos te laat werk (in video by 00:00).
Hardeware Verduidelik
Vir hierdie projek is die primêre komponente wat ons sal gebruik die ESP32-mikrobeheerder en die RGB-LED. Die ESP32 is in staat om aan Wi-Fi-netwerke te koppel, wat dit toelaat om met die Adafruit IO-diens te kommunikeer. Die RGB-LED bevat drie individuele LED's (rooi, groen en blou) wat gemeng kan word om 'n wye reeks kleure te skep.
Die RGB-LED werk op 'n gemeenskaplike anode- of gemeenskaplike katode-beginsel, wat beteken dat die anode (positief) of katode (negatief) van die individuele LED's korrek gekoppel moet word vir hulle om te werk. Elke kleur kan beheer word deur gebruik te maak van Pulsbreedtemodulasie (PWM), wat die helderheid van elke LED aanpas deur die dienssiklus te varieer.
Datablad Besonderhede
| Vervaardiger | SunFounder |
|---|---|
| Deelnommer | RGB-LED |
| Voorwaartse spanning (VF) | 2.0–3.4 V |
| Voorwaartse stroom (IF) | 20 mA |
| Piek golflengte (nm) | Rooi: 620, Groen: 525, Blou: 465 |
| Pakket | Standaard 4-pen |
| Notas / variante | Gemeenskaplike anode of gemeenskaplike katode opsies beskikbaar |
- Gebruik 220 ohm-weerstande vir elke LED-kleur om stroom te beperk.
- Verseker korrekte bedrading vir gemeenskaplike anode- of katode-konfigurasie.
- Kontroleer die ESP32 se kragtoevoer om bruinvalle te vermy.
- Hou die PWM-frekwensie binne die perke vir gladde kleuroorgange.
- Verseker dat Wi-Fi-geloofsbriewe korrek is om aan die Adafruit IO-diens te koppel.
Bedradingsinstruksies

Om die RGB-LED aan die ESP32 te bedraad, begin deur die penne op die RGB-LED te identifiseer. Die langste pen is die gemeenskaplike pen. Vir 'n gemeenskaplike anode-konfigurasie, koppel hierdie pen aan die positiewe spanningsvoorsiening (3.3V). Die ander drie penne stem ooreen met die rooi, groen en blou LED's. Koppel die rooi pen aan GPIO 27, die groen pen aan GPIO 26, en die blou pen aan GPIO 25. Elk van hierdie verbindings moet deur 'n 220 ohm-weerstand gemaak word om die stroom wat deur die LED's vloei te beperk.
Volgende, koppel die grond (GND) van die ESP32 aan die grondlyn van jou stroombaan. Verseker dat die bedrading veilig is om enige intermitterende verbindings te voorkom. As jy 'n gemeenskaplike katode-RGB-LED gebruik, koppel die gemeenskaplike pen aan grond in plaas daarvan en koppel die individuele kleurpenne aan die positiewe voorsiening deur die weerstande. Dubbel-kontroleer alle verbindings voordat jy die stroombaan van krag voorsien.
Kode Voorbeelde & Deurloop
In die Arduino-kode begin ons deur die penne vir die rooi, groen en blou LED's te definieer met die identifiseerders redPin, greenPin, en bluePin. Daarbenewens definieer ons die PWM-kanale vir elke kleur met redChannel, greenChannel, en blueChannel. Die PWM-frekwensie word op 5000 Hz gestel met 'n 8-bis resolusie.
const int redPin = 27;
const int greenPin = 26;
const int bluePin = 25;
const int redChannel = 0;
const int greenChannel = 1;
const int blueChannel = 2;
In die setup()-funksie initialiseer ons die PWM-kanale en heg die ooreenstemmende penne aan. Ons koppel ook aan die Wi-Fi-netwerk met die gedefinieerde geloofsbriewe en stel die MQTT-kliënt op vir kommunikasie met Adafruit IO.
void setup() {
ledcSetup(redChannel, freq, resolution);
ledcAttachPin(redPin, redChannel);
// Koppel aan WiFi
WiFi.begin(WLAN_SSID, WLAN_PASS);
}
Die hoof-lus kontroleer die MQTT-verbinding en verwerk inkomende boodskappe. Dit druk ook die huidige RGB-waardes na die reeksmonitor. Die kleur van die LED word opgedateer gebaseer op die waardes wat deur MQTT-inskrywings ontvang word.
void loop() {
MQTT_connect();
mqtt.processPackets(500);
setColor();
}
Vir meer besonderhede oor die volledige kode, verwys asseblief na die volledige kode wat onder die artikel gelaai is.
Demonstrasie / Wat om te Verwag
Sodra alles opgestel is en die kode opgelaai is, behoort jy die RGB-LED te sien reageer op kleurveranderinge wat deur die Adafruit IO-paneelbord gemaak word. Soos jy die skuifbalke vir rooi, groen en blou aanpas, behoort die LED sy kleur dienooreenkomstig te verander. As jy enige probleme ondervind, maak seker dat die Wi-Fi-verbinding stabiel is en dat die MQTT-onderwerpname ooreenstem met dié wat in die kode gedefinieer is (in video by 17:30).
Algemene slaggate sluit in verkeerde bedrading, nie-ooreenstemmende onderwerpname, en om te vergeet om die korrekte Wi-Fi-geloofsbriewe in te stel. As die LED nie aangaan nie, kontroleer die resistorverbindings weer en maak seker dat die ESP32 korrek aangedryf word.
Video-tydstempels
- 00:00 Begin
- 2:23 Inleiding tot die projek
- 4:43 Wat is MQTT
- 7:55 Adafruit IO-opstelling
- 14:09 Bedrading verduidelik
- 16:07 Kode verduidelik
- 27:03 Kies ESP32-bord en COM-poort op Arduino IDE
- 29:12 Projekdemonstrasie
- 31:25 Wat is RGB-LED?
- 35:26 RGB-kleur
/***********************************************************************
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
Goedere wat jy dalk nodig het
-
AliExpressESP32-S3 N16R8 on AliExpresss.click.aliexpress.com
Hulpbronne en verwysings
Geen hulpbronne nog.
Lêers📁
Datasheet (pdf)
-
ESP32 C3 Datasheet English
esp32-c3_datasheet_en[1].pdf0.86 MB