Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lamunes40forever/3edb20cb68426fae13f7ccb51a09fe76 to your computer and use it in GitHub Desktop.
Save lamunes40forever/3edb20cb68426fae13f7ccb51a09fe76 to your computer and use it in GitHub Desktop.
Arduino
#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