使用uPython製作溫度感測IoT

上一場的創客技術營教大家準備了安裝好MicroPython直譯器的開發板,這個禮拜講師喵喵繼續帶領大家用他來做一個簡單的IoT應用–溫度感測裝置。

整個教學流程分為三個部分:

  1. I/O控制測試
  2. 使用溫度感測器
  3. 透過無線的方式(WiFi)控制I/O,讀取溫度感測器的溫度。

1. I/O控制測試

喵喵講師設計的開發板上頭有兩顆可以控制的LED,由電路圖可以看出其中一顆由ESP8266的GPIO10來控制

GPIO10_LED.png

但是另一顆在天線旁邊的好像是ESP-12這個模組內建的,所以電路圖中看不出來,不過課程中講師喵喵說他的控制是GPIO2。那麼讓我們先來試試看用REPL的方式來控制這兩顆LED燈。

其中,我們把這兩顆LED重新命名一下: pin0 and pin1,各自使用ESP8266的GPIO2和GPIO10. 程式如下。

from machine import Pin
import time
pin0 = Pin(2, Pin.OUT)
pin1 = Pin(10, Pin.OUT)
for i in range(10):
  pin0.value(0)
  pin1.value(1)
  time.sleep(0.5)
  pin0.value(1)
  pin1.value(0)
  time.sleep(0.5)

看到兩顆LED燈交互閃爍一陣子,可以確認老師設計的板子功能和接線正常。(這是當然的啦XD)


2. 使用溫度感測器

我使用的是DS18B20這顆溫度感測器,他使用onewire這種通訊格式,顧名思義只要一條線就可以通訊,在硬體接線上非常方便。不過onewire接線方式我在這塊板子上讀到的溫度怪怪的,所以就用一般的接線方式把他接起來,接線方式如下:

pin1黑線: GND

pin2(黃線): GPIO4

pin3(紅線): 3.3V (VCC or 5V亦可)

IMAG0601_1

測試程式如下:

from machine import Pin
import onewire
ow = onewire.OneWire(Pin(4))
import time, ds18x20
ds = ds18x20.DS18X20(ow)
roms = ds.scan()
ds.convert_temp()
time.sleep_ms(750)
for rom in roms:
  print(ds.read_temp(rom))

執行之後會顯示量測到的溫度。


3. 透過無線的方式(WiFi)控制I/O,讀取溫度感測器的溫度。

這部分可以分為三個部分,第一個部分是要先將ESP8266設置成AP mode,並設置他的SSID以及密碼,這部分似乎只要執行一次就會燒錄在ESP8266的rom裡面,因為斷電之後重開這些設定還會存在。程式碼如下:

import network

ap = network.WLAN(network.AP_IF) # create access-point interface
ap.active(True) # activate the interface
ap.config(essid=’ESP-AP’) # set the ESSID of the access point
ap.config(password=’12345678′) # set the password of the access point
ap.ifconfig((‘192.168.4.1’, ‘255.255.255.0’, ‘192.168.4.1’, ‘168.95.1.1’))

第二個部分是直接取用網路上David Gouveia大神寫好的簡單測試程式,將ESP8266設置成AP mode,讓我們用WiFi連上去。然後他也開啟了http的socket,讓我們用http方法和他溝通。這個部分可以直接參考下面這個網站:

Controlling relays using Micropython and an ESP8266

只要修改第5行,把relay的pin改成2和10就可以直接來試試看了

RELAYS = [machine.Pin(i, machine.Pin.OUT) for i in (2, 10)]

執行程式之後,可以看到開發板回覆 listening on (‘0.0.0.0’, 80),表示正在等待我們的命令。

斷開原本的WiFi連線,改用第一部分我們所設置的SSID那個WiFi,打開瀏覽器,在路徑上輸入

http://192.168.4.1  –>網頁回應 “hello! …."

http://192.168.4.1/getPinStatus  –> 網頁回應 “RELAY STATUS: 0 0″

http://192.168.4.1/setPinStatus?pin=0&value=0  –> 網頁回應 “SET RELAY: PIN 0 set to 0″

http://192.168.4.1/setPinStatus?pin=0&value=1  –> 網頁回應 “SET RELAY: PIN 0 set to 1″

下setPinStatus命令的同時也可以觀察到板子上LED的變化。

根據David Gouveia的說明,他的程式並不完美,可能還有很多bug,不過基本的功能算是已經具備了。我在測試的時候的確發覺有的時候網頁會沒有反應,但是路徑列重刷幾次就可以了。

第三個部分是把溫度感測的code加進去,也就是整合兩個程式。整合好的範例可以去喵喵講師的github下載(使用dht-11)。

P.S 喵喵講師的code已經整合了以上三個部分。

不過使用上要特別注意排版的問題,因為python語法是使用縮排來作為程式方塊的區隔,使用複製貼上的話有可能格式會跑掉,請注意喔!

最後喵喵講師特別補充了一下可以將程式上傳到開發板,這樣只要一上電他就可以自動開工啦。步驟如下:

打開命令視窗,進到程式所在路徑,請將程式命名為main.py

執行: ampy -p comx put main.py

uPython開發板就會在每次開機自動執行main.py了。

發表留言