GetImage

智慧電風扇

本章重點

  • 分析大同電風扇的電路接線
  • 連接智慧插座實驗板到大同電風扇

主要設備

  • 大同電風扇
  • 智慧插座實驗板

 

重點說明

在本章中將以大同電風扇(如圖1)為改造對象,大同電風扇是屬於傳統型的電器,主要是由按鈕來控制電源開啟和風量。以下將首先分析風扇的電路設計,再將電路連接到智慧插座開發板,然後再撰寫程式,完成後即可透過手機app做遠端控制。

智慧電風扇-圖1

圖1 大同電風扇外觀

  1. 電風扇電路分析

將電風扇底板拆開後可以看到電路板(如圖2),對照電風扇的按鈕(如圖3)從左到右分別為關、強、中、弱。使用三用電表量測分析後,可以畫出電路連接圖(如圖4)。

智慧電風扇-圖2

圖2 電風扇電路板

智慧電風扇-圖3

圖3 電風扇按鈕

智慧電風扇-圖4

圖4 電風扇電路連接圖

  1. 連接智慧插座開發版

將電風扇電路版與智慧插座開發版依圖5焊接,完成時如圖6、圖7所示。再將智慧插座開發板固定於底座(如圖8),並將電風扇底板重新裝回即完成。

注意:由於電源為110V,建議將智慧插座開發板外加上一片絕緣保護罩以免觸電。

智慧電風扇-圖5

圖5 智慧插座開發板連接圖

 

智慧電風扇-圖6

圖6 電路板焊接完成圖

智慧電風扇-圖7

圖7 智慧插座開發板焊接完成圖

智慧電風扇-圖8

    圖8 智慧插座開發板固定圖

 

  1. 撰寫程式

本範例要實做一個可以遠端控制的智慧電扇,共有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

 

 

Posted in CoAP, DIY實作, IoT相關訊息, Lua, NodeMCU.

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *


*