[IoT] ESP8266+BroadLink實現進出房間自動開關燈 - (1) 感測器及主控器介紹

常說要「隨手關燈,節約用電」,但人就是懶得去按開關,那就讓它自動化吧。

如果只想看Code,請直接移步我的github

 

目標

進房間門時立即開啟所有燈,出門也馬上關燈。並且感測器不能比房間的LED燈泡還要耗電。

前言

自己房間有兩組使用BroadLink控制的燈,一組是牆上開關TC2,另一是接在智慧插座SP3,每次進房間都得按兩組燈的開關挺麻煩,故此開始想更方便的作法。

BroadLink提供的e-Control App能讓你在手機上控制他們家的產品。而它的缺點就是"一定"得把App打開後才能用(似乎挺合理的),不能設定什麼Trigger或捷徑、api來控制,故此每次都還得等app載入個快十秒才能操作,而且在外網連進時還常常會連不上裝置...

於是乎我找到了RM Plugin這個Android App能介接Broadlink RM Pro遙控主機,它能讓我建立開關燈的捷徑、用Tasker自動觸發、或以手機為Server並從電腦用HTTP GET/POST開控制。有了它我便有一個api來控制房燈了。

最初的作法是在我Android手機上的Tasker設定說連上房間的Wifi後便自動開,斷線時關閉。而缺點就是Wi-Fi必需等幾秒鐘才會連上,在這之前都只能摸黑。這樣不行,我必需另找感測裝置來用。

感測器

市面上已經有許多人體紅外線感應器能感測在有人經過時自動開燈,或者有人在燈下活動時才亮。但我認為那是在有動作的情況下才會感應到,我估計長時間坐電腦前會電影看到一半自動關燈,故此沒考慮現呈的產品。

我想自己組裝一個能感應進來與出去的感測器,就像百貨的人數計數器那樣,只是我不打算採用影像辨識的方式來感測。現在的目標是在門前感應兩條線的訊號,如下圖所示。先經過B再A是開燈,反之為關燈。

以下是我考慮過的感測器

  • 光柵: 兩個點一直線式的感測,最精準也最貴,常見於停車場會用來感測有沒有車在前面的那種。通常使用12V,感覺有點貴也有點耗電,先不採用
  • 紅外線距離感測器: 便宜、距離短、精度低,試了一款標榜能感測60cm的只測得到15cm距離
  • 雷射距離感應 VL53L0X: 範圍為一條線,對距離長短很精準,缺點是必需感應到平面來反射訊號回去才能感應得到,手放前面還得抓到接近水平的角度才感應得到
  • 超音波距離感應: 怕會吵到貓貓,買來了還沒試
  • 人體紅外線感應模組: 120度範圍內人體紅外線強度不同時會觸發,距離兩公尺沒問題

最後我決定使用人體紅外線模組,再拿個紙板包成管狀來套上去以限制它只感應一條線的範圍了

主控器

即然要作硬體就得找個單晶片來控制它。我選擇了ESP8266這塊搭載W-Fi功能的IoT晶片,它其中一個特色就是便宜,一個附USB上傳功能的開發板百元有找(網路價)。

這塊單晶片因為便宜所以被用的很廣範,因此也有開發者作了其它非官方的寫法。

  • RTOS: 官方SDK,使用C語言編寫,如同一般單晶片一樣每次編譯後都得將韌體整個重新寫入,故此每改完程式要測試都要個20~30秒等它上傳
  • Arduino: 將官方SDK套上Arduino的語法,也是最多人用的寫法,許多模組都有實作它的Lib可以直接使用
  • NodeMcu: Lua語言。特色是只要寫入一次韌體,再將寫好的lua腳本存入晶片的儲存空間執行。改完程式後只要將那段程式碼重新上傳就好,開發測試過程很快

經過一段時間的選擇障礙並全都過試一次後,我決定使用NodeMcu作為主要的開發框架,即便它即有的模組Library並沒有Arduino那麼多。