esp8266 智能灯设计
1. 安装 Adafruit_NeoPixel 库
Github地址:Adafruit_NeoPixel
打开 Arduino
, 项目
-> 加载库
-> 管理库
,在搜索框中输入 “Adafruit_NeoPixel”,单击 安装
即可;
2.打开项目
安装成功后在 Arduino
可看到已加载 Adafruit NeoPixel
库
3.线路连接
D6 连接绿色线,
// NeoPixel 测试程序,展示如何使用 WHITE 通道来控制 RGBW 灯条
// 仅适用于 RGBW 型号的灯条(在普通的 RGB 灯条上显示效果不佳)。
#include <Arduino.h>
#ifdef ESP8266 // 添加 ESP8266 特有的头文件和定义
#include <ESP8266WiFi.h>
#define LED_PIN D6 // NodeMCU 的 D6 引脚,对应 ESP8266 的 GPIO12
#else
#define LED_PIN 6 // 如果不是 ESP8266,则使用默认的引脚 6
#endif
#include <FastLED.h> //包含FastLED库
// 连接到 Arduino 的 NeoPixel 灯珠数量
#define NUM_LEDS 60 // 使用更通用的名称 NUM_LEDS
// NeoPixel 灯条的亮度,范围从 0 (最小) 到 255 (最大)
#define BRIGHTNESS 50 // 设置亮度为最大值的 1/5 (max = 255)
// 声明 NeoPixel 灯条对象:
CRGB leds[NUM_LEDS]; // 定义一个 CRGB 数组,用于存储灯珠颜色数据
uint8_t gHue = 0; // 全局色相变量,用于颜色循环
#define FADE_AMOUNT 1 // 定义渐变量,数值越大,渐变越快
#define RAINBOW_SPEED 1 //彩虹速度,值越小,速度越慢
#define CHANGE_INTERVAL 5000 // 颜色改变间隔,单位毫秒
#define CHANCE_OF_GLITTER 10 // 闪烁概率,0-255,值越大概率越高
//定义一个全局变量保存上一次的模式
int previousMode = -1;
unsigned long lastChangeTime = 0;
// 颜色模式函数
void addGlitter( fract8 chanceOfGlitter) {
if( random8() < chanceOfGlitter) {
leds[ random16(NUM_LEDS) ] += CRGB::White;
}
}
void confetti() {
// 随机彩色斑点,闪烁并平滑淡入
fadeToBlackBy( leds, NUM_LEDS, 10);
int pos = random16(NUM_LEDS);
leds[pos] += CHSV( gHue + random8(64), 200, 255);
}
void sinelon() {
// 彩色点来回扫描,带有淡化轨迹
fadeToBlackBy( leds, NUM_LEDS, 20);
int pos = beatsin16( 13, 0, NUM_LEDS-1 );
leds[pos] += CHSV( gHue, 255, 192);
}
void bpm() {
// 彩色条纹以定义的每分钟节拍数 (BPM) 跳动
uint8_t BeatsPerMinute = 62;
CRGBPalette16 palette = PartyColors_p;
uint8_t beat = beatsin8( BeatsPerMinute, 64, 255);
for( int i = 0; i < NUM_LEDS; i++) { //9948
leds[i] = ColorFromPalette(palette, gHue+(i*2), beat-gHue+(i*10));
}
}
void juggle() {
// 八个彩色点,彼此交织并不同步
fadeToBlackBy( leds, NUM_LEDS, 20);
byte dothue = 0;
for( int i = 0; i < 8; i++) {
leds[beatsin16( i+7, 0, NUM_LEDS-1 )] |= CHSV(dothue, 200, 255);
dothue += 32;
}
}
void rainbowGlitter() {
rainbow();
addGlitter(CHANCE_OF_GLITTER);
}
//彩虹色填充函数
void rainbow() {
for( int i = 0; i < NUM_LEDS; i++) {
leds[i] = CHSV( gHue + i * 256 / NUM_LEDS, 255, 255);
}
}
// 随机选择颜色模式
void randomColorMode() {
static CRGB target_leds[NUM_LEDS]; // static 保证只初始化一次
// 使用一个更长的间隔时间来切换颜色模式
if (millis() - lastChangeTime >= CHANGE_INTERVAL) {
int mode = random(7); // 随机选择 0 到 6
// 避免连续选择相同的模式
while(mode == previousMode){
mode = random(7);
}
previousMode = mode;
//生成新的目标颜色
switch (mode) {
case 0:
confetti();
break;
case 1:
sinelon();
break;
case 2:
bpm();
break;
case 3:
juggle();
break;
case 4:
addGlitter(80);
break;
case 5:
fill_solid(target_leds, NUM_LEDS, CHSV(random8(), 255, 255));
break;
case 6:
rainbowGlitter(); // 彩虹色加闪烁
break;
}
//将目标颜色数据赋值给target_leds
for(int i = 0; i < NUM_LEDS; i++){
target_leds[i] = leds[i]; //复制当前leds的状态到目标
}
lastChangeTime = millis(); // 更新上次改变时间
}
//渐变过渡到目标颜色
for(int i = 0; i < NUM_LEDS; i++){
nblend(leds[i], target_leds[i], FADE_AMOUNT); //渐变,每次改变FADE_AMOUNT
}
}
void loop() {
randomColorMode(); // 运行随机颜色模式
FastLED.show(); // 显示颜色
FastLED.delay(10); // 适当的延迟
gHue += RAINBOW_SPEED; // 增加全局色相,实现颜色循环
}
void setup() { // 确保 setup 函数存在
FastLED.addLeds<NEOPIXEL, LED_PIN>(leds, NUM_LEDS); // 初始化 FastLED 库
FastLED.setBrightness(BRIGHTNESS); // 设置全局亮度
randomSeed(analogRead(0)); // 随机数种子初始化
}
本文作者: 永生
本文链接: https://yys.zone/detail/?id=230
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
发表评论
评论列表 (0 条评论)
暂无评论,快来抢沙发吧!