Koyarwar ESP32 50/55 - Sarrafa LED RGB daga ko'ina a duniya | Kunshin ESP32 na SunFounder
A cikin wannan koyawa, za mu koyi yadda ake sarrafa launi na RGB LED ta amfani da microcontroller na ESP32 akan Wi-Fi, ta amfani da ka'idar MQTT da sabis na Adafruit IO. Wannan saitin yana ba ka damar canza launi na RGB LED daga ko'ina a duniya, yana ba da aikace-aikace na fasahar IoT. Za mu kuma bincika yadda ake amfani da sliders da mai zaɓar launi don zaɓar launin da ake so.

ESP32 microcontroller ne mai ƙarfi wanda ke da Wi-Fi da Bluetooth a cikinsa, yana sa ya dace da ayyukan IoT. A wannan ginin, za mu haɗa RGB LED zuwa ESP32 kuma mu sarrafa launinsa ta hanyar MQTT broker da Adafruit ke bayarwa. Koyawar za ta jagorance ka ta hanyar saitin kayan aiki, umarnin wayoyi, da lambar da ake buƙata don komai ya yi aiki cikin sauƙi (a cikin bidiyo a 00:00).
Bayanin Kayan Aiki
Don wannan aikin, manyan abubuwan da za mu yi amfani da su sune ESP32 microcontroller da RGB LED. ESP32 yana iya haɗawa da cibiyoyin sadarwar Wi-Fi, yana ba shi damar sadarwa da sabis na Adafruit IO. RGB LED yana ƙunshe da LEDs guda uku (ja, kore, da shuɗi) waɗanda za a iya haɗa su don ƙirƙirar launuka da yawa.
RGB LED yana aiki akan ka'idar common anode ko common cathode, wanda ke nufin cewa anode (positive) ko cathode (negative) na kowane LED dole ne a haɗa shi da kyau don su yi aiki. Kowane launi za a iya sarrafa shi ta amfani da Pulse Width Modulation (PWM), wanda ke daidaita hasken kowane LED ta hanyar canza yanayin aiki.
Cikakkun Bayanan Datasheet
| Mai Ƙirƙira | SunFounder |
|---|---|
| Lambar sashi | RGB LED |
| Forward voltage (VF) | 2.0–3.4 V |
| Forward current (IF) | 20 mA |
| Peak wavelength (nm) | Ja: 620, Kore: 525, Shuɗi: 465 |
| Package | Daidaitaccen 4-pin |
| Bayanan kula / bambance-bambance | Zaɓuɓɓukan common anode ko common cathode suna samuwa |
- Yi amfani da resistors na 220 ohm don kowane launi na LED don iyakance wutar lantarki.
- Tabbatar da daidaitaccen wayoyi don saitin common anode ko cathode.
- Duba samar da wutar lantarki na ESP32 don guje wa brownouts.
- Kiyaye mitar PWM a cikin iyakoki don sauƙin canjin launi.
- Tabbatar da cewa bayanan Wi-Fi daidai ne don haɗawa da sabis na Adafruit IO.
Umurnin Wayoyi

Don haɗa RGB LED zuwa ESP32, fara da gano pins akan RGB LED. Pin mafi tsawo shine pin na gama-gari. Don saitin common anode, haɗa wannan pin zuwa samar da wutar lantarki mai kyau (3.3V). Sauran pins guda uku sun dace da LEDs ja, kore, da shuɗi. Haɗa pin ja zuwa GPIO 27, pin kore zuwa GPIO 26, da pin shuɗi zuwa GPIO 25. Kowane ɗayan waɗannan haɗin ya kamata a yi ta hanyar resistor na 220 ohm don iyakance wutar da ke gudana ta cikin LEDs.
Na gaba, haɗa ground (GND) na ESP32 zuwa layin ground na kewayenka. Tabbatar cewa wayoyi sun tsaya lafiya don hana haɗin da ke katsewa. Idan kana amfani da RGB LED na common cathode, haɗa pin na gama-gari zuwa ground maimakon haka kuma haɗa pins na launuka daban-daban zuwa samar da wutar mai kyau ta hanyar resistors. Duba duk haɗin kai kafin kunna kewayen.
Misalan Lamba & Jagora
A cikin lambar Arduino, muna fara da ayyana pins don LEDs ja, kore, da shuɗi ta amfani da alamomin redPin, greenPin, da bluePin. Bugu da ƙari, muna ayyana tashoshin PWM don kowane launi ta amfani da redChannel, greenChannel, da blueChannel. An saita mitar PWM zuwa 5000 Hz tare da ƙudurin 8-bit.
const int redPin = 27;
const int greenPin = 26;
const int bluePin = 25;
const int redChannel = 0;
const int greenChannel = 1;
const int blueChannel = 2;
A cikin aikin setup(), muna fara tashoshin PWM kuma mu haɗa pins masu dacewa. Muna kuma haɗa zuwa cibiyar sadarwar Wi-Fi ta amfani da bayanan da aka ayyana kuma mu saita abokin ciniki na MQTT don sadarwa da Adafruit IO.
void setup() {
ledcSetup(redChannel, freq, resolution);
ledcAttachPin(redPin, redChannel);
// Haɗa zuwa WiFi
WiFi.begin(WLAN_SSID, WLAN_PASS);
}
Babban loop yana duba haɗin MQTT kuma yana sarrafa saƙonni masu shigowa. Yana kuma buga ƙimar RGB na yanzu zuwa serial monitor. Launin LED ana sabunta shi bisa ga ƙimar da aka karɓa ta hanyar biyan kuɗin MQTT.
void loop() {
MQTT_connect();
mqtt.processPackets(500);
setColor();
}
Don ƙarin cikakkun bayanai kan cikakken lambar, da fatan za a koma ga cikakken lambar da aka ɗora a ƙasan labarin.
Nuni / Abin da za ka Yi Tsammani
Da zarar an shirya komai kuma an ɗora lambar, ya kamata ka ga LED na RGB yana amsa canjin launi da aka yi ta hanyar dashboard na Adafruit IO. Yayin da kake daidaita ma'aunin ja, kore, da shuɗi, LED ya kamata ya canza launinsa daidai. Idan ka fuskanci wata matsala, ka tabbatar cewa haɗin Wi-Fi yana da ƙarfi kuma sunayen jigogin MQTT sun dace da waɗanda aka ayyana a cikin lambar (a cikin bidiyo a 17:30).
Matsalolin gama-gari sun haɗa da haɗin waya mara kyau, sunayen jigogi marasa daidaito, da manta saita bayanan shiga Wi-Fi daidai. Idan LED bai haskaka ba, sake duba haɗin resistor kuma ka tabbatar cewa ESP32 yana da wutar lantarki daidai.
Lokutan Bidiyo
- 00:00 Fara
- 2:23 Gabatarwa ga aikin
- 4:43 Menene MQTT
- 7:55 Saitin Adafruit IO
- 14:09 Bayanin haɗin waya
- 16:07 Bayanin lambar
- 27:03 Zaɓin board na ESP32 da tashar COM a kan Arduino IDE
- 29:12 Nunin aikin
- 31:25 Menene LED na RGB?
- 35:26 Launin 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
Abin da zaka iya bukata
-
AliExpressESP32-S3 N16R8 on AliExpresss.click.aliexpress.com
Albarkatun da kuma shafukan da za a duba
Babu kayan aiki tukuna.
Fayiloli📁
Takardar bayanai (pdf)
-
ESP32 C3 Datasheet English
esp32-c3_datasheet_en[1].pdf0.86 MB