Search Code

ESP32 Tutorijal 50/55 - Kontrolišite RGB LED sa bilo kojeg mjesta na svijetu | SunFounder-ov ESP32 komplet

ESP32 Tutorijal 50/55 - Kontrolišite RGB LED sa bilo kojeg mjesta na svijetu | SunFounder-ov ESP32 komplet

U ovom tutorijalu naučit ćemo kako kontrolirati boju RGB LED diode koristeći ESP32 mikrokontroler putem Wi-Fi mreže, koristeći MQTT protokol i Adafruit IO servis. Ova postavka vam omogućava da promijenite boju RGB LED diode s bilo kojeg mjesta na svijetu, pružajući praktičnu primjenu IoT tehnologije. Također ćemo istražiti kako koristiti klizače i birač boja za odabir željene boje.

esp32-50-RGB-led-mqtt-main

ESP32 je moćan mikrokontroler koji ima ugrađene Wi-Fi i Bluetooth mogućnosti, što ga čini idealnim za IoT projekte. U ovoj izradi spojit ćemo RGB LED diodu na ESP32 i kontrolirati njenu boju putem MQTT brokera kojeg pruža Adafruit. Tutorijal će vas provesti kroz postavljanje hardvera, upute za povezivanje i kod potreban da sve radi besprijekorno (u videu na 00:00).

Objašnjenje hardvera

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

Za ovaj projekt, primarne komponente koje ćemo koristiti su ESP32 mikrokontroler i RGB LED dioda. ESP32 je sposoban povezati se na Wi-Fi mreže, omogućavajući mu komunikaciju s Adafruit IO servisom. RGB LED dioda sadrži tri pojedinačne LED diode (crvenu, zelenu i plavu) koje se mogu miješati kako bi se stvorio širok raspon boja.

RGB LED dioda radi na principu zajedničke anode ili zajedničke katode, što znači da anoda (pozitivna) ili katoda (negativna) pojedinačnih LED dioda mora biti pravilno spojena da bi radile. Svaka boja može se kontrolirati pomoću Pulse Width Modulation (PWM), koja prilagođava svjetlinu svake LED diode mijenjanjem radnog ciklusa.

ES32-38_RGB_LED-wiring

Detalji iz tehničke specifikacije

Proizvođač SunFounder
Broj dijela RGB LED
Napon provođenja (VF) 2.0–3.4 V
Struja provođenja (IF) 20 mA
Vršna talasna dužina (nm) Crvena: 620, Zelena: 525, Plava: 465
Pakovanje Standardni 4-pinski
Napomene / varijante Dostupne opcije sa zajedničkom anodom ili zajedničkom katodom

 

  • Koristite otpornike od 220 oma za svaku boju LED diode kako biste ograničili struju.
  • Osigurajte ispravno povezivanje za konfiguraciju sa zajedničkom anodom ili katodom.
  • Provjerite napajanje ESP32-a kako biste izbjegli smanjenje napona.
  • Držite PWM frekvenciju unutar granica za glatke prijelaze boja.
  • Osigurajte da su Wi-Fi akreditivi ispravni za povezivanje na Adafruit IO servis.

Upute za povezivanje

ES32-38_RGB_LED-wiring

Da biste povezali RGB LED diodu na ESP32, počnite identificiranjem pinova na RGB LED diodi. Najduži pin je zajednički pin. Za konfiguraciju sa zajedničkom anodom, spojite ovaj pin na pozitivni napon napajanja (3.3V). Ostala tri pina odgovaraju crvenoj, zelenoj i plavoj LED diodi. Spojite crveni pin na GPIO 27, zeleni pin na GPIO 26, a plavi pin na GPIO 25. Svaka od ovih veza treba biti napravljena kroz otpornik od 220 oma kako bi se ograničila struja koja teče kroz LED diode.

Zatim spojite uzemljenje (GND) ESP32-a na liniju uzemljenja vašeg kruga. Osigurajte da je povezivanje sigurno kako biste spriječili povremene veze. Ako koristite RGB LED diodu sa zajedničkom katodom, spojite zajednički pin na uzemljenje umjesto toga i spojite pojedinačne pinove boja na pozitivno napajanje kroz otpornike. Dvaput provjerite sve veze prije uključivanja kruga.

Primjeri koda i objašnjenje

U Arduino kodu, počinjemo definiranjem pinova za crvenu, zelenu i plavu LED diodu koristeći identifikatore redPin, greenPin i bluePin. Dodatno, definiramo PWM kanale za svaku boju koristeći redChannel, greenChannel i blueChannel. PWM frekvencija je postavljena na 5000 Hz s 8-bitnom rezolucijom.

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

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

U setup() funkciji, inicijaliziramo PWM kanale i povezujemo odgovarajuće pinove. Također se povezujemo na Wi-Fi mrežu koristeći definirane akreditive i postavljamo MQTT klijent za komunikaciju s Adafruit IO.

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

Glavna petlja provjerava MQTT vezu i obrađuje dolazne poruke. Također ispisuje trenutne RGB vrijednosti na serijski monitor. Boja LED diode ažurira se na osnovu vrijednosti primljenih putem MQTT pretplata.

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

Za više detalja o cijelom kodu, pogledajte kompletan kod učitavan ispod članka.

Demonstracija / Šta očekivati

Kada je sve podešeno i kod je uploadovan, trebali biste vidjeti RGB LED kako reagira na promjene boja napravljene putem Adafruit IO kontrolne ploče. Dok podešavate klizače za crvenu, zelenu i plavu boju, LED bi trebao mijenjati svoju boju u skladu s tim. Ako naiđete na bilo kakve probleme, provjerite da je Wi-Fi veza stabilna i da se nazivi MQTT tema podudaraju s onima definiranim u kodu (u videu na 17:30).

Uobičajene zamke uključuju pogrešno povezivanje, neusklađene nazive tema i zaboravljanje postavljanja ispravnih Wi-Fi akreditiva. Ako LED ne zasvijetli, još jednom provjerite veze otpornika i osigurajte da je ESP32 ispravno napajan.

Vremenske oznake videa

  • 00:00 Početak
  • 2:23 Uvod u projekat
  • 4:43 Šta je MQTT
  • 7:55 Adafruit IO podešavanje
  • 14:09 Objašnjeno povezivanje
  • 16:07 Objašnjen kod
  • 27:03 Odabir ESP32 ploče i COM porta u Arduino IDE
  • 29:12 Demonstracija projekta
  • 31:25 Šta je RGB LED?
  • 35:26 RGB boja

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)