37款傳感器與模塊的提法,在網絡上廣泛流傳,其實Arduino能夠兼容的傳感器模塊肯定是不止37種的。鑒於本人手頭積累了一些傳感器和模塊,依照實踐出真知(一定要動手做)的理念,以學習和交流為目的,這里准備逐一動手試試做實驗,不管成功與否,都會記錄下來---小小的進步或是搞不定的問題,希望能夠拋磚引玉。
【Arduino】108種傳感器模塊系列實驗(資料+代碼+圖形+仿真)
實驗三十六:WS2812B智能外控集成LED四位彩燈模塊(內置驅動IC)
WS2813B
是一個集控制電路與發光電路於一體的智能外控LED光源。其外型與一個5050LED燈珠相同,每個元件即為一個像素點。像素點內部包含了智能數字接口數據鎖存信號整形放大驅動電路,還包含有高精度的內部振盪器和12V高壓可編程定電流控制部分,有效保證了像素點光的顏色高度一致。
主要特點
● 智能反接保護,電源反接不會損壞IC。
● IC控制電路與LED點光源公用一個電源。
● 控制電路與RGB芯片集成在一個5050封裝的元器件中,構成一個完整的外控像素點。
● 內置信號整形電路,任何一個像素點收到信號后經過波形整形再輸出,保證線路波形畸變不會累加。
● 內置上電復位和掉電復位電路。
● 每個像素點的三基色顏色可實現256級亮度顯示,完成16777216種顏色的全真色彩顯示,掃描頻率不低於400Hz/s。
● 串行級聯接口,能通過一根信號線完成數據的接收與解碼。
● 任意兩點傳傳輸距離在不超過5米時無需增加任何電路。
● 當刷新速率30幀/秒時,級聯數不小於1024點。
● 數據發送速度可達800Kbps。
● 光的顏色高度一致,性價比高。
數據協議采用單線歸零碼的通訊方式,像素點在上電復位以后,DIN端接受從控制器傳輸過來的數據,首先送過來的24bit數據被第一個像素點提取后,送到像素點內部的數據鎖存器,剩余的數據經過內部整形處理電路整形放大后通過DO端口開始轉發輸出給下一個級聯的像素點,每經過一個像素點的傳輸,信號減少24bit。像素點采用自動整形轉發技術,使得該像素點的級聯個數不受信號傳送的限制,僅僅受限信號傳輸速度要求。
LED具有低電壓驅動,環保節能,亮度高,散射角度大,一致性好,超低功率,超長壽命等優點。將控制電路集成於LED上面,電路變得更加簡單,體積小,安裝更加簡便。
應用領域
● LED全彩發光字燈串,LED全彩模組, LED全彩軟燈條硬燈條,LED護欄管
● LED點光源,LED像素屏,LED異形屏,各種電子產品,電器設備跑馬燈等
只需要一個數字口就可以幾乎無限級聯的全彩RGB LED( 我這里是四位的模塊)
四位模塊電原理圖
模塊引腳
VCC---這個引腳需要由一個5V-7V的直流電源接入。電壓過高(7V)的話會燒毀LED,電壓太低(5V)的話則會造成亮度過低,甚至造成LED不工作。
GND---公共引腳,接地,即接電源的負極。
IN---微控制器(或者是另外一個WS2812)的數據從這個引腳傳入LED。
OUT---數據從這里輸出給下一級的WS2812,如果這個WS2812是最后一級,則可直接懸空此引腳。
下載WS2812驅動庫Adafruit_NeoPixel,有二鏈接;
https://github.com/adafruit/Adafruit_NeoPixel
https://www.tuicool.com/articles/IbaAJbE
好像需要三個庫,以適應不同情況下的使用
Adafruit_GFX
Adafruit_NeoPixel
Adafruit_NeoMatrix
解壓縮每個庫,從文件夾名稱中刪除“-master”並將它們移動到Arduino庫文件夾libraries里面。重新啟動Arduino IDE以加載庫。
/* 【Arduino】108種傳感器模塊系列實驗(資料+代碼+圖形+仿真) 實驗三十六:WS2812B智能外控集成LED四位彩燈模塊(內置驅動IC)之一 第一個實驗:一只LED的呼吸燈 */ #include <Adafruit_NeoPixel.h> #define PIN 6 #define MAX_LED 1 #define ADD true #define SUB false int val = 0; boolean stat = ADD; Adafruit_NeoPixel strip = Adafruit_NeoPixel( MAX_LED, PIN, NEO_RGB + NEO_KHZ800 ); void setup(){ strip.begin(); strip.show(); } void loop(){ uint32_t color = strip.Color(val, val, val); strip.setPixelColor(0, color); if(val>=235) stat = SUB; if(val<=0) stat = ADD; strip.show(); delay(15); if(stat==SUB) val --; else if(stat==ADD) val++; }
/* 【Arduino】108種傳感器模塊系列實驗(資料+代碼+圖形+仿真) 實驗三十六:WS2812B智能外控集成LED四位彩燈模塊(內置驅動IC)之二 第二個實驗:四只LED輪流全彩快閃 */ #include <Adafruit_NeoPixel.h> #define PIN 6 #define MAX_LED 4 #define ADD true #define SUB false int val = 0; boolean stat = ADD; Adafruit_NeoPixel strip = Adafruit_NeoPixel( MAX_LED, PIN, NEO_RGB + NEO_KHZ800 ); void setup() { strip.begin(); strip.show(); } void loop() { uint8_t i,a=0; uint32_t color = strip.Color(0, 100, 255); while(a<10) { for(i=0;i<9;i++) { if(i==a) strip.setPixelColor(i, color); else strip.setPixelColor(i, 0); } strip.show(); delay(30); a++; } }
/* 【Arduino】108種傳感器模塊系列實驗(資料+代碼+圖形+仿真) 實驗三十六:WS2812B智能外控集成LED四位彩燈模塊(內置驅動IC)之三 第三個實驗:循序點亮四只綠色光LED */ #include <Adafruit_NeoPixel.h> #ifdef __AVR__ #include <avr/power.h> #endif #define PIN 6 #define NUMPIXELS 4 Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); int delayval = 500; void setup() { #if defined (__AVR_ATtiny85__) if (F_CPU == 16000000) clock_prescale_set(clock_div_1); #endif pixels.begin(); } void loop() { for(int i=0;i<NUMPIXELS;i++){ pixels.setPixelColor(i, pixels.Color(0,150,0)); pixels.show(); delay(delayval); } }
實現同一效果,至少有三種編程方式,代碼+圖形+仿真,可以互為補充,互相配合