Samouczek ESP32 50/55 - Sterowanie diodą RGB z dowolnego miejsca na świecie | Zestaw SunFounder ESP32
W tym samouczku nauczymy się, jak sterować kolorem diody RGB LED za pomocą mikrokontrolera ESP32 przez Wi-Fi, wykorzystując protokół MQTT oraz usługę Adafruit IO. Ta konfiguracja pozwala zmieniać kolor diody RGB LED z dowolnego miejsca na świecie, co stanowi praktyczne zastosowanie technologii IoT. Omówimy również, jak używać suwaków i selektora kolorów do wyboru pożądanego koloru.

ESP32 to wydajny mikrokontroler z wbudowaną obsługą Wi-Fi i Bluetooth, co czyni go idealnym do projektów IoT. W tym projekcie podłączymy diodę RGB LED do ESP32 i będziemy sterować jej kolorem przez broker MQTT udostępniany przez Adafruit. Samouczek przeprowadzi Cię przez konfigurację sprzętu, instrukcje podłączenia oraz kod niezbędny do płynnego działania wszystkiego (na filmie w 00:00).
Omówienie sprzętu
Do tego projektu głównymi komponentami, których użyjemy, są mikrokontroler ESP32 oraz dioda RGB LED. ESP32 może łączyć się z sieciami Wi-Fi, co pozwala mu komunikować się z usługą Adafruit IO. Dioda RGB LED zawiera trzy pojedyncze diody (czerwoną, zieloną i niebieską), które można mieszać, aby uzyskać szeroką gamę kolorów.
Dioda RGB LED działa na zasadzie wspólnej anody lub wspólnej katody, co oznacza, że anoda (dodatnia) lub katoda (ujemna) poszczególnych diod musi być odpowiednio podłączona, aby działały. Każdym kolorem można sterować za pomocą modulacji szerokości impulsu (PWM), która reguluje jasność każdej diody poprzez zmianę współczynnika wypełnienia.
Szczegóły z karty katalogowej
| Producent | SunFounder |
|---|---|
| Numer części | Dioda RGB LED |
| Napięcie przewodzenia (VF) | 2,0–3,4 V |
| Prąd przewodzenia (IF) | 20 mA |
| Szczytowa długość fali (nm) | Czerwony: 620, Zielony: 525, Niebieski: 465 |
| Obudowa | Standardowa 4-pinowa |
| Uwagi / warianty | Dostępne opcje wspólnej anody lub wspólnej katody |
- Użyj rezystorów 220 omów dla każdego koloru diody, aby ograniczyć prąd.
- Upewnij się, że okablowanie jest prawidłowe dla konfiguracji wspólnej anody lub katody.
- Sprawdź zasilanie ESP32, aby uniknąć spadków napięcia.
- Utrzymuj częstotliwość PWM w odpowiednich granicach, aby zapewnić płynne przejścia kolorów.
- Upewnij się, że dane logowania do Wi-Fi są poprawne, aby połączyć się z usługą Adafruit IO.
Instrukcje podłączenia

Aby podłączyć diodę RGB LED do ESP32, zacznij od zidentyfikowania pinów na diodzie RGB LED. Najdłuższy pin to pin wspólny. Dla konfiguracji ze wspólną anodą podłącz ten pin do dodatniego źródła napięcia (3,3 V). Pozostałe trzy piny odpowiadają diodom czerwonemu, zielonemu i niebieskiemu. Podłącz pin czerwony do GPIO 27, pin zielony do GPIO 26, a pin niebieski do GPIO 25. Każde z tych połączeń powinno być wykonane przez rezystor 220 omów, aby ograniczyć prąd płynący przez diody.
Następnie podłącz masę (GND) ESP32 do linii masy swojego obwodu. Upewnij się, że okablowanie jest pewne, aby uniknąć przerywanych połączeń. Jeśli używasz diody RGB LED ze wspólną katodą, podłącz pin wspólny do masy zamiast tego i podłącz poszczególne piny kolorów do dodatniego zasilania przez rezystory. Sprawdź dokładnie wszystkie połączenia przed zasileniem obwodu.
Przykłady kodu i omówienie
W kodzie Arduino zaczynamy od zdefiniowania pinów dla czerwonych, zielonych i niebieskich diod za pomocą identyfikatorów redPin, greenPin i bluePin. Dodatkowo definiujemy kanały PWM dla każdego koloru za pomocą redChannel, greenChannel i blueChannel. Częstotliwość PWM jest ustawiona na 5000 Hz z rozdzielczością 8-bitową.
const int redPin = 27;
const int greenPin = 26;
const int bluePin = 25;
const int redChannel = 0;
const int greenChannel = 1;
const int blueChannel = 2;
W funkcji setup() inicjalizujemy kanały PWM i przypisujemy odpowiednie piny. Łączymy się również z siecią Wi-Fi przy użyciu zdefiniowanych danych logowania i konfigurujemy klienta MQTT do komunikacji z Adafruit IO.
void setup() {
ledcSetup(redChannel, freq, resolution);
ledcAttachPin(redPin, redChannel);
// Połączenie z WiFi
WiFi.begin(WLAN_SSID, WLAN_PASS);
}
Główna pętla sprawdza połączenie MQTT i przetwarza przychodzące wiadomości. Wypisuje również bieżące wartości RGB na monitorze szeregowym. Kolor diody jest aktualizowany na podstawie wartości otrzymanych przez subskrypcje MQTT.
void loop() {
MQTT_connect();
mqtt.processPackets(500);
setColor();
}
Więcej szczegółów na temat pełnego kodu znajdziesz w kompletnym kodzie zamieszczonym poniżej artykułu.
Demonstracja / Czego się spodziewać
Gdy wszystko będzie skonfigurowane, a kod wgrany, powinieneś zobaczyć, jak dioda RGB reaguje na zmiany kolorów wprowadzane przez panel Adafruit IO. Podczas regulowania suwaków dla koloru czerwonego, zielonego i niebieskiego dioda powinna odpowiednio zmieniać swój kolor. Jeśli napotkasz jakiekolwiek problemy, upewnij się, że połączenie Wi-Fi jest stabilne, a nazwy tematów MQTT zgadzają się z tymi zdefiniowanymi w kodzie (na filmie w 17:30).
Typowe problemy obejmują nieprawidłowe podłączenie, niezgodne nazwy tematów oraz zapomnienie o ustawieniu poprawnych danych logowania do Wi-Fi. Jeśli dioda nie świeci się, sprawdź ponownie połączenia rezystorów i upewnij się, że ESP32 jest poprawnie zasilany.
Znaczniki czasu w filmie
- 00:00 Start
- 2:23 Wprowadzenie do projektu
- 4:43 Co to jest MQTT
- 7:55 Konfiguracja Adafruit IO
- 14:09 Wyjaśnienie podłączeń
- 16:07 Wyjaśnienie kodu
- 27:03 Wybór płytki ESP32 i portu COM w Arduino IDE
- 29:12 Prezentacja projektu
- 31:25 Co to jest dioda RGB?
- 35:26 Kolor 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
Rzeczy, których możesz potrzebować
-
AliExpressESP32-S3 N16R8 on AliExpresss.click.aliexpress.com
Zasoby i odniesienia
Brak zasobów.
Pliki📁
Karta katalogowa (pdf)
-
ESP32 C3 Datasheet English
esp32-c3_datasheet_en[1].pdf0.86 MB