用arduino uno开发板,30个ws2812b灯珠,微动按键。编程实现按键触发流星流动效果,每按一次按键,流动一次,支持多个同时流动。
时间: 2023-11-28 10:03:39 浏览: 167
好的,以下是一个简单的代码实现:
```C++
#include <Adafruit_NeoPixel.h>
#define PIN 6
#define NUM_LEDS 30
Adafruit_NeoPixel strip(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
int buttonPin = 2; // 微动按键连接到数字引脚2
int buttonState = 0; // 按键状态变量,初始值为0
void setup() {
strip.begin();
strip.show(); // 初始化灯珠
pinMode(buttonPin, INPUT); // 设置按键为输入模式
}
void loop() {
buttonState = digitalRead(buttonPin); // 读取按键状态
if (buttonState == HIGH) { // 如果按键被按下
meteor(); // 调用流星函数
}
}
void meteor() {
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, 0, 0, 0); // 先将所有灯珠设置为黑色
}
strip.show();
for (int j = 0; j < 5; j++) { // 流星数量为5个
int start = random(NUM_LEDS - 5); // 流星起点随机
for (int i = 0; i < 5; i++) { // 流星长度为5个灯珠
strip.setPixelColor(start + i, 255, 255, 255); // 将流星的5个灯珠设置为白色
}
strip.show();
delay(50); // 流星流动速度为50ms
for (int i = 0; i < 5; i++) {
strip.setPixelColor(start + i, 0, 0, 0); // 将流星擦除
}
strip.show();
delay(50);
}
}
```
注释已经解释了每段代码的功能,简单说一下整个流程:
1. 在 `setup()` 函数中初始化灯珠和按键。
2. 在 `loop()` 函数中不断读取按键状态,如果按键被按下就调用 `meteor()` 函数。
3. `meteor()` 函数先将所有灯珠设置为黑色,然后随机生成5个流星,每个流星长度为5个灯珠,颜色为白色,流动速度为50ms。每个流星流动完毕后将其擦除,继续等待下一次按键触发。
至于支持多个同时流动,这需要对代码进行一些修改,可以通过数组存储多组流星数据,然后分别处理每组流星。
阅读全文