搜索代码

ESP32教程47/55 - 使用MQTT通过互联网实现WS2812 CheerLights | SunFounder的ESP32物联网套件

ESP32教程47/55 - 使用MQTT通过互联网实现WS2812 CheerLights | SunFounder的ESP32物联网套件

在本教程中,我们将使用ESP32和WS2812 LED创建一个可通过MQTT远程控制的同步照明系统。该系统允许多个用户同时更改灯光颜色,无论身处何地都能创造互联体验。该项目利用SunFounder ESP32 IoT套件,该套件包含一个具有Wi-Fi功能的强大微控制器,非常适合物联网应用。

WS2812_strip.ON

在整个视频中,我们将逐步讲解实现此效果所需的设置、接线和代码实现。如果您需要进一步说明,请务必在特定时间戳(视频中的mm:ss处)查看视频。

硬件说明

该项目的主要组件包括ESP32微控制器、WS2812 LED灯带和MQTT代理。ESP32是一款功能多样的微控制器,内置Wi-Fi和蓝牙功能,可轻松连接到互联网。它作为我们项目的大脑,负责处理通信和控制LED灯带。

WS2812 LED灯带由可单独寻址的RGB LED组成,可通过单根数据线控制以显示各种颜色。每个LED都可以独立开关并设置为任意颜色,非常适合动态照明效果。MQTT代理促进不同客户端之间的通信,允许用户发布和订阅控制LED颜色的主题。

数据手册详情

制造商 Adafruit
零件编号 WS2812B
逻辑/IO电压 3.5 - 5.5 V
电源电压 5 V
输出电流(每通道) 20 mA
峰值电流(每通道) 60 mA
PWM频率建议 400 Hz
输入逻辑阈值 0.2Vcc(低电平),0.7Vcc(高电平)
压降 / RDS(on) / 饱和 0.5 V
热限制 工作温度:-25至85 °C
封装 独立5050 SMD
备注 / 变体 提供各种长度和配置

 

  • 确保为WS2812灯带提供充足的电源,以避免电压下降。
  • 在ESP32和LED灯带之间使用公共接地。
  • 保持数据线较短,以防止信号衰减。
  • 考虑在电源两端使用电容器(1000μF)以平滑电压尖峰。
  • 在数据线上使用适当的电阻以防止信号反射。
  • 注意LED灯带的总电流消耗;必要时使用外部电源。

接线说明

要将ESP32与WS2812 LED灯带连接,首先连接电源。将LED灯带的红线连接到5V电源,黑线连接到地线。接下来,将WS2812灯带的数据线(黄线)连接到ESP32上的引脚14。确保ESP32与LED灯带连接到同一地线,以保持公共参考。

完成电源和数据连接后,使用micro USB线将ESP32连接到计算机进行编程。您需要确保在编程时ESP32已通电以建立连接。接线完成后,您可以继续上传代码并测试设置。

esp32-47-cheer-light-wiring

代码示例与讲解

代码首先包含Wi-Fi和MQTT功能所需的库。标识符ssidpassword用于存储您的Wi-Fi凭据,而mqtt_server保存MQTT代理的地址。

const char* ssid = "SSID";
const char* password = "PASSWORD";
const char* mqtt_server = "mqtt.cheerlights.com";

接下来,我们使用数组定义支持的CheerLights颜色及其对应的RGB值。这允许程序根据用户输入轻松访问颜色设置。

String colorName[] = {"red", "pink", "green", "blue", "cyan", "white", "warmwhite", "oldlace", "purple", "magenta", "yellow", "orange"};
int colorRGB[][3] = { 255, 0, 0,  // "red"
                      255, 192, 203,  // "pink" ...};

setup()函数初始化串行通信,设置Wi-Fi连接,并准备MQTT客户端。它还启动LED灯带。

void setup() {
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  pixels.begin();
  pixels.show(); 
}

主循环持续检查MQTT连接并处理控制LED颜色的传入消息。当在订阅的主题上收到消息时,会触发callback()函数。

演示 / 预期效果

一切设置完成并上传代码后,您应该能够通过向MQTT主题发送消息来更改WS2812 LED的颜色。如果其他用户更改颜色,所有连接的设备将同时反映该更改。请注意可能的问题,如极性接反或连接不当,这可能导致LED无法正常工作(视频中的mm:ss处)。

视频时间戳

  • 00:00 开始
  • 2:00 介绍
  • 3:48 文档页面
  • 6:33 接线说明
  • 7:35 Arduino代码说明
  • 15:03 在Arduino IDE中选择ESP32开发板和COMP端口
  • 16:46 CheerLights演示

图像

WS2812_strip.ON
WS2812_strip.ON
esp32-47-cheer-light-wiring
esp32-47-cheer-light-wiring
848-ESP32 Tutorial 47/55- Arduino code for cheer light
语言: C++
/*
 * :ref: https://randomnerdtutorials.com/esp32-mqtt-publish-subscribe-arduino-ide/
 * https://docs.sunfounder.com/projects/kepler-kit/en/latest/iotproject/5.mqtt_pub.html
 */
#include <WiFi.h>
#include <PubSubClient.h>
 // #include <Wire.h>
#include <Adafruit_NeoPixel.h>

 // 用你的SSID/密码组合替换下列变量
const char* ssid = "SSID";
const char* password = "PASSWORD";

 // 添加您的 MQTT 代理地址:
const char* mqtt_server = "mqtt.cheerlights.com";
const char* unique_identifier = "sunfounder-client-sdgvsasdda";

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
int value = 0;


 // 定义支持的CheerLights颜色及其RGB值。
String colorName[] = {"red", "pink", "green", "blue", "cyan", "white", "warmwhite", "oldlace", "purple", "magenta", "yellow", "orange"};

int colorRGB[][3] = { 255,   0,   0, // 红色
                      255, 192, 203, // 粉色
                        0, 255,   0, // 绿色
                        0,   0, 255, // 蓝色
                        0, 255, 255, // 青色
                      255, 255, 255, // 白色
                      255, 223, 223, // 暖白
                      255, 223, 223, // 旧花边
                      128,   0, 128, // 紫色
                      255,   0, 255, // 品红
                      255, 255,   0, // 黄色
                      255, 165,   0}; // 橙子

 // 初始化 RGB 灯带
#define LED_PIN 13
#define NUM_LEDS 8

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  Serial.begin(115200);

 // wifi默认设置
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);

 // rgb 灯带开始
  pixels.begin();
  pixels.show();

}

void setup_wifi() {
  delay(10);
 // 我们首先连接到一个WiFi网络。
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* message, unsigned int length) {
  Serial.print("Message arrived on topic: ");
  Serial.print(topic);
  Serial.print(". Message: ");
  String messageTemp;

  for (int i = 0; i < length; i++) {
    Serial.print((char)message[i]);
    messageTemp += (char)message[i];
  }
  Serial.println();

 // 如果在该主题上收到消息,您将检查该消息。
 // 根据消息改变输出状态
  if (String(topic) == "cheerlights") {
    Serial.print("Changing color to ");
    Serial.println(messageTemp);
    setColor(messageTemp);
  }
}

void reconnect() {
 // 循环直到我们重新连接
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
 // 尝试连接
    if (client.connect(unique_identifier)) {
      Serial.println("connected");
 // 订阅
      client.subscribe("cheerlights");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
 // 在重试之前请等待5秒钟
      delay(5000);
    }
  }
}

void setColor(String color) {
 // 遍历颜色列表以找到匹配的颜色
  for (int colorIndex = 0; colorIndex < 12; colorIndex++) {
    if (color == colorName[colorIndex]) {
 // 设置条带上每个NeoPixel的颜色
      for (int pixel = 0; pixel < NUM_LEDS; pixel++) {
        pixels.setPixelColor(pixel, pixels.Color (colorRGB [colorIndex][0], colorRGB [colorIndex][1], colorRGB [colorIndex][2]));
      }
      pixels.show();
    }
  }
}


void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
}

资源与参考

文件📁

没有可用的文件。