ESP32 оқулығы 50/55 - Әлемнің кез келген жерінен RGB жарықдиодын басқару | SunFounder ESP32 жиынтығы
Бұл оқулықта біз ESP32 микроконтроллерін Wi-Fi арқылы RGB жарықдиодының түсін басқаруды үйренеміз, MQTT протоколы мен Adafruit IO қызметін қолданамыз. Бұл қондырғы әлемнің кез келген жерінен RGB жарықдиодының түсін өзгертуге мүмкіндік береді, бұл IoT технологиясының практикалық қолданылуын қамтамасыз етеді. Сондай-ақ қалаған түсті таңдау үшін слайдерлер мен түс таңдағышты қалай пайдалану керектігін қарастырамыз.

ESP32 - бұл кірістірілген Wi-Fi және Bluetooth мүмкіндіктері бар қуатты микроконтроллер, ол IoT жобалары үшін өте қолайлы. Бұл құрылыста біз RGB жарықдиодын ESP32-ге қосып, оның түсін Adafruit ұсынған MQTT брокері арқылы басқарамыз. Оқулық сізді аппараттық қондырғы, сым қосу нұсқаулары және бәрінің үздіксіз жұмыс істеуіне қажетті код арқылы жүргізеді (бейнеде 00:00).
Аппараттық құралдар түсіндірмесі
Бұл жоба үшін біз қолданатын негізгі компоненттер - ESP32 микроконтроллері және RGB жарықдиоды. ESP32 Wi-Fi желілеріне қосылуға қабілетті, бұл оған Adafruit IO қызметімен байланысуға мүмкіндік береді. RGB жарықдиодында үш жеке жарықдиод (қызыл, жасыл және көк) бар, оларды араластыру арқылы кең түс ауқымын жасауға болады.
RGB жарықдиоды ортақ анод немесе ортақ катод принципі бойынша жұмыс істейді, яғни жеке жарықдиодтардың аноды (оң) немесе катоды (теріс) олардың жұмыс істеуі үшін дұрыс қосылуы керек. Әр түсті Pulse Width Modulation (PWM) көмегімен басқаруға болады, ол жұмыс циклін өзгерту арқылы әр жарықдиодтың жарықтығын реттейді.
Деректер парағының мәліметтері
| Өндіруші | SunFounder |
|---|---|
| Бөлшек нөмірі | RGB жарықдиоды |
| Тура кернеу (VF) | 2.0–3.4 В |
| Тура ток (IF) | 20 мА |
| Шың толқын ұзындығы (нм) | Қызыл: 620, Жасыл: 525, Көк: 465 |
| Қаптама | Стандартты 4 істікшелі |
| Ескертулер / нұсқалар | Ортақ анод немесе ортақ катод нұсқалары қолжетімді |
- Әр жарықдиод түсі үшін токты шектеу үшін 220 Ом резисторларды қолданыңыз.
- Ортақ анод немесе катод конфигурациясы үшін дұрыс сым қосуды қамтамасыз етіңіз.
- Кернеудің төмендеуін болдырмау үшін ESP32 қуат көзін тексеріңіз.
- Тегіс түс ауысулары үшін PWM жиілігін шектерде ұстаңыз.
- Adafruit IO қызметіне қосылу үшін Wi-Fi тіркелгі деректерінің дұрыс екенін қамтамасыз етіңіз.
Сым қосу нұсқаулары

RGB жарықдиодын ESP32-ге қосу үшін алдымен RGB жарықдиодындағы істікшелерді анықтаңыз. Ең ұзын істікше - ортақ істікше. Ортақ анод конфигурациясы үшін бұл істікшені оң кернеу көзіне (3.3В) қосыңыз. Қалған үш істікше қызыл, жасыл және көк жарықдиодтарға сәйкес келеді. Қызыл істікшені GPIO 27-ге, жасыл істікшені GPIO 26-ға және көк істікшені GPIO 25-ке қосыңыз. Осы қосылымдардың әрқайсысы жарықдиодтар арқылы өтетін токты шектеу үшін 220 Ом резистор арқылы жасалуы керек.
Әрі қарай, ESP32 жерге (GND) тұйықтау сымын тізбегіңіздің жер сымына қосыңыз. Үзіліссіз қосылымдарды болдырмау үшін сымдардың берік екенін қамтамасыз етіңіз. Егер ортақ катодты RGB жарықдиодын қолдансаңыз, ортақ істікшені жерге қосып, жеке түс істікшелерін резисторлар арқылы оң қуат көзіне қосыңыз. Тізбекті қуаттандыру алдында барлық қосылымдарды екі рет тексеріңіз.
Код мысалдары және түсіндірме
Arduino кодында біз қызыл, жасыл және көк жарықдиодтар үшін істікшелерді redPin, greenPin және bluePin идентификаторлары арқылы анықтаймыз. Сонымен қатар, әр түс үшін PWM арналарын redChannel, greenChannel және blueChannel арқылы анықтаймыз. PWM жиілігі 5000 Гц және 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;
setup() функциясында біз PWM арналарын инициализациялап, сәйкес істікшелерді қосамыз. Сондай-ақ анықталған тіркелгі деректерін пайдаланып Wi-Fi желісіне қосыламыз және Adafruit IO-мен байланыс үшін MQTT клиентін орнатамыз.
void setup() {
ledcSetup(redChannel, freq, resolution);
ledcAttachPin(redPin, redChannel);
// Wi-Fi-ға қосылу
WiFi.begin(WLAN_SSID, WLAN_PASS);
}
Негізгі цикл MQTT қосылымын тексереді және кіріс хабарламаларды өңдейді. Сондай-ақ ағымдағы RGB мәндерін сериялық мониторға басып шығарады. Жарықдиодтың түсі MQTT жазылымдары арқылы алынған мәндерге негізделіп жаңартылады.
void loop() {
MQTT_connect();
mqtt.processPackets(500);
setColor();
}
Толық код туралы қосымша мәліметтер үшін мақаланың төменінде жүктелген толық кодты қараңыз.
Демонстрация / Не күтуге болады
Барлығы орнатылып, код жүктелгеннен кейін, Adafruit IO бақылау тақтасы арқылы жасалған түс өзгерістеріне RGB жарықдиодының жауап беруін көруіңіз керек. Қызыл, жасыл және көк түстерге арналған сырғытпаларды реттеген сайын, жарықдиод өз түсін сәйкесінше өзгертуі тиіс. Қандай да бір ақаулықтар туындаса, Wi-Fi қосылымының тұрақты екенін және MQTT тақырып атауларының кодта анықталғандармен сәйкес келетінін тексеріңіз (бейнеде 17:30).
Жиі кездесетін қателіктерге дұрыс емес сым қосылымы, тақырып атауларының сәйкес келмеуі және дұрыс Wi-Fi тіркелгі деректерін орнатуды ұмыту жатады. Егер жарықдиод жанбаса, резистор қосылымдарын қайта тексеріп, ESP32 дұрыс қуатталғанына көз жеткізіңіз.
Бейне уақыт белгілері
- 00:00 Басталуы
- 2:23 Жобаға кіріспе
- 4:43 MQTT дегеніміз не
- 7:55 Adafruit IO орнату
- 14:09 Сым қосылымы түсіндірілді
- 16:07 Код түсіндірілді
- 27:03 Arduino IDE-де ESP32 тақтасын және COM портын таңдау
- 29:12 Жобаны көрсету
- 31:25 RGB жарықдиоды дегеніміз не?
- 35:26 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
Сізге қажет болуы мүмкін нәрселер
-
AliExpressESP32-S3 N16R8 on AliExpresss.click.aliexpress.com
Ресурстар мен сілтемелер
Әлі ресурстар жоқ.
Файлдар📁
Техникалық сипаттама (pdf)
-
ESP32 C3 Datasheet English
esp32-c3_datasheet_en[1].pdf0.86 MB