Tutorial ESP32 50/55 - Controla LED-ul RGB de oriunde din lume | Kitul ESP32 de la SunFounder
În acest tutorial, vom învăța cum să controlăm culoarea unui LED RGB folosind microcontrolerul ESP32 prin Wi-Fi, utilizând protocolul MQTT și serviciul Adafruit IO. Această configurare vă permite să schimbați culoarea LED-ului RGB de oriunde din lume, oferind o aplicație practică a tehnologiei IoT. Vom explora, de asemenea, cum să folosim glisoare și un selector de culori pentru a alege culoarea dorită.

ESP32 este un microcontroler puternic care are capacități integrate de Wi-Fi și Bluetooth, fiind ideal pentru proiecte IoT. În această construcție, vom conecta un LED RGB la ESP32 și vom controla culoarea acestuia printr-un broker MQTT furnizat de Adafruit. Tutorialul vă va ghida prin configurarea hardware-ului, instrucțiunile de cablare și codul necesar pentru ca totul să funcționeze perfect (în video la 00:00).
Hardware Explicat
Pentru acest proiect, componentele principale pe care le vom folosi sunt microcontrolerul ESP32 și LED-ul RGB. ESP32 este capabil să se conecteze la rețele Wi-Fi, permițându-i să comunice cu serviciul Adafruit IO. LED-ul RGB conține trei LED-uri individuale (roșu, verde și albastru) care pot fi amestecate pentru a crea o gamă largă de culori.
LED-ul RGB funcționează pe principiul anod comun sau catod comun, ceea ce înseamnă că anodul (pozitiv) sau catodul (negativ) al LED-urilor individuale trebuie conectat corect pentru ca acestea să funcționeze. Fiecare culoare poate fi controlată folosind Modulația în Lățime a Impulsurilor (PWM), care ajustează luminozitatea fiecărui LED prin varierea ciclului de funcționare.
Detalii din Fișa Tehnică
| Producător | SunFounder |
|---|---|
| Număr de piesă | LED RGB |
| Tensiune directă (VF) | 2,0–3,4 V |
| Curent direct (IF) | 20 mA |
| Lungime de undă de vârf (nm) | Roșu: 620, Verde: 525, Albastru: 465 |
| Pachet | Standard cu 4 pini |
| Note / variante | Opțiuni disponibile cu anod comun sau catod comun |
- Folosiți rezistențe de 220 ohmi pentru fiecare culoare a LED-ului pentru a limita curentul.
- Asigurați-vă de cablarea corectă pentru configurația cu anod comun sau catod comun.
- Verificați sursa de alimentare a ESP32 pentru a evita căderile de tensiune.
- Mențineți frecvența PWM în limitele pentru tranziții line ale culorilor.
- Asigurați-vă că datele de autentificare Wi-Fi sunt corecte pentru a vă conecta la serviciul Adafruit IO.
Instrucțiuni de Cablare

Pentru a cabla LED-ul RGB la ESP32, începeți prin identificarea pinilor de pe LED-ul RGB. Cel mai lung pin este pinul comun. Pentru o configurație cu anod comun, conectați acest pin la sursa de tensiune pozitivă (3,3V). Ceilalți trei pini corespund LED-urilor roșu, verde și albastru. Conectați pinul roșu la GPIO 27, pinul verde la GPIO 26 și pinul albastru la GPIO 25. Fiecare dintre aceste conexiuni ar trebui făcută printr-o rezistență de 220 ohmi pentru a limita curentul care trece prin LED-uri.
Apoi, conectați masa (GND) a ESP32 la linia de masă a circuitului dumneavoastră. Asigurați-vă că cablarea este sigură pentru a preveni conexiunile intermitente. Dacă folosiți un LED RGB cu catod comun, conectați pinul comun la masă și conectați pinii individuali de culoare la sursa pozitivă prin rezistențe. Verificați de două ori toate conexiunile înainte de a alimenta circuitul.
Exemple de Cod & Explicații
În codul Arduino, începem prin definirea pinilor pentru LED-urile roșu, verde și albastru folosind identificatorii redPin, greenPin și bluePin. În plus, definim canalele PWM pentru fiecare culoare folosind redChannel, greenChannel și blueChannel. Frecvența PWM este setată la 5000 Hz cu o rezoluție de 8 biți.
const int redPin = 27;
const int greenPin = 26;
const int bluePin = 25;
const int redChannel = 0;
const int greenChannel = 1;
const int blueChannel = 2;
În funcția setup(), inițializăm canalele PWM și atașăm pinii corespunzători. De asemenea, ne conectăm la rețeaua Wi-Fi folosind datele de autentificare definite și configurăm clientul MQTT pentru comunicarea cu Adafruit IO.
void setup() {
ledcSetup(redChannel, freq, resolution);
ledcAttachPin(redPin, redChannel);
// Conectare la WiFi
WiFi.begin(WLAN_SSID, WLAN_PASS);
}
Bucla principală verifică conexiunea MQTT și procesează mesajele primite. De asemenea, afișează valorile RGB curente pe monitorul serial. Culoarea LED-ului este actualizată pe baza valorilor primite prin abonamentele MQTT.
void loop() {
MQTT_connect();
mqtt.processPackets(500);
setColor();
}
Pentru mai multe detalii despre codul complet, vă rugăm să consultați codul integral încărcat mai jos în articol.
Demonstrație / Ce să Vă Așteptați
Odată ce totul este configurat și codul este încărcat, ar trebui să vezi LED-ul RGB răspunzând la schimbările de culoare făcute prin panoul de control Adafruit IO. Pe măsură ce ajustezi glisoarele pentru roșu, verde și albastru, LED-ul ar trebui să își schimbe culoarea în consecință. Dacă întâmpini probleme, asigură-te că conexiunea Wi-Fi este stabilă și că numele subiectelor MQTT corespund celor definite în cod (în video la 17:30).
Capcanele frecvente includ cablarea incorectă, numele de subiecte nepotrivite și uitarea de a seta acreditările Wi-Fi corecte. Dacă LED-ul nu se aprinde, verifică din nou conexiunile rezistorului și asigură-te că ESP32 este alimentat corect.
Marcaje temporale video
- 00:00 Început
- 2:23 Introducere în proiect
- 4:43 Ce este MQTT
- 7:55 Configurare Adafruit IO
- 14:09 Cablare explicată
- 16:07 Cod explicat
- 27:03 Selectarea plăcii ESP32 și a portului COM în Arduino IDE
- 29:12 Demonstrația proiectului
- 31:25 Ce este LED-ul RGB?
- 35:26 Culoare 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
Lucruri de care ai putea avea nevoie
-
AliExpressESP32-S3 N16R8 on AliExpresss.click.aliexpress.com
Resurse și referințe
Încă nu sunt resurse.
Fișiere📁
Fișă tehnică (pdf)
-
ESP32 C3 Datasheet English
esp32-c3_datasheet_en[1].pdf0.86 MB