ኢኤስፒ32 ትምህርት 50/55 - ከየትኛውም የዓለም ክፍል የRGB LED መቆጣጠር | የSunFounder ኢኤስፒ32 ኪት
በዚህ መማሪያ ውስጥ፣ የRGB LEDን ቀለም በESP32 microcontroller በWi-Fi ላይ እንዴት መቆጣጠር እንደምንችል እንማራለን፣ MQTT protocol እና Adafruit IO አገልግሎትን በመጠቀም። ይህ ዝግጅት የRGB LEDን ቀለም ከየትኛውም የዓለም ክፍል እንዲቀይሩ ያስችልዎታል፣ ይህም የIoT ቴክኖሎጂ ተግባራዊ አተገባበርን ይሰጣል። እንዲሁም የሚፈለገውን ቀለም ለመምረጥ ስላይደር እና የቀለም መራጭ እንዴት መጠቀም እንደሚቻል እንመረምራለን።

ESP32 ኃይለኛ microcontroller ነው፣ አብሮ የተሰራ Wi-Fi እና Bluetooth አቅም ያለው፣ ለIoT ፕሮጀክቶች ተስማሚ ያደርገዋል። በዚህ ግንባታ ውስጥ፣ RGB LEDን ከESP32 ጋር እናገናኛለን እና ቀለሙን በAdafruit በሚሰጠው MQTT broker በኩል እንቆጣጠራለን። መማሪያው በሃርድዌር ዝግጅት፣ በሽቦ መገናኘት መመሪያዎች እና ሁሉንም ነገር ያለችግር እንዲሰራ አስፈላጊውን ኮድ ይመራዎታል (በቪዲዮ በ00:00)።
ሃርድዌር ተብራርቷል
ለዚህ ፕሮጀክት፣ ዋና ዋና ክፍሎች ESP32 microcontroller እና RGB LED ናቸው። ESP32 ከWi-Fi አውታረ መረቦች ጋር መገናኘት ይችላል፣ ይህም ከAdafruit IO አገልግሎት ጋር እንዲግባባ ያስችለዋል። RGB LED ሦስት የተለያዩ LEDs (ቀይ፣ አረንጓዴ እና ሰማያዊ) ይዟል፣ እነዚህም ተቀላቅለው ብዙ አይነት ቀለሞችን መፍጠር ይችላሉ።
RGB LED በጋራ anode ወይም በጋራ cathode መርህ ላይ ይሰራል፣ ይህ ማለት የእያንዳንዱ LED anode (አዎንታዊ) ወይም cathode (አሉታዊ) እንዲሰሩ በትክክል መገናኘት አለባቸው ማለት ነው። እያንዳንዱ ቀለም Pulse Width Modulation (PWM) በመጠቀም መቆጣጠር ይቻላል፣ ይህም የእያንዳንዱን LED ብሩህነት የduty cycleን በመቀየር ያስተካክላል።
የዳታሼት ዝርዝሮች
| አምራች | SunFounder |
|---|---|
| የክፍል ቁጥር | RGB LED |
| የፊት ቮልቴጅ (VF) | 2.0–3.4 V |
| የፊት ኤሌክትሪክ (IF) | 20 mA |
| ከፍተኛ የሞገድ ርዝመት (nm) | ቀይ: 620, አረንጓዴ: 525, ሰማያዊ: 465 |
| ፓኬጅ | መደበኛ 4-ፒን |
| ማስታወሻዎች / ልዩነቶች | የጋራ anode ወይም የጋራ cathode አማራጮች ይገኛሉ |
- ኤሌክትሪክን ለመገደብ ለእያንዳንዱ የLED ቀለም 220 ohm resistors ይጠቀሙ።
- ለጋራ anode ወይም cathode ውቅር ትክክለኛ ሽቦ መገናኘትን ያረጋግጡ።
- ቡናማ መቆራረጥን ለማስቀረት የESP32 የኃይል አቅርቦትን ይፈትሹ።
- ለስላሳ የቀለም ሽግግሮች PWM ድግግሞሽን በገደብ ውስጥ ያቆዩ።
- ከAdafruit IO አገልግሎት ጋር ለመገናኘት የWi-Fi ምስክርነቶች ትክክል መሆናቸውን ያረጋግጡ።
የሽቦ መገናኘት መመሪያዎች

RGB LEDን ከESP32 ጋር ለማገናኘት፣ በRGB LED ላይ ያሉትን ፒኖች በመለየት ይጀምሩ። ረጅሙ ፒን የጋራ ፒን ነው። ለጋራ anode ውቅር፣ ይህን ፒን ከአዎንታዊ ቮልቴጅ አቅርቦት (3.3V) ጋር ያገናኙ። ሌሎቹ ሦስት ፒኖች ከቀይ፣ አረንጓዴ እና ሰማያዊ LEDs ጋር ይዛመዳሉ። ቀይ ፒንን ከGPIO 27፣ አረንጓዴ ፒንን ከGPIO 26 እና ሰማያዊ ፒንን ከGPIO 25 ጋር ያገናኙ። እያንዳንዱ እነዚህ ግንኙነቶች በLEDs ውስጥ የሚፈሰውን ኤሌክትሪክ ለመገደብ በ220 ohm resistor በኩል መደረግ አለባቸው።
በመቀጠል፣ የESP32ን መሬት (GND) ከወረዳዎ የመሬት መስመር ጋር ያገናኙ። የሚቋረጡ ግንኙነቶችን ለማስቀረት ሽቦው ደህንነቱ የተጠበቀ መሆኑን ያረጋግጡ። የጋራ cathode RGB LED እየተጠቀሙ ከሆነ፣ የጋራ ፒንን ከመሬት ጋር ያገናኙ እና የእያንዳንዱን ቀለም ፒኖች በresistors በኩል ከአዎንታዊ አቅርቦት ጋር ያገናኙ። ወረዳውን ከማብራት በፊት ሁሉንም ግንኙነቶች ሁለት ጊዜ ያረጋግጡ።
የኮድ ምሳሌዎች እና ማብራሪያ
በArduino ኮድ ውስጥ፣ ለቀይ፣ አረንጓዴ እና ሰማያዊ LEDs ፒኖችን redPin፣ greenPin እና bluePin በሚሉ መለያዎች በመግለጽ እንጀምራለን። በተጨማሪም፣ ለእያንዳንዱ ቀለም PWM ቻናሎችን redChannel፣ greenChannel እና blueChannel በመጠቀም እንገልጻለን። PWM ድግግሞሽ በ5000 Hz ከ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);
// ከWiFi ጋር ይገናኙ
WiFi.begin(WLAN_SSID, WLAN_PASS);
}
ዋናው loop MQTT ግንኙነትን ይፈትሻል እና የመጡ መልዕክቶችን ያስኬዳል። እንዲሁም የአሁኑን RGB እሴቶች ወደ serial monitor ያትማል። የLED ቀለም በMQTT ምዝገባዎች በኩል በተቀበሉት እሴቶች ላይ ተመስርቶ ይዘመናል።
void loop() {
MQTT_connect();
mqtt.processPackets(500);
setColor();
}
ለሙሉ ኮድ ተጨማሪ ዝርዝሮች፣ እባክዎ ከጽሑፉ በታች የተጫነውን ሙሉ ኮድ ይመልከቱ።
ማሳያ / ምን እንደሚጠበቅ
ሁሉም ነገር ከተዋቀረ እና ኮዱ ከተጫነ በኋላ፣ RGB LED በAdafruit IO ዳሽቦርድ በኩል ለተደረጉ የቀለም ለውጦች ምላሽ ሲሰጥ ማየት ይኖርብዎታል። ለቀይ፣ አረንጓዴ እና ሰማያዊ ተንሸራታቾችን ሲያስተካክሉ፣ LED በዚሁ መሰረት ቀለሙን መቀየር አለበት። ማንኛውም ችግር ካጋጠምዎት፣ የWi-Fi ግንኙነቱ የተረጋጋ መሆኑን እና የMQTT ርዕስ ስሞች በኮዱ ውስጥ ከተገለጹት ጋር የሚዛመዱ መሆናቸውን ያረጋግጡ (በቪዲዮው 17:30 ላይ)።
የተለመዱ ችግሮች የተሳሳተ የሽቦ አያያዝ፣ ያልተመሳሳዩ የርዕስ ስሞች እና ትክክለኛውን የWi-Fi ማረጋገጫ መረጃ መርሳት ያካትታሉ። LED ካልበራ፣ የመቋቋሚያ (resistor) ግንኙነቶችን በድጋሚ ያረጋግጡ እና 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 LED ምንድን ነው?
- 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
እንደሚያስፈልግዎት ይችላል
-
አሊኤክስፕሬስESP32-S3 N16R8 on AliExpresss.click.aliexpress.com
ምንጮች እና ምንጮች
አሁን ምንም ምንጮች የለም።
ፋይሎች📁
የዳታ ማዕከል (pdf)
-
ESP32 C3 Datasheet English
esp32-c3_datasheet_en[1].pdf0.86 MB