前言

最早我是在B站上刷到这类视频的,这种灯成本不高,而且设计也相对简单,非常适合上手。但是不同于这些视频中的单色电气灯,本项目计划使用ESP-8266单片机搭配WS2812灯珠设计一款可编程电气灯。

初期设计

电气灯外壳使用250*80*70的防水电源盒,WS2812B灯珠则采用已经焊接好的灯带或灯板。ESP8266安装在灯盒背部主控PCB上,主控PCB示意图如下。具体文件在文章末尾给出。

丝印 元件 功能
USB-C USB-C口母座 电源供电
POWER 船型开关 总电源开关
MODE 轻触开关 切换工作模式(常亮、呼吸、渐变……)
COLOR 轻触开关 切换颜色
DEBUG USB-C口母座 调试ESP-8266
VIBRA ON 小型拨动开关 开关震动切换颜色功能

螺丝使用M3螺丝,外壳开孔尺寸 90*50.

ws2812使用六块8灯一组的长条形灯板,每三块板串联在一起,分别放在外壳的上部和下部,上下灯组的信号采用并联方式连接到ESP8266的D2引脚上。
这样上下对称的排列方式可以很好的保证发出光颜色的均匀性。

此外,在主控pcb上预留了可供烧录程序的DEBUG接口,可以在不拆开外壳的情况下方便地进行数据烧写,大大提高了拓展性。

ESP8266是具有wifi功能的模块,因此有关于wifi的拓展功能也非常丰富,比如通过手机控制调色、通过当地天气数据自动改变灯的颜色、在不同的节日显示不同的效果……目前我还打算将这个灯连入我的家庭服务器(这个大工程我之后也会开一篇blog),来提供更多有趣的功能。

材料准备

序号 材料 数量 价格(供参考) 备注
1 透明盖防水盒250*80*70 1 11.87+6(工艺费) 背板开250*80*70的方孔
2 pp导光板250*80*70 1 5.00
3 8位ws2812灯板 6 10.50
4 嘉立创PCB板 1 0
5 1*15p排母 4 1.00
6 4pType-C母座 2 3.2
7 自复位按钮 2 0.8
8 船型开关 1 0.28
9 M3螺柱螺母 若干 0.50
10 跳线 若干 0.50
11 sw18015p振动开关 1 0.20
12 SS12D07VG3 3mm开关 2 0.12
13 ESP8266开发板 1 10.00
14 贴纸 - -
合计 49.97

材料组装

ws2812灯板焊接

用跳线将三块灯板的VCC和GND分别焊在一起,将前一块板的DO与下一块板的DI焊接在一起,留出第一块版VCC,GND,DI的接线端子。另外三块板也是同样的操作。

GND只需焊接一个焊盘即可

主控板组装

依次在电路板指定位置焊上排母、电源输入±、船型开关、两个按钮、两个拨动开关、振动开关、两组灯板。

取一根microUSB数据线的公口,将四根线和DEBUG母座焊接,最后插上ESP8266.

外壳组装

用螺柱螺母将主控板固定在外壳背部开槽处,用胶水将两组灯板分别粘在外壳上下。

用美工刀在导光板上切出外壳的螺丝座,将导光板压在透明盖和底壳之间。

程序烧录

有关Arduino IDE的使用请参考我之前有关ESP8266的博客

安装adafruit_neopixel库

搜索adafruit_neopixel库,安装即可。

程序

固定的引脚定义:

D2-数据输出引脚
D3,D4-按钮上升沿控制中断

下面提供了一个简单的Rainbow灯效。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <Adafruit_NeoPixel.h>

#define LED_COUNT 24 //虽然总共有48个灯,但由于是上下两组并联,所以只需要24位灯的数据
#define LED_PIN D2 //数据输出引脚

Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

void setup() {
strip.begin();
strip.show();
strip.setBrightness(50); //亮度(0-255),建议不超过 200
}


void loop() {
rainbow(10); //滚动速度参数
}

void rainbow(int wait) {
for(long firstPixelHue = 0; firstPixelHue < 5*65536; firstPixelHue += 256) {
for(int i=0; i<strip.numPixels(); i++) {
int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
}
strip.show();
delay(wait);
}
}

未完待续

PCB文件: