使用的是 ws2812数字灯珠 + esp826601s +mqtt 使用arduino IDE开发
能够实现使用mqtt控制多种亮度的灯珠
效果演示:链接
有信号的输入和输出
有信号的输入和输出
DO是信号输出 DI是信号输入
将多个RGB灯串联,信号进行传输然后实现灯带。
有很多种 我使用是这种来充当led灯
只需要一个GPIO给ws2812 信号端就可以
因此考虑使用esp8266 -01s的GPIO2
对esp8266 mqtt 使用arduino开发没有基础的同学可以先看这几篇文章
http://niehen.cn/esp8266/esp8266-mqtt-%e4%bd%bf%e7%94%a8arduino%e5%bc%80%e5%8f%91%e6%95%99%e7%a8%8b/
http://niehen.cn/esp8266/mqtt%e5%8d%8f%e8%ae%ae%e4%bb%8b%e7%bb%8d%e4%b8%8e%e5%ba%94%e7%94%a8/
http://niehen.cn/esp8266/esp8266-01s%e4%bb%8b%e7%bb%8d/
前期使用 fast led 库 多次尝试不成功,
查资料发现 由于ws2812 需要连续的扫描 频率很大,而esp01s频率不足所以在前期尝试的时候都没成功,但是使用ws2812只需要一个引脚 使用12f显得浪费
查找了很多资料发现使用Adafruit_NeoPixel.h 可以实现
下面会讲
只需要ws2812 的信号引脚接到 esp01s的GPIO2
5v接到电源5v
GND接地
这里推荐使用 这种模块 方便简单
接线省事很多
用于控制基于单线的LED像素和条带
IDE内安装:
源码安装:
有两种创建灯带形式
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800); // 创建 GRB灯带
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRBW + NEO_KHZ800); // 创建 GRBW灯带
在使用时 显示的形式不一样
函数
在使用时可以根据自己需要显示的样子
编写控制灯珠颜色 亮度变化的代码
当然也可以使用这个库提供的一些示例代码 也是很有意思的
内含注释
#include
#ifdef __AVR__
#include
#endif
//使用的引脚
#define PIN 6
//数字灯珠数量
#define NUMPIXELS 16
// 当我们设置NeoPixel库时,我们告诉它要使用多少像素,以及使用哪个pin发送信号。
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int delayval = 500; // delay for half a second
void setup() {
// 这是5V 16MHz的小饰品,如果不使用小饰品,可以去掉这三条线
#if defined (__AVR_ATtiny85__)
if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif
pixels.begin(); // 这将初始化neopix库。
}
void loop() {
// 对于一组NeoPixel,第一个NeoPixel是0,第二个是1,一直到像素数减1为止.
for(int i=0;i<NUMPIXELS;i++){
// pixels.Color 设置RGB的值 区间是 0,0,0 到 255,255,255
pixels.setPixelColor(i, pixels.Color(0,150,0)); // 中等明亮的绿色。
pixels.show(); // 这会将更新的像素颜色发送到硬件。
delay(delayval); // 延迟一段时间(以毫秒为单位)。
}
}
这个库的GitHub链接
在这个项目中 只需要显示白色
多级调节 其实也就是调节灯珠的亮度
mqtt发过来一个数字值,然后控制亮度变化
思路很简单
将LED灯珠变为全部白色 设置亮度只需要改变传入的第一个参数即可
在亮度等级调整的时候,为了变换没有那么突兀,程序里面采用的是逐渐变化.而不是直接的全部设为目标亮度。
int bright = 0;
void pulseWhite(uint8_t result,uint8_t wait) { // 第一个参数为要变为的亮度值 第二个参数为变化间隔的时间单位为毫秒
if (bright < result){
for(int j = bright; j < result ; j++){
for(uint16_t i=0; i<pixels.numPixels(); i++) {
pixels.setPixelColor(i, pixels.Color(j,j,j) );
}
delay(wait);
pixels.show();
}
bright = result;
}else if(bright > result){
for(int j = bright; j >= result ; j--){
for(uint16_t i=0; i<pixels.numPixels(); i++) {
pixels.setPixelColor(i, pixels.Color(j,j,j) );
}
delay(wait);
pixels.show();
}
bright = result;
}
}
GitHub地址
基础知识包括对esp模块的认识与了解 mqtt协议的了解,arduino IDE运用代码编写等等。
基于esp8266的模块以及其他模块根据实际的应用场景与需求制作的物联网应用