Upgrade to Pro — share decks privately, control downloads, hide ads and more …

專題

PatricK
October 11, 2017

 專題

專題

PatricK

October 11, 2017
Tweet

Other Decks in Education

Transcript

  1. I 國立虎尾科技大學 自動化工程系 專題製作報告 無線控制LED光源調變系統 A wireless base LED light

    source modulation control system 指導老師: 陳 俊 仁 教 授 學 生: 柯 博 云(40217116) 許 孝 鳴(40127130) 許 淳 堯(40127131) 鄭 健 宏 (40127149) 中 華 民 國 一O四 年 六 月 九 日
  2. I 專題製作成員簡介 題目: 無線控制LED光源調變系統 班 級: 自動三甲 自動三甲 自動三甲 自動三甲

    學 號: 40217116 40127130 40127131 40217149 姓 名: 柯 博 云 許 孝 鳴 許 淳 堯 鄭 健 宏
  3. II 目錄 錄目…………………………………………………………………………………Ⅰ 圖目錄………………………………………………………………………………Ⅳ 第一序論………………………………………………………………………………1 1-1 前言…………………………………………………………………………1 1-2 文獻回顧……………………………………………………………………1 1-3

    研究方法……………………………………………………………………2 1-4 研究目的及本文架構………………………………………………………3 1-4-1 研究目的……………………………………………………………3 1-4-2 本文架構……………………………………………………………4 第二章 硬體介紹……………………………………………………………………5 2-1 Arduino 介紹…………………………………………………………………5 2-2 Wi-Fi模組……………………………………………………………………6 2-2-1 Wi-Fi 模組外觀………………………………………………………6 2-2-2 按鈕與跳線介紹……………………………………………………7 2-3 PWM 風扇…………………………………………………………………8 2-4 PT-100 熱阻體………………………………………………………………9 2-5 高功率 LED 燈板…………………………………………………………10 第三章 軟體介紹……………………………………………………………………11 3-1 Android APP 編寫軟體介紹………………………………………………11 3-2 Wi-Fi 模組使用方法………………………………………………………13 3-3 Arduino 軟體介紹…………………………………………………………14 3-4 C# 編寫軟體介紹…………………………………………………………15 第四章 研究方法與步驟……………………………………………………………17 4-1 PWM 脈波調寬……………………………………………………………17 4-2 模組架設方法……………………………………………………………18 4-3 燈具與風扇系統介紹……………………………………………………21 第五章 實驗結果……………………………………………………………………22 5-1 Android 操作介面介紹……………………………………………………22 5-2 C# 程式使用說明…………………………………………………………25 5-3 Arduino 高功率 LED燈板程式……………………………………………28 5-4 散熱模組介紹……………………………………………………………29 5-4-1 PT-100………………………………………………………………30 5-4-2 風扇開關電路……………………………………………………30 5-4-3 燈板開關電路……………………………………………………31 5-5 PWM 波形量測……………………………………………………………32 5-5-1 燈板 PWM 控制波形……………………………………………… 33
  4. IV 圖目錄 圖 2.1:Arduino UNO 微控制器 9 圖 2.2:Arduino UNO

    簡介 11 圖2.3:Arduino Wi-Fi模組 12 圖2.4:Arduino Wi-Fi模組按鈕與跳線介紹 12 圖2.5:散熱風扇 13 表2.6:風扇規格表 13 圖 2.7 : PT-100 熱阻體 14 圖 2.8 : 常溫下之電阻值 14 圖 2.9 : 溫水中之電阻值 14 圖 2.10:高功率 LED 燈板結合散熱片 15 圖 3.1:Android Application Project 16 圖 3.2:Android Application Project 17 圖 3.3 : 完成專案新增 17 圖 3.4 : 新增專案完成之編譯環境 18 圖3.5:Arduino Wi-Fi編譯程式碼 18 圖 3.6 : Arduino 編譯環境 19 圖 3.7 : 新增專案 20 圖3.8 : Windows Form 應用程式 21 圖 3.9:Form1 視窗 21 圖 4.1:脈衝寬度調變(PWM)圖 22 圖4.2:Arduino Wi-Fi模組按鈕與跳線架設介紹 23 圖4.3:Arduino Wi-Fi模組程式SSID與IP參數 23 圖4.4:Arduino Wi-Fi模組程式架設 24 表 4.5:OSI(開放式系統互聯通訊參考模型) 25 圖 4.6 : 燈具系統架構圖 26 圖 5.1:Android LED 1 - LED 6 on/off 27 圖 5.2 : Android 手動輸入位置 28 圖 5.3 : Android 手動輸入數值 29 圖5.4:C#連線準備 30 圖5.5:C#連線成功 31 圖5.6:C# LED 1亮度調節至100 31 圖5.7 : C# LED 1亮度調節至255(最高亮度) 32 圖5.8 : C# LED 1 - LED 6亮度調節至255(最高亮度) 32 圖 5.9:Serial Monitor 33 圖5.10:PT-100溫度感測器電路圖 34 圖5.11:散熱風扇之開關電路 35
  5. V 圖5.12:LED燈板之開關電路 36 圖 5.13 : PWM 值 0 38

    圖 5.14:PWM 值 50 38 圖 5.15:PWM 值 100 38 圖 5.16:PWM 值 150 39 圖 5.17:PWM 值 200 39 圖 5.18:PWM 值 255 39 圖 5.19:攝氏 22 度之 PWM 波型 40 圖 5.20:攝氏 29 度之 PWM 波型 41 圖 5.21:攝氏 30 度之 PWM 波型 41 圖 5.22 : 攝氏 33 度之 PWM 波型 41 圖 5.23 : 無使用風扇情況 37 圖 5.24 : 有使用風扇情況 37 圖 5.25:Lx 對照圖 38 圖 5.26 : 溫度對照圖 38
  6. 1 第一章 序論 1-1 前言 本專題利用Wi-Fi不僅達到科技與便利的結合,更能節省生活上不必要的能 源浪費與消耗,而達到真正的節能,也能適應於各種場合所需。 在電費高漲的時代,如何節省能源消耗已經是社會上共同的議題,而想要找 出最容易下手的地方,就要從日常生活中隨處可見又不可或缺的點著手,而本專 題針對的重點,就是「燈光」

    ,現在大眾所使用之燈光,只存在著開或關,就算 十人容納的空間只剩下一個人,卻還是使用著相同的燈光,這就造成了過多的能 源消耗,也就是浪費。 因此無論是居家、辦公室或是工業場所,均需要一套系統來控制日常生活中 所使用的燈光,本專題利用Wi-Fi無線網路連接Arduino,不僅能遠端控制燈源的 開關及調整光源亮度,更可區域控管照明燈具,以減低能源消耗或是加強照明亮 度。而此套系統也能應用於影像處理的調光、聚焦,使拍攝出來的影像或照片能 更加清楚。如果能夠以現代人常用的手機和電腦直接進行無線遠端操控,不僅能 增加方便性還能節省時間。 本研究面對的問題是現在燈源只能依靠人為手動去操作,而各個時段環境本 身的亮度也不完全相同,如果能達到自動感測調節成所設定的亮度並數值化,更 能達到節省與便利的目的。 1-2 文獻回顧 遠端控制對於便利性有一定程度的提升,Arduino 也具有方便使用的特性以 往分無線控制都是要受到線的束縛,想要遠一點就要加長電線,對於方便性有一 定程度的限制,因此在之前就逐漸有人使用 Arduino 來進行無線遠端控制,但都 是使用 NFC 與藍芽短距離傳輸較多,王元君[1]於 2014 年提出以 NFC(近距離無 線通訊)手機及 Arduino 嵌入式模組為主之家電控制系統 NFC(近距離無線通訊), 常應用於行動商務,具有便利性及安全性。運用藍牙模組與 NFC,設計一個具 備嵌入式架構之「家電控制系統」 ,其可藉由手機藍牙之連結,建構家電控制與 傳輸的平台。採用 Arduino 嵌入式硬體,搭配藍芽模組、無線射頻辨識模組、NFC 來實現「家電控制系統」 。李健榆[2]於 2013 年提出,ZigBee 無線控制路燈系統 的設計與架構。其中由於 ZigBee 具備低功耗,大量節點等優點而採用此通訊協 定進行無線通訊的方法 。 分別架構協調器端的監控電路與路由器端的控制路燈電 路。在電路的架構上使用 Arduino 的微處理器開發板,搭配 Sensor 以監控路燈的 狀況。李健榆[5]於 2013 年提出,ZigBee 無線控制路燈系統的設計與架構。其中 由於 ZigBee 具備低功耗,大量節點等優點而採用此通訊協定進行無線通訊的方 法。分別架構協調器端的監控電路與路由器端的控制路燈電路。在電路的架構上
  7. 2 使用 Arduino 的微處理器開發版,搭配 Sensor 以監控路燈的狀況。王元陵[3]於 2001 年提出架構於 CEBUS(Consumer Electronic

    Bus)電力線網路之家庭自動化系 統架構 , 並實現了 「無線家庭自動化控制介面」 系統韌體結合了嵌入式作業系統, 並使用時脈處理技巧大幅降低了系統於低負載時的功率消耗。鄭欽豪[4]於 2013 年提出使用智慧型手機、Wi-Fi 及嵌入式系統晶片來控制之六足機器人,智慧型 手機以 HTML5(HTML、CSS、JAVA SCRIPT)編寫,因此任何智慧型手機均可使 用,不限品牌。硬體控制方面,以二顆 ARM(進階精簡指令集機器)嵌入式系統 晶片(Embedded Chip System)來做 Wi-Fi 與無線電遙控伺服機(Radio-Controlled Servo Motor)控制,使智慧型手機能與實際硬體做溝通。蘇韵寗[5]於 2010 年提出 Web 化電氣無線控制系統之研究,旨在居家電氣安全生活為主,工作職場電氣安 全為輔,結合網際網路的便利性,經由手機或職場的電腦,透過網路即可隨時監 控家中或職場的電氣設備。利用 Visual Basic 與 PLC(可程式邏輯控制器)連線, PLC(可程式邏輯控制器)本身銜接光纖網路,使其能利用網路作為傳輸媒介。因 過去文獻較無使用 Wi-Fi 進行控制家電的紀錄 Wi-Fi 具有高速傳輸、遠距離等優 勢,故適合用在此專題,可以遠距離與大範圍控制燈具較無藍牙或紅外線有距離 與傳輸速度的限制。 1-3 研究方法 利用手機、PC、NB 的 Wi-Fi、行動網路、固網功能與 Arduino 來達成遠端 控制連結,並以 PWM 輸出控制高功率 LED 燈板,本專題分做四個部分完成:程 式、Wi-Fi 模組架設、燈板、風扇。 程式方面以 C#完成 PC 與 NB 的操作介面,而 Android 手機的 APP 應用程 式操作介面以 Java 完成,燈板、風扇的程式以 Arduino 完成。 由於 PC 無法接收 Wi-Fi,所以本專題使用 D-Link Wi-Fi 模組,再架設程式 後,就能透過遠端傳輸控制 Arduino 的輸出。 利用 Arduino 作為接收媒介,在接收到 Wi-Fi 所傳出訊號後,輸出 PWM 信 號控制開關電路中的電晶體飽和,燈板的亮度、開關就會依照所需而改變,其中 燈板需要較高的電流推動,所以電晶體的部分採用低電壓高電流的 MOSFET, 而燈板散熱問題則以散熱鰭片與風扇解決。 風扇會依照溫度變化調整轉速,由溫度感測器 PT100 產生阻值變化,利用 加減法器與放大器的電路來放大與調整類比訊號以利 Arduino 的接收,並在類比 訊號與溫度變化的比例中算出適合的公式令Arduino能在接收訊號後能傳出相應 的 PWM 信號變化來改變風扇的轉速。
  8. 3 1-4 研究目的及本文架構 1-4-1 研究目的 為了減少社會上的能源浪費 , 本專題採用Wi-Fi模組令手機或電腦與Arduino 進行無線連接,以達到分區控制多排高功率 LED

    燈板,或調整 LED 燈板亮度等 控制,由於使用高功率 LED 燈板,開啟時間長時容易溫度過高,因此另外追加 風扇、散熱鰭片及溫度感測器,當溫度感測器測量溫度超過原先設定值就會自動 啟動風扇進行散熱防止溫度過高損壞燈板甚至故障,以下說明本專題為何選擇這 些硬體或軟體進行研究與製作。 Wi-Fi 模組:Wi-Fi 與藍芽之間的選擇,最終選擇了 Wi-Fi,兩者都是常見的 無線連接方式,但 Wi-Fi 相對於藍牙,有著更遠的無線距離傳播、傳播速度快、 成本較低等優點,而藍牙雖然安全性較高,但因其會有功耗過高的問題,固不 適合用於需求成本低、低消耗的市場上。 電腦:現今社會上,電腦已經非常的普及,不管在公司或是在家庭裡, 許多人會花上大把的時間在電腦上, 因此本專題將電腦與 Arduino 利用 Wi-Fi 進行連接,其目的是為了增加使用便利性,也能以現有的科技免去額外的硬 體設備。 Android APP:手機是現代人不可或缺的物品之一,且手機 APP 下載容易, 透過手機 APP 達成隨時可以控制燈具的功能,大大增加了使用上的便利性,也 因為不需要額外如遙控器之類的硬體設備,更容易增加大家的慾望並推廣起來。 風扇:在使用高功率的物品之時,散熱成了非常重要的考慮項目,一個散熱 不佳的高功率物品,會大大減少其使用壽命並產生許多如故障、反應不靈敏等等 缺點。而目前最常看到的散熱方式,有導熱率高的金屬,或是風扇。因此本專題 利用鋁板導熱性質佳的特性並結合風扇達到散熱目的,風扇透過程式,能依不同 的溫度而有著不同的轉速,確保使用溫度在設定值上而不會過熱。 LED 燈板:目前常見的照明設備,大多為日光燈或燈泡,而 LED 燈,經證 實不僅亮度比傳統日光燈更佳,也較省電,因此本專題選擇 LED 燈進行研究。 傳統日光燈除了亮或暗,沒有其他項目能選擇,而 LED 燈則能利用程式編寫好 的控制系統達到區域控制,及亮度調節等功能。
  9. 4 1-4-2 本文架構 第一章緒論為本專題的基本介紹和研究動機,透過小組的討論與構思制定出 一個方向 , 並透過參考過去文獻過濾對本專題有用的部分進行研究探討並使用, 最終製成此專題。 第二章介紹專題所使用到的各項硬體設備,內容包括所有硬體的圖片、基本 介紹和此次專題所使用到的功能。

    第三章介紹編寫不同程式所使用到的軟體部分,內容包括各項軟體的基本介 紹、操作方式和使用方法。 第四章為研究方法及步驟,本章節介紹專題所使用到的各項技術,包括 PWM 技術、模組架設、各項系統等等。 第五為實驗結果,介紹軟體執行後的結果及各項數據。 第六章是此次專題的結論,討論專題實驗時遭遇到的困難、如何解決硬體設 備的問題和軟體與硬體之間連接的障礙等等,而附錄則是本專題各個軟體的程式 碼。
  10. 5 第二章 硬體介紹 本章節為專題所需要的硬體,包括 LED 燈板、Arduino、Wi-Fi 模組、散熱 模組等各項設備的使用,而每小章節皆有各個硬體設備的功用與詳細介紹。 2-1 Arduino

    介紹 本專題採用微控制器 Arduino UNO 如圖 2.1 所示。Arduino 是一種開放授權 的互動環境開發技術,軟體及硬體都對外開放,其中主要可分為三大類:Arduino 硬體、Arduino 軟體及 Arduino 擴充原件,圖 22 為一些簡單的介紹。 這裡主要針對硬體作介紹:Arduino UNO主要有14支數位I/O接腳、3支GND 接腳、6支類比輸入接腳A0~A5、微控制器ATMEGA328、工作電壓5V,震盪速 度16MHz,最佳輸入電壓為7V~12V,極限輸入電壓為6V~20V。其中,14支數位 I/O接腳可以同時作為input及output透過pinMode() 、 digitalWrite()、anddigitalRead() 函式使用,接腳3、5、6、9、10、11為PWM接腳,透過analogWrite()函式可以提 供8-bit的PWM輸出。接腳0(RX)及接腳1(TX)為Serial通訊,用來接收(RX)與傳輸 (TX)TTL訊號的序列資料。2、3接腳為外部中斷,這兩支腳可以利用外部事件觸 發中斷。4(SDA)和5(SCL)可透過Wire -library提供I2C通訊,10(SS)、11(MOSI)、 12(MISO)和13(SCK)這四支接腳搭配SPI Library可提供SPI序列通訊。13接腳內建 LED,當pin腳位為HIGH時,LED打開,當pin腳位為LOW時,LED關閉。 Arduino UNO擁有 6 支類比輸入接腳 A0~A5 , 每支接腳都可提供 10位元的解析, 即 1024 種不同數值。這些腳位所用的參考電壓預設為 0V~5V。如欲改變參考電 壓,需透過 AREF 腳位並使用 analogReference()函式。3 支 GND 接腳為共同的地 線,配置電路需要接地線時可擇一使用。Arduino UNO 還附帶一支 Reset 接腳, 當 Reset 接腳為 LOW 時,Arduino UNO 將會進行重置。 圖 2.1:Arduino UNO 微控制器
  11. 6 圖 2.2:Arduino UNO 簡介 2-2 Wi-Fi 模組 Wi-Fi,相較於其他傳輸協定,擁有距離遠(室外開闊空間可達 100

    公尺,室 內約為 35 公尺)、傳輸速度快等優點,相較於藍牙(約 10 公尺)與紅外線,擁有較 遠的距離與較快的傳輸速度,因此能夠利用於大樓辦公室之區域控管。也能應用 於影像處理的調光、聚焦,使拍攝出來的影像或照片能更加清楚。如果能夠以現 代人常用的手機和電腦直接進行無線遠端操控,不僅能增加方便性還能節省時間, 且如果應用在工業場所也會更加安全。 2-2-1 Wi-Fi 模組外觀 Arduino Wi-Fi Shield RJ45外觀如圖2.3所示,此模組套上Arduino再經過跳線 後可以進行Wi-Fi無線傳輸,並且利用Arduino內建程式的撰寫來修改SSID、IP等 內容。 此模組適用於無線數據傳輸使用電腦將數據無線傳入Arduino中以控制IO的 輸出。
  12. 7 圖2.3:Arduino Wi-Fi模組 2-2-2 按鈕與跳線介紹 如圖2.4所示,紅框處為跳線會依造UNO、Mega模板的不同而有所改改變若 位置錯誤則會造成數據無法傳輸,右下角處按鈕為Rest按鈕與AT Command按鈕 可以使用Rest按鈕來清除數據,AT Command按鈕長按兩秒後則可以進入設定。

    左下角的三顆LED由左而右為紅燈、橘燈、綠燈,紅燈為電源燈橘燈為進入 設定燈,綠燈為Wi-Fi啟用燈。左邊兩個金屬插槽為網路線(Router)插槽 圖2.4:Arduino Wi-Fi模組按鈕與跳線介紹
  13. 10 2-5 高功率 LED 燈板 本專題使用 Arduino UNO 微控制器透過 PWM

    功能控制高功率 LED 燈板之 明亮程度,為防止長時間啟動導致 LED 燈板過熱,於燈板背面塗抹散熱膏再裝 上散熱鋁鰭片,外接溫度感測器及小型風扇進行散熱。為了使燈板與鰭片緊密接 合,必須鎖上螺絲但市售螺絲頭較大若鎖上會壓壞燈板上的 LED 燈故使用 M2 螺絲攻進行攻牙,可以避過 LED 燈泡故須先鑽上直徑 17mm 的孔才可順利進行 攻牙。 高功率 LED 燈板如圖 2.10 所示 , 最高亮度可達 68500 lm(流明) , 限流 X XX。 一塊完整的高功率 LED 燈板內含 6 片燈片,這裡採用 6 個 LED 開關電路並搭配 Arduino 自行編譯的 6 支腳位進行控制。 圖 2.10:高功率 LED 燈板結合散熱片
  14. 11 第三章 軟體介紹 本章節介紹所使用的軟體部分,本專題需求在於編寫不同的程式達到控制各 個硬體的目的 , 不同硬體之間所需的軟體也不盡相同 , 包括 C#

    、 Eclipse 等軟體, 而各個軟體所使用的程式語言也不相同。 3-1 Android APP 編寫軟體介紹 Eclipse 是著名的跨平台開源整合式開發環境(IDE)。最初主要用來 Java 語 言開發,目前亦有人通過外掛模組使其作為 C++、Python、PHP 等其他語言的開 發工具。 Eclipse 的本身只是一個框架平台,但是眾多外掛模組的支援,使得 Eclipse 擁有較佳的靈活性,所以許多軟體開發商以 Eclipse 為框架開發自己的 IDE。 操作方式 如圖3.1所示 , 開啟程式後從左上角點選[File] →[New]→[Android Application Project]。 如圖 3.2 所示 , 在點選[Android Application Project]後會跳出新增專案的視窗 , 於[Application Name]打上專案名稱後按 Next。 如圖 3.3 所示,在這個視窗按下 Finish 鍵即完成專案新增。 如圖 3.4 所示,建立好專案後會跑出上圖之頁面,之後就能開始撰寫程式與 拖曳需要使用的元件至視窗內。 圖 3.1:Android Application Project
  15. 13 圖 3.4:新增專案完成之編譯環境 3-2 Wi-Fi 模組使用方法 Arduino Wi-Fi 程式碼參數介紹如圖 3.5

    所示,下方紅框處的 buyic 為 Wi-Fi 的 SSID,橘框處 192.168.1.75 為 IP 位置,需要 C#有相對應的 IP 才可連接。 圖3.5:Arduino Wi-Fi編譯程式碼
  16. 15 3-4 C# 編寫軟體介紹 C#是物件導向的高階程式語言,旨在設計成為一種「簡單、現代、通用」 , 由 C 語言和 C++衍生而來,繼承了其強大的效能,同時又以.NET

    框架類別庫作 為基礎,擁有類似 Visual Basic 的快速開發能力。 操作方式 如圖 3.7 所示,開啟程式後從左上角點選[檔案] →[新增]→[專案]。 如圖 3.8 所示 , 在點選專案後會跳出新增專案的視窗 , 點選[Windows Form 應 用程式]後按下確定鍵。 如圖 3.9 所示,建立好專案後會跑出上圖之頁面,之後就能開始撰寫程式與 拖曳需要使用的元件至 Form1 視窗內。 圖 3.7:新增專案
  17. 17 第四章 研究方法與步驟 本章節介紹專題所使用到的各項技術,包括 PWM 技術、模組架設、各項系統 等等。 4-1 PWM 脈波調寬

    脈衝寬度調變(PWM)簡稱脈寬調製如圖 4.1 所示,是將類比信號轉換為 脈波的一種技術,一般轉換後脈波的週期固定,但脈波的占空比會依類比信號的 大小而改變。 在類比電路中,類比信號的值可以連續進行變化,在時間和值的幅度上都幾 乎沒有限制,基本上可以取任何實數值,輸入與輸出也呈線性變化。所以在類比 電路中,電壓和電流可直接用來進行控制對象,例如家用電器設備中的音量開關 控制、採用鹵素燈泡燈具的亮度控制等等。但類比電路有諸多的問題:例如控制 信號容易隨時間漂移,難以調節;功耗大;易受雜訊和環境干擾等等。 與類比電路不同,數位電路是在預先確定的範圍內取值,在任何時刻,其輸 出只可能為 ON 和 OFF 兩種狀態,所以電壓或電流會通電/斷電方式的重複脈衝 序列加載到類比負載。 PWM 技術是一種對類比信號電位的數字編碼方法,通過使用高解析度計數 器(調製頻率)調製方波的占空比,從而實現對一個類比信號的電位進行編碼。 其最大的優點是從處理器到被控對象之間的所有信號都是數位形式的,無需再進 行數位類比轉換過程;而且對雜訊的抗干擾能力也大大增強,這也是 PWM 在通 訊等信號傳輸行業得到大量應用的主要原因。 圖 4.1:脈衝寬度調變(PWM)圖
  18. 20 本專題使用1到4層實體層、資料鏈結層、網路層、傳輸層,如圖4.5所示: 表 4.5:OSI(開放式系統互聯通訊參考模型) 層 功能 第 7 層 應用層(Application

    Layer) 提供為應用軟體而設的介面 , 以設定與 另一應用軟體之間的通訊。例如: HTTP,HTTPS,FTP,TELNET,SSH, SMTP,POP3 等。 第 6 層 表現層(Presentation Layer) 把資料轉換為能與接收者的系統格式 相容並適合傳輸的格式。 第 5 層 會議層(Session Layer) 負責在資料傳輸中設定和維護電腦網 路中兩台電腦之間的通訊連接。 第 4 層 傳輸層(Transport Layer) 把傳輸表頭(TH)加至資料以形成資料 報 。 傳輸表頭包含了所使用的協定等傳 送資訊。例如:傳輸控制協定義(TCP) 等。 第 3 層 網路層(Network Layer) 決定資料的路徑選擇和轉寄 , 它網路表 頭(NH)加至資料報,以形成封包。網 路表頭包含了網路資料。例如:網際網 路協定(IP) 等。 第 2 層 資料鏈結層(Data Link Layer) 負責網路尋址、錯誤偵測和改錯。當表 頭和表尾被加至資料包時 , 會形成了影 格。資料鏈表頭(DLH)是包含了實體位 址和錯誤偵測及改錯的方法 。 資料鏈表 尾(DLT)是一串指示資料包末端的字 串。例如乙太網、無線區域網路(Wi-Fi) 和通用分組無線服務(GPRS)等。 第 1 層 實體層(Physical Layer) 在局部區域網路上傳送影格 , 它負責管 理電腦通訊裝置和網路媒體之間的互 通。包括了針腳、電壓、線纜規範、集 線器、中繼器、網卡、主機介面卡等。
  19. 22 第五章 實驗結果 本章節將介紹 Android 操作介面、C#操作介面、Arduino 操作介面及高功率 LED 燈板之結合成果。 5-1

    Android 操作介面介紹 如圖 5.1 所示 , 上半部的按鈕(Button)可直接控制燈光的亮滅 , 按下 Led1 on, 則第一顆 LED 就會亮,按下 off 則滅。以此類推,其他 LED 也有各自的開關。 如圖 5.2 所示,在文字框框(Edit Text)處打上數字,在按下 Send,即可控制 LED 燈的亮度,數值範圍由 0~255,0 表示亮度為 0;255 亮度為最亮。 如圖 5.3 所示:上圖紅框內的値是 Arduino 能判斷的輸出格式;1 代表的是 第幾號燈具;逗號是為了區隔數字所代表的意思;255 則是燈具亮度,0 為最暗, 255 為最亮;#字號則是這段數字的句點,讓 Arduino 結束讀取。 圖 5.1:Android LED 1 - LED 6 on/off
  20. 25 5-2 C# 程式使用說明 如圖 5.4 及圖 5.5 所示,啟動程式尚未連線時,左下角會顯示連線準備,當 按下“連線”成功連線時顯示連線成功,失敗則顯示連線失敗,IP

    與 Port 依需 求改變。 如圖 5.6 所示,當滾動條由左而右做動時文字盒會顯示 0~255 變化,利用觸 發事件 Scroll(移動捲動方塊時發生)讓文字盒能與滾動條同步,並以觸發事件 ValueChanged(當值改變時)作及時輸出,令 LED 燈能隨著參數改變及時輸出,達 到無段變化。 如圖 5.7 所示,當按下開/關鍵,對應左方 LED 組在”開”的情況下,滾動條 全開與文字盒顯示 255 最大值輸出,"關”則是滾動條全關與文字盒歸零。 如圖 5.8 所示,當按下總開關“開”,全部 LED 燈組滾動條全開與文字盒顯示 255 最大值輸出,“關”則是全體滾動條全關與文字盒歸零。 圖5.4:C#連線準備
  21. 28 5-3 Arduino 高功率 LED 燈板程式 高功率 LED 燈板執行程式為 Arduino,欲開啟

    LED 燈時可先使用手機或電 腦開啟相應軟體,再進行調節即可。Arduino 則作為接收端軟體,自手機端接收 Android 或電腦端接收 C#所發出之訊號,Arduino 接收訊號後會於 Serial Monitor 顯示出燈號及亮度。如圖 5.9 之紅框所示,當 Arduino 收到發送端傳送之訊息: 第一排燈開啟,亮度調節至最高時,Arduino 會將此訊息轉變為一則訊號 1,255# 透過陣列的方式顯示於 Serial Monitor,先顯示燈號,再在燈號下面顯示亮度, 並發送端之執行命令。 圖 5.9:Serial Monitor
  22. 29 R 5-4 散熱模組介紹 由於LED燈板具高功率約60W左右,長期運作後會產生高溫因此會造成LED 燈板的亮度會有所下降明亮程度會受到影響,因此需要一套散熱系統,此散熱系 統的感測器為PT100,當溫度越高時,電阻也會越高,在藉由IC lm324電壓差放 大器後控制電壓來進行調控。 5-4-1

    PT-100 電阻式溫度感測器應用電路圖如圖5.10所示,其中 為準位調整 為放大倍 率調整。 5K 5K 10K 10K 78015 100 82 100K 100K 10K 10K 50K 10K 4 2 3 6 5 7 1 - + + - Vcc 12DCV Vout Vcc PT-100 熱 阻 體 11 圖5.10:PT-100溫度感測器電路圖
  23. 32 5-5 PWM 波形量測 PWM (Pulse Width Modulation) 燈板與風扇的亮度與轉速調控藉由 PWM

    進 行控制,在每個工作週期中調整電壓開啟與關閉的時間,來進行控制由於開關的 時間很快通常在 1 秒內已開啟與關閉數次,故使用示波器量測週期來進行監控其 開啟與關閉的時間是否有依造程式所做動,開啟時是否有達到 5V 準位與關閉時 是否接近於 0V。並比較使用內建 Arduino 程式碼指令 analogWrite 與使用 digitalWrite 指令配合 delay 來進行開關時是否能達到一樣效果。 5-5-1 燈板 PWM 控制波形 燈板的 PWM 控制是使用 analogWrite 指令方式來控制在一定的工作週期內 改變高態與低態的比例來控制燈板亮度,當高態的比例越高燈板就會越亮,當全 亮時低態時間為 0s 當燈版全滅時則相反高態時間為 0s。 如圖 5.13 所示,為 PWM 燈板停止願轉時的波形圖,其中最 Vmax 為 160mV 很接近於 0V。因為沒有運轉故也沒有工作週期。 如圖 5.14 所示,為開啟 20%左右的情況可以看到右下角紅框處 Duty+為 19.6%表示在週期 2.04ms 內有 19.6%的時間為高態也就是 5V 的情況,Duty-則為 80.4%表示在週期內有 80.4%的情況是沒有供電的。 如圖 5.15 所示,為開啟 60%左右的情況可以看到右下角紅框處 Duty+為 58.8%表示在週期 2.04ms 內有 58.8%的時間為高態也就是 5V 的情況,Duty-則為 41.2%表示在週期內有 41.2%的情況是沒有供電的。 如圖 5.16 所示,為開啟 80%左右的情況可以看到右下角紅框處 Duty+為 78.4%表示在週期 2.04ms 內有 78.4%的時間為高態也就是 5V 的情況,Duty-則為 21.6%表示在週期內有 21.6%的情況是沒有供電的。 如圖 5.17 所示,為全開狀態,Vmax 與 Vmin 皆為 4.72V 在工作週期中都全 開,因為屬於全開故也沒有工作週期。
  24. 35 5-5-2 風扇 PWM 控制波形 風扇的 PWM 控制是使用 digitalWrite 指令的方式並配合

    delay 來控制高態的 時間長度低態固定為 50ms 因此當高態變長時相對低態來說會變得更長,轉速即 會上升這種方法是大量增加高態的時間但固定或少量增加低態時間來增加總工 作週期,造成高態與低態比例會有一定幅度的差異來進行控制。 如圖 5.19 所示,為攝氏 22 度時風扇的 PWM 波形總週期為 564ms 其中高態 週期為 416ms 低態週期為 148ms 頻率為 1.7Hz。 如圖 5.20 所示,為攝氏 29 度時風扇的 PWM 波形總週期為 680ms 其中高態 週期為 530ms 低態週期為 150ms 頻率為 1.47Hz。 如圖 5.21 所示,為攝氏 30 度時風扇的 PWM 波形總週期為 736ms 其中高態 週期為 584ms 低態週期為 152ms 頻率為 1.36Hz。 如圖 5.22 所示,為攝氏 33 度時風扇的 PWM 波形總週期為 800ms 其中高態 週期為 648ms 低態週期為 152ms 頻率為 1.25Hz。 圖 5.19:攝氏 22 度之 PWM 波型
  25. 36 圖 5.20:攝氏 29 度之 PWM 波型 圖 5.21:攝氏 30

    度之 PWM 波型 圖 5.22:攝氏 33 度之 PWM 波型
  26. 38 5-7 實驗結果 實驗數據藉由照度計與數位是溫度計來進行量測溫度與照度,量測完成後並記錄 成圖表以利於分析與對照 , 時間部分於十分鐘記錄過五十分後改十五分鐘記錄一 次。 圖 5.25:Lx

    對照圖 圖 5.26:溫度對照圖 71290 68710 70180 70100 67000 67500 68000 68500 69000 69500 70000 70500 71000 71500 0 10 20 30 40 50 65 90 115 145 175 205 Lx fan Lx 31.3 56.8 30.4 31.1 0 5 10 15 20 25 30 35 40 45 50 55 60 0 10 20 30 40 50 65 90 115 145 175 205 溫度 溫度對照 溫度 溫度fan
  27. 39 第六章 結論 本次專題以LED光源調變為主,輔以風扇進行散熱,兩樣均以Arduino PWM 結合WI-FI做為控制方式。以手動方式調節使用者所需之亮度,當LED燈板溫度 過高時將自動啟動散熱風扇,並因溫度上升而加快轉速,溫度下降而降低轉速。 在實驗之後比較燈板結合風扇與燈板未結合風扇的溫度與亮度,並分析是否能達 到預期的降溫效果且亮度衰退較為緩慢的結果。但因風扇無法量測數值,故使用 示波器來捕捉波形確定風扇與燈板是否有依照Arduino所輸出的波形作動,且比

    較Arduino的兩種PWM寫法的各細節與特色。 控制端分別選用C#及Android製作控制介面,接收端則使用Arduino,接收電 腦及手機所發出之命令進行調控。本次專題採用Arduino UNO,之後如欲增加 LED燈板之數量可採用Arduino MEGA。後續製作方向將朝向自動控制部分,加 入光感測器及後續程式讓使用者能夠在初始操控時除了選擇手動模式外還可以 選擇自動模式。自動模式將以光感測器感測周遭之亮度,並自動節LED燈板之亮 度以達到最佳省電及採光效果 。 不只控制LED燈板 , 也可加入繼電器控制日光燈, 以組為單位進行控制,透過點亮一組日光燈裡燈管的數量調節亮度。
  28. 41 參考文獻 [1]賴宜廷,基於 Arduino 與 Android 之智慧家庭遠端監控系統設計與實作,碩士 論文,國立虎尾科技大學機械與機電工程研究所, 2014。 [2]陳民峻,基於

    Arduino 及影像處理的居家全監控系統,碩士論文,國立彰化師 範大學電機工程學系,2014。 [3]王元君 , 設計及實作以 NFC 手機及 Arduino 嵌入式模組為主之家電控制系統, 碩士論文,淡江大學資訊工程學系,2014。 [4]陳聖翰,Android 裝置控制 Arduino 機器人之研究,碩士論文,國立雲林科技 大學電子與光電工程系研究所碩士班,2013。 [5]李健榆,ZigBee 無線控制路燈系統的設計與架構,碩士論文,國立成功大學 微電子工程研究所碩士班,2013。 [6]蘇韵寗,Web 化電氣無線控制系統之研究,碩士論文,國立高雄應用科技大 學電子工程系,2010。 [7]王元陵,整合嵌入式作業系統之家庭自動化無線控制介面,碩士論文,國立 成功大學電機工程學系,2001。 [8]紀孫鉉,可應用於智慧家庭感測系統之 ZigBee 無線控制插座,碩士論文,東 海大學電機工程學系,2012。 [9]鄭欽豪,使用 SMARTPHONE、Wi-Fi 及 ARM 系統晶片之無線控制系統,碩 士論文,國立勤益科技大學電子工程系,2013。 [10]劉信偉,具 Zigbee 無線控制之可調光 RGB LED 驅動器,碩士論文,國立台 灣科技大學電子工程系,2013。 [11]PWM 波型圖,https://www.google.com.tw/search?q=PWM&es_sm=93&source =lnms&tbm=isch&sa=X&ei=PNhlVauRA4e1mwWT04NQ&ved=0CAgQ_AUo AQ&biw=1280&bih=855#imgrc=Hb24QHGiTS2YcM%253A%3BsJG1_TH908 _mXM%3Bhttp%253A%252F%252Fhomepages.ius.edu%252FRWISMAN%25 2FC335%252FHTML%252Fmsp43017.png%3Bhttp%253A%252F%252Fhome pages.ius.edu%252FRWISMAN%252FC335%252FHTML%252Fmsp430Timer. HTM%3B700%3B283 [12]PWM介紹,http://zh.wikipedia.org/wiki/%E8%84%88%E8%A1%9D%E5%AF %AC%E5%BA%A6%E8%AA%BF%E8%AE%8A [13]Arduino UNO 圖片,https://solarbotics.com/product/50450/
  29. 42 國 立 虎 尾 科 技 大 學 自

    動 化 工 程 系 學 生 專 題 製 作 合 格 認 可 證 明 專題製作修習學生: ˍˍˍˍˍˍˍˍˍˍˍˍˍˍ ˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍ ˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍ ˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍ 專題製作題目: 無線控制LED光源調變系統 經評量合格,特此證 指 導 教 師 簽 名:ˍˍˍˍˍˍˍˍˍˍˍˍˍˍˍ 中華民國 年 月 日
  30. 43 附錄 Arduino 程式 LED 程式 #include <stdlib.h> #include <Ethernet.h>

    #include <SPI.h> #include <Ethernet.h> #include <SoftwareSerial.h> #define RxD 2 #define TxD 3 #define LED 13 #define UARTPACKLEN 64 SoftwareSerial WIFISerial(RxD,TxD); int b=0; int led1=11; int led2=10; int led3=9; int led4=6; int led5=5; int led6=3; char incomingByte; char Data[50]; int inData[50]; int i; int x; int y; int s=0; int Z =0; void setup() { WIFISerial.begin(38400); Serial.begin(9600);//開啟 Serial Port 並設定 通訊速率 pinMode(led1,OUTPUT); pinMode(led2,OUTPUT); pinMode(led3,OUTPUT); pinMode(led4,OUTPUT); pinMode(led5,OUTPUT); pinMode(led6,OUTPUT); } void loop() { char inDat[UARTPACKLEN]; // Allocate some space for the string char inChar; // Where to store the character read byte index = 0; // Index into array; where to store the character int b = 0; while(WIFISerial.available() > 0) // Don't read unless { inChar = WIFISerial.read(); // Read a character CC(inChar); } } void CC(char inChar) { incomingByte = inChar; if(incomingByte=='#') { for(int i=0;i<s;i++) { if(Data[i]==',')
  31. 2 { Z=1; y=0; } else { inData[Z] = Convert(Data[i]);

    } } if(inData[1]>255) { inData[1]=255; } switch(inData[0]) { case 1:Serial.println(inData[0]); Serial.println(inData[1]); analogWrite(led1,inData[1]); break; case 2:Serial.println(inData[0]); Serial.println(inData[1]); analogWrite(led2,inData[1]); break; case 3:Serial.println(inData[0]); Serial.println(inData[1]); analogWrite(led3,inData[1]); break; case 4:Serial.println(inData[0]); Serial.println(inData[1]); analogWrite(led4,inData[1]); break; case 5:Serial.println(inData[0]); Serial.println(inData[1]); analogWrite(led5,inData[1]); break; case 6:Serial.println(inData[0]); Serial.println(inData[1]); analogWrite(led6,inData[1]); break; } y=0; Z=0; s=0; } else { Data[s] = incomingByte; s++; } } int Convert(char z) { int x = z - '0'; y = y * 10 + x; return y; }
  32. 1 風扇程式 int val=0; int ledpin=11; int analogPin=A0; void setup()

    { pinMode(ledpin,OUTPUT); Serial.begin(9600); } void loop() { val=analogRead(analogPin); Serial.println(val/2.25+4); delay(100); if((val/2.25+4)>=30) { digitalWrite(ledpin,HIGH); } else { if((val/2.25+4)>=10) { digitalWrite(ledpin,HIGH); delay(val*10); digitalWrite(ledpin,LOW); delay(50); } else { digitalWrite(ledpin,LOW); } } } C# 程式 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Net.Sockets;//網路溝通 using System.IO;//寫&讀 namespace WindowsFormsApplication16 { public partial class Form1 : Form { public Form1() { InitializeComponent(); textBox1.Text = "0"; textBox2.Text = "0"; textBox3.Text = "0"; textBox4.Text = "0"; textBox7.Text = "0"; textBox8.Text = "0";//令文字盒初始值為 0 } TcpClient tcp; NetworkStream net;//針對網路存取提供 資料的基礎資料流 private void button2_Click(object sender, EventArgs e) { try { tcp = new TcpClient(textBox5.Text, Convert.ToInt16(textBox6.Text));
  33. 2 if (tcp != null) { toolStripStatusLabel1.Text = "連線成功 ";//連線成功顯示

    net = tcp.GetStream(); } } catch { toolStripStatusLabel1.Text = "連線失敗 ";//連線失敗顯示 } } private void hScrollBar1_Scroll(object sender, ScrollEventArgs e) { textBox1.Text = hScrollBar1.Value.ToString();//令文字盒 與滾動條同時變化 } private void hScrollBar2_Scroll(object sender, ScrollEventArgs e) { textBox2.Text = hScrollBar2.Value.ToString(); } private void hScrollBar3_Scroll(object sender, ScrollEventArgs e) { textBox3.Text = hScrollBar3.Value.ToString(); } private void hScrollBar4_Scroll(object sender, ScrollEventArgs e) { textBox4.Text = hScrollBar4.Value.ToString(); } private void hScrollBar5_Scroll(object sender, ScrollEventArgs e) { textBox7.Text = hScrollBar5.Value.ToString(); } private void hScrollBar6_Scroll(object sender, ScrollEventArgs e) { textBox8.Text = hScrollBar6.Value.ToString(); } private void textBox1_KeyDown(object sender, KeyEventArgs e) { try { if (e.KeyCode == Keys.Enter)//按下Enter 鍵觸發事件 { if (Convert.ToInt16(textBox1.Text) > 255) { textBox1.Text = Convert.ToString(255); hScrollBar1.Value = 255;//如值超過255, 最大就顯示255 } else { hScrollBar1.Value = Convert.ToInt16(textBox1.Text); } } } catch { MessageBox.Show("已超出最大輸入值"); }
  34. 3 } private void textBox2_KeyDown(object sender, KeyEventArgs e) { try

    { if(e.KeyCode == Keys.Enter) { if (Convert.ToInt16(textBox2.Text) > 255) { textBox2.Text = Convert.ToString(255); hScrollBar2.Value = 255; } else { hScrollBar2.Value = Convert.ToInt16(textBox2.Text); } } } catch { MessageBox.Show("已超出最大輸入值"); } } private void textBox3_KeyDown(object sender, KeyEventArgs e) { try { if (e.KeyCode == Keys.Enter) { if (Convert.ToInt16(textBox3.Text) > 255) { textBox3.Text = Convert.ToString(255); hScrollBar3.Value = 255; } else { hScrollBar3.Value = Convert.ToInt16(textBox3.Text); } } } catch { MessageBox.Show("已超出最大輸入值"); } } private void textBox4_KeyDown(object sender, KeyEventArgs e) { try { if (e.KeyCode == Keys.Enter) { if (Convert.ToInt16(textBox4.Text) > 255) { textBox4.Text = Convert.ToString(255); hScrollBar4.Value = 255; } else { hScrollBar4.Value = Convert.ToInt16(textBox4.Text); } } } catch { MessageBox.Show("已超出最大輸入值"); } }
  35. 4 private void textBox7_KeyDown(object sender, KeyEventArgs e) { try {

    if (e.KeyCode == Keys.Enter) { if (Convert.ToInt16(textBox7.Text) > 255) { textBox7.Text = Convert.ToString(255); hScrollBar5.Value = 255; } else { hScrollBar5.Value = Convert.ToInt16(textBox7.Text); } } } catch { MessageBox.Show("已超出最大輸入值"); } } private void textBox8_KeyDown(object sender, KeyEventArgs e) { try { if (e.KeyCode == Keys.Enter) { if (Convert.ToInt16(textBox8.Text) > 255) { textBox8.Text = Convert.ToString(255); hScrollBar6.Value = 255; } else { hScrollBar6.Value = Convert.ToInt16(textBox8.Text); } } } catch { MessageBox.Show("已超出最大輸入值"); } } private void hScrollBar1_ValueChanged(object sender, EventArgs e) { try { StreamWriter sw; sw = new StreamWriter(net); sw.Write("1," + hScrollBar1.Value+ "#");//Arduino接收格式 sw.Flush(); } catch { toolStripStatusLabel1.Text = "連線失敗 "; } } private void hScrollBar2_ValueChanged(object sender, EventArgs e) { try { StreamWriter sw; sw = new StreamWriter(net);
  36. 5 sw.Write("2," + hScrollBar2.Value + "#"); sw.Flush(); } catch {

    toolStripStatusLabel1.Text = "連線失敗 "; } } private void hScrollBar3_ValueChanged(object sender, EventArgs e) { try { StreamWriter sw; sw = new StreamWriter(net); sw.Write("3," + hScrollBar3.Value + "#"); sw.Flush(); } catch { toolStripStatusLabel1.Text = "連線失敗"; } } private void hScrollBar4_ValueChanged(object sender, EventArgs e) { try { StreamWriter sw; sw = new StreamWriter(net); sw.Write("4," + hScrollBar4.Value + "#"); sw.Flush(); } catch { toolStripStatusLabel1.Text = "連線失敗 "; } } private void hScrollBar5_ValueChanged(object sender, EventArgs e) { try { StreamWriter sw; sw = new StreamWriter(net); sw.Write("5," + hScrollBar5.Value + "#"); sw.Flush(); } catch { toolStripStatusLabel1.Text = "連線失敗 "; } } private void hScrollBar6_ValueChanged(object sender, EventArgs e) { try { StreamWriter sw; sw = new StreamWriter(net); sw.Write("6," + hScrollBar6.Value + "#"); sw.Flush(); } catch
  37. 6 { toolStripStatusLabel1.Text = "連線失敗 "; } } private void

    button1_Click_2(object sender, EventArgs e) { StreamWriter sw; if (Convert.ToInt16(textBox1.Text) > 0)//當在有任何輸出情況下按下”開關”鍵, 直接歸零 { sw = new StreamWriter(net); sw.Write("1," + 0 + "#"); sw.Flush(); textBox1.Text = "0"; hScrollBar1.Value = Convert.ToInt16(textBox1.Text); } else//當在無任何輸出情況下按下”開關” 鍵,直接全開 { sw = new StreamWriter(net); sw.Write("1," + 255 + "#"); sw.Flush(); textBox1.Text = "255"; hScrollBar1.Value = Convert.ToInt16(textBox1.Text); } } private void button3_Click(object sender, EventArgs e) { StreamWriter sw; if (Convert.ToInt16(textBox2.Text) > 0) { sw = new StreamWriter(net); sw.Write("2," + 0 + "#"); sw.Flush(); textBox2.Text = "0"; hScrollBar2.Value = Convert.ToInt16(textBox2.Text); } else { sw = new StreamWriter(net); sw.Write("2," + 255 + "#"); sw.Flush(); textBox2.Text = "255"; hScrollBar2.Value = Convert.ToInt16(textBox2.Text); } } private void button4_Click(object sender, EventArgs e) { StreamWriter sw; if (Convert.ToInt16(textBox3.Text) > 0) { sw = new StreamWriter(net); sw.Write("3," + 0 + "#"); sw.Flush(); textBox3.Text = "0"; hScrollBar3.Value = Convert.ToInt16(textBox3.Text); } else { sw = new StreamWriter(net); sw.Write("3," + 255 + "#"); sw.Flush(); textBox3.Text = "255"; hScrollBar3.Value = Convert.ToInt16(textBox3.Text); }
  38. 7 } private void button5_Click(object sender, EventArgs e) { StreamWriter

    sw; if (Convert.ToInt16(textBox4.Text) > 0) { sw = new StreamWriter(net); sw.Write("4," + 0 + "#"); sw.Flush(); textBox4.Text = "0"; hScrollBar4.Value = Convert.ToInt16(textBox4.Text); } else { sw = new StreamWriter(net); sw.Write("4," + 255 + "#"); sw.Flush(); textBox4.Text = "255"; hScrollBar4.Value = Convert.ToInt16(textBox4.Text); } } private void button6_Click(object sender, EventArgs e) { StreamWriter sw; if (Convert.ToInt16(textBox7.Text) > 0) { sw = new StreamWriter(net); sw.Write("5," + 0 + "#"); sw.Flush(); textBox7.Text = "0"; hScrollBar5.Value = Convert.ToInt16(textBox7.Text); } else { sw = new StreamWriter(net); sw.Write("5," + 255 + "#"); sw.Flush(); textBox7.Text = "255"; hScrollBar5.Value = Convert.ToInt16(textBox7.Text); } } private void button7_Click(object sender, EventArgs e) { StreamWriter sw; if (Convert.ToInt16(textBox8.Text) > 0) { sw = new StreamWriter(net); sw.Write("6," + 0 + "#"); sw.Flush(); textBox8.Text = "0"; hScrollBar6.Value = Convert.ToInt16(textBox8.Text); } else { sw = new StreamWriter(net); sw.Write("6," + 255 + "#"); sw.Flush(); textBox8.Text = "255"; hScrollBar6.Value = Convert.ToInt16(textBox8.Text); } } private void button8_Click(object sender, EventArgs e) { StreamWriter sw;//總開關”開”控制 sw = new StreamWriter(net);
  39. 8 sw.Write("1," + 255 + "#"); sw.Write("2," + 255 +

    "#"); sw.Write("3," + 255 + "#"); sw.Write("4," + 255 + "#"); sw.Write("5," + 255 + "#"); sw.Write("6," + 255 + "#"); sw.Flush(); textBox1.Text = "255"; textBox2.Text = "255"; textBox3.Text = "255"; textBox4.Text = "255"; textBox7.Text = "255"; textBox8.Text = "255"; hScrollBar1.Value = Convert.ToInt16(textBox1.Text); hScrollBar2.Value = Convert.ToInt16(textBox2.Text); hScrollBar3.Value = Convert.ToInt16(textBox3.Text); hScrollBar4.Value = Convert.ToInt16(textBox4.Text); hScrollBar5.Value = Convert.ToInt16(textBox7.Text); hScrollBar6.Value = Convert.ToInt16(textBox8.Text); } private void button9_Click(object sender, EventArgs e) { StreamWriter sw; //總開關”關”控制 sw = new StreamWriter(net); sw.Write("1," + 0 + "#"); sw.Write("2," + 0 + "#"); sw.Write("3," + 0 + "#"); sw.Write("4," + 0 + "#"); sw.Write("5," + 0 + "#"); sw.Write("6," + 0 + "#"); sw.Flush(); textBox1.Text = "0"; textBox2.Text = "0"; textBox3.Text = "0"; textBox4.Text = "0"; textBox7.Text = "0"; textBox8.Text = "0"; hScrollBar1.Value = Convert.ToInt16(textBox1.Text); hScrollBar2.Value = Convert.ToInt16(textBox2.Text); hScrollBar3.Value = Convert.ToInt16(textBox3.Text); hScrollBar4.Value = Convert.ToInt16(textBox4.Text); hScrollBar5.Value = Convert.ToInt16(textBox7.Text); hScrollBar6.Value = Convert.ToInt16(textBox8.Text); } } }
  40. 9 Android APP 程式 AndroidMainfest.Xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/r

    es/android" package="com.example.gg30" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <uses-permission android:name="android.permission.ACCES S_WIFI_STATE" /> <uses-permission android:name="android.permission.CHAN GE_WIFI_STATE"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <actionandroid:name="android.intent.action.MAI N" /> <category android:name="android.intent.category.LAUN CHER" /> </intent-filter> </activity> </application> </manifest> Activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk /res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_ve rtical_margin" android:paddingLeft="@dimen/activity_horizo ntal_margin" android:paddingRight="@dimen/activity_hori zontal_margin" android:paddingTop="@dimen/activity_vertica l_margin" tools:context="com.example.gg30.MainActivity > <Button android:id="@+id/button1" android:layout_width="wrap_content"
  41. 10 android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="102dp" android:text="LED1 ON " /> <Button

    android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="102dp" android:text="LED1 OFF " /> <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="102dp" android:text=" LED2 ON " /> <Button android:id="@+id/button4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="102dp" android:text=" LED2 OFF " /> <Button android:id="@+id/button5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="102dp" android:text=" LED3 ON " /> <Button android:id="@+id/button6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="102dp" android:text=" LED3 OFF " /> <Button android:id="@+id/button7" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="102dp" android:text=" LED4 ON " /> <Button android:id="@+id/button8" android:layout_width="wrap_content"
  42. 11 android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="102dp" android:text=" LED4 OFF " />

    <Button android:id="@+id/button9" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="102dp" android:text=" LED5 ON " /> <Button android:id="@+id/button10" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="102dp" android:text=" LED5 OFF " /> <Button android:id="@+id/button11" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/editText1" android:layout_alignBottom="@+id/editText1" android:layout_alignParentRight="true" android:text=" LED6 ON " /> <Button android:id="@+id/button12" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/editText1" android:layout_alignBottom="@+id/editText1" android:layout_alignParentRight="true" android:text=" LED6 OFF " /> <Button android:id="@+id/button13" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/editText1" android:layout_alignBottom="@+id/editText1" android:layout_alignParentRight="true" android:text="Send " /> <EditText android:id="@+id/editText1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_marginBottom="131dp" android:layout_marginLeft="18dp" android:ems="10" android:inputType="numberDecimal" /> </RelativeLayout>
  43. 12 MainActivity.java package net.macdidi.HAHA; import android.app.Activity; import android.os.Bundle; import android.widget.Button;

    import android.widget.TextView; import android.widget.EditText; //import java.io.FileInputStream; //import java.io.InputStream; import java.io.PrintWriter; import java.net.Socket; import java.util.Scanner; import android.view.View; import android.view.Menu; //import android.view.MenuInflater; import android.view.View.OnClickListener; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.computer_r2); btn1 = (Button)findViewById(R.id.LED1 ON); btn2 = (Button)findViewById(R.id.LED1 OFF); btn3 = (Button)findViewById(R.id.LED2 ON); btn4 = (Button)findViewById(R.id.LED2 OFF); btn5 = (Button)findViewById(R.id.LRD3 ON); btn6 = (Button)findViewById(R.id.LRD3 OFF); btn7 = (Button)findViewById(R.id.LRD4 ON); btn8 = (Button)findViewById(R.id.LED4 OFF); btn9 = (Button)findViewById(R.id.LED5 ON); btn10 = (Button)findViewById(R.id.LED5 OFF); btn11 = (Button)findViewById(R.id.LED6 ON); btn12 = (Button)findViewById(R.id.LED6 OFF); btn13 = (Button)findViewById(R.id.Send); btn1.setText(R.string.btn1); btn2.setText(R.string.btn2); btn3.setText(R.string.btn3); btn4.setText(R.string.btn4); btn5.setText(R.string.btn5); btn6.setText(R.string.btn6); btn7.setText(R.string.btn7); btn8setText(R.string.btn8); btn9.setText(R.string.btn9); btn10.setText(R.string.btn10); btn11.setText(R.string.btn11); btn12.setText(R.string.btn12); EditText1 = (EditText)findViewById(R.id.editText1); button1.setOnClickListener(this); } public boolean onCreateOptionsMenu(Menu
  44. 13 menu) { getMenuInflater().inflate(R.menu.main_menu, menu); return true; } public void

    onClick(View v){ message = editText1.getText().toString().trim(); if(message.length() == 0) { return; } Thread thread = new Thread(new NetThread(), "thread1"); thread.start(); editText1.setText(""); } class NetThread implements Runnable { @Override public void run() { try { Socket socket=new Socket("192.168.1.75", 8080); PrintWriter pw =new PrintWriter(socket.getOutputStream()); pw.println(message); pw.flush(); MainActivity.this.runOnUiThread(new Scanner scan = new Scanner(socket.getInputStream()); String ret = scan.nextLine(); pw.close(); scan.close(); socket.close(); } catch (Exception EE) { EE.printStackTrace(); } } } class ChangeText implements Runnable { String text; ChangeText(String text) { T his.text = text; } @Override public void run() { textView1.append(text); } } }