Search Code

Lisano ya ESP32 50/55 - Kokamba mbwaki ya RGB uta esika nyonso na mokili | Kit ya SunFounder ya ESP32

Lisano ya ESP32 50/55 - Kokamba mbwaki ya RGB uta esika nyonso na mokili | Kit ya SunFounder ya ESP32

Na boyekoli oyo, tokoyekola ndenge ya kokamba langi ya LED ya RGB na esaleli ya microcontrôleur ya ESP32 na nzela ya Wi-Fi, na kosalela protokolo ya MQTT mpe mosala ya Adafruit IO. Esika oyo ekopesa yo nzela ya kobongola langi ya LED ya RGB esika nyonso na mokili, mpe yango ekosalisa yo na kosalela teknoloji ya IoT. Tokotalaka mpe ndenge ya kosalela ba sliders mpe color picker mpo na kopona langi oyo olingi.

esp32-50-RGB-led-mqtt-main

ESP32 ezali microcontrôleur ya makasi oyo ezali na Wi-Fi mpe Bluetooth na kati, mpe yango esalaka ete ezala malamu mpo na ba projets ya IoT. Na construction oyo, tokokangisa LED ya RGB na ESP32 mpe tokokamba langi na yango na nzela ya MQTT broker oyo Adafruit epesaka. Tutoriel oyo ekokamba yo na mise en place ya matériel, ba instructions ya câblage, mpe code oyo esengeli mpo ete nyonso esala malamu (na vidéo na 00:00).

Matériel Explicé

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

Mpo na projet oyo, ba composants ya liboso oyo tokosalela ezali microcontrôleur ya ESP32 mpe LED ya RGB. ESP32 ekoki kokangama na ba réseaux ya Wi-Fi, mpe yango ekopesa yango nzela ya kosolola na mosala ya Adafruit IO. LED ya RGB ezali na ba LED misato ya moko-moko (motane, vert, mpe bleu) oyo ekoki kosangisama mpo na kosala ba langi ebele.

LED ya RGB esalaka na principe ya anode commune to cathode commune, elingi koloba ete anode (positif) to cathode (négatif) ya ba LED ya moko-moko esengeli kokangama malamu mpo ete esala. Langi nyonso ekoki kokambama na Pulse Width Modulation (PWM), oyo ebongolaka bongengi ya LED nyonso na kobongola cycle ya devoir.

ES32-38_RGB_LED-wiring

Détails ya Datasheet

Fabricant SunFounder
Numéro ya partie LED ya RGB
Tension ya forward (VF) 2.0–3.4 V
Courant ya forward (IF) 20 mA
Longueur d'onde ya pic (nm) Motane: 620, Vert: 525, Bleu: 465
Package Standard ya ba pins 4
Notes / variantes Ba options ya anode commune to cathode commune ezali

 

  • Salela ba résistances ya 220 ohms mpo na langi nyonso ya LED mpo na kokamba courant.
  • Kokamba câblage malamu mpo na configuration ya anode commune to cathode.
  • Kotala alimentation ya ESP32 mpo na kokima ba brownouts.
  • Kokamba fréquence ya PWM na kati ya ba limites mpo na transitions ya langi ya malamu.
  • Kokamba ete ba identifiants ya Wi-Fi ezali malamu mpo na kokangama na mosala ya Adafruit IO.

Instructions ya Câblage

ES32-38_RGB_LED-wiring

Mpo na kokangisa LED ya RGB na ESP32, banda na koyeba ba pins ya LED ya RGB. Pin oyo eleki molai ezali pin commune. Mpo na configuration ya anode commune, kokangisa pin oyo na tension ya positif (3.3V). Ba pins misato mosusu ekokani na ba LED ya motane, vert, mpe bleu. Kokangisa pin ya motane na GPIO 27, pin ya vert na GPIO 26, mpe pin ya bleu na GPIO 25. Chacune ya ba connexions oyo esengeli kosalema na nzela ya résistance ya 220 ohms mpo na kokamba courant oyo elekaka na ba LED.

Na sima, kokangisa ground (GND) ya ESP32 na ligne ya ground ya circuit na yo. Kotala ete câblage ezali makasi mpo na kokima ba connexions ya intermittente. Soki oluki kosalela LED ya RGB ya cathode commune, kokangisa pin commune na ground mpo na yango mpe kokangisa ba pins ya langi ya moko-moko na alimentation ya positif na nzela ya ba résistances. Kotala ba connexions nyonso mibale mpe mibale liboso ya kopesa courant na circuit.

Ba Exemples ya Code & Explication

Na code ya Arduino, tobandi na koyeba ba pins mpo na ba LED ya motane, vert, mpe bleu na kosalela ba identifiants redPin, greenPin, mpe bluePin. Na libanda ya yango, toyebi mpe ba canaux ya PWM mpo na langi nyonso na kosalela redChannel, greenChannel, mpe blueChannel. Fréquence ya PWM esili kotiama na 5000 Hz na résolution ya bits 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;

Na fonction setup(), tobandisi ba canaux ya PWM mpe tokangisi ba pins oyo ekokani. Tokangisaka mpe na réseau ya Wi-Fi na kosalela ba identifiants oyo toyebi mpe tosalelaka client ya MQTT mpo na kosolola na Adafruit IO.

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

Boucle principale etalaka connexion ya MQTT mpe esalelaka ba messages oyo ezali koya. Ezalaka mpe na impression ya ba valeurs ya RGB ya lelo na moniteur ya série. Langi ya LED ebongolamaka kolanda ba valeurs oyo ezali koya na nzela ya ba souscriptions ya MQTT.

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

Mpo na ba détails mingi na tina ya code mobimba, tala code mobimba oyo ezali na se ya article oyo.

Démonstration / Nini Okokanela

Ntango nyonso esili kotiama mpe kode esili kotomama, okomona ete LED ya RGB ezali koyanola na mbongwana ya langi oyo esalemi na Adafruit IO dashboard. Ntango ozali kobongola ba sliders ya rouge, vert, mpe bleu, LED esengeli kobongola langi na yango ndenge esengeli. Soki ozali na mikakatano, tia ete connexion ya Wi-Fi ezali stable mpe ete ba nkombo ya MQTT topic ezali kokokana na oyo ezali na kode (na vidéo na 17:30).

Ba erreurs ya mbala mingi ezali kosangisa ba fils na ndenge ya mabe, ba nkombo ya topics oyo ekokani te, mpe kobosana kotia ba identifiants ya Wi-Fi ya solo. Soki LED ezali kopelisa te, tala lisusu ba connexions ya résistances mpe tia ete ESP32 ezali na courant ya malamu.

Ba Timestamps ya Vidéo

  • 00:00 Ebandeli
  • 2:23 Introduction na projet
  • 4:43 Nini MQTT ezali
  • 7:55 Mise en place ya Adafruit IO
  • 14:09 Explication ya ba connexions
  • 16:07 Explication ya kode
  • 27:03 Kopona carte ESP32 mpe COM port na Arduino IDE
  • 29:12 Démonstration ya projet
  • 31:25 Nini RGB LED ezali?
  • 35:26 Langi ya 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
Langue: 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!");
}

Nko o na nki.

Mokili na bisika

Pas encore de ressources.

Fichiers📁

Fiche technique (pdf)