Search Code

Tutorial ESP32 50/55 - Controla LED-ul RGB de oriunde din lume | Kitul ESP32 de la SunFounder

Tutorial ESP32 50/55 - Controla LED-ul RGB de oriunde din lume | Kitul ESP32 de la SunFounder

În acest tutorial, vom învăța cum să controlăm culoarea unui LED RGB folosind microcontrolerul ESP32 prin Wi-Fi, utilizând protocolul MQTT și serviciul Adafruit IO. Această configurare vă permite să schimbați culoarea LED-ului RGB de oriunde din lume, oferind o aplicație practică a tehnologiei IoT. Vom explora, de asemenea, cum să folosim glisoare și un selector de culori pentru a alege culoarea dorită.

esp32-50-RGB-led-mqtt-main

ESP32 este un microcontroler puternic care are capacități integrate de Wi-Fi și Bluetooth, fiind ideal pentru proiecte IoT. În această construcție, vom conecta un LED RGB la ESP32 și vom controla culoarea acestuia printr-un broker MQTT furnizat de Adafruit. Tutorialul vă va ghida prin configurarea hardware-ului, instrucțiunile de cablare și codul necesar pentru ca totul să funcționeze perfect (în video la 00:00).

Hardware Explicat

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

Pentru acest proiect, componentele principale pe care le vom folosi sunt microcontrolerul ESP32 și LED-ul RGB. ESP32 este capabil să se conecteze la rețele Wi-Fi, permițându-i să comunice cu serviciul Adafruit IO. LED-ul RGB conține trei LED-uri individuale (roșu, verde și albastru) care pot fi amestecate pentru a crea o gamă largă de culori.

LED-ul RGB funcționează pe principiul anod comun sau catod comun, ceea ce înseamnă că anodul (pozitiv) sau catodul (negativ) al LED-urilor individuale trebuie conectat corect pentru ca acestea să funcționeze. Fiecare culoare poate fi controlată folosind Modulația în Lățime a Impulsurilor (PWM), care ajustează luminozitatea fiecărui LED prin varierea ciclului de funcționare.

ES32-38_RGB_LED-wiring

Detalii din Fișa Tehnică

Producător SunFounder
Număr de piesă LED RGB
Tensiune directă (VF) 2,0–3,4 V
Curent direct (IF) 20 mA
Lungime de undă de vârf (nm) Roșu: 620, Verde: 525, Albastru: 465
Pachet Standard cu 4 pini
Note / variante Opțiuni disponibile cu anod comun sau catod comun

 

  • Folosiți rezistențe de 220 ohmi pentru fiecare culoare a LED-ului pentru a limita curentul.
  • Asigurați-vă de cablarea corectă pentru configurația cu anod comun sau catod comun.
  • Verificați sursa de alimentare a ESP32 pentru a evita căderile de tensiune.
  • Mențineți frecvența PWM în limitele pentru tranziții line ale culorilor.
  • Asigurați-vă că datele de autentificare Wi-Fi sunt corecte pentru a vă conecta la serviciul Adafruit IO.

Instrucțiuni de Cablare

ES32-38_RGB_LED-wiring

Pentru a cabla LED-ul RGB la ESP32, începeți prin identificarea pinilor de pe LED-ul RGB. Cel mai lung pin este pinul comun. Pentru o configurație cu anod comun, conectați acest pin la sursa de tensiune pozitivă (3,3V). Ceilalți trei pini corespund LED-urilor roșu, verde și albastru. Conectați pinul roșu la GPIO 27, pinul verde la GPIO 26 și pinul albastru la GPIO 25. Fiecare dintre aceste conexiuni ar trebui făcută printr-o rezistență de 220 ohmi pentru a limita curentul care trece prin LED-uri.

Apoi, conectați masa (GND) a ESP32 la linia de masă a circuitului dumneavoastră. Asigurați-vă că cablarea este sigură pentru a preveni conexiunile intermitente. Dacă folosiți un LED RGB cu catod comun, conectați pinul comun la masă și conectați pinii individuali de culoare la sursa pozitivă prin rezistențe. Verificați de două ori toate conexiunile înainte de a alimenta circuitul.

Exemple de Cod & Explicații

În codul Arduino, începem prin definirea pinilor pentru LED-urile roșu, verde și albastru folosind identificatorii redPin, greenPin și bluePin. În plus, definim canalele PWM pentru fiecare culoare folosind redChannel, greenChannel și blueChannel. Frecvența PWM este setată la 5000 Hz cu o rezoluție de 8 biți.

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

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

În funcția setup(), inițializăm canalele PWM și atașăm pinii corespunzători. De asemenea, ne conectăm la rețeaua Wi-Fi folosind datele de autentificare definite și configurăm clientul MQTT pentru comunicarea cu Adafruit IO.

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

Bucla principală verifică conexiunea MQTT și procesează mesajele primite. De asemenea, afișează valorile RGB curente pe monitorul serial. Culoarea LED-ului este actualizată pe baza valorilor primite prin abonamentele MQTT.

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

Pentru mai multe detalii despre codul complet, vă rugăm să consultați codul integral încărcat mai jos în articol.

Demonstrație / Ce să Vă Așteptați

Odată ce totul este configurat și codul este încărcat, ar trebui să vezi LED-ul RGB răspunzând la schimbările de culoare făcute prin panoul de control Adafruit IO. Pe măsură ce ajustezi glisoarele pentru roșu, verde și albastru, LED-ul ar trebui să își schimbe culoarea în consecință. Dacă întâmpini probleme, asigură-te că conexiunea Wi-Fi este stabilă și că numele subiectelor MQTT corespund celor definite în cod (în video la 17:30).

Capcanele frecvente includ cablarea incorectă, numele de subiecte nepotrivite și uitarea de a seta acreditările Wi-Fi corecte. Dacă LED-ul nu se aprinde, verifică din nou conexiunile rezistorului și asigură-te că ESP32 este alimentat corect.

Marcaje temporale video

  • 00:00 Început
  • 2:23 Introducere în proiect
  • 4:43 Ce este MQTT
  • 7:55 Configurare Adafruit IO
  • 14:09 Cablare explicată
  • 16:07 Cod explicat
  • 27:03 Selectarea plăcii ESP32 și a portului COM în Arduino IDE
  • 29:12 Demonstrația proiectului
  • 31:25 Ce este LED-ul RGB?
  • 35:26 Culoare RGB

Imagini

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

Lucruri de care ai putea avea nevoie

Resurse și referințe

Încă nu sunt resurse.

Fișiere📁

Fișă tehnică (pdf)