2016年1月9日 星期六

[穿戴科技] Adafruit NeoPixel 學習

官方教材:https://learn.adafruit.com/getting-started-with-flora/blink-onboard-neopixel

記得要裝函式庫,可以選擇草稿碼(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="">
    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="">
    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);
  }

}

沒有留言:

張貼留言