ESP8266 + ws2812 编写当声音大于一定值时发送一个流水灯,可以在上一个流水时未结束时,继续发射下个流水灯的代码
时间: 2024-03-09 16:50:09 浏览: 61
流水灯代码,方便编程者学习
好的,这里是一个简单的 ESP8266 + WS2812 的流水灯代码示例,可以当声音大于一定值时发送一个流水灯,并且可以在上一个流水时未结束时,继续发射下个流水灯。
```cpp
#include <Adafruit_NeoPixel.h>
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <EasyButton.h>
// 定义 WS2812 控制引脚和灯珠数量
#define PIN 2
#define NUM_LEDS 16
// 初始化一个 NeoPixel 对象
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
// 定义声音传感器的引脚
const int soundPin = A0;
// 定义流水灯效果相关变量
bool isLighting = false;
int color = 0;
// 定义 EasyButton 对象,用于处理按钮事件
EasyButton button(0);
void setup() {
Serial.begin(115200);
// 连接 WiFi
WiFi.begin("YourSSID", "YourPassword");
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("WiFi connected");
// 初始化 OTA 升级服务
ArduinoOTA.setHostname("ESP8266-WS2812");
ArduinoOTA.begin();
// 初始化 NeoPixel 对象
strip.begin();
strip.show();
// 初始化按钮对象
button.begin();
button.onPressed(onButtonPressed);
}
void loop() {
// 处理 OTA 升级服务
ArduinoOTA.handle();
// 检测声音是否大于一定值
int soundLevel = analogRead(soundPin);
if (soundLevel > 500 && !isLighting) {
// 发送流水灯效果
sendLight();
}
// 如果当前正在进行流水灯效果,则继续进行
if (isLighting) {
// 从左往右流水灯效果
for (int j = 0; j < NUM_LEDS; j++) {
strip.setPixelColor(j, color); // 设置灯珠颜色
strip.show(); // 刷新灯珠
delay(50); // 等待时间
}
// 从右往左流水灯效果
for (int j = NUM_LEDS - 1; j >= 0; j--) {
strip.setPixelColor(j, color); // 设置灯珠颜色
strip.show(); // 刷新灯珠
delay(50); // 等待时间
}
// 等待一段时间后结束流水灯效果
delay(500);
strip.clear(); // 将所有灯珠关闭
strip.show();
isLighting = false;
}
}
// 发送流水灯效果
void sendLight() {
// 随机生成流水灯颜色
int r = random(0, 255);
int g = random(0, 255);
int b = random(0, 255);
color = strip.Color(r, g, b);
// 发送流水灯效果
isLighting = true;
}
// 处理按钮事件,用于手动发送流水灯效果
void onButtonPressed() {
sendLight();
}
```
这个代码会通过声音传感器检测声音是否大于一定值,如果是,则会发送一个流水灯效果。当一个流水灯效果还未结束时,如果检测到声音,则会立即发送下一个流水灯效果。除此之外,你还可以通过按下按钮手动发送流水灯效果。你可以根据需要修改声音传感器的引脚、检测声音的阈值、流水灯效果的颜色和等待时间等参数。
阅读全文