[IoT] ESP8266+BroadLink實現進出房間自動開關燈 - (3) 材料及NodeMcu開發環境準備

房間的裝置搞定後,我們要有一個能發送HTTP Request的單晶片,以及感測器來偵測進出房門的事件。

材料清單

  • ESP8266開發板: NodeMcu v2、WeMos D1 mini或其它只要帶有USB接頭的都行
  • 人體紅外線模組 HC-SR501×2: 針腳朝上看過來,左邊的可變電組能調精度,右邊的調延時,將右邊的逆時針轉到底以將延時縮至最短
  • 麵包板 + 3條以上的4pin杜邦2.54排線(公對母): 拿半塊麵包板來接就夠了,隨時想拆方便
  • lcd1602螢幕(非必要): 讓你在開發時能直接看到單晶片的狀態,或直接在電腦上看UART輸出也行。選已焊上i2c模組的,3.3V為佳

開發環境

Windows或macOS都行,只要有裝Python及Java的環境。

開發工具

  • esptool.py: 用來寫入韌體到ESP8266
  • ESPlorer: NodeMcu專用的IDE,支援Windows及macOS,可以直接在上面編寫lua程式,並在儲存檔案時同步存至ESP8266執行,同時還能即時看到它UART的輸出訊息。個人的用法是在其它IDE上寫好lua,再開ESPlorer重載程式,並即時查看運行的情況

連接ESP8266

如果你的開發板是NodeMcu或WeMos的,那上面應當是搭載CP2102這個USB to UART晶片,可以在它的官方網站下載驅動。驅動搞定後,在Windows上會有Com x的連接埠,macOS是/dev/tty.wchusbserial*。詳細可以參考這篇文章來設定

韌體

NodeMcu不提供韌體下載,是由於它可以選擇要納入的模組而產出不同的韌體。簡單一點可以使用他們的雲端編譯服務,在Select modules那邊要確保以下這些模組有勾選

bit, file, gpio, http, i2c, net, node, rtcfifo, rtcmem, rtctime, sjson, tmr, uart, wifi

LFS options中的LFS size可以先選64KB,之後要用LFS時不用再重新寫入一次。

再來按下Statr your build後,大約十幾分鐘後就會收到編譯好的韌體,裡面會有float與int兩個版本,選float版來寫入。

寫入前最好先清除flash空間,如果預設的port不對的話可以再加上--port參數,像是--port COM3或者在macOS的--port /dev/tty.wchusbserial1410

esptool.py erase_flash

寫入韌體,這邊假設韌體檔案名稱為nodemcu-master-19-modules-2019-03-05-16-18-04-float.bin

esptool.py write_flash --flash_mode dio --flash_size 4MB 0x00000 nodemcu-master-19-modules-2019-03-05-16-18-04-float.bin

完成後便能以ESPlorer開啟連接埠,在連接後應當會出現像這樣的畫面,代表韌體沒問題。

若想看清頂端那一行亂碼內容,請將baud rate切換為9600(NodeMcu預設是115200)。這樣就能看到ESP原本開機時輸出的訊息,反之NodeMcu的訊息就會變亂碼了。想要兩種都看得到的話,可以參考官方文件將它的預設baud rate調為9600。

我在首次使用雲端編譯出來的韌體時曾出現過bootloop的情況,後來的解法是用它出的Docker image來編譯原碼,並在ESP8266寫入它產出的0x00000.bin, 0x10000.bin,然後就沒問題了。

測試功能

在ESPlorer開一個新的lua script,命名為test.lua,貼上以下程式碼後按Save to ESP或ctrl+s,成功的話便會看到LED閃爍了一次。

gpio.mode(4, gpio.OUTPUT)
gpio.write(4, gpio.LOW)
tmr.delay(500000) --500,000 us = 500ms = 0.5s
gpio.write(4, gpio.HIGH)

可以參考官方文件來瞭解NodeMcu的程式怎麼寫,其中比較常用的模組為gpio, tmr, wifi, file, http, node

硬體組裝

將兩個人體紅外線模組接上開發板上的5V電源,它吃3.3V會工作不正常。兩個模組的訊號輸出分別接至開發板的D1, D2接腳,這樣就搞定了。

如果有lcd1602,它的SDA -> D3,SCL -> D4,電源則看你買的是3.3V還是5V版來接。接好後記得調整一下它的對比度(背面的可變電阻)

人體紅外線感應模組加工

前面說過那120°的感應範圍太廣了,那就手動限制它的範圍。

  1. 找到一張紙板,像是某漢堡店外帶會放紙袋墊杯子的那厚紙板
  2. 把模組放在上面捲成一個四角柱
  3. 拿封箱膠帶固定好那四角柱的外型,並保包在裡面的模組不會亂跑即可
  4. 手放前面試試看它是不是真的變成只感應得到一線的範圍

測試硬體功能

執行這段程式來註冊D1、D2這兩個pin的外部中斷

function regTrig(pin)
  do
    gpio.mode(pin, gpio.INT, gpio.PULLUP)
    local function pinCallback(level)
      level = gpio.read(pin)
      if level == gpio.HIGH then
        print(pin, 'high')
      else
        print(pin, 'low')
      end
      gpio.trig(pin, level == gpio.HIGH and 'down' or 'up')
    end
    gpio.trig(pin, gpio.read(pin) == gpio.HIGH and 'down' or 'up', pinCallback)
  end
end

regTrig(1)
regTrig(2)
(點部落不還沒支援lua)

接下來把D1或D2接到vcc或gnd時應當就能在ESPlorer的終端視窗看到相應的訊息

high 1 low 1 high 2 low 2

lcd1602的部份,可以把lcd1602.lua上傳到ESP8266,並照裡面的example來測試。