Raspberry Pi Pico WにGROVE温度・湿度センサ(DHT20)をつなぐ

先日、「Raspberry Pi Pico W」で、一定時間毎にランダムな数値をWebサーバに送信(HTTP GETリクエスト)するプログラムをつくりました(記事は こちら)。
今回は、先日のプログラムの「ランダムな数値」の部分を「センサから取得したデータ」に置き換え、本物のIoTデバイスとして仕上げようと思います。


今回は、「GROVE – デジタル温度・湿度センサ(DHT20)」を使います。
このセンサで、1分毎に温度データを採取し、Webサーバに送信することとします。

このセンサはI2C出力です。
また、こちら のドキュメントによれば、「Raspberry Pi Pico W」のI2Cピン(デフォルト)は以下のようになっているとのことです。

I2C0 SCLPin 9
I2C0 SDAPin 8
I2C1 SCLPin 7
I2C1 SDAPin 6

よって今回は「I2C1」を使うこととし、「Raspberry Pi Pico W」と「DHT20」を以下のようにつなぎます。

Raspberry Pi Pico WDHT20
GNDGND
3V3(OUT)VCC
6SDA
7SCL

「DHT20」でのデータ採取方法については、こちら を参考にします。

こちら から、DHT20用のライブラリをダウンロードします。
ダウンロードしたファイルを解凍し、中に入っている「dht20.py」を「Thonny」で開きます。
「ファイル」>「名前を付けて保存」で、開いた「dht20.py」を「Raspberry Pi Pico W」に保存します。その際、名前は「dht20.py」のままにしておきます。

以下のとおり、プログラムをつくります。

from machine import I2C
from dht20 import DHT20
i2c = I2C(1)
dht20 = DHT20(i2c)
while True:
    temper = dht20.dht20_temperature()
    humidity = dht20.dht20_humidity()
    print("temper : " + str(temper))
    print("humidity : " + str(humidity)) 

これを「Raspberry Pi Pico W」に「main.py」という名前で保存し、「実行」ボタンをクリックすると、以下のようにシェルに温度と湿度が表示されます。

それでは、先日つくったプログラムに対し、「ランダムな数値」の部分を「センサから取得したデータ」に置き換えてみます。

import machine
import time
import network
import urequests
from machine import I2C
from dht20 import DHT20

i2c = I2C(1)
dht20 = DHT20(i2c)

led = machine.Pin("LED", machine.Pin.OUT)
led.value(1)

ssid = 'XXXXXXXX'
password = 'XXXXXXXX'

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
chipid = int.from_bytes(wlan.config('mac'), 'big') % 65536
wlan.connect(ssid, password)

max_wait = 10
while max_wait > 0:
    if wlan.status() < 0 or wlan.status() >= 3:
        break
    max_wait -= 1
    print('waiting for connection...')
    time.sleep(1)
    
if wlan.status() != 3:
    raise RuntimeError('network connection failed')
else:
    print('connected')
    status = wlan.ifconfig()
    print('ip = ' + status[0])

while True:
    led.value(1)
    value = round(dht20.dht20_temperature(), 1)
    url = "http://XXXXXXXX?chipid=RPI" + str(chipid) + "&val0=" + str(value)
    r = urequests.get(url)
    print(r.content)
    r.close()
    led.value(0)
    time.sleep(60)

これを「Raspberry Pi Pico W」に「main.py」という名前で保存します。

「Raspberry Pi Pico W」をパソコンから外し、ACアダプタにつないで電源供給すると、「Raspberry Pi Pico W」が動作開始します。
そのまましばらく置いておくと、このように温度データが取得できていました(Wabサーバ側のプログラムは、以前PHPでつくったものです)。

期待していたとおり、とても簡単にIoTデバイスをつくることができました。