Created
December 7, 2017 10:01
-
-
Save lamunes40forever/3edb20cb68426fae13f7ccb51a09fe76 to your computer and use it in GitHub Desktop.
Arduino
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <Servo.h> | |
#include <Adafruit_NeoPixel.h> | |
Servo myservo; // create servo object to control a servo | |
// twelve servo objects can be created on most boards | |
// 建立燈條(燈環)物件,參數為:共16顆LED,資料線接在Pin6 | |
Adafruit_NeoPixel strip = Adafruit_NeoPixel(16, 6); | |
int id = 0; // 儲存 Serial 的回傳值 | |
int pos = 90; // 一開始關閉 | |
int type = -1; | |
int isOpen = 0; | |
void setup() { | |
Serial.begin(57600); // 初始化 Serial 物件並設定 115200bps | |
strip.begin(); // 將燈條物件初始化,並設為全暗 | |
strip.setBrightness(32); // 將整體亮度降為 1/8 | |
Serial.println("CYB6"); // 向 Serial 傳送指令: 開始錄音 | |
strip.show(); // 讓燈條顯示出所設定的狀態 | |
TurnClear(); | |
} | |
void loop() { | |
// 若偵測到 Serial 回傳值,儲存到 id | |
if (Serial.available()) { | |
id = Serial.read(); | |
if (id == 3) { | |
type += 1; | |
if (type > 7) | |
type = 0; | |
} | |
} | |
// 依照 id 值來判斷應該執行哪一個特效 | |
switch (id) { | |
// Serial 回傳 0,代表向 Serial 傳送指令執行成功 | |
case 0: | |
break; | |
// Serial 回傳正整數,代表辨識到的指令 ID | |
case 5: | |
if (isOpen == 0) { | |
TurnOn(); // 打開 | |
isOpen = 1; | |
} | |
break; | |
case 1: | |
if (isOpen == 1) | |
showAll(255, 255, 255); | |
break; | |
case 2: | |
if (isOpen == 1) | |
showAll(0, 0, 0); | |
break; | |
case 3: | |
if (isOpen == 1) | |
showType(); | |
break; | |
case 4: | |
if (isOpen == 1) { | |
showAll(0, 0, 0); | |
TurnOff(); | |
isOpen = 0; | |
} | |
break; | |
// Serial 回傳負數,代表向 Serial 傳送指令執行失敗 | |
default: | |
break; | |
} | |
} | |
void TurnClear() { | |
myservo.attach(9); | |
pos = myservo.read(); | |
if (pos != 90) | |
myservo.write(90); | |
myservo.detach(); | |
} | |
void TurnOn() { | |
myservo.attach(9); | |
for (pos = 90; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees | |
// in steps of 1 degree | |
myservo.write(pos); // tell servo to go to position in variable 'pos' | |
delay(15); // waits 15ms for the servo to reach the position | |
} | |
myservo.detach(); | |
} | |
void TurnOff() { | |
myservo.attach(9); | |
for (pos = 180; pos >= 90; pos -= 1) { // goes from 0 degrees to 180 degrees | |
// in steps of 1 degree | |
myservo.write(pos); // tell servo to go to position in variable 'pos' | |
delay(15); // waits 15ms for the servo to reach the position | |
} | |
myservo.detach(); | |
} | |
void showType() { | |
// 依照 id 值來判斷應該執行哪一個特效 | |
switch (type) { | |
case 0: | |
rgbLoop(); // 漸變循環 | |
break; | |
case 1: | |
theaterChase(strip.Color(255, 255, 255), 50); // 劇院追逐 | |
break; | |
case 2: | |
rainbow(20); // 彩虹 | |
break; | |
case 3: | |
rainbowCycle(1); // 彩虹圓圈 | |
break; | |
case 4: | |
strobe(255, 255, 255, 10, 50, 1000); // 閃光 | |
break; | |
case 5: | |
runningLights(255, 255, 255, 80); // 流光 | |
break; | |
case 6: | |
cylonBounce(255, 0, 0, 2, 70, 70); // 賽隆人 | |
break; | |
case 7: | |
sparkle(255, 255, 255, 0); // 發泡 | |
break; | |
} | |
} | |
// 點亮所有 LED, 並顯示出來 | |
void showAll(int r, int g, int b) { | |
for (int i = 0; i < strip.numPixels(); i++) { | |
strip.setPixelColor(i, r, g, b); | |
} | |
strip.show(); // 讓燈條顯示出來 | |
} | |
// 漸變循環特效 | |
void rgbLoop() { | |
for (int j = 0; j < 3; j++ ) { | |
// Fade IN 漸強 | |
for (int k = 0; k < 256; k++) { | |
switch (j) { | |
case 0: showAll(k, 0, 0); break; | |
case 1: showAll(0, k, 0); break; | |
case 2: showAll(0, 0, k); break; | |
} | |
delay(5); | |
if (Serial.available()) return; // 若偵測到 Serial 回傳值則停止目前特效 | |
} | |
// Fade OUT 漸弱 | |
for (int k = 255; k >= 0; k--) { | |
switch (j) { | |
case 0: showAll(k, 0, 0); break; | |
case 1: showAll(0, k, 0); break; | |
case 2: showAll(0, 0, k); break; | |
} | |
delay(5); | |
if (Serial.available()) return; // 若偵測到 Serial 回傳值則停止目前特效 | |
} | |
} | |
} | |
// 劇院追逐特效 | |
void theaterChase(uint32_t c, uint8_t wait) { | |
for (int j = 0; j < 10; j++) { | |
for (int q = 0; q < 3; q++) { | |
for (int i = 0; i < strip.numPixels(); i = i + 3) { | |
strip.setPixelColor(i + q, c); | |
} | |
strip.show(); | |
delay(wait); | |
for (int i = 0; i < strip.numPixels(); i = i + 3) { | |
strip.setPixelColor(i + q, 0); | |
} | |
if (Serial.available()) return; // 若偵測到 Serial 回傳值則停止目前特效 | |
} | |
} | |
} | |
// 彩虹特效 | |
void rainbow(uint8_t wait) { | |
uint16_t i, j; | |
for (j = 0; j < 256; j++) { | |
for (i = 0; i < strip.numPixels(); i++) { | |
strip.setPixelColor(i, Wheel((i + j) & 255)); | |
} | |
strip.show(); | |
delay(wait); | |
if (Serial.available()) return; // 若偵測到 Serial 回傳值則停止目前特效 | |
} | |
} | |
// 彩虹圓圈特效 | |
void rainbowCycle(uint8_t wait) { | |
uint16_t i, j; | |
for (j = 0; j < 256 * 5; j++) { | |
for (i = 0; i < strip.numPixels(); i++) { | |
strip.setPixelColor(i, | |
Wheel(((i * 256 / strip.numPixels()) + j) & 255)); | |
} | |
strip.show(); | |
delay(wait); | |
if (Serial.available()) return; // 若偵測到 Serial 回傳值則停止目前特效 | |
} | |
} | |
// 閃光特效 | |
void strobe(byte red, byte green, byte blue, | |
int StrobeCount, int FlashDelay, int EndPause) { | |
for (int j = 0; j < StrobeCount; j++) { | |
showAll(red, green, blue); | |
delay(FlashDelay); | |
showAll(0, 0, 0); | |
delay(FlashDelay); | |
} | |
delay(EndPause); | |
} | |
// 流光特效 | |
void runningLights(byte red, byte green, byte blue, int WaveDelay) { | |
int poslocal; | |
while (true) { | |
poslocal = 0; | |
for (int i = 0; i < strip.numPixels() * 2; i++) | |
{ | |
poslocal++; // = 0; //pos + Rate; | |
for (int i = 0; i < strip.numPixels(); i++) { | |
strip.setPixelColor(i, ((sin(i + poslocal) * 127 + 128) / 255)*red, | |
((sin(i + poslocal) * 127 + 128) / 255)*green, | |
((sin(i + poslocal) * 127 + 128) / 255)*blue); | |
} | |
strip.show(); | |
delay(WaveDelay); | |
if (Serial.available()) return; // 若偵測到 Serial 回傳值則停止目前特效 | |
} | |
} | |
} | |
// 賽隆人特效 | |
void cylonBounce(byte red, byte green, byte blue, | |
int EyeSize, int SpeedDelay, int ReturnDelay) { | |
while (true) { | |
for (int i = 0; i < strip.numPixels() - EyeSize - 2; i++) { | |
showAll(0, 0, 0); | |
strip.setPixelColor(i, red / 10, green / 10, blue / 10); | |
for (int j = 1; j <= EyeSize; j++) { | |
strip.setPixelColor(i + j, red, green, blue); | |
} | |
strip.setPixelColor(i + EyeSize + 1, | |
red / 10, green / 10, blue / 10); | |
strip.show(); | |
delay(SpeedDelay); | |
} | |
delay(ReturnDelay); | |
for (int i = strip.numPixels() - EyeSize - 2; i > 0; i--) { | |
showAll(0, 0, 0); | |
for (int j = 1; j <= EyeSize; j++) { | |
strip.setPixelColor(i + j, red, green, blue); | |
} | |
strip.setPixelColor(i + EyeSize + 1, | |
red / 10, green / 10, blue / 10); | |
strip.show(); | |
delay(SpeedDelay); | |
} | |
delay(ReturnDelay); | |
if (Serial.available()) return; // 若偵測到 Serial 回傳值則停止目前特效 | |
} | |
} | |
// 發泡特效 | |
void sparkle(byte red, byte green, byte blue, int SpeedDelay) { | |
while (true) { | |
int px = random(strip.numPixels()); | |
strip.setPixelColor(px, red, green, blue); strip.show(); | |
delay(SpeedDelay); | |
strip.setPixelColor(px, 0, 0, 0); strip.show(); | |
if (Serial.available()) return; // 若偵測到 Serial 回傳值則停止目前特效 | |
} | |
} | |
// 有關彩虹的特效中, 產生漸變顏色值的函式 | |
uint32_t Wheel(byte WheelPos) { | |
WheelPos = 255 - WheelPos; | |
if (WheelPos < 85) { | |
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3); | |
} | |
if (WheelPos < 170) { | |
WheelPos -= 85; | |
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3); | |
} | |
WheelPos -= 170; | |
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment