ESP32 Tutorijal 50/55 - Kontrolišite RGB LED sa bilo kojeg mjesta na svijetu | SunFounder-ov ESP32 komplet
U ovom tutorijalu naučit ćemo kako kontrolirati boju RGB LED diode koristeći ESP32 mikrokontroler putem Wi-Fi mreže, koristeći MQTT protokol i Adafruit IO servis. Ova postavka vam omogućava da promijenite boju RGB LED diode s bilo kojeg mjesta na svijetu, pružajući praktičnu primjenu IoT tehnologije. Također ćemo istražiti kako koristiti klizače i birač boja za odabir željene boje.

ESP32 je moćan mikrokontroler koji ima ugrađene Wi-Fi i Bluetooth mogućnosti, što ga čini idealnim za IoT projekte. U ovoj izradi spojit ćemo RGB LED diodu na ESP32 i kontrolirati njenu boju putem MQTT brokera kojeg pruža Adafruit. Tutorijal će vas provesti kroz postavljanje hardvera, upute za povezivanje i kod potreban da sve radi besprijekorno (u videu na 00:00).
Objašnjenje hardvera
Za ovaj projekt, primarne komponente koje ćemo koristiti su ESP32 mikrokontroler i RGB LED dioda. ESP32 je sposoban povezati se na Wi-Fi mreže, omogućavajući mu komunikaciju s Adafruit IO servisom. RGB LED dioda sadrži tri pojedinačne LED diode (crvenu, zelenu i plavu) koje se mogu miješati kako bi se stvorio širok raspon boja.
RGB LED dioda radi na principu zajedničke anode ili zajedničke katode, što znači da anoda (pozitivna) ili katoda (negativna) pojedinačnih LED dioda mora biti pravilno spojena da bi radile. Svaka boja može se kontrolirati pomoću Pulse Width Modulation (PWM), koja prilagođava svjetlinu svake LED diode mijenjanjem radnog ciklusa.
Detalji iz tehničke specifikacije
| Proizvođač | SunFounder |
|---|---|
| Broj dijela | RGB LED |
| Napon provođenja (VF) | 2.0–3.4 V |
| Struja provođenja (IF) | 20 mA |
| Vršna talasna dužina (nm) | Crvena: 620, Zelena: 525, Plava: 465 |
| Pakovanje | Standardni 4-pinski |
| Napomene / varijante | Dostupne opcije sa zajedničkom anodom ili zajedničkom katodom |
- Koristite otpornike od 220 oma za svaku boju LED diode kako biste ograničili struju.
- Osigurajte ispravno povezivanje za konfiguraciju sa zajedničkom anodom ili katodom.
- Provjerite napajanje ESP32-a kako biste izbjegli smanjenje napona.
- Držite PWM frekvenciju unutar granica za glatke prijelaze boja.
- Osigurajte da su Wi-Fi akreditivi ispravni za povezivanje na Adafruit IO servis.
Upute za povezivanje

Da biste povezali RGB LED diodu na ESP32, počnite identificiranjem pinova na RGB LED diodi. Najduži pin je zajednički pin. Za konfiguraciju sa zajedničkom anodom, spojite ovaj pin na pozitivni napon napajanja (3.3V). Ostala tri pina odgovaraju crvenoj, zelenoj i plavoj LED diodi. Spojite crveni pin na GPIO 27, zeleni pin na GPIO 26, a plavi pin na GPIO 25. Svaka od ovih veza treba biti napravljena kroz otpornik od 220 oma kako bi se ograničila struja koja teče kroz LED diode.
Zatim spojite uzemljenje (GND) ESP32-a na liniju uzemljenja vašeg kruga. Osigurajte da je povezivanje sigurno kako biste spriječili povremene veze. Ako koristite RGB LED diodu sa zajedničkom katodom, spojite zajednički pin na uzemljenje umjesto toga i spojite pojedinačne pinove boja na pozitivno napajanje kroz otpornike. Dvaput provjerite sve veze prije uključivanja kruga.
Primjeri koda i objašnjenje
U Arduino kodu, počinjemo definiranjem pinova za crvenu, zelenu i plavu LED diodu koristeći identifikatore redPin, greenPin i bluePin. Dodatno, definiramo PWM kanale za svaku boju koristeći redChannel, greenChannel i blueChannel. PWM frekvencija je postavljena na 5000 Hz s 8-bitnom rezolucijom.
const int redPin = 27;
const int greenPin = 26;
const int bluePin = 25;
const int redChannel = 0;
const int greenChannel = 1;
const int blueChannel = 2;
U setup() funkciji, inicijaliziramo PWM kanale i povezujemo odgovarajuće pinove. Također se povezujemo na Wi-Fi mrežu koristeći definirane akreditive i postavljamo MQTT klijent za komunikaciju s Adafruit IO.
void setup() {
ledcSetup(redChannel, freq, resolution);
ledcAttachPin(redPin, redChannel);
// Povezivanje na WiFi
WiFi.begin(WLAN_SSID, WLAN_PASS);
}
Glavna petlja provjerava MQTT vezu i obrađuje dolazne poruke. Također ispisuje trenutne RGB vrijednosti na serijski monitor. Boja LED diode ažurira se na osnovu vrijednosti primljenih putem MQTT pretplata.
void loop() {
MQTT_connect();
mqtt.processPackets(500);
setColor();
}
Za više detalja o cijelom kodu, pogledajte kompletan kod učitavan ispod članka.
Demonstracija / Šta očekivati
Kada je sve podešeno i kod je uploadovan, trebali biste vidjeti RGB LED kako reagira na promjene boja napravljene putem Adafruit IO kontrolne ploče. Dok podešavate klizače za crvenu, zelenu i plavu boju, LED bi trebao mijenjati svoju boju u skladu s tim. Ako naiđete na bilo kakve probleme, provjerite da je Wi-Fi veza stabilna i da se nazivi MQTT tema podudaraju s onima definiranim u kodu (u videu na 17:30).
Uobičajene zamke uključuju pogrešno povezivanje, neusklađene nazive tema i zaboravljanje postavljanja ispravnih Wi-Fi akreditiva. Ako LED ne zasvijetli, još jednom provjerite veze otpornika i osigurajte da je ESP32 ispravno napajan.
Vremenske oznake videa
- 00:00 Početak
- 2:23 Uvod u projekat
- 4:43 Šta je MQTT
- 7:55 Adafruit IO podešavanje
- 14:09 Objašnjeno povezivanje
- 16:07 Objašnjen kod
- 27:03 Odabir ESP32 ploče i COM porta u Arduino IDE
- 29:12 Demonstracija projekta
- 31:25 Šta je RGB LED?
- 35:26 RGB boja
/***********************************************************************
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
Things you might need
-
AliExpressESP32-S3 N16R8 on AliExpresss.click.aliexpress.com
Resources & references
No resources yet.
Files📁
Datasheet (pdf)
-
ESP32 C3 Datasheet English
esp32-c3_datasheet_en[1].pdf0.86 MB