記得要裝函式庫,可以選擇草稿碼(Sketch)->滙入函式庫(Include Library)->管理函式庫...(Manage Libaries...)安裝 Adafruit_NeoPixel。
在官方網站上有程式碼可以複製,程式碼如下:
#include < adafruit_neopixel .h>;
#define PIN 8
Adafruit_NeoPixel strip = Adafruit_NeoPixel(1, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
strip.begin();
strip.show(); // Initialize all pixels to 'off'
}
void loop() {
// Some example procedures showing how to display to the pixels:
colorWipe(strip.Color(255, 0, 0), 500); // Red
colorWipe(strip.Color(0, 255, 0), 500); // Green
colorWipe(strip.Color(0, 0, 255), 500); // Blue
rainbowCycle(20);
}
// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
for(uint16_t i=0; i
strip.setPixelColor(i, c);
strip.show();
delay(wait);
}
}
// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
uint16_t i, j;
for(j=0; j<256 5="" all="" b="" colors="" cycles="" j="" of="" on="" wheel="">256>
for(i=0; i< strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
}
strip.show();
delay(wait);
}
}
// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 - WheelPos;
if(WheelPos < 85) {
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
} else if(WheelPos < 170) {
WheelPos -= 85;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
} else {
WheelPos -= 170;
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
}
接下來我們來解釋程式碼的內容
首先我們會看到#include指令。
#include
我們使用Google查一下Adafruit_NeoPixel.h,可以發現https://github.com/adafruit/Adafruit_NeoPixel,該專案中可以發現Adafruit_NeoPixel.h和Adafruit_NeoPixel.cpp原始碼,有興趣的是可以看到esp8266.c,很有趣吧!經由敏哥追蹤程式碼,我們發現在Adafruit_NeoPixel.cpp檔案中,可以發現有使用到esp8266.c中的函式espShow()。
#elif defined(ESP8266)
// ESP8266 ----------------------------------------------------------------
// ESP8266 show() is external to enforce ICACHE_RAM_ATTR execution
espShow(pin, pixels, numBytes, is800KHz);
#endif // ESP8266
接下來則是使用#define來定義使用到的腳位。
#define PIN 8
隨著物件導向(OO)程式設計廣泛受到大家重視,就連微電腦控制也採用OO的設計方式,不過在建立新物件時,並不需要像C++一樣使用到new關鍵字,Adafruit_NeoPixel就是類別,其建構子有3個參數,分別為LED的數量、硬體連接的腳位、以及LED的型別。
Adafruit_NeoPixel strip = Adafruit_NeoPixel(1, PIN, NEO_GRB + NEO_KHZ800);
以上例來說,只有1個LED,連接在第8支腳,採用GRB,800KHZ通訊訊號的速率。
為何LED跟通訊訊號的速率有關,因為它採用串接方式,當送出10顆LED命令時,接收到的第一顆LED會取下其命令,然後把9個命令再往下送,以此類推。下圖是從https://www.adafruit.com/category/168取得。
接下來則是setup函式,直接呼叫strip物件中,begin函式以及show函式。
void setup() {
strip.begin();
strip.show(); // Initialize all pixels to 'off'
}
loop函式裏呼叫2個函式,其一為colorWipe和rainbowCycle兩個函式,前者是固定顏色的顯示,後者則是以顏色變化來顯示。 void loop() {
// Some example procedures showing how to display to the pixels:
colorWipe(strip.Color(255, 0, 0), 500); // Red
colorWipe(strip.Color(0, 255, 0), 500); // Green
colorWipe(strip.Color(0, 0, 255), 500); // Blue
rainbowCycle(20);
}
colorWipe第一個參數為顏色值,第二個為延遲的時間。
// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
for(uint16_t i=0; i
strip.setPixelColor(i, c);
strip.show();
delay(wait);
}
}
// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
uint16_t i, j;
for(j=0; j<256 5="" all="" b="" colors="" cycles="" j="" of="" on="" wheel="">256>
for(i=0; i< strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
}
strip.show();
delay(wait);
}
}
// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 - WheelPos;
if(WheelPos < 85) {
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
} else if(WheelPos < 170) {
WheelPos -= 85;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
} else {
WheelPos -= 170;
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
}