Search Code

ESP32 Туторијал 50/55 - Контролирај RGB LED од било каде во светот | SunFounder-овиот ESP32 комплет

ESP32 Туторијал 50/55 - Контролирај RGB LED од било каде во светот | SunFounder-овиот ESP32 комплет

Во ова упатство, ќе научиме како да го контролираме бојата на RGB LED користејќи го ESP32 микроконтролерот преку Wi-Fi, користејќи го MQTT протоколот и Adafruit IO услугата. Оваа поставка ви овозможува да ја менувате бојата на RGB LED од било каде во светот, обезбедувајќи практична примена на IoT технологијата. Исто така, ќе истражиме како да користиме лизгачи и избирач на бои за да ја изберете саканата боја.

esp32-50-RGB-led-mqtt-main

ESP32 е моќен микроконтролер кој има вградени Wi-Fi и Bluetooth можности, што го прави идеален за IoT проекти. Во оваа изработка, ќе поврземе RGB LED со ESP32 и ќе ја контролираме неговата боја преку MQTT брокер обезбеден од Adafruit. Упатството ќе ве води низ поставувањето на хардверот, инструкциите за поврзување и кодот потребен за сè да функционира беспрекорно (во видеото на 00:00).

Објаснување на хардверот

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

За овој проект, главните компоненти што ќе ги користиме се ESP32 микроконтролерот и RGB LED. ESP32 е способен да се поврзе со Wi-Fi мрежи, овозможувајќи му да комуницира со Adafruit IO услугата. RGB LED содржи три поединечни LED диоди (црвена, зелена и сина) кои можат да се мешаат за да создадат широк опсег на бои.

RGB LED работи на принцип на заедничка анода или заедничка катода, што значи дека анодата (позитивна) или катодата (негативна) на поединечните LED диоди мора да бидат правилно поврзани за да работат. Секоја боја може да се контролира со користење на пулсно ширинска модулација (PWM), која ја прилагодува осветленоста на секоја LED диода со менување на работниот циклус.

ES32-38_RGB_LED-wiring

Детали од техничката спецификација

Производител SunFounder
Број на дел RGB LED
Напреден напон (VF) 2.0–3.4 V
Напредна струја (IF) 20 mA
Врвна бранова должина (nm) Црвена: 620, Зелена: 525, Сина: 465
Пакет Стандарден 4-пински
Белешки / варијанти Достапни опции за заедничка анода или заедничка катода

 

  • Користете отпорници од 220 оми за секоја LED боја за да ја ограничите струјата.
  • Осигурете се дека поврзувањето е правилно за конфигурација на заедничка анода или катода.
  • Проверете го напојувањето на ESP32 за да избегнете падови на напон.
  • Чувајте ја PWM фреквенцијата во границите за мазни транзиции на бои.
  • Осигурете се дека Wi-Fi акредитивите се точни за да се поврзете со Adafruit IO услугата.

Инструкции за поврзување

ES32-38_RGB_LED-wiring

За да го поврзете RGB LED со ESP32, започнете со идентификување на пиновите на RGB LED. Најдолгиот пин е заедничкиот пин. За конфигурација на заедничка анода, поврзете го овој пин на позитивното напојување (3.3V). Останатите три пина одговараат на црвената, зелената и сината LED диода. Поврзете го црвениот пин на GPIO 27, зелениот пин на GPIO 26, и синиот пин на GPIO 25. Секоја од овие врски треба да се направи преку отпорник од 220 оми за да се ограничи струјата што тече низ LED диодите.

Следно, поврзете ја земјата (GND) на ESP32 со линијата за земја на вашето коло. Осигурете се дека поврзувањето е безбедно за да се спречат повремени врски. Ако користите RGB LED со заедничка катода, поврзете го заедничкиот пин на земја наместо тоа и поврзете ги поединечните пинови за бои на позитивното напојување преку отпорниците. Проверете ги сите врски двапати пред да го напојувате колото.

Примери на код и објаснување

Во Arduino кодот, започнуваме со дефинирање на пиновите за црвената, зелената и сината LED диода користејќи ги идентификаторите 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 мрежата користејќи ги дефинираните акредитиви и го поставуваме MQTT клиентот за комуникација со Adafruit IO.

void setup() {
  ledcSetup(redChannel, freq, resolution);
  ledcAttachPin(redPin, redChannel);
  // Поврзување со 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 Избор на ESP32 плоча и COM порта во Arduino IDE
  • 29:12 Демонстрација на проектот
  • 31:25 Што е RGB LED?
  • 35:26 RGB боја

Images

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

Things you might need

Resources & references

No resources yet.

Files📁

Datasheet (pdf)