Search Code

Návod na ESP32 50/55 – Ovládajte RGB LED z akéhokoľvek miesta na svete | Súprava ESP32 od SunFounder

Návod na ESP32 50/55 – Ovládajte RGB LED z akéhokoľvek miesta na svete | Súprava ESP32 od SunFounder

V tomto návode sa naučíme, ako ovládať farbu RGB LED pomocou mikrokontroléra ESP32 cez Wi-Fi, s využitím protokolu MQTT a služby Adafruit IO. Toto nastavenie vám umožní meniť farbu RGB LED z ktoréhokoľvek miesta na svete, čo poskytuje praktické využitie technológie IoT. Tiež preskúmame, ako používať posúvače a výber farieb na zvolenie požadovanej farby.

esp32-50-RGB-led-mqtt-main

ESP32 je výkonný mikrokontrolér so vstavanými funkciami Wi-Fi a Bluetooth, čo ho robí ideálnym pre IoT projekty. V tomto projekte pripojíme RGB LED k ESP32 a budeme ovládať jej farbu cez MQTT broker poskytovaný službou Adafruit. Návod vás prevedie nastavením hardvéru, zapojením a kódom potrebným na to, aby všetko fungovalo bez problémov (vo videu o 00:00).

Vysvetlenie hardvéru

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

Pre tento projekt použijeme ako hlavné komponenty mikrokontrolér ESP32 a RGB LED. ESP32 je schopný pripojiť sa k Wi-Fi sieťam, čo mu umožňuje komunikovať so službou Adafruit IO. RGB LED obsahuje tri samostatné LED diódy (červenú, zelenú a modrú), ktoré je možné miešať a vytvárať tak širokú škálu farieb.

RGB LED pracuje na princípe spoločnej anódy alebo spoločnej katódy, čo znamená, že anóda (kladný pól) alebo katóda (záporný pól) jednotlivých LED diód musí byť správne pripojená, aby fungovali. Každú farbu je možné ovládať pomocou pulznej šírkovej modulácie (PWM), ktorá upravuje jas každej LED diódy zmenou pracovného cyklu.

ES32-38_RGB_LED-wiring

Podrobnosti z datasheetu

Výrobca SunFounder
Označenie súčiastky RGB LED
Priepustné napätie (VF) 2,0–3,4 V
Priepustný prúd (IF) 20 mA
Špičková vlnová dĺžka (nm) Červená: 620, Zelená: 525, Modrá: 465
Puzdro Štandardné 4-pinové
Poznámky / varianty Dostupné možnosti so spoločnou anódou alebo spoločnou katódou

 

  • Použite 220 ohmové rezistory pre každú farbu LED na obmedzenie prúdu.
  • Zabezpečte správne zapojenie pre konfiguráciu so spoločnou anódou alebo katódou.
  • Skontrolujte napájanie ESP32, aby ste predišli poklesom napätia.
  • Udržujte frekvenciu PWM v rámci limitov pre plynulé prechody farieb.
  • Uistite sa, že prihlasovacie údaje Wi-Fi sú správne na pripojenie k službe Adafruit IO.

Pokyny na zapojenie

ES32-38_RGB_LED-wiring

Na zapojenie RGB LED k ESP32 začnite identifikáciou pinov na RGB LED. Najdlhší pin je spoločný pin. Pre konfiguráciu so spoločnou anódou pripojte tento pin na kladné napájacie napätie (3,3 V). Ostatné tri piny zodpovedajú červenej, zelenej a modrej LED dióde. Pripojte červený pin na GPIO 27, zelený pin na GPIO 26 a modrý pin na GPIO 25. Každé z týchto pripojení by malo byť vytvorené cez 220 ohmový rezistor na obmedzenie prúdu pretekajúceho cez LED diódy.

Ďalej pripojte uzemnenie (GND) ESP32 k uzemňovacej linke vášho obvodu. Uistite sa, že je zapojenie pevné, aby sa predišlo prerušovaným spojeniam. Ak používate RGB LED so spoločnou katódou, pripojte spoločný pin na uzemnenie a jednotlivé farebné piny pripojte na kladné napájanie cez rezistory. Pred napájaním obvodu dôkladne skontrolujte všetky pripojenia.

Príklady kódu a vysvetlenie

V kóde pre Arduino začneme definovaním pinov pre červenú, zelenú a modrú LED diódu pomocou identifikátorov redPin, greenPin a bluePin. Okrem toho definujeme PWM kanály pre každú farbu pomocou redChannel, greenChannel a blueChannel. Frekvencia PWM je nastavená na 5000 Hz s 8-bitovým rozlíšením.

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

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

Vo funkcii setup() inicializujeme PWM kanály a pripojíme príslušné piny. Tiež sa pripojíme k Wi-Fi sieti pomocou definovaných prihlasovacích údajov a nastavíme MQTT klienta na komunikáciu so službou Adafruit IO.

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

Hlavná slučka kontroluje MQTT pripojenie a spracováva prichádzajúce správy. Tiež tlačí aktuálne hodnoty RGB do sériového monitora. Farba LED sa aktualizuje na základe hodnôt prijatých cez MQTT odbery.

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

Pre viac podrobností o celom kóde si pozrite kompletný kód uvedený nižšie v článku.

Demonštrácia / Čo očakávať

Keď je všetko nastavené a kód je nahraný, mali by ste vidieť, ako RGB LED reaguje na zmeny farieb vykonané cez Adafruit IO dashboard. Pri úprave posuvníkov pre červenú, zelenú a modrú farbu by LED mala podľa toho meniť svoju farbu. Ak narazíte na akékoľvek problémy, uistite sa, že Wi-Fi pripojenie je stabilné a že názvy MQTT tém zodpovedajú tým definovaným v kóde (vo videu o 17:30).

Medzi časté chyby patrí nesprávne zapojenie, nezhodné názvy tém a zabudnutie nastaviť správne Wi-Fi prihlasovacie údaje. Ak LED nesvieti, skontrolujte zapojenie rezistorov a uistite sa, že ESP32 je správne napájaný.

Časové značky videa

  • 00:00 Začiatok
  • 2:23 Úvod do projektu
  • 4:43 Čo je MQTT
  • 7:55 Nastavenie Adafruit IO
  • 14:09 Vysvetlenie zapojenia
  • 16:07 Vysvetlenie kódu
  • 27:03 Výber dosky ESP32 a COM portu v Arduino IDE
  • 29:12 Ukážka projektu
  • 31:25 Čo je RGB LED?
  • 35:26 RGB farba

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)