新北市立泰山高級中學電子科
專題製作報告
指導老師: 陳煥文 陳致中 老師
Arduino 控制串列式全彩 LED
班級: 三年級乙班 23 號
學生: 陳俊穎
中 華 民 國 一 零 六 年 0 5 月 1 9 日
摘 要
隨科技愈趨發展至登峰造極的地步,我們無法跟隨如此迅雷不 及掩耳的速度,但這些無論新舊的科技產品下其實都是在一系列基 礎以及標準所架構起,我們認為因為時代在日新月異而需要學習更 多不同的技術,其實並不全然,只要將基本的概念釐清並理解,便 能輕易再往更進階的方式去深究,往後面對其他相關技術也能駕輕 就熟。 普遍民眾相信對 LED 此一詞並不陌生,他充斥著我們日常生 活,也扮演著相當重要的角色,像是智慧型手機的觸控螢幕、電視 機、電腦螢幕等都有他的存在,其他像是以廣告業者一例來看,昔 日的廣告宣傳只是使用人力或是書面,甚至是媒體等較傳統的方式 達到產品宣傳效果,於今廣告則是利用 LED 燈特性製作廣告看板, 不僅能在同一面積宣傳不同的資訊,更能省去無用資源。 此次要製作的作品硬體部分即是使用最早,也是現在仍在使用 的PCB印刷版的技術去製作作品的電路板,用到的技術是採用蝕刻當 中的減去法方式完成基板以及電路圖的部分,軟體則是採用Arduino 開發程式撰寫程式碼,進而操控相關實體元件。目 錄
摘 要... ...1 目 錄... ...2 第一章 緒論 1-1 研究動機... 4 1-2 研究方法... ...4 第二章 硬體及機器介紹 2-1 Arduino Uno... ...5 2-2 ATmega328 IC... ...6 2-3 Arduino 藍芽模組(HC-06)... ...8 2-4 全彩式 LED... ...8 2-5 三腳DC電源插座... ...8 2-6 7805穩壓IC... 9 2-7 USB B type 90˚ 母座 ...9 2-8 2段3P 迷你小搖頭開關 ...10 2-9 2段6P 開關 ...11 2-10 5P 可變電阻 ...11 2-11 PCB 電路板綜合加工機機台 ...12 第三章 硬體架構與軟硬體設計 3-1 硬體架構... 13 3-2 流程圖... 13 3-3 硬體設計... 14 3-3.1 操作環境... 14 3-3.2 草稿設計...15 3-3.3 Protel99SE 設計過程 ... ... ... ...16 3-4 軟體設計... 17 第四章 專題結果 4-1 功能說明... ...18 4-2 操作流程... ...19 4-2.1 直接展示 ...19 4-2.2 藍芽模式(限Android平台使用) ...21 4-2.3 更改藍芽模式鍵盤參數(限Android平台使用) ...24 第五章 結論與未來展望 5-1 結論... ...27 5-2 未來展望... ...27 5-3 問題討論... ...27 附錄一 Protel99SE 操作過程 ... 28附錄二 PCB 電路板綜合加工機電腦操作過程... 33 附錄三 Arduino控制串列式全彩LED燈程式碼... 37 參考文獻... 42
第一章 緒論
1-1 研究動機
普遍民眾相信對 LED 此一詞並不陌生,他充斥著我們日常生活, 也扮演著相當重要的角色,像是智慧型手機的觸控螢幕、電視機、 電腦螢幕等都有他的存在,其他像是以廣告業者一例來看,昔日的 廣告宣傳只是使用人力或是書面,甚至是媒體等較傳統的方式達到 產品宣傳效果,於今廣告則是利用 LED 燈特性製作廣告看板,不僅 能在同一面積宣傳不同的資訊,更能省去多餘資源。 1-2 研究方法 本次作品主要由ATmega328 IC、藍芽模組以及其他電子零件進 行操控完成後的作品,一開始我們使用Arduino Uno開發板撰寫程式 碼燒錄至ATmega328 IC內,得到自己所需的功能,作品的板子則是 使用PCB印刷電路板技術製作,接著再將需要驅動的元件焊接至電路 板上,最後則是調整功能以及作品呈現出來的完整度。 ▲圖 1-2:研究方法流程圖第二章 硬體及機器介紹
2-1 Arduino Uno
微控制器 ATMEGA328 工作電壓 5V 輸入電壓(推薦) 7-12V 輸入電壓(限制) 6-20V 數字 I / O 接腳 14(6 個提供 PWM 輸出) 模擬輸入接腳 6 支 EEPROM 1 KB(ATMEGA328) 震盪速度 16 MHz ▲圖 2-1-1:Arduino Uno 開發版(左) ▲表 2-1-1:Arduino Uno 開發版功能及特性(右) 功能說明: 1.類比輸入接腳 :Arduino Uno 有 6 支類比輸入腳,標記為 A0 到 A5,每支腳 都可提供 10 位元的解析 (即 1024 種不同的數值)。這些腳位所用 的參考電壓預設為 0 到 5V,不過參考電壓也是可以更改的,方法 是透過 AREF 腳和 analogReference()。
I2C 4 (SDA) 和 5 (SCL) 這兩支腳。透過 Wire library 可 以提供 I2C 通訊。
▲表 2-1-2:Arduino Uno 類比輸入接腳功能 2.數位 I/O 接腳 :
14 支數位 I/O 接腳 可以當作 input 使用,也可以當作 output 使用,使用方法是透過 pinMode(), digitalWrite(),
Serial 通訊 0(RX) 和 1 (TX) 這兩支腳。用來接收(RX)與傳輸 (TX) TTL 訊號的序列資料。這兩支腳也連接到 USB Converter 晶片中。 外部中斷 2 和 3 這兩支腳。這兩支腳可以利用外部事件觸發 中斷。 PWM 3, 5, 6, 9, 10 和 11 共六支腳。透過 analogWrite() 函式可以提供 8-bit 的 PWM 輸出。 SPI 10 (SS), 11 (MOSI), 12 (MISO) 和 13 (SCK) 這 四支腳。這四支腳搭配 SPI Library 可提供 SPI 序 列通訊。
LED 13。內建一顆 LED,當 pin 腳為 HIGH 時,LED 打 開,當 pin 腳為 LOW 時,LED 關閉。
▲表 2-1-3:Arduino Uno 數位 I/O 接腳功能
3.其它:
AREF 類比輸入的參考電壓,搭配 analogReference() 函式一 起使用。
Reset 當 Reset 腳為 LOW 時,微控制器會重置。 ▲表 2-1-4:Arduino Uno 類比輸入接腳功能
2-2 ATmega328 IC
Arduino UNO 用的是同一顆 ATmega328 晶片,下表是 ATmega328 的晶片特性摘要:
特性 說明 Operating Voltage 1.8V - 5V Flash Memory 32 KB SRAM 2 KB EEPROM 1 KB Clock Speed 16 MHz External Interrupt 2
Timer Two 8-bit Timer/Counters with Prescaler and Compare Mode One 16-bit Timer/Counter with
Prescaler, Compare and Capture Mode PWM Channel 6 Channels
ADC Channel 8 Channels 10-bit ADC in TQFP package 6 Channels 10-bit ADC in PDIP package USART 1
SPI 1
TWI Phlilips I2C compatible
▲表 2-1-1:ATmega328 IC 功能及特性
I/O 腳位配置圖 (Pinout) 如下:
2-3 Arduino 藍芽模組(HC-06)
▲圖2-3-1:Arduino 藍芽模組(HC-06)實體圖(左) ▲圖2-3-2:Arduino 藍芽模組(HC-06)腳位說明(右)2-4 全彩式 LED
▲圖2-4-1.2:全彩式 LED實體圖(左)、腳位定義(右) 全彩式LED的腳位定義有不同的連接方式,此次專題則是採用圖 內所說明的連接。2-5 三腳DC電源插座
Arduino上的驅動電源孔,通常圖中的 第1、2腳為接地(GND),第3腳則是接電(Vcc)。◥圖2-5-1:三腳DC電源插座實體圖 ▲圖2-5-2:三腳DC電源插座腳位定義及規格圖
2-6 7805穩壓IC
可使原電壓穩定在+5V的IC,共3支腳 位,其中腳位是以零件正面朝自己,最左邊 為輸入(Input)、中間為共接地(Ground), 最右邊則是輸出(Output)。 ◥圖2-6:7805穩壓IC實體圖及腳位定義2-7 USB B type 90˚ 母座
USB訊號使用分別標記為D+ 和D- 的雙絞線 傳輸,它們各自使用半雙工的差動訊號並協同 工作,以抵消長導線的電磁干擾。◥圖2-7-1:USB B type 90˚ 母座實體圖 ▲圖2-7-2:USB B type 90˚ 母座腳位定義圖 ▲表2-7:USB B type 90˚ 母座腳位定義表
2-8 2段3P 迷你小搖頭開關
通常做為訊號源的切換,此專題則
作為電源不同供應的方式作切換。
◥圖2-8-1:2段3P 迷你小搖頭開關實體圖 ▲圖2-8-2:2段3P 迷你小搖頭開關腳位定義及規格圖 腳位 功能 1 VBUS (4.75-5.25 V) 2 D-3 D+ 4 接地2-9 2段6P 開關
通 常 做 為 訊 號 源 的
切換,此專題則作為訊號
輸入的不同作切換。
◥圖2-9-1:2段6P 開關實體圖 ▲2-9-2:2段6P 開關腳位定義及規格圖2-10 5P 可變電阻
通常做為訊號源強度的類比調整,
此專題則作為全彩式LED的亮度作亮暗
微調。。
◥圖2-10-1:5P 可變電阻實體圖▲圖2-10-2:5P 可變電阻腳位定義圖
2-11 PCB 電路板綜合加工機機台
校方提供的機台,在電腦系統Windows XP下運作,有多種刀片 可供切換使用,內部功能皆為基礎使用者也能上手。 ▲圖2-11-1:PCB 電路板綜合加工機機台-整體(左上) ▲圖2-11-2:PCB 電路板綜合加工機機台-雕刻刀工作台(右上) ▲圖2-11-3:PCB 電路板綜合加工機機台-雕刻刀盒(左下) ▲圖2-11-4:PCB 電路板綜合加工機機台-雕刻刀手臂(右下)第三章 硬體架構與軟硬體設計
3-1 硬體架構
▲圖3-1:作品概念架構 概念說明: 1. 藍芽控制:藉由手機端傳送指令給串列式LED進行操作。 2. 直接展示:藉由鋰電池供電給電路板運作。 3. 調整亮度:當串列式LED燈正在顯示時,可以利用可變電阻調整發 光亮度。 4. 按鈕展示:按下電路板上的按鈕顯示功能。3-2 流程圖
流程圖說明: 1. 相關資料蒐集:蒐集此次作品所需材料各相關特性以及使用說明。 2. 硬體製作:使用”Protel99SE”印刷電路板程式製作線路檔案,並 且將檔案輸出至雕刻機台進行雕刻。 3. 軟體程式設計:採用Arduino Uno撰寫程式碼並寫入ATmega 328 IC 晶片。 4. 完成作品:將元件焊接至電路板上並測試功能。
3-3 硬體設計
3-3.1 操作環境 關於硬體的設計使用的是”Protel99SE”印刷電路板設計程式進 行拉線(Layout)設計,以及”PCB Prototype Machine電路板綜合 加工機”程式,使雕刻機台能夠讀取到檔案進行PCB完成電路板切割。▲圖3-3-1:Protel99SE 操作環境 ▲圖3-3-2:PCB Prototype Machine電路板綜合加工機 操作環境 3-3.2 草稿設計 在一開始在電腦設計前,先在空白紙上打好電路圖草稿,避免 在電腦上直接修改電路的麻煩,草稿如圖下: ▲圖3-3-3,4:草稿圖-零件連結概念設計圖(左),
▲圖3-3-5:草稿圖-串列式全彩LED佈線圖 做完草稿後依序清點草稿上所需零件並進行採購,清單如下: 3-3.3 Protel99SE 設計過程 由於操作過程過於冗長,詳細過程詳見附錄。 當草稿完成後再使用Protel99SE印刷電路板設計程式進行拉線 (Layout),完成後如下: ▲圖3-3-6:草稿圖-佈線完成圖
當拉線設計完畢後,還需要PCB Prototype Machine電路板綜合 加工機與雕刻機台連線操作,將剛剛拉線好的檔案輸入進去使機器 運作,雕刻出電路板。 ▲圖3-3-7:草稿圖-佈線完成圖
3-4 軟體設計
軟體則是使用Arduino撰寫程式燒寫至ATmega328 IC晶片內以致 操控全彩式LED,其中包含藍芽模組,程式碼請詳見附錄。第四章 專題結果
4-1 功能說明
下列為關於作品的操作功能介紹,如需了解詳細內容可以掃描 下方QR code連結至YouTube影片進行觀看。 ▲圖4-1、2:實體作品(左)及作品介紹及操作過程QR code(右) 串列式全彩 LED 簡易操作說明: 1. 提供三種電源切換選擇 A. 鋰電池:往右撥同時將按鈕放開(註:不用時須按下) B. 5VDC 變壓器:往左撥同時將按鈕按下,避免降壓耗電 C. USB 行動電源:往下撥同時將按鈕按下,避免降壓耗電 2. 可變電阻用來調整 LED 亮度 3. 當展示按鈕放開做自動展示,搭配按鈕,可做兩種動態展示 4. 按鈕展示按下是做藍芽控制,HC-6 密碼 1234,可用手機控制 (限 Android 平台使 用),可調整功能如下: A.RGB(0,0,0,)各個顏色單一±5 B.亮燈順序的快慢(±10ms) C.亮燈亮度的明暗(±2lux) D.清除現在設定值至 RGB(0,0,0) E.重設現在設定值至 RGB(100,100,100)4-2 操作流程
4-2.1 直接展示
▲圖4-3:按鈕壓壓-四字依序點亮+春雨特效示意圖-1
▲圖4-2-1:按鈕壓壓-四字依序點亮+春雨特效示意圖-2
▲圖4-2-4:按鈕壓壓-四字依序點亮+春雨特效示意圖-5
▲圖4-2-5:按鈕壓放-GRB依序點亮+靛藍龍捲風示意圖-1
▲圖4-2-6:按鈕壓放-GRB依序點亮+靛藍龍捲風示意圖-2
▲圖4-2-8:按鈕壓放-GRB依序點亮+靛藍龍捲風示意圖-4
▲圖4-2-9:按鈕放壓-彩虹特效示意圖
4-2.2 藍芽模式(限Android平台使用)
Step 1: 至”Google Play商店”搜尋”藍芽串 手助手增強版(Bluetooth spp pro)”並下載, 程式免費。
Step 2: 開啟程式。
Step 3: 進入程式後,程式會自動開始搜尋附 近裝置,搜尋結束後,點選藍芽模組的選項。
Step 5: 輸入藍芽模組預設密碼”1234”後點 選「確定」。
Step 6: 點選「連接裝置」。
Step 8: 進入介面後即可進行LED的細部調整控 制。
▲圖4-2-10:按鈕放放-手機藍芽控制示意圖
Step 1: 在鍵盤操作介面點選右上角的選項鍵。
Step 2: 點選「配置鍵盤值」。
Step 3: 對下方3*4共12方格隨意點選一格進行 設定。
Step 4: 進行參數設定,顯示名稱一定要取名, 以及輸入按下欄位參數設定定義。 按下 定義 0 RGB(+0,+0,+5) 1 RGB(+0,+0,-5) 2 RGB(+0,+5,+0) 3 RGB(+0,-5,+0) 4 RGB(+5,+0,+0) 5 RGB(-5,+0,+0) 6 速度+10ms 7 速度-10ms 8 亮度-2lux 9 亮度+2lux C 清除現在設定值至RGB(0,0,0) R 重設現在設定值至RGB(100,100,100) ▲表4-2:按下定義參數
第五章 結論與未來展望
5-1 結論
針對串列式全彩LED在商業有一定的使用地位及價值,此次研究 成功順利探討該元件特性以及定義,最後撰寫程式進行對LED的操 作,跟一般發光二極體截然不同的是,串列式全彩LED藉由頻率達到 改變顏色的效果,而在程式的定義則是採RGB光的三原色作定義,並 且可以藉由藍芽模組,使用智慧型手機操作LED亮燈順序、顏色及速 度。5-2 未來展望
現代科技產業發達,每一項產品值得關注及研究發展,本次專題 使用大量的LED在電子領域中佔領重要的地位,生活中時常看到他的 身影,這些物品成為我們身邊不可或缺的物質,但時代變遷快速, 人們必須學習更多技能,以應對及適應無法預知的未來。5-3 問題討論
Q1.電路圖尺寸設計完畢後發現比實際尺寸過大或過小。 A1.只能捲土重來,必須仔細調整尺寸間距參數值並確認再開始拉 線。 Q2.雕刻機在雕刻印刷版時,雕刻刀卻未依照檔案進行雕刻。 A2.由於校內雕刻機硬體設備老舊,在進行首次雕刻時先隨意找一塊 廢棄印刷版進行硬體設備的測試再雕刻新的印刷版。 Q3.印刷版焊接過程時,測試 LED 亮燈情況卻不正常運作 A3.由於此實驗使用印刷版的減去法進行拉線雕刻,當機台雕刻完畢 後難免會產生微小碎屑卡在兩線路之間導致線路相互短路,此時必 須使用軟質刷子將剛雕刻完畢的印刷版雕刻面完整刷過,確保無短 路情況發生,或是可使用三用電表測量。附錄一 Portel99SE 操作過程
Step 1: 先新增資料夾以便放置稍後設計產 生出來的檔案,接著再執行程式。 Step 2: 點選「檔案」→「開新檔 案」。 Step 3: 點選「Browse…」 選擇剛建立好的新資料夾路 徑後再點選「OK」。Step 4: 點選「檔案」→「開新檔 案」。 Step 5: 點選 「 PCB Document 」 → 「OK」。 Step 6: 雙擊剛建立的檔 案即可進行設計。 Step 7: 設計完成後,要輸出檔案 給雕刻機的專有檔案讀取,必須再 另外新增資料夾存放給雕刻機讀 取的檔案,建立後,在操作環境上 點選「檔案」→「開新檔案」。
Step 8: 點選「CAM output configuration」→「OK」。 Step 9: 點選剛剛設計完成的檔案後再 點選「OK」。 Step 10: 看到此畫面後點選 「NEXT」還會有五次不同的 頁面需要確認,此時頁面內 的選項接不用特別選取,直 接繼續下一步。 Step 11: 看到此畫面後點選 「Finish」。
Step 12: 點選剛剛建立好的 檔案會出現一個已經建立好 的「Bom Output1」。 Step 13: 點選「編輯」此時 我 們 只 需 要 輸 出 兩 個 檔 案 「 Insert Gerber… 」 以 及 「Insert NC Drill…」,當 這兩個選項點選之後皆會跳 出視窗,此時皆只要直接點 選「OK」即可。
Step 14: 建立完成後會顯示「Gerber Output 1」以及「NC Drill Output 1」檔案,記住, 檔案名稱旁邊的勾勾請不要取消勾選。
Step 15: 在操作環境上點選「工具」→ 「Generate CAM Files」。
Step 16: 輸出完畢後,操作環境最左邊的 路徑欄位會顯示剛才產生的檔案。 Step 17: 將其剛才產生的 輸出檔全部反白選取,接著 在操作環境上的工作列點 選「檔案」→「輸出」。
Step 18: 選擇剛才新建立的資 料夾路徑再點選「確定」。
附錄二 PCB 電路板綜合加工機電腦操作過程
Step 1: 先新增資料夾以便放置稍後設計 產生出來的檔案,接著再執行程式。 Step 2: 在工具列點選「檔案」→「新的 檔案」。Step 3: 在設定視窗中,只 需 要 再 載 入 焊 錫 面 的 「Gerber File」、「Aperture File」以及鑽孔檔即可。 Step 4: 在 尋 找 焊 錫 面 的 「Gerber File」檔案類型時 請選擇副檔名為「.GBL」才 能找到相符合的檔案。 Step 5: 在 尋 找 焊 錫 面 的 「Aperture File」檔案類 型時請選擇「PROTEL *A*」 才能找到相符合的檔案。 Step 6: 在尋找鑽孔檔的檔 案類型時請選擇「PROTEL *TXT」才能找到相符合的檔 案並選擇檔案名稱與當初在 Protel99SE命名的名稱。
Step 7: 點選「確定」。 Step 8: 點選「路徑計算」, 才能讀取電路圖檔案有無錯 誤。 Step 9: 設定值皆不變,點選 「確定」。 Step 10: 點選「確定」。
Step 11: 為使觀看結果清晰,在工具列點選「規 畫」→「圖層控制」。 Step 12: 一開始預設選項值接全部勾 選,此時只要勾選「鑽孔層」、「實體線」 及「T1 隔離線」選項即可,接著再點選 「OK」。 Step 13: 呈現圖層如右圖。
附錄三 Arduino控制串列式全彩LED燈程式碼
#include <Adafruit_NeoPixel.h> #define TOP_DOWN 0
#define DOWN_TOP 1
#define MEDIUMSPRINGGREEN 0x00FA9A #define INDIGO 0x4B0082
const int pot = A5; //宣告可調電阻分壓後連接在A5腳,以調整亮度 #define PIN 9
#define LED_CNT 42 //宣告多少顆LED // 建構名為leds的Adafruit_NeoPixel 類別
Adafruit_NeoPixel leds = Adafruit_NeoPixel(LED_CNT, PIN, NEO_GRB + NEO_KHZ800); // 設定=================================================================== void setup() { pinMode(2, INPUT); pinMode(3, INPUT); leds.begin(); // 初始化 clearLEDs(); // 關閉所有LED leds.show(); // 開啟所有LED } // 主程式 =================================================================== void loop(){ int x=analogRead(pot); leds.setBrightness(x/4); //宣告可調電阻分壓後連接在A5腳,以調整亮度 brightness();
int button3_State = digitalRead(3); int button4_State = digitalRead(2);
if (button3_State == HIGH && button4_State == HIGH ) { //三原色逐字點亮
for (int i=0; i<LED_CNT; i++) { clearLEDs(); // 關閉所有LED for (int j=0; j<=i; j++) {
leds.setPixelColor(j, 255, 0, 0); // 綠色 } brightness(); // 調整亮度 leds.show(); // 開啟所有LED delay(20); // 持續顯示 }
for (int i=0; i<LED_CNT; i++) { clearLEDs(); // 關閉所有LED for (int j=0; j<=i; j++) {
leds.setPixelColor(j, 0, 255, 0); // 紅色 }
delay(20); // 持續顯示 }
for (int i=0; i<LED_CNT; i++) { clearLEDs(); // 關閉所有LED for (int j=0; j<=i; j++) {
leds.setPixelColor(j, 0, 0, 255); // 藍色 } brightness(); // 調整亮度 leds.show(); // 開啟所有LED delay(20); // 持續顯示 } //單字閃爍 clearLEDs(); // 關閉所有LED for (int i=0; i<8; i++) {
leds.setPixelColor(i, 255, 0, 0);} // 第1個字綠色 brightness(); // 調整亮度
leds.show(); // 開啟所有LED delay(500); // 持續顯示 for (int i=8; i<8+12; i++) {
leds.setPixelColor(i, 0, 255, 0);} // 第2個字紅色 brightness(); // 調整亮度
leds.show(); // 開啟所有LED delay(500); // 持續顯示 for (int i=8+12; i<8+12+12; i++) {
leds.setPixelColor(i, 0, 0, 255);} // 第3個字藍色 brightness(); // 調整亮度
leds.show(); // 開啟所有LED delay(500); // 持續顯示
for (int i=8+12+12; i<8+12+12+10; i++) {
leds.setPixelColor(i, 128, 128, 128);} // 第4個字白色 brightness(); // 調整亮度
leds.show(); // 開啟所有LED delay(3000); // 持續顯示 }
if (button3_State == HIGH && button4_State == LOW ) { // 漫步彩虹大道 (重複10週)
for (int i=0; i<LED_CNT*20; i++) { rainbow(i); // 執行彩虹顯示功能 delay(20); // 持續顯示
} }
if (button3_State == LOW && button4_State == HIGH ) { // 靛藍龍捲風 (重複10週)
// 龍捲風函數:第一個引數為顏色,第二個引數為週期(時間) }
}
if (button3_State == LOW && button4_State == LOW ) { // 春雨(執行由上而下瀑布20次)
for (int i=0; i<10; i++) {
cascade(MEDIUMSPRINGGREEN, TOP_DOWN, 50); // 第一個引數為顏色, 第二個引數為方向, 第二個引數為掉落時間(ms) } } } // 龍捲風函數============================================================= void cyclone(unsigned long color, byte wait) {
// weight 為淡化外部眼顏色的亮 const byte weight = 4;
// 分離24位元格式為8位元RGB格式 byte red = (color & 0xFF0000) >> 16; byte green = (color & 0x00FF00) >> 8; byte blue = (color & 0x0000FF); // 由最近的LED往內移
for (int i=0; i<=LED_CNT-1; i++) { clearLEDs(); // 關閉所有LED
leds.setPixelColor(i, red, green, blue); // 設定亮的中間眼Set the bright middle eye
// 使兩個眼往兩側逐漸變暗 for (int j=1; j<3; j++) { if (i-j >= 0)
leds.setPixelColor(i-j, red/(weight*j), green/(weight*j), blue/(weight*j));
if (i-j <= LED_CNT)
leds.setPixelColor(i+j, red/(weight*j), green/(weight*j), blue/(weight*j));
}
brightness(); // 調整亮度
leds.show(); // Turn the LEDs on delay(wait); // Delay for visibility }
// 反向操作
for (int i=LED_CNT-2; i>=1; i--) { clearLEDs(); // 關閉所有LED
leds.setPixelColor(i, red, green, blue); for (int j=1; j<3; j++) {
if (i-j >= 0)
leds.setPixelColor(i+j, red/(weight*j), green/(weight*j), blue/(weight*j)); } brightness(); // 調整亮度 leds.show(); // 開啟所有LED delay(wait); // 持續顯示wait時間 } } // 瀑布函數=============================================================== void cascade(unsigned long color, byte direction, byte wait)
{
if (direction == TOP_DOWN) { // 由上而下
for (int i=0; i<LED_CNT; i++) { clearLEDs(); // 關閉所有LED
leds.setPixelColor(i, color); // 設定此LED的顏色 brightness(); // 調整亮度 leds.show(); // 開啟所有LED delay(wait); // 持續顯示wait時間 } } else { // 由下而上
for (int i=LED_CNT-1; i>=0; i--) { clearLEDs(); // 關閉所有LED
leds.setPixelColor(i, color); // 設定此LED的顏色 brightness(); // 調整亮度 leds.show(); // 開啟所有LED delay(wait); // 持續顯示wait時間 } } } // 關閉所有LED函數 ========================================================== // 設定顏色為黑色,再呼叫show()函數,即可關閉LED void clearLEDs() {
for (int i=0; i<LED_CNT; i++) { leds.setPixelColor(i, 0); }
}
// 彩虹函數================================================================ void rainbow(byte startPosition) {
// 0-191總共192個顏色(紅=>橙=>黃=>綠=>…=>紫)
leds.setPixelColor(i, rainbowOrder((rainbowScale * (i + startPosition)) % 192)); } brightness(); // 調整亮度 leds.show(); // 開啟LED } // 產生彩虹色帶函數====================================================== // 輸入0~191以取得顏色值 // 顏色變化為紅=>黃=>綠=>淺綠=>藍=>粉紅=>紅... uint32_t rainbowOrder(byte position) {
// 6個顏色區域(每區32點)
if (position < 31) { // 紅=>黃 (Red = FF, blue = 0, Green = 00=>FF) return leds.Color(0xFF, position * 8, 0); // 只遞增綠色成份 }
else if (position < 63) { //黃=>綠 (Red = FF=>00, Green = FF, blue = 0) position -= 31; // 第2區
return leds.Color(0xFF - position * 8, 0xFF, 0); // 只遞減紅色成份 }
else if (position < 95) { //綠=>淺綠 (Red = 0, Green = FF, Blue = 00=>FF) position -= 63; // 第3區
return leds.Color(0, 0xFF, position * 8); // 只遞增藍色成份 }
else if (position < 127) { //淺綠>藍 (Red = 0, Green = FF=>00, Blue = FF) position -= 95; // 第4區
return leds.Color(0, 0xFF - position * 8, 0xFF); // 只遞減綠色成份 }
else if (position < 159) { //藍=>粉紅 (Red = 00=>FF, Green = 0, Blue = FF) position -= 127; // 第5區
return leds.Color(position * 8, 0, 0xFF); // 只遞增紅色成份 }
else {//160 <position< 191 粉紅=>紅 (Red = FF, Green = 0, Blue = FF=>00) position -= 159; // 第6區
return leds.Color(0xFF, 0x00, 0xFF - position * 8); // 只遞減藍色成份 }
}
void brightness() // 讀取A5分壓結果,以控制亮度 { int x=analogRead(pot);
leds.setBrightness(x/4); }