arduino使用多线程库实现五个随机周期led点亮,互不干扰,且每次周期均不相同的代码
时间: 2024-12-04 10:29:17 浏览: 28
Arduino使用第三方库如 "SoftwareSerial" 或 "Thread" 实现多线程控制LED灯并不是最直接的方法,因为Arduino Uno等单片机并没有真正的操作系统支持原生多线程。然而,你可以通过延时函数结合无限循环来模拟“并发”效果。下面是一个简单的示例,用到了 `millis()` 函数来模拟随机周期:
```cpp
#include <FastLED.h> // 快速LED库,用于控制LEDs
#include <random>
#define NUM_LEDS 5
CRGB leds[NUM_LEDS];
// 每个LED的闪烁状态
bool ledStates[NUM_LEDS];
void setup() {
FastLED.addLeds<NEOPIXEL, LED_PIN>(leds, NUM_LEDS);
for (int i = 0; i < NUM_LEDS; i++) {
ledStates[i] = false;
}
}
void loop() {
// 创建随机数生成器
std::default_random_engine engine(time(nullptr));
std::uniform_int_distribution<int> period_dist(500, 1000); // 随机周期范围
while (true) {
// 为每个LED创建随机周期
for (int i = 0; i < NUM_LEDS; i++) {
if (!ledStates[i]) { // 只有当LED未亮时才改变
int current_period = period_dist(engine);
ledStates[i] = true;
// 开始计时
unsigned long start_time = millis();
while (millis() - start_time < current_period) {
FastLED.show(); // 更新LED状态
delayMicroseconds(10); // 稍微停顿以减小闪烁频率
}
ledStates[i] = false; // 刷新结束后关闭LED
}
}
delay(10); // 为了减少CPU占用率,稍微等待一下再进入下一轮循环
}
}
```
注意:这种方法实际上并不能完全实现严格的互不干扰,因为它依赖于程序的执行速度和延时函数的时间间隔。在资源有限的Arduino上,这只能近似模拟。
阅读全文