使用的是 ws2812數字燈珠 + esp826601s +mqtt 使用arduino IDE開發
能夠實現使用mqtt控制多種亮度的燈珠
效果演示:鏈接
ws2812數字燈珠
有信號的輸入和輸出
有信號的輸入和輸出
DO是信號輸出 DI是信號輸入
將多個RGB燈串聯,信號進行傳輸然後實現燈帶。
有很多種 我使用是這種來充當led燈
聯合esp826601s使用
只需要一個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接地
這裏推薦使用 這種模塊 方便簡單
接線省事很多
Adafruit_NeoPixel庫
用於控制基於單線的LED像素和條帶
安裝
IDE內安裝:
- 在arduino IDE中 項目—》加載庫----》管理庫
- 然後使用搜索欄搜索Neopixel strip。
- 選擇版本進行安裝
源碼安裝:
- 找到源碼 GitHub鏈接下載下來
- 下載後,將文件夾重命名爲“ Adafruit_NeoPixel”並安裝在Arduino Libraries文件夾中
- 重新啓動Arduino IDE,打開示例 找到這個庫的示例代碼
支持的芯片
使用
有兩種創建燈帶形式
- GRB:綠紅藍三基色 值從0到255
- GRBW:在RGB的基礎上加上一種白光,增加亮度的作用。
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燈帶
在使用時 顯示的形式不一樣
函數
- begin() 燈帶初始化
- setPixelColor() 設置燈帶的顏色(第一個參數是燈珠索引,第二個是顏色值(GRB或GRBW))
- setBrightness() 設置燈帶的亮度(第一個參數是燈珠索引,第二個是亮度值0-255)
- show() 顯示燈帶
…
這些函數控制對象 就是前面創建的燈帶對象(可以看下面的示例代碼)
在使用時可以根據自己需要顯示的樣子
編寫控制燈珠顏色 亮度變化的代碼
當然也可以使用這個庫提供的一些示例代碼 也是很有意思的
示例代碼
內含註釋
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#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;
}
}
項目參考代碼鏈接
更多學習教程
ESP開發學習基礎知識
基礎知識包括對esp模塊的認識與瞭解 mqtt協議的瞭解,arduino IDE運用代碼編寫等等。
- arduino基礎學習
- esp系列模塊的介紹
- mqtt協議的介紹與使用
- 利用mqtt esp模塊 基於arduino IDE開發方法
- esp模塊的AT指令 刷固件
- esp模塊睡眠模式使用
- esp8266-01s介紹與使用
- esp8266-12f介紹與使用
- NodeMcu介紹與使用
esp開發IOT應用
基於esp8266的模塊以及其他模塊根據實際的應用場景與需求製作的物聯網應用