本章重點
- 分析大同電風扇的電路接線
- 連接智慧插座實驗板到大同電風扇
主要設備
- 大同電風扇
- 智慧插座實驗板
重點說明
在本章中將以大同電風扇(如圖1)為改造對象,大同電風扇是屬於傳統型的電器,主要是由按鈕來控制電源開啟和風量。以下將首先分析風扇的電路設計,再將電路連接到智慧插座開發板,然後再撰寫程式,完成後即可透過手機app做遠端控制。
圖1 大同電風扇外觀
- 電風扇電路分析
將電風扇底板拆開後可以看到電路板(如圖2),對照電風扇的按鈕(如圖3)從左到右分別為關、強、中、弱。使用三用電表量測分析後,可以畫出電路連接圖(如圖4)。
圖2 電風扇電路板
圖3 電風扇按鈕
圖4 電風扇電路連接圖
- 連接智慧插座開發版
將電風扇電路版與智慧插座開發版依圖5焊接,完成時如圖6、圖7所示。再將智慧插座開發板固定於底座(如圖8),並將電風扇底板重新裝回即完成。
注意:由於電源為110V,建議將智慧插座開發板外加上一片絕緣保護罩以免觸電。
圖5 智慧插座開發板連接圖
圖6 電路板焊接完成圖
圖7 智慧插座開發板焊接完成圖
圖8 智慧插座開發板固定圖
- 撰寫程式
本範例要實做一個可以遠端控制的智慧電扇,共有3個lua程式,分別說明如下:
- init.lua:NodeMCU開機啟動檔。當NodeMCU一開機就會自動執行此檔案。我們將於此程式中將4個GPIO設為LOW,然後再執行wifi.lua啟動wifi連線。
- wifi.lua:啟動wifi連線。取得IP後會執行coap.lua。
- coap.lua:啟動CoAP Server接受連線。
init.lua
pin1=0 --智慧插座使用D0,D5,D6,D7這4個GPIO來控制relay pin2=5 pin3=6 pin4=7 gpio.mode(pin1, gpio.OUTPUT) --將D0設為OUTPUT模式 gpio.write(pin1, gpio.LOW) --將D0設為LOW gpio.mode(pin2, gpio.OUTPUT) --將D5設為OUTPUT模式 gpio.write(pin2, gpio.LOW) --將D5設為LOW gpio.mode(pin3, gpio.OUTPUT) --將D6設為OUTPUT模式 gpio.write(pin3, gpio.LOW) --將D6設為LOW gpio.mode(pin4, gpio.OUTPUT) --將D7設為OUTPUT模式 gpio.write(pin4, gpio.LOW) --將D7設為LOW dofile("wifi.lua") --執行wifi.lua去啟動wifi連線
wifi.lua
wifi.setmode(wifi.STATION) --將WiFi設定為station模式 wifi.sta.config("4Clab-2.4G", "12345678") --設定wifi SSID和密碼 tmr.alarm(0,1000,1, function() --設定一個timer。ID為0,每1000毫秒執行一次,不斷重複執行 print(wifi.sta.getip()) --印出目前的IP if wifi.sta.getip() ~= nil then --檢查是否取得IP dofile("coap.lua") --取得IP後執行 coap.lua tmr.stop(0) --關閉timer end end)
coap.lua
cs=coap.Server() --啟動CoAP Server cs:listen(5683) --監聽 udp port 5683 print("Coap Server Running...") get_socket1=0 --儲存socket1的狀態。初始化為0 cs:actuator("get_socket1") --產生一個叫get_socket1的resource用來GET socket1的狀態 function put_socket1(payload) -- PUT put_socket1這個resource時會執行的function if payload=="0" then --假如PUT的值為0 get_socket1 = 0 --將get_socket1設為0 gpio.write(pin1, gpio.LOW) --將D0設為LOW elseif payload=="1" then --假如PUT的值為1 get_socket1 = 1 --將get_socket1設為1 gpio.write(pin1, gpio.HIGH) --將D0設為HIGH end cs:actuator("get_socket1") --更新get_socket1這個resource的值 return get_socket1 --回傳get_socket1的值 end cs:actuator("put_socket1") --產生一個叫put_socket1的resource get_socket2=0 --儲存socket2的狀態。初始化為0 cs:actuator("get_socket2") --產生一個叫get_socket1的resource用來GET socket2的狀態 function put_socket2(payload) -- PUT put_socket2這個resource時會執行的function if payload=="0" then --假如PUT的值為0 get_socket2 = 0 --將get_socket2設為0 gpio.write(pin2, gpio.LOW) --將D5設為LOW elseif payload=="1" then --假如PUT的值為1 get_socket2 = 1 --將get_socket2設為1 gpio.write(pin2, gpio.HIGH) --將D5設為HIGH end cs:actuator("get_socket2") --更新get_socket2這個resource的值 return get_socket2 --回傳get_socket2的值 end cs:actuator("put_socket2") --產生一個叫put_socket2的resource get_socket3=0 --儲存socket3的狀態。初始化為0 cs:actuator("get_socket3") --產生一個叫get_socket3的resource用來GET socket3的狀態 function put_socket3(payload) --PUT put_socket3這個resource時,會執行的function if payload=="0" then --假如PUT的值為0 get_socket3 = 0 --將get_socket3設為0 gpio.write(pin3, gpio.LOW) --將D6設為LOW elseif payload=="1" then --假如PUT的值為1 get_socket3 = 1 --將get_socket3設為1 gpio.write(pin3, gpio.HIGH) --將D6設為HIGH end cs:actuator("get_socket3") --更新get_socket3這個resource的值 return get_socket3 --回傳get_socket3的值 end cs:actuator("put_socket3") --產生一個叫put_socket3的resource get_socket4=0 --儲存socket4的狀態。初始化為0 cs:actuator("get_socket4") --產生一個叫get_socket4的resource function put_socket4(payload) -- PUT put_socket4這個resource時,會執行的function if payload=="0" then --假如PUT的值為0 get_socket4 = 0 --將get_socket4設為0 gpio.write(pin4, gpio.LOW) --將D7設為LOW elseif payload=="1" then --假如PUT的值為1 get_socket4 = 1 --將get_socket4設為1 gpio.write(pin4, gpio.HIGH) --將D7設為HIGH end cs:actuator("get_socket4") --更新get_socket4這個resource的值 return get_socket4 --回傳get_socket4的值 end cs:actuator("put_socket4") --產生一個叫put_socket4的resource