问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

ESP8266+ws2812,吊灯灯带炫酷升级!

创作时间:
2025-01-22 05:30:30
作者:
@小白创作中心

ESP8266+ws2812,吊灯灯带炫酷升级!

随着智能家居的普及,DIY一套炫酷的灯光系统成为许多科技爱好者的首选项目。本文将带你使用ESP8266和ws2812 LED灯带,打造一个支持远程控制和声音控制的智能灯光系统。无论是在家中还是办公室,这套系统都能为你带来前所未有的视觉享受。

硬件准备

  • ESP8266开发板
  • ws2812 LED灯带(建议30颗灯珠)
  • MAX9814麦克风模块
  • 5V电源
  • 杜邦线若干

软件准备

  • Arduino IDE
  • 必需的库文件:
    • Adafruit_NeoPixel
    • PubSubClient
    • FastLED
    • MegunoLink

硬件连接

  1. ESP8266与ws2812 LED灯带连接

    • ESP8266的GPIO15连接到LED灯带的DO
    • 5V电源连接到灯带的VCC
    • GND连接到灯带的GND
  2. ESP8266与MAX9814麦克风模块连接

    • ESP8266的A0连接到麦克风模块的OUT
    • 5V电源连接到麦克风模块的Vdd
    • GND连接到麦克风模块的GND

代码实现

远程控制部分

基于MQTT协议实现远程控制,代码如下:

#include <ESP8266WiFi.h>
#include <Adafruit_NeoPixel.h>
#include <PubSubClient.h>

Adafruit_NeoPixel rgb_display_15 = Adafruit_NeoPixel(30, 15, NEO_GRB + NEO_KHZ800);
const char *mqtt_broker = "mixio.mixly.cn";
const char *mqtt_username = "your_email@example.com";
const char *mqtt_password = "your_mqtt_password";
const int mqtt_port = 1883;
String mqtt_topic = "";
String mqtt_data = "";
boolean mqtt_status = false;
String project = "ControlRGB";

WiFiClient espClient;
PubSubClient client(espClient);

void callback(char *topic, byte *payload, unsigned int length) {
  String data = "";
  for (int i = 0; i < length; i++) {
    data = String(data) + String((char) payload[i]);
  }
  mqtt_topic = String(topic);
  mqtt_data = data;
  mqtt_status = true;
}

void setup() {
  WiFi.begin("your_wifi_ssid", "your_wifi_password");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  rgb_display_15.begin();
  client.setServer(mqtt_broker, mqtt_port);
  client.setCallback(callback);
  while (!client.connected()) {
    String client_id = "esp-client-";
    client_id += String(WiFi.macAddress());
    if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
      client.publish(String(String(mqtt_username) + "/" + String(project) + "/" + String("b640a0ce465fa2a4150c36b305c1c11b")).c_str(), String(client_id).c_str());
    } else {
      delay(2000);
    }
  }
  client.subscribe(String(String(mqtt_username) + "/" + String(project) + "/" + String("RGBdata")).c_str());
}

void loop() {
  client.loop();
  if (mqtt_status) {
    if (String(mqtt_topic).equals(String(String(mqtt_username) + "/" + String(project) + "/" + String("RGBdata")))) {
      int r = mqtt_data.substring(1, 3).toInt();
      int g = mqtt_data.substring(4, 6).toInt();
      int b = mqtt_data.substring(7, 9).toInt();
      for (int i = 0; i < rgb_display_15.numPixels(); i++) {
        rgb_display_15.setPixelColor(i, rgb_display_15.Color(r, g, b));
      }
      rgb_display_15.show();
      mqtt_status = false;
    }
  }
}

声音控制部分

使用MAX9814麦克风模块实现声音控制,代码如下:

#include <FastLED.h>
#include <MegunoLink.h>
#include <Filter.h>

#define N_PIXELS 30
#define MIC_PIN A0
#define LED_PIN 15
#define NOISE 580
#define TOP (N_PIXELS + 2)
#define LED_TYPE WS2812B
#define BRIGHTNESS 100
#define COLOR_ORDER GRB

CRGB leds[N_PIXELS];
int lvl = 0, minLvl = 0, maxLvl = 136;
ExponentialFilter<long> ADCFilter(5, 0);

void music_vu() {
  int n, height;
  n = analogRead(MIC_PIN);
  n = abs(1023 - n);
  n = (n <= NOISE) ? 0 : abs(n - NOISE);
  ADCFilter.Filter(n);
  lvl = ADCFilter.Current();
  height = TOP * (lvl - minLvl) / (long)(maxLvl - minLvl);
  if (height < 0L) height = 0;
  else if (height > TOP) height = TOP;
  for (uint8_t i = 0; i < N_PIXELS; i++) {
    if (i >= height) leds[i] = CRGB(0, 0, 0);
    else leds[i] = Wheel(map(i, 0, N_PIXELS - 1, 30, 150));
  }
  FastLED.show();
}

void setup() {
  Serial.begin(115200);
  FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, N_PIXELS).setCorrection(TypicalLEDStrip);
  FastLED.setBrightness(BRIGHTNESS);
}

void loop() {
  music_vu();
}

CRGB Wheel(byte WheelPos) {
  if (WheelPos < 85)
    return CRGB(WheelPos * 3, 255 - WheelPos * 3, 0);
  else if (WheelPos < 170) {
    WheelPos -= 85;
    return CRGB(255 - WheelPos * 3, 0, WheelPos * 3);
  } else {
    WheelPos -= 170;
    return CRGB(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}

测试与调试

  1. 远程控制测试

    • 在MIXIO平台上创建一个色盘控件
    • 将控件的消息主题设置为"RGBdata"
    • 发送颜色信息,观察LED灯带是否按预期变化
  2. 声音控制测试

    • 运行声音控制代码
    • 播放音乐或制造声音,观察LED灯带是否随声音节奏变化

总结与展望

通过以上步骤,你已经成功打造了一个支持远程控制和声音控制的智能灯光系统。这个系统不仅能够通过手机APP远程调节灯光效果,还能根据环境声音实现灯光律动,为你带来前所未有的视觉享受。未来,你可以尝试添加更多传感器,如光线传感器或人体红外传感器,进一步提升系统的智能化水平。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号