کوډ ولټوئ

د ESP32 ټیوټوریل 50/55 - د نړۍ له هر ځای څخه د RGB LED کنټرول | د SunFounder د ESP32 کټ

د ESP32 ټیوټوریل 50/55 - د نړۍ له هر ځای څخه د RGB LED کنټرول | د SunFounder د ESP32 کټ

په دې ټیوټوریل کې به موږ زده کړو چې څنګه د ESP32 مایکروکنټرولر په کارولو سره د RGB LED رنګ د Wi-Fi له لارې کنټرول کړو، د MQTT پروتوکول او Adafruit IO خدمت په کارولو سره. دا ترتیب تاسو ته اجازه درکوي چې د RGB LED رنګ د نړۍ له هر ځای څخه بدل کړئ، چې د IoT ټیکنالوژۍ عملي کارونې وړاندې کوي. موږ به دا هم وپلټو چې څنګه د سلایډرونو او رنګ غوره کونکي څخه کار واخلو ترڅو مطلوب رنګ غوره کړو.

esp32-50-RGB-led-mqtt-main

ESP32 یو پیاوړی مایکروکنټرولر دی چې په جوړ شوي Wi-Fi او بلوتوت وړتیاوې لري، چې دا د IoT پروژو لپاره مثالی کوي. په دې جوړښت کې به موږ یو RGB LED له ESP32 سره وصل کړو او د هغې رنګ به د Adafruit لخوا چمتو شوي MQTT بروکر له لارې کنټرول کړو. ټیوټوریل به تاسو ته د هارډویر تنظیم، د تارونو لارښوونې، او هغه کوډ ته لارښوونه وکړي چې د هرڅه بې ساري کار کولو لپاره اړین دی (په ویډیو کې په 00:00 کې).

هارډویر تشریح شوی

esp32-50-RGB-led
esp32-50-RGB-led

د دې پروژې لپاره، لومړني اجزا چې موږ به یې وکاروو د ESP32 مایکروکنټرولر او RGB LED دي. ESP32 د Wi-Fi شبکو سره د نښلولو وړ دی، چې دا ته اجازه ورکوي چې د Adafruit IO خدمت سره اړیکه ونیسي. RGB LED درې انفرادي LEDs (سور، شین، او نیلي) لري چې د رنګونو پراخه لړۍ رامینځته کولو لپاره مخلوط کیدی شي.

RGB LED په عام انود یا عام کاتود اصولو کار کوي، چې معنی یې دا ده چې د انفرادي LEDs انود (مثبت) یا کاتود (منفي) باید په سمه توګه وصل شي ترڅو کار وکړي. هر رنګ د Pulse Width Modulation (PWM) په کارولو سره کنټرول کیدی شي، کوم چې د هر LED روښانتیا د دندې دورې په بدلولو سره تنظیموي.

ES32-38_RGB_LED-wiring

د ډیټاشیټ تفصیلات

جوړونکی SunFounder
د برخې شمېره RGB LED
فارورډ ولټاژ (VF) 2.0–3.4 V
فارورډ جریان (IF) 20 mA
د څوکې طول موج (nm) سور: 620، شین: 525، نیلي: 465
بسته بندي معیاري 4-پن
یادښتونه / ډولونه عام انود یا عام کاتود اختیارونه شتون لري

 

  • د هر LED رنګ لپاره د 220 اوم ریزسټرونه وکاروئ ترڅو جریان محدود کړئ.
  • د عام انود یا کاتود تنظیم لپاره سم تارونه ډاډمن کړئ.
  • د براون آوټ مخنیوي لپاره د ESP32 بریښنا رسول وګورئ.
  • د نرم رنګ لیږدونو لپاره د PWM فریکونسي په حدودو کې وساتئ.
  • د Adafruit IO خدمت سره د نښلولو لپاره د Wi-Fi اسناد سم دي ډاډمن کړئ.

د تارونو لارښوونې

ES32-38_RGB_LED-wiring

د RGB LED له ESP32 سره د تار کولو لپاره، د RGB LED په پنونو پیژندلو سره پیل وکړئ. تر ټولو اوږد پن عام پن دی. د عام انود تنظیم لپاره، دا پن د مثبت ولټاژ رسولو (3.3V) سره وصل کړئ. نور درې پنونه د سور، شین، او نیلي LEDs سره مطابقت لري. سور پن له GPIO 27 سره، شین پن له GPIO 26 سره، او نیلي پن له GPIO 25 سره وصل کړئ. د دې هرې اړیکې باید د 220 اوم ریزسټر له لارې ترسره شي ترڅو د LEDs له لارې بهیدونکی جریان محدود کړي.

بیا، د ESP32 ځمکه (GND) د خپل سرکټ د ځمکې کرښې سره وصل کړئ. ډاډ ترلاسه کړئ چې تارونه خوندي دي ترڅو د وقفې اړیکو مخه ونیسي. که تاسو د عام کاتود RGB LED کاروئ، عام پن د ځمکې سره وصل کړئ او د انفرادي رنګ پنونه د ریزسټرونو له لارې مثبت رسولو سره وصل کړئ. د سرکټ بریښنا کولو دمخه ټولې اړیکې دوه ځله وګورئ.

د کوډ مثالونه او لارښوونه

د Arduino کوډ کې، موږ د سور، شین، او نیلي LEDs لپاره پنونه د redPin، greenPin، او bluePin پیژندونکو په کارولو سره تعریف کوو. سربیره پردې، موږ د هر رنګ لپاره د PWM چینلونه د redChannel، greenChannel، او blueChannel په کارولو سره تعریف کوو. د PWM فریکونسي د 8-bit ریزولوشن سره 5000 Hz ټاکل شوې ده.

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);
  // Connect to WiFi
  WiFi.begin(WLAN_SSID, WLAN_PASS);
}

اصلي لوپ د MQTT اړیکه ګوري او راتلونکي پیغامونه پروسس کوي. دا همدارنګه اوسني RGB ارزښتونه سیریل مانیټور ته چاپوي. د LED رنګ د MQTT ګډونونو له لارې ترلاسه شوي ارزښتونو پراساس تازه کیږي.

void loop() {
  MQTT_connect();
  mqtt.processPackets(500);
  setColor();
}

د بشپړ کوډ په اړه د نورو تفصیلاتو لپاره، مهرباني وکړئ د مقالې لاندې بار شوي بشپړ کوډ ته مراجعه وکړئ.

مظاهره / څه تمه وکړو

کله چې هر څه تنظیم شي او کوډ اپلوډ شي، تاسو باید وګورئ چې RGB LED د Adafruit IO ډشبورډ له لارې شوي رنګ بدلونونو ته ځواب ورکوي. لکه څنګه چې تاسو د سور، شین او نیلي لپاره سلایډرونه تنظیموئ، LED باید د هغې مطابق خپل رنګ بدل کړي. که تاسو کومه ستونزه تجربه کړئ، ډاډ ترلاسه کړئ چې د Wi-Fi اړیکه باثباته ده او د MQTT موضوع نومونه د کوډ کې تعریف شوي سره سمون لري (په ویډیو کې په 17:30 کې).

عامې ستونزې عبارت دي له ناسم تارونه، ناسم موضوع نومونه، او د سم Wi-Fi اسنادو ټاکل هېرول. که LED روښانه نه شي، د ریزسټر اړیکې دوه ځله وګورئ او ډاډ ترلاسه کړئ چې 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 رنګ

انځورونه

ESP32_rgb_pin
ESP32_rgb_pin
ESP32_RGB_led_wires
ESP32_RGB_led_wires
ES32-38_RGB_LED-wiring
ES32-38_RGB_LED-wiring
esp32-50-RGB-led
esp32-50-RGB-led
esp32-50-RGB-led-mqtt-main
esp32-50-RGB-led-mqtt-main
852-ESP32 Tutorial 50/55- Arduino code to control RGB LED using MQTT service of Adafruit
ژبه: C++
/***********************************************************************
 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!");
}

هغه شیان چې تاسو ورته اړتیا لرئ

سرچینې او حوالې

تر اوسه هیڅ سرچینې نشته.

فایلونه📁

ډیټاشیټ (pdf)