ESP32 IoT Tutorial 50/55 - Control RGB LED from anywhere in the world | SunFounder's ESP32 kit
SunFounder Documentation page ESP32 Learning Kit
Purchase SunFounder ESP32 Learning Kit
In this video we learn how to control RGB LED color over the internet using MQTT protocol. We will explained RGB LED, RGB Color, MQTT, setting up Adafruit IO dashboard so we are able to control the color of RGB LED
Topics in this lesson
Use Chapters from timeline or click on the time
- 00:00 Introduction
- 2:23 Introduction to the project
- 4:43 What is MQTT
- 7:55 Adafruit IO setup
- 14:09 Wiring explained
- 16:07 Code explained
- 27:03 Selecting ESP32 board and COM port on Arduino IDE
- 29:12 Project demonstration
- 31:25 What is RGB LED?
- 35:26 RGB Color
/*********************************************************************** This is Arduino sketch for ESP32 to control RGB LED using MQTT service of Adafruit www.Robojax.com 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#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: /feeds/ 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!"); }