#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
#define PIN 5 // On Trinket or Gemma, suggest changing this to 1
#define NUMPIXELS 16 // Popular NeoPixel ring size
byte TOP_DOWN=1; //由上而下
byte wait=100;
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
#define DELAYVAL 100 // Time (in milliseconds) to pause between pixels
// 彩虹函數================================================================
void rainbow(byte startPosition) {
int rainbowScale = 192 / NUMPIXELS; // 指定彩虹的刻度
for (int i=0; i<NUMPIXELS; i++) { // 設定每個LED的顏色
// 0-191總共192個顏色(紅=>橙=>黃=>綠=>…=>紫)
pixels.setPixelColor(i, rainbowOrder((rainbowScale * (i + startPosition)) % 192));
}
pixels.show(); // 開啟LED
}
// 產生彩虹色帶函數======================================================
// 輸入0~191以取得顏色值
// 顏色變化為紅=>黃=>綠=>淺綠=>藍=>粉紅=>紅...
uint32_t rainbowOrder(byte position) {
// 6個顏色區域(每區32點)
if (position < 31) { // 紅=>黃 (Red = FF, blue = 0, Green = 00=>FF)
return pixels.Color(0xFF, position * 8, 0); // 只遞增綠色成份
}
else if (position < 63) { //黃=>綠 (Red = FF=>00, Green = FF, blue = 0)
position -= 31; // 第2區
return pixels.Color(0xFF - position * 8, 0xFF, 0); // 只遞減紅色成份
}
else if (position < 95) { //綠=>淺綠 (Red = 0, Green = FF, Blue = 00=>FF)
position -= 63; // 第3區
return pixels.Color(0, 0xFF, position * 8); // 只遞增藍色成份
}
else if (position < 127) { //淺綠>藍 (Red = 0, Green = FF=>00, Blue = FF)
position -= 95; // 第4區
return pixels.Color(0, 0xFF - position * 8, 0xFF); // 只遞減綠色成份
}
else if (position < 159) { //藍=>粉紅 (Red = 00=>FF, Green = 0, Blue = FF)
position -= 127; // 第5區
return pixels.Color(position * 8, 0, 0xFF); // 只遞增紅色成份
}
else {//160 <position< 191 粉紅=>紅 (Red = FF, Green = 0, Blue = FF=>00)
position -= 159; // 第6區
return pixels.Color(0xFF, 0x00, 0xFF - position * 8); // 只遞減藍色成份
}
}
void setup() {
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
clock_prescale_set(clock_div_1);
#endif
pixels.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
}
void loop() {
pixels.clear(); // Set all pixel colors to 'off'
unsigned long trueColor;
for (int i=0;i<NUMPIXELS*10;i++){
rainbow(i);
delay(100);
}
}