Bincika Lambar

Koyarwar ESP32 50/55 - Sarrafa LED RGB daga ko'ina a duniya | Kunshin ESP32 na SunFounder

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-50-RGB-led-mqtt-main

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

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

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.

ES32-38_RGB_LED-wiring

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

ES32-38_RGB_LED-wiring

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

Hotuna

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

Abin da zaka iya bukata

Albarkatun da kuma shafukan da za a duba

Babu kayan aiki tukuna.

Fayiloli📁

Takardar bayanai (pdf)