Search Code

Hướng dẫn ESP32 50/55 - Điều khiển đèn LED RGB từ bất cứ đâu trên thế giới | Bộ kit ESP32 của SunFounder

Hướng dẫn ESP32 50/55 - Điều khiển đèn LED RGB từ bất cứ đâu trên thế giới | Bộ kit ESP32 của SunFounder

Trong hướng dẫn này, chúng ta sẽ học cách điều khiển màu sắc của đèn LED RGB bằng vi điều khiển ESP32 qua Wi-Fi, sử dụng giao thức MQTT và dịch vụ Adafruit IO. Thiết lập này cho phép bạn thay đổi màu sắc của đèn LED RGB từ bất kỳ đâu trên thế giới, mang lại ứng dụng thực tế của công nghệ IoT. Chúng ta cũng sẽ khám phá cách sử dụng thanh trượt và bộ chọn màu để chọn màu mong muốn.

esp32-50-RGB-led-mqtt-main

ESP32 là một vi điều khiển mạnh mẽ có khả năng Wi-Fi và Bluetooth tích hợp, khiến nó trở nên lý tưởng cho các dự án IoT. Trong bài xây dựng này, chúng ta sẽ kết nối một đèn LED RGB với ESP32 và điều khiển màu sắc của nó thông qua một broker MQTT do Adafruit cung cấp. Hướng dẫn sẽ hướng dẫn bạn qua thiết lập phần cứng, hướng dẫn nối dây và mã cần thiết để làm cho mọi thứ hoạt động liền mạch (trong video ở phút 00:00).

Giải thích về phần cứng

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

Đối với dự án này, các thành phần chính chúng ta sẽ sử dụng là vi điều khiển ESP32 và đèn LED RGB. ESP32 có khả năng kết nối với mạng Wi-Fi, cho phép nó giao tiếp với dịch vụ Adafruit IO. Đèn LED RGB chứa ba đèn LED riêng lẻ (đỏ, xanh lá cây và xanh dương) có thể được trộn lẫn để tạo ra nhiều loại màu sắc.

Đèn LED RGB hoạt động theo nguyên lý anode chung hoặc cathode chung, nghĩa là anode (dương) hoặc cathode (âm) của các đèn LED riêng lẻ phải được kết nối đúng cách để chúng hoạt động. Mỗi màu có thể được điều khiển bằng Điều chế độ rộng xung (PWM), điều chỉnh độ sáng của mỗi đèn LED bằng cách thay đổi chu kỳ nhiệm vụ.

ES32-38_RGB_LED-wiring

Chi tiết bảng dữ liệu

Nhà sản xuất SunFounder
Số bộ phận Đèn LED RGB
Điện áp thuận (VF) 2,0–3,4 V
Dòng điện thuận (IF) 20 mA
Bước sóng đỉnh (nm) Đỏ: 620, Xanh lá cây: 525, Xanh dương: 465
Kiểu đóng gói 4 chân tiêu chuẩn
Ghi chú / biến thể Có sẵn tùy chọn anode chung hoặc cathode chung

 

  • Sử dụng điện trở 220 ohm cho mỗi màu LED để giới hạn dòng điện.
  • Đảm bảo nối dây đúng cho cấu hình anode chung hoặc cathode chung.
  • Kiểm tra nguồn điện của ESP32 để tránh sụt áp.
  • Giữ tần số PWM trong giới hạn để chuyển màu mượt mà.
  • Đảm bảo thông tin đăng nhập Wi-Fi chính xác để kết nối với dịch vụ Adafruit IO.

Hướng dẫn nối dây

ES32-38_RGB_LED-wiring

Để nối đèn LED RGB với ESP32, hãy bắt đầu bằng cách xác định các chân trên đèn LED RGB. Chân dài nhất là chân chung. Đối với cấu hình anode chung, kết nối chân này với nguồn điện áp dương (3,3V). Ba chân còn lại tương ứng với các đèn LED đỏ, xanh lá cây và xanh dương. Kết nối chân đỏ với GPIO 27, chân xanh lá cây với GPIO 26 và chân xanh dương với GPIO 25. Mỗi kết nối này nên được thực hiện qua một điện trở 220 ohm để giới hạn dòng điện chạy qua các đèn LED.

Tiếp theo, kết nối đất (GND) của ESP32 với đường đất của mạch của bạn. Đảm bảo rằng việc nối dây được chắc chắn để tránh các kết nối chập chờn. Nếu sử dụng đèn LED RGB cathode chung, hãy kết nối chân chung với đất và kết nối các chân màu riêng lẻ với nguồn dương qua các điện trở. Kiểm tra kỹ tất cả các kết nối trước khi cấp nguồn cho mạch.

Ví dụ mã & hướng dẫn chi tiết

Trong mã Arduino, chúng ta bắt đầu bằng cách định nghĩa các chân cho đèn LED đỏ, xanh lá cây và xanh dương bằng các định danh redPin, greenPinbluePin. Ngoài ra, chúng ta định nghĩa các kênh PWM cho mỗi màu bằng redChannel, greenChannelblueChannel. Tần số PWM được đặt ở 5000 Hz với độ phân giải 8 bit.

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

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

Trong hàm setup(), chúng ta khởi tạo các kênh PWM và gắn các chân tương ứng. Chúng ta cũng kết nối với mạng Wi-Fi bằng thông tin đăng nhập đã định nghĩa và thiết lập máy khách MQTT để giao tiếp với Adafruit IO.

void setup() {
  ledcSetup(redChannel, freq, resolution);
  ledcAttachPin(redPin, redChannel);
  // Kết nối với WiFi
  WiFi.begin(WLAN_SSID, WLAN_PASS);
}

Vòng lặp chính kiểm tra kết nối MQTT và xử lý các thông điệp đến. Nó cũng in các giá trị RGB hiện tại ra màn hình nối tiếp. Màu sắc của đèn LED được cập nhật dựa trên các giá trị nhận được thông qua các đăng ký MQTT.

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

Để biết thêm chi tiết về mã đầy đủ, vui lòng tham khảo mã hoàn chỉnh được tải bên dưới bài viết.

Trình diễn / Điều gì sẽ xảy ra

Khi mọi thứ đã được thiết lập và mã được tải lên, bạn sẽ thấy đèn LED RGB phản hồi với các thay đổi màu sắc được thực hiện qua bảng điều khiển Adafruit IO. Khi bạn điều chỉnh các thanh trượt cho màu đỏ, xanh lá cây và xanh dương, đèn LED sẽ thay đổi màu tương ứng. Nếu bạn gặp bất kỳ sự cố nào, hãy đảm bảo rằng kết nối Wi-Fi ổn định và tên chủ đề MQTT khớp với những tên được định nghĩa trong mã (trong video ở phút 17:30).

Các lỗi thường gặp bao gồm đấu dây sai, tên chủ đề không khớp và quên đặt thông tin đăng nhập Wi-Fi chính xác. Nếu đèn LED không sáng, hãy kiểm tra lại các kết nối điện trở và đảm bảo rằng ESP32 được cấp nguồn đúng cách.

Mốc thời gian trong video

  • 00:00 Bắt đầu
  • 2:23 Giới thiệu về dự án
  • 4:43 MQTT là gì
  • 7:55 Thiết lập Adafruit IO
  • 14:09 Giải thích về đấu dây
  • 16:07 Giải thích về mã
  • 27:03 Chọn bo mạch ESP32 và cổng COM trên Arduino IDE
  • 29:12 Trình diễn dự án
  • 31:25 Đèn LED RGB là gì?
  • 35:26 Màu RGB

Hình ảnh

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
Ngôn ngữ: 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!");
}

Nghĩ bạn có thể cần

Tài nguyên & tài liệu tham khảo

Chưa có tài nguyên nào.

Tập tin📁

Bảng dữ liệu (pdf)