# [教學]Arduino懶人遙控電燈開關 搬到新家之後,第一次有了自己的房間 新房間什麼都好,就是沒有離床近一點的電燈開關 每晚睡前都要到門口關燈之後再摸黑爬回床上 秉持著科技來自於惰性的精神 我用Arduino做了一個低科技東東: {%youtube 2opoliKnHnE%} 製作時間: 初學且材料齊全 3~5小時 再做一次    1小時 再做第三次   15分鐘 ## 材料! ![](https://i.imgur.com/YzDPwOo.jpg) 從左至右分別是: 1. Arduino UNO板一份 ![](https://i.imgur.com/4l3PcK6.jpg) 一個小電腦! 他會記住你要執行的程式和指令,並且接收來自紅外線接收器的訊號、傳送給伺服馬達要轉幾度的訊號。 我們等等會需要跟Arduino跟用USB Type B線電腦連接,這樣就可以把我們想要機器做的指令從電腦上傳到Adruino上。 ![](https://i.imgur.com/NBdbIMw.jpg) USB Type B 本人 通常在買Arduino時就會附贈!沒附贈也沒關係,各大電子材料行都有。 2. 麵包板 ![](https://i.imgur.com/2E3FpVt.jpg) 一塊長得跟麵包一點都不像的板子 關於這塊板子,我們得先知道他底下是怎麼通電的。 在上面的圖片中,左右各有兩排藍色和紅色的線,代表它們旁邊的孔(也就是最左兩直排跟最右兩直排)是每直行互相通電的。 而中間標號123和abc的那30x10個孔,則是依照我用上面黃色筆跡畫的方向,橫著通電。 3. SG-90 伺服馬達 ![](https://i.imgur.com/Jcbi8gp.png) 幫你按開關的酷東西 馬達上面會有買的時候附贈的轉動手臂,因此我們就可以用馬達的轉動來這樣控制開關: ![](https://i.imgur.com/RXJndSR.jpg) 4. 紅外線接收器 ![](https://i.imgur.com/XrjLmdd.png) 中間那個三隻腳的東東 他可以把接收到的紅外線訊號變成有意義的電流,然後傳給Arduino做判斷 對了 既然有接收器就需要發送器 ![](https://i.imgur.com/ksxVYmU.png) 一般家用的電視遙控器都可以,廠牌規格不一樣沒關係,只要他是紅外線發送訊號的就好。 5. 杜邦線 ![](https://i.imgur.com/pVLoZ6O.png) 很像小時候吃的那種彩虹色、一條一條的糖果 就是一種電線,需要的時候可以一條一條撕下來。他上面堅硬的針頭讓我們在插麵包板跟Arduino時更容易固定 - 以上東西在可以在哪裡得到? 1. 當然,網購一定買的到。 2. 你家附近的電子材料行 (中壢有大洋電子、台南有南一電子和TNA168可以去) 3. 當你的家人朋友有電機背景.jpg ## 前提! 在你開始做之前,有一些事必須先知道: ### 1. 電燈開關附近要有插座 畢竟這整個東西還是吃電的,所以還是需要一個電源才行,如圖: ![](https://i.imgur.com/IuZ0HgF.png) 對我那時是用capo固定伺服馬達的,後來改用束帶固定 其實我最一開始的想法是用電池供電,用ATtiny85代替Arduino。這樣不僅體積小很多也不用用插座供電,但是在燒錄程式到ATtiny85的過程中,軟體的部分會無法溝通所以才放棄的。如果有做出來的話我再打一篇教學。 ### 2. 先來認識Arduino吧! 如果是第一次接觸程式語言或是Arduino的人,看到程式這個字應該都會感覺到陌生吧? 沒關係,我接觸了一年也還是很矇。 網路上的教學其實非常多,但是就得耐住性子,一步步花時間認識這個環境。正好,疫情在家的期間你可以花時間多學一個東西。 我當初就是看[佑來認真教](https://www.youtube.com/channel/UCCd23n-zY1Vfsvc9FLrZZbQ)的arduino教學系列。雖然不是最精深的arduino教學,但是是我認為最容易入門、最好懂的教學系列。 {%youtube 3mw-1Bvv0WU %} 對於初學者,建議先看到 **[實作01-基礎Blink](https://www.youtube.com/watch?v=KzjWbRozItM&t=1s)**,了解Arduino IDE是怎麼上傳程式、基本操作之後,後面的教學會更容易理解喔。 ## 開始! ### 1. 把所以有東西按照下圖連起來: ![](https://i.imgur.com/6mYAwOb.png) 我們可以分成三個部分說明: #### 1. 電源 ![](https://i.imgur.com/4t3NTLE.png) 紅色線跟藍色線就是剛剛提到的杜邦線,如此可以讓麵包板最上面兩排作為正極及負極的電源 #### 2. 紅外線接收器 ![](https://i.imgur.com/1jkyBdt.png) 三隻腳直接插進麵包板就可以了,但是切記三支腳的順序不能錯(面對圓球時,右腳正極、中腳負極、左腳接Arduino二號腳位),否則紅外線接收器有機率壞掉 #### 3. 伺服馬達 ![](https://i.imgur.com/mN0RQL8.png) 在用Thinkercad做這張圖的時候,一直覺得這個圖示也太不像伺服馬達,後來才發現這是俯視圖: ![](https://i.imgur.com/ftHzMPC.jpg) 這裡有一點需要注意!伺服馬達會有三條線,分別是橘色(接Arduino五號腳位)、紅色(接正極)、棕色(接負極),分清楚之後再用杜邦線連接起來。 ### 2. 讓電腦連上Arduino 用剛剛提到的USB type B讓電腦和Arduino連接。再把Arduino IDE打開,以下的code複製上去吧: ``` ///////////////////////////////前置作業/////////////////////////////// #include<IRremote.h> //引入紅外線和伺服馬達的函式庫 #include <Servo.h> Servo myservo; IRrecv irrecv(2); //紅外線感測器的訊號從2號腳位輸入 decode_results results; void setup() { Serial.begin(9600); //啟動序列埠 (按右上角放大鏡啟動!) myservo.attach(5); //伺服馬達的訊號從5號腳位輸出 Serial.println("啟動紅外線接收器及序列埠"); //在序列埠顯示這一行文字 irrecv.enableIRIn(); } ///////////////////////////////////////////////////////////////////// ///////////////////////////////程式開始/////////////////////////////// void loop() { if(irrecv.decode(&results)) { Serial.println(results.value); //在序列埠監控視窗顯示遙控器訊號的解碼後的數字 irrecv.stop(); //把紅外線接收器暫時關閉 if(results.value==2105361595) //在兩個等號右邊把數字刪掉,填入你想要作為開關按鈕發出的訊號值。像我的是2105361595 { myservo.write(47); //伺服馬達轉到47度 delay(500); //停止500毫秒 myservo.write(40); //伺服馬達轉到40度 } if(results.value==2105377915) //在兩個等號右邊把數字刪掉,填入你想要作為開關按鈕發出的訊號值。像我的是2105377915 { myservo.write(0); //伺服馬達轉到0度 delay(500); //停止500毫秒 myservo.write(10); //伺服馬達轉到10度 } irrecv.enableIRIn(); //再把紅外線接收器打開 } delay(100); } ``` 在這篇教學裡面,我不打算教有關程式的東西。畢竟程式的概念太多,要通通解釋太麻煩;而且有些東西我也看不懂。 想要了解這些程式碼的意義的人可以看一下用中文打的註解,我有大略說明每一行code所代表的意思。 複製上去之後應該會長這樣: ![](https://i.imgur.com/VH3VnCa.png) 打完記得儲存! ### 3. 讓Arduino認識紅外線接受器的系統 在上傳程式之前,我們必須先讓Arduino認識紅外線的函式庫,否則Arduino是無法解讀紅外線接受器的訊號的。 而要怎麼讓他們認識呢?詳細操作方式可以見下面影片: {%youtube 5bfJTu5tekY%} 建議全部看完。若覺得自己對Arduino有一定了解的話可以直接從2:47開始,5:00結束 ## 上傳! 接著就按下左上角的上傳。上傳成功的話下方的藍色框框會顯示"Done uploading"字樣,如圖: ![](https://i.imgur.com/KsNxKqf.png) 上傳完成之後,你的伺服馬達可能會突然轉動一下,這是正常的。 但現在去按你家的遙控器他是不會動的,因為這些程式只認得我的遙控器。必須對程式碼做一點點修改,才能讓讓程式認得你家的遙控器。 (不過如果你的遙控器跟我的型號一樣,那你可以試試看按1跟2,有機率伺服馬達就會開始轉動) 這時候要按下右上方的放大鏡: ![](https://i.imgur.com/SUzsDo6.gif) (這張圖是GIF喔 給他一點時間動起來) 會出現一個視窗,顯示"啟動紅外線接收器及序列埠"字樣 這時候就可以拿起你家的遙控器,然後對著紅外線接收器開始按按鈕了: 這時候,你可以發現,每個按鈕都在按下去之後,在視窗上出現屬於自己的數字, {%youtube vzLlCygmvHo%} 在你決定好哪兩個按鈕作為開燈按鈕與關燈按鈕之後,將按下按鈕之後第一個跑出的數字複製起來(因為長壓按鈕的話會有其他訊號),並在程式碼中雙等號的右邊貼上: /////////程式碼///////// if(results.value== [在此貼上開燈訊號]) //在兩個等號右邊把數字刪掉,填入你想要作為開燈按鈕發出的訊號值。像我的是2105361595 { myservo.write(47); //伺服馬達轉到47度 delay(500); //停止500毫秒 myservo.write(40); //伺服馬達轉到40度 } if(results.value==[在此貼上關燈訊號]) //在兩個等號右邊把數字刪掉,填入你想要作為開關按鈕發出的訊號值。像我的是2105377915 { myservo.write(0); //伺服馬達轉到0度 delay(500); //停止500毫秒 myservo.write(10); //伺服馬達轉到10度 } /////////程式碼///////// 然後再上傳一次,就可以試試看你在按按鈕時伺服馬達會不會轉動囉! {%youtube ouGWMnYYjGQ%} ## 設置! 上傳後就可以把USB頭從電腦上拔掉了。USB頭能夠插到任何手機充電器的變壓器上為他供電。剩下的就是在電燈開關上的配置。 ![](https://i.imgur.com/hXfboYJ.png) 這是我在電燈開關上的配置:將電燈開關的殼打開,用束帶繞一圈之後固定伺服馬達。 ## 注意! 若是照著我的配置去擺放伺服馬達,則務必注意,在你把插頭拆上的那一刻,伺服馬達的轉動手臂會轉到一個非常不自然的位置。接下來要嘛你的伺服馬達沒固定好被拱起來,要嘛你的伺服馬達的轉動手臂直接被彈飛。 所以建議在Arduino通電之後先按按鈕,讓手臂維持開燈的狀態再裝。 {%youtube 2opoliKnHnE%} 這樣就成功了ヽ(*´∀`)ノ゚ ### Have Fun!