Search Code

ESP32 Tutorial 50/55 - Bestuur RGB-LED vanaf enige plek ter wêreld | SunFounder se ESP32-kit

ESP32 Tutorial 50/55 - Bestuur RGB-LED vanaf enige plek ter wêreld | SunFounder se ESP32-kit

In deze tutorial leren we hoe we de kleur van een RGB-LED kunnen besturen met behulp van de ESP32-microcontroller via Wi-Fi, gebruikmakend van het MQTT-protocol en de Adafruit IO-service. Deze opstelling stelt je in staat om de kleur van de RGB-LED vanaf elke plek ter wereld te veranderen, wat een praktische toepassing van IoT-technologie biedt. We zullen ook verkennen hoe we schuifregelaars en een kleurkiezer kunnen gebruiken om de gewenste kleur te selecteren.

esp32-50-RGB-led-mqtt-main

De ESP32 is een krachtige microcontroller met ingebouwde Wi-Fi- en Bluetooth-mogelijkheden, waardoor hij ideaal is voor IoT-projecten. In deze build verbinden we een RGB-LED met de ESP32 en besturen we de kleur ervan via een MQTT-broker die door Adafruit wordt geleverd. De tutorial begeleidt je door de hardware-opstelling, bedradingsinstructies en de benodigde code om alles naadloos te laten werken (in video op 00:00).

Hardware uitgelegd

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

Voor dit project zijn de primaire componenten die we gebruiken de ESP32-microcontroller en de RGB-LED. De ESP32 kan verbinding maken met Wi-Fi-netwerken, waardoor hij kan communiceren met de Adafruit IO-service. De RGB-LED bevat drie afzonderlijke LED's (rood, groen en blauw) die kunnen worden gemengd om een breed scala aan kleuren te creëren.

De RGB-LED werkt volgens het principe van een gemeenschappelijke anode of gemeenschappelijke kathode, wat betekent dat de anode (positief) of kathode (negatief) van de afzonderlijke LED's correct moet worden aangesloten om te kunnen werken. Elke kleur kan worden bestuurd met behulp van pulsbreedtemodulatie (PWM), die de helderheid van elke LED aanpast door de duty-cycle te variëren.

ES32-38_RGB_LED-wiring

Datasheet-details

Fabrikant SunFounder
Onderdeelnummer RGB-LED
Doorlaatspanning (VF) 2,0–3,4 V
Doorlaatstroom (IF) 20 mA
Piekgolflengte (nm) Rood: 620, Groen: 525, Blauw: 465
Behuizing Standaard 4-pins
Opmerkingen / varianten Gemeenschappelijke anode- of kathode-opties beschikbaar

 

  • Gebruik 220 ohm-weerstanden voor elke LED-kleur om de stroom te beperken.
  • Zorg voor correcte bedrading voor de configuratie met gemeenschappelijke anode of kathode.
  • Controleer de voeding van de ESP32 om brownouts te voorkomen.
  • Houd de PWM-frequentie binnen de limieten voor vloeiende kleurovergangen.
  • Zorg ervoor dat de Wi-Fi-gegevens correct zijn om verbinding te maken met de Adafruit IO-service.

Bedradingsinstructies

ES32-38_RGB_LED-wiring

Om de RGB-LED op de ESP32 aan te sluiten, begin je met het identificeren van de pinnen op de RGB-LED. De langste pin is de gemeenschappelijke pin. Voor een configuratie met gemeenschappelijke anode verbind je deze pin met de positieve voedingsspanning (3,3V). De andere drie pinnen corresponderen met de rode, groene en blauwe LED's. Verbind de rode pin met GPIO 27, de groene pin met GPIO 26 en de blauwe pin met GPIO 25. Elk van deze verbindingen moet worden gemaakt via een 220 ohm-weerstand om de stroom door de LED's te beperken.

Verbind vervolgens de aarde (GND) van de ESP32 met de aardlijn van je circuit. Zorg ervoor dat de bedrading stevig is om losse verbindingen te voorkomen. Als je een RGB-LED met gemeenschappelijke kathode gebruikt, verbind dan de gemeenschappelijke pin met aarde en verbind de afzonderlijke kleurpinnen met de positieve voeding via de weerstanden. Controleer alle verbindingen dubbel voordat je het circuit van stroom voorziet.

Codevoorbeelden & uitleg

In de Arduino-code beginnen we met het definiëren van de pinnen voor de rode, groene en blauwe LED's met behulp van de identifiers redPin, greenPin en bluePin. Daarnaast definiëren we de PWM-kanalen voor elke kleur met behulp van redChannel, greenChannel en blueChannel. De PWM-frequentie is ingesteld op 5000 Hz met een 8-bits resolutie.

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

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

In de setup()-functie initialiseren we de PWM-kanalen en koppelen we de bijbehorende pinnen. We maken ook verbinding met het Wi-Fi-netwerk met behulp van de gedefinieerde gegevens en stellen de MQTT-client in voor communicatie met Adafruit IO.

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

De hoofdloop controleert de MQTT-verbinding en verwerkt inkomende berichten. Het print ook de huidige RGB-waarden naar de seriële monitor. De kleur van de LED wordt bijgewerkt op basis van de waarden die via MQTT-abonnementen worden ontvangen.

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

Voor meer details over de volledige code, raadpleeg de volledige code die onder het artikel is geladen.

Demonstratie / wat te verwachten

Zodra alles is ingesteld en de code is geüpload, zou je de RGB-LED moeten zien reageren op kleurveranderingen die via het Adafruit IO-dashboard worden gemaakt. Wanneer je de schuifregelaars voor rood, groen en blauw aanpast, zou de LED zijn kleur dienovereenkomstig moeten veranderen. Als je problemen ondervindt, zorg er dan voor dat de Wi-Fi-verbinding stabiel is en dat de MQTT-onderwerpnamen overeenkomen met die in de code (in de video op 17:30).

Veelvoorkomende valkuilen zijn onder meer onjuiste bedrading, niet-overeenkomende onderwerpnamen en het vergeten om de juiste Wi-Fi-inloggegevens in te stellen. Als de LED niet oplicht, controleer dan opnieuw de weerstandverbindingen en zorg ervoor dat de ESP32 correct van stroom wordt voorzien.

Videotijdstempels

  • 00:00 Start
  • 2:23 Introductie van het project
  • 4:43 Wat is MQTT
  • 7:55 Adafruit IO-installatie
  • 14:09 Bedrading uitgelegd
  • 16:07 Code uitgelegd
  • 27:03 ESP32-board en COM-poort selecteren in Arduino IDE
  • 29:12 Projectdemonstratie
  • 31:25 Wat is een RGB-LED?
  • 35:26 RGB-kleur

Afbeeldingen

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

Dingen die je misschien nodig hebt

Hulpmiddelen en referenties

Nog geen middelen.

Bestanden📁

Datasheet (pdf)