Raspberry Piに秋月電子で買ったI2C接続の温湿度センサモジュールを接続し温度と湿度を取得するための手順メモ.畑監視システムでは温度と湿度情報は,作物を元気に育てる環境を知るために必須.
使用機器
使用する機器は以下の通り.
- Raspberry Pi 2 model B
- 温湿度センサモジュール AE-SHT3X(秋月電子で購入)
※この温湿度センサは,データシート上では温度測定精度±0.2℃,相対湿度精度±2%RHとのこと.
配線と接続状態の確認
温湿度センサモジュールとRaspberry Piは以下のように接続する.
- 端子1(VDD)→ Raspberry Pi Pin01(3.3V)
- 端子2(SDA)→ Raspberry Pi Pin03(SDA1)
- 端子3(SCL)→ Raspberry Pi Pin05(SCL1)
- 端子4(ADR)→ 接続なし
- 端子5(GND)→ Raspberry Pi Pin06(GND)
この状態で,Raspberry PiのI2Cの機能を使ってまず簡単にI2C接続のテストをしておく.まずは以下のコマンド.
pi@raspberrypi:~ $ sudo raspi-config
すると以下のような画面になる.5つ目のInterfacing Optionsを選択すると,以下の画面となる.これのI2Cを選択して,Enable(有効)にする.その後,一度再起動するとI2C機能ターミナル上で簡単に使えるようになる.
再起動出来たら,ターミナル上で以下のようにコマンドを打ってみる.
pi@raspberrypi:~ $ sudo i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- 45 -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
i2cdetetコマンドは,接続されているI2Cデバイスを検出し,そのアドレスを表示してくれる.温湿度センサモジュールのアドレスは,アドレスピンをどこにも繋いでいない状態では0x45とデータシートに書いてあるので,これが検出されていることがわかる.これで,正しく配線ができていることがわかった.
Python3でのプログラム
以下のようなプログラムを作成.ライブラリが落ちてなかったので,以下のサイトを参考にさせて頂きながらササっと書いて時間短縮.
(https://www.denshi.club/pc/raspi/post-8.html)
import smbus import time i2c = smbus.SMBus(1) addr=0x45 def sign16(x): return ( -(x & 0b1000000000000000) | (x & 0b0111111111111111) ) while 1: #send address i2c.write_byte_data(addr,0xe0,0x0) #read data data = i2c.read_i2c_block_data(addr,0x0,6) #calculate temparature data raw_data_T = ((data[0]) << 8) | (data[1]) calc_T = sign16(int(hex(raw_data_T),16)) Temparature = round(-45 + 175 * calc_T / (2**16 - 1), 1) #calculate humidity data raw_data_RH = ((data[3]) << 8) | (data[4]) RelativeHumi = round(100 * raw_data_RH / (2**16 - 1), 1) #print data print (str(Temparature) +"degC") print (str(RelativeHumi) +"%RH") #wait for data conversion time.sleep(1)
湿度に関しては測定精度±2%RHだが,温度に合わせてとりあえず少数第一位にしている.これをターミナル上でコンパイルすると以下のようになる.
pi@raspberrypi:~ $ sudo python3 i2c_temp.py i2c_temp 19.0degC 48.9%RH 19.0degC 48.9%RH 19.4degC 48.9%RH 20.2degC 52.3%RH 19.9degC 59.2%RH 19.9degC 61.9%RH 19.8degC 61.7%RH 19.7degC 60.5%RH 19.7degC 59.2%RH 19.7degC 57.8%RH
温度と湿度が取得できていることを確認.本当に計測できているか不安だったので息を吹きかけている.息を吹きかけたら温度と湿度が上昇しているので,何となく測定できてそう.とりあえず今回は時間がないのでI2Cの波形確認などそういうのは無しで…時間あればいつか追記・解説します…