ESP-01S繼電器模組-最便宜的智慧開關?!
對,它很便宜,百元有找,目前我還沒有看到比它更低價的智慧開關,不過說到底,它只是個模組,所以需要具備一些基礎知識,才有辦法讓它發揮效用。
本文將分享如何透過ESP-01S繼電器模組搭配Tasmota韌體並以MQTT協定串連至Home Assistant (HA)。文中亦會提及ESP-01S使用上的問題,以及解決方法。
動機
事情是這樣的: 家裡廁所的電燈開關是跟抽風機並聯的,所以電燈跟抽風機是同時開關的。這是一個常見的設計,但是滿不理想的,因為:
- 洗完早廁所濕度飆高,離開廁所必須要把燈開著抽風機才會保持運作,但是會忘記關啊!
- 有時候濕氣很重想把抽風機打開,但是燈也得跟著打開,挺浪費電的,而且,還是會忘記關啊!
我曾經想過要把抽風機的線單獨拉出來給並它一個獨立開關,但是:
- 拉線很煩,人生好難
- 我可能會忘記開,開了也不知道要開多久,重點是:我還是會忘記關啊!
解決方法: 一切就交給廁所的濕度去決定抽風機開關就好了啊!
材料
- 濕度計
- ESP-01S
- ESP-01S繼電器模組
- 470μF電容
- 110V轉5V降壓模組
以下是關於材料的詳細說明:
電源
ESP-01S繼電器模組的工作電壓是5V,但ESP-01S的工作電壓是3.3V,不過不用擔心,模組本身有AMS1117去做降壓的動作,所以請放心以5V供電即可。我的話是直接拿5V USB變壓器做供電來源,如果你身邊有手機充電器,多半也都是可以用的,建議輸出電流至少要1A以上。
ESP-01S繼電器模組
網路上有兩種版本:
- ESP-01S Relay v1.0
- ESP-01S Relay v4.0
兩者長得差不多,但v4.0多了一個PC817光耦元件去做隔離市電與控制電路(當然還有其他部分的提升,就不在此贅述),所以買得時候注意一下,因為賣家不一定會標示清楚,請務必注意!
濕度計
只要能夠接入HA的濕度計都好。我自己是用小米藍芽溫濕度計2。
接線
此圖僅供參考,接線時請以背板的標示為主。
等等,好像有bug?
在通電的那瞬間,繼電器會發出「啪啪」兩聲,那是繼電器快速開關的聲音。請看以下影片:
雖說繼電器模組會保持通電狀態,所以也只會發生在第一次接上去的時候,不過如果遇到停電復電的狀況,那就不有趣了,而且這件事情對電器本身傷害也是挺大的。
該如何解決呢?
TL;DR
拿一個470μF電容與PC817並聯即可。
電容正極焊接至PC817的Pin1(左上角)
電容負極焊接至PC817的Pin2(左下角)
請務必不要接反!
以下是我焊完的樣子,不過被ESP-01S擋住了,所以請參考別人的完工圖。
原理
此模組是用GPIO0透過PC817去控制繼電器,而GPIO0在通電瞬間會被上拉,隨即降至0V,所以會有「瞬間開關」的狀況。並聯電容的目的就是不要在通電瞬間讓電流經過PC817的Pin1與Pin2,而是優先走向阻抗較低的電容。根據這篇文章的實驗,這個「瞬間」大概是0.1秒,所以我們只要讓電容充電時間大於0.1秒即可,而根據RC時間常數公式,我們可以計算出:
τ = R x C = 470Ω x 470 μF ≈ 0.2 sec
而0.2秒> 0.1秒,所以解決了「瞬間開關」的問題(參考:Github)。
其他解法
以下兩種是其他網友分享的經驗,也可以試試看。
-
改用GPIO3(RX)控制繼電器
我覺得其實這個方法是最好的,因為GPIO3在通電時就會保持0V,是個穩定可用的Pin。 有人是在pin那邊動手腳,有人則是直接改PCB的電路。 -
在VCC加上一個10KΩ的電阻,然後在GPIO0到GND之間也加一個10KΩ的電阻 網友Arismane在Github上面提到此做法,接線圖可以參考這裡。
所以,到底發生什麼事情了?
此模組是用GPIO0來控制繼電器,而萬惡的起源就是這個GPIO0。上面提到,在ESP8266通電的時候,約莫有0.1秒的時間GPIO的電壓不會是0V。這是bug嗎?並不是,ESP8266設計上就是這樣。GPIO0如果在啟動階段被下拉了,那就是準備進入燒錄模式,所以GPIO0其實不算是一個「可以放心使用的Pin」。
網路上的討論
上網研究了一下,發現這個問題已經被討論到爛掉了,以下是我整理出來的連結:
- How to prevent flickering relay upon waking from deep sleep using ESP01 board? (StackExchange)
- Relays triggers on boot of ESP-01 (Arduino Forum)
- ESP8266 RELAY MODULE (Arduino Forum)
- ESP-01/01S RELAY V4.0 FLICKER ON STARTUP (ESP8266 Forum)
- LED FLICKER DURING ESP-01 STARTUP (GPIO0 / GPIO2 USAGE) (ESP8266 Forum)
- Relay flickers on boot #1 (Github)
- GPIO Pins goes “HIGH” a short pulse on boot #421 (Github)
看完這麼多,你是不是覺得…我幹嘛不要用這個模組就好了…
Tasmota
我是用Tasmotizer燒錄,韌體請至官網下載。 成功連到Tasmota管理頁面後,請依照下列做設定。
Configure Module
請至 Configuration > Configur Module
頁面做設定。
因為此模組為低電平觸發,所以這裡將GPIO0設定為Relay_i (i
就是 inverse 的意思),後面數字是什麼無所謂,預設為1
。
Configure MQTT
在 Configuration > Configure MQTT
下,填入MQTT broker的資訊及密碼。其他像是Client、Topic或是Full Topic,如果你不清楚這些代表的意義,用預設值即可。
Configure Other
記得要去這邊Configuration > Configure Other
這邊把 MQTT enable 打勾。
Console
請至 Console
頁面下,輸入SetOption19 1
後,按下Enter即可。這個動作是向HA發送有關這個繼電器模組的設定,HA收到這則訊息則會將此裝置註冊完畢(前提是HA的MQTT Auto Discovery是開啟的,預設是開啟的)。
Home Assistant
接下來,在HA裡面的裝置就可以看到以下畫面:
Automation
這邊分享如何完成讓濕度控制抽風機開關的yaml檔案,不過建議是用HA提供的編輯器直接編輯會比較方便啦。
設定 濕度超過75%即開啟抽風機
alias: Turn On Exhaust Fan
description: 'Turn on exhaust fan while humidity is higher than 75%'
trigger:
- platform: numeric_state
entity_id: sensor.humidity # 請填入濕度計的entity_id
above: '75'
condition: []
action:
- type: turn_on
device_id: 80049305cc3488cf17c135a21694fb92
entity_id: switch.exhaust_fan
domain: switch
mode: single
設定 濕度低於75%即關閉抽風機
alias: Turn Off Exhaust Fan
description: 'Turn off exhaust fan while humidity is lower than 70%'
trigger:
- platform: numeric_state
entity_id: sensor.humidity
below: '70'
condition:
- condition: device
type: is_on
device_id: 80049305cc3488cf17c135a21694fb92
entity_id: switch.exhaust_fan
domain: switch
action:
- type: turn_off
device_id: 80049305cc3488cf17c135a21694fb92
entity_id: switch.exhaust_fan
domain: switch
mode: single
結語
使用安全上請注意不要超過繼電器上標示的最大電流,接線時也請務必斷電,以免造成危險。這麼便宜好用的東西,不用嗎?我覺得很可以! (好啦,其實時間才是最貴的部分…)