#include <Adafruit_NeoPixel.h>
// 定义开关连接的引脚
const int switchPin = 4;
// 定义灯带连接的引脚
const int ledPin = 6;
// 定义灯带的灯珠数量
const int numLEDs = 16;
// 定义 NeoPixel 对象
Adafruit_NeoPixel strip(numLEDs, ledPin, NEO_GRB + NEO_KHZ800);
// 存储开关的状态
int switchState = 0;
// 存储上一次开关的状态
int lastSwitchState = HIGH;
// 存储灯带的状态
bool ledStripOn = false;
// 定时器相关变量
unsigned long previousMillis = 0;
const long interval = 3000; // 3 秒的间隔
void setup() {
// 初始化串口通信,波特率为 9600
Serial.begin(9600);
// 将开关引脚设置为输入模式
pinMode(switchPin, INPUT_PULLUP);
// 初始化灯带
strip.begin();
strip.show();
}
void loop() {
// 读取开关的状态
switchState = digitalRead(switchPin);
// 判断开关状态是否发生变化
if (switchState != lastSwitchState) {
// 延迟一小段时间以消除抖动
delay(50);
// 再次读取开关状态以确认
switchState = digitalRead(switchPin);
if (switchState != lastSwitchState) {
if (switchState == LOW) {
// 开关按下,切换灯带状态
ledStripOn = !ledStripOn;
if (ledStripOn) {
// 灯带打开,设置所有灯珠为白色
for (int i = 0; i < numLEDs; i++) {
strip.setPixelColor(i, strip.Color(255, 255, 255));
}
Serial.println("WS2812 LED strip is turned on!");
} else {
// 灯带关闭,设置所有灯珠为黑色
for (int i = 0; i < numLEDs; i++) {
strip.setPixelColor(i, strip.Color(0, 0, 0));
}
Serial.println("WS2812 LED strip is turned off!");
}
// 更新灯带显示
strip.show();
}
// 更新上一次的开关状态
lastSwitchState = switchState;
}
}
// 定时器逻辑
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
// 每隔 3 秒自动点亮灯带
ledStripOn = true;
for (int i = 0; i < numLEDs; i++) {
strip.setPixelColor(i, strip.Color(255, 255, 255));
}
Serial.println("WS2812 LED strip is automatically turned on!");
strip.show();
}
}