Search Code

Cashirka ESP32 50/55 - Xakamaynta LED RGB meel kasta oo adduunka ah | Qalabka ESP32 ee SunFounder

Cashirka ESP32 50/55 - Xakamaynta LED RGB meel kasta oo adduunka ah | Qalabka ESP32 ee SunFounder

Cashigarkani, waxaan baran doonaa sida loo xakameeyo midabka LED-ga RGB iyadoo la isticmaalayo kontoroolka ESP32 ee Wi-Fi-ka, iyadoo la adeegsanayo borotokoolka MQTT iyo adeegga Adafruit IO. Qaabkan wuxuu kuu ogolaanayaa inaad ka beddesho midabka LED-ga RGB meel kasta oo adduunka ah, isagoo bixinaya codsi wax ku ool ah oo teknoolojiyadda IoT ah. Waxaan sidoo kale sahamin doonaa sida loo isticmaalo sliders-ka iyo midab-doorashada si loo doorto midabka la doonayo.

esp32-50-RGB-led-mqtt-main

ESP32 waa kontorool yar oo xoog badan oo leh awoodo Wi-Fi iyo Bluetooth ku dhex jira, taasoo ka dhigaysa mid ku habboon mashruucyada IoT. Dhismahan, waxaan ku xidhi doonaa LED-ga RGB ee ESP32-ka oo waxaan ku xakameyn doonaa midabkiisa iyadoo loo marayo dhexdhexaadiyaha MQTT ee uu bixiyo Adafruit. Casharku wuxuu ku hagaynaa qalabaynta hardware-ka, tilmaamaha fiilooyinka, iyo koodhka lagama maarmaanka u ah si wax walba si habsami leh u shaqeeyaan (fiidiyowga 00:00).

Qalabka La Sharaxay

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

Mashruucan, qaybaha aasaasiga ah ee aan isticmaali doonaa waa kontoroolka ESP32 iyo LED-ga RGB. ESP32 wuxuu awood u leeyahay inuu ku xidhmao shabakadaha Wi-Fi, isagoo u oggolaanaya inuu la xidhiidho adeegga Adafruit IO. LED-ga RGB wuxuu ka kooban yahay saddex LED oo kala duwan (casaan, cagaar, iyo buluug) kuwaas oo la isku qasi karo si loo abuuro midabyo kala duwan oo badan.

LED-ga RGB wuxuu ku shaqeeyaa mabda'a anode guud ama cathode guud, taasoo la macno ah in anode (positive) ama cathode (negative) ee LED-yada shaqsiga ah ay tahay in si sax ah loo xidho si ay u shaqeeyaan. Midab kasta waxaa lagu xakameyn karaa isticmaalka Pulse Width Modulation (PWM), kaas oo hagaajiya iftiinka LED kasta adoo kala duwanaya wareegga shaqada.

ES32-38_RGB_LED-wiring

Faahfaahinta Xogta

Soo saaraha SunFounder
Nambarka qaybta RGB LED
Koronto hore (VF) 2.0–3.4 V
Koronto hore (IF) 20 mA
Dhererka mawjadda ugu sarreeya (nm) Casaan: 620, Cagaar: 525, Buluug: 465
Baakad 4-birood oo caadi ah
Xusuus / noocyo Ikhtiyaarada anode guud ama cathode guud ayaa diyaar ah

 

  • Isticmaal resistors 220 ohm oo midab kasta oo LED ah si aad u xaddiddo korontada.
  • Hubi in fiilooyinka ay sax yihiin qaabka anode guud ama cathode guud.
  • Hubi sahayda korontada ee ESP32-ka si aad uga fogaato brownouts.
  • Ku hay soo noqnoqoshada PWM-ka gudaha xadka si loo helo isbeddel midab oo siman.
  • Hubi in aqoonsiga Wi-Fi-ku sax yahay si aad ugu xidhanto adeegga Adafruit IO.

Tilmaamaha Fiilooyinka

ES32-38_RGB_LED-wiring

Si aad ugu xidho LED-ga RGB ee ESP32-ka, waxaad ku bilaabaysaa inaad aqoonsato biinanka LED-ga RGB. Biinka ugu dheer waa biinka guud. Qaabka anode guud, ku xidh biinkan korontada togan (3.3V). Saddexda biin ee kale waxay u dhigmaan LED-yada casaan, cagaar, iyo buluug. Ku xidh biinka casaan ee GPIO 27, biinka cagaar ee GPIO 26, iyo biinka buluug ee GPIO 25. Mid kasta oo ka mid ah xidhiidhadaan waa in lagu sameeyaa resistor 220 ohm si loo xaddiddo korontada ku socota LED-yada.

Marka xigta, ku xidh dhulka (GND) ee ESP32-ka khadka dhulka ee wareeggaaga. Hubi in fiilooyinka ay adag yihiin si looga hortago xidhiidhka kala go'a. Haddii aad isticmaalayso LED-ga RGB ee cathode guud, ku xidh biinka guud dhulka oo ku xidh biinanka midabka shaqsiga ah sahayda togan iyadoo loo marayo resistors-ka. Laba jeer hubi dhammaan xidhiidhada ka hor intaadan shidin wareegga.

Tusaalooyinka Koodhka & Sharaxaad

Koodhka Arduino, waxaan ku bilaabaynaa inaan qeexno biinanka LED-yada casaan, cagaar, iyo buluug iyadoo la isticmaalayo aqoonsiyada redPin, greenPin, iyo bluePin. Intaa waxaa dheer, waxaan qeexaynaa kanaalada PWM ee midab kasta iyadoo la isticmaalayo redChannel, greenChannel, iyo blueChannel. Soo noqnoqoshada PWM waxaa lagu dejiyaa 5000 Hz oo leh xallin 8-bit ah.

const int redPin = 27;
const int greenPin = 26;
const int bluePin = 25;

const int redChannel = 0;
const int greenChannel = 1;
const int blueChannel = 2;

Shaqada setup(), waxaan bilaabaynaa kanaalada PWM oo waxaan ku xidhaynaa biinanka u dhigma. Waxaan sidoo kale ku xidhnaa shabakadda Wi-Fi iyadoo la isticmaalayo aqoonsiyada la qeexay oo waxaan dejineynaa macmiilka MQTT si uu ula xidhiidho Adafruit IO.

void setup() {
  ledcSetup(redChannel, freq, resolution);
  ledcAttachPin(redPin, redChannel);
  // Ku xidh WiFi
  WiFi.begin(WLAN_SSID, WLAN_PASS);
}

Loop-ka ugu weyn wuxuu hubinayaa xidhiidhka MQTT oo wuxuu habaynayaa fariimaha soo socda. Waxa kale oo uu daabacaa qiimaha RGB ee hadda jira kormeerka serial-ka. Midabka LED-ga waxaa lagu cusboonaysiiyaa iyadoo lagu salaynayo qiimaha lagu helo macmiilka MQTT.

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

Faahfaahin dheeri ah oo ku saabsan koodhka buuxa, fadlan tixraac koodhka dhammaystiran ee hoos ku xusan maqaalka.

Muuqaal / Waxa Lagu Filan Karaa

Mark haddii wax walba si habboon loo habeeyo oo koodhka la soo geliyo, waa inaad aragtaa RGB LED oo ka jawaabaya isbeddelka midabka ee lagu sameeyay dashboard-ka Adafruit IO. Markaad hagaajiso slider-yada casaanka, cagaarka, iyo buluugga, LED-ku waa inuu midabkiisa u beddelaa si waafaqsan. Haddii aad la kulanto dhibaatooyin, hubi in isku xirka Wi-Fi uu xasiloon yahay iyo in magacyada mawduuca MQTT ay la mid yihiin kuwa lagu qeexay koodhka (fiidiyowga 17:30).

Khaladaadka caadiga ah waxaa ka mid ah fiilooyinka qaldan, magacyada mawduucyada oo aan is waafaqin, iyo hilmaamista dejinta astaamaha saxda ah ee Wi-Fi. Haddii LED-ku uusan ifin, laba jeer hubi isku xirka resistor-ka oo hubi in ESP32 si sax ah loo shideeyo.

Waqtiyada Fiidiyowga

  • 00:00 Bilow
  • 2:23 Hordhaca mashruuca
  • 4:43 Waa maxay MQTT
  • 7:55 Dejinta Adafruit IO
  • 14:09 Sharaxaadda fiilooyinka
  • 16:07 Sharaxaadda koodhka
  • 27:03 Doorashada guddiga ESP32 iyo COM port-ka Arduino IDE
  • 29:12 Bandejiga mashruuca
  • 31:25 Waa maxay RGB LED?
  • 35:26 Midabka RGB

Sawirro

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
Luqadda: 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!");
}

Waad u baahan tahay

Kheyraadka & Tixraacyada

Wali wax kaydsan ah oo weli ma jiro.

Faylasha📁

Waraaqa xogta (pdf)