|
* 坛子里也有ESP8266驱动WS2812B的教程,带联网和远程控制:https://www.mydigit.cn/forum.php?mod=viewthread&tid=109563
* 这个帖子只是我的学习心得和思考。
* 要说WS2812B灯珠与ESP8266的共同点,我觉得就是廉价又易用,WS2812B已经广泛在各种使用场景中流行,园林景观灯,点阵屏等。
对于单片机爱好者来说,考虑其高性价比和让人眼花缭乱的炫技效果,它也成为囤货必备。
* 回想以前普通的三色LED灯珠,每个点需要三根线独立控制RGB,如果灯珠很多,需要使用串行控制线,电路中可能还要设计大量的串行信号译码芯片,例如74HC959,可能还要设计大量的三极管来增加LED驱动电流,实际上以前的很多点阵屏都是这样做的,大量的外围电路增加了模块的成本和重量,稳定性也降低。
* WS2812B灯珠与普通的RGB三色灯珠区别在于其每个灯珠中都集成了恒流驱动电路,以及控制电路,使得外围不再需要设计太多的电路,而驱动方式还是和以前采用了74HC959类似的,级联输出,理论上一根串行信号线可以驱动若干个LED灯珠,每个灯珠的颜色,亮灭都是可以单独控制的。在实际生产中,官方说明是一根信号线至少可以级联1024个灯珠,也就是说我们可能只需要一个单片机IO,就可以控制一个32x32像素的全彩点阵屏,而且不需要太多的外围电路。
* 如果使用ESP8266基于Arduino来驱动WS2812B,那就是一种简单又实用的操作了,因为Arduino是特别容易上手的软件开发环境。
* 我首先是玩一个Blink,这是最简单的,如果不想关心WS2812B实际的驱动信号细节,直接使用FastLED这个库即可。
* 先安装FastLED库,工具->管理库->搜索安装FastLED即可。这个库也可以用在其他的Arduino设备上,不一定是ESP8266,它支持的LED也有很多种,WS2812只是其中之一。
* 当然如果是全新安装的ArduinoIED,得首先装ESP8266支持,可以参考https://arduino-esp8266.readthedocs.io/en/latest/index.html
* 用NodeMCU电路接线如图,VCC,GND,IN即可
* 实物如下图:
* 第一个Blink程序:
- #include <FastLED.h>
- #define LED_PIN 8 //我的LED信号线IN接在8引脚
- #define NUM_LEDS 12 //我的灯带一共级联了12颗LED
- CRGB leds[NUM_LEDS];
- void setup() {
- FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
- FastLED.setBrightness(20); //可以设置全局亮度,调低亮度不刺眼
- }
- void loop() {
- // 显示一下粉色
- leds[0] = CRGB::HotPink;
- FastLED.show();
- delay(1000);
- // 显示一下黑色,黑色就是熄灭
- leds[0] = CRGB::Black;
- FastLED.show();
- delay(1000);
- }
复制代码
* 再来玩个呼吸灯
- #include <FastLED.h>
- #define LED_PIN 8 //我的LED信号线IN接在8引脚
- #define NUM_LEDS 12 //我的灯带一共级联了12颗LED
- CRGB leds[NUM_LEDS];
- void setup() {
- FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
- FastLED.setBrightness(20); //可以设置全局亮度,调低亮度不刺眼
- }
- int h = 0;
- void loop() {
- leds[0] = CHSV( h, 255, 255); //用HSV色彩空间,不断改变H即可
- FastLED.show();
- delay(2);
- h = (h + 1) % 255;
- }
复制代码
* 所有LED一起呼吸
- #include <FastLED.h>
- #define LED_PIN 8 //我的LED信号线IN接在8引脚
- #define NUM_LEDS 12 //我的灯带一共级联了12颗LED
- CRGB leds[NUM_LEDS];
- void setup() {
- FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
- FastLED.setBrightness(20); //可以设置全局亮度,调低亮度不刺眼
- }
- int h = 0;
- void loop() {
- for (int i = 0; i < NUM_LEDS; i++) {
- leds[i] = CHSV( h, 255, 255); //用HSV色彩空间,不断改变H即可
- FastLED.show();
- }
- delay(2);
- h = (h + 3) % 255;
- }
复制代码
* 彩虹呼吸,大家颜色不一样
- #include <FastLED.h>
- #define LED_PIN 8 //我的LED信号线IN接在8引脚
- #define NUM_LEDS 12 //我的灯带一共级联了12颗LED
- CRGB leds[NUM_LEDS];
- void setup() {
- FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
- FastLED.setBrightness(20); //可以设置全局亮度,调低亮度不刺眼
- }
- int h = 0;
- void loop() {
- for (int i = 0; i < NUM_LEDS; i++) {
- leds[i] = CHSV( (h + (255 / NUM_LEDS) * i), 255, 255); //用HSV色彩空间,不断改变H即可
- FastLED.show();
- }
- delay(2);
- h = (h + 3) % 255;
- }
复制代码
* 使用FastLED来操作LED,代码非常精简易懂,再来个简单的流水灯
- #include <FastLED.h>
- #define LED_PIN 8 //我的LED信号线IN接在8引脚
- #define NUM_LEDS 12 //我的灯带一共级联了12颗LED
- CRGB leds[NUM_LEDS];
- void setup() {
- FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
- FastLED.setBrightness(20); //可以设置全局亮度,调低亮度不刺眼
- }
- void loop() {
- for (int i = 0; i < NUM_LEDS; i++) {
- leds[i] = CRGB::Red;
- FastLED.show();
- delay(500);
- leds[i] = CRGB::Black;
- }
- }
复制代码
这样就可以让每个LED一次点亮成红色,感觉和普通的单片机操作流水灯没太大区别。
学会了点灯,我们就已经可以帮女主播做一块五彩斑斓的彩灯背景墙了。
当然下一步我计划学习把ESP8266的Wifi连接功能发挥出来,加入配网,接入贝壳物联,通过天猫精灵语音控制灯带切换颜色和呼吸灯模式,毕竟主播一般手上很忙,用语音会方便很多。
ESP8266基于Arduino接入贝壳物联,使用天猫精灵控制WS2812B灯带
https://www.mydigit.cn/forum.php?mod=viewthread&tid=113073
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|