Raspberry Piと温湿度センサモジュール(AE-SHT3X)をI2C接続する

Raspberry Piに秋月電子で買ったI2C接続の温湿度センサモジュールを接続し温度と湿度を取得するための手順メモ.畑監視システムでは温度と湿度情報は,作物を元気に育てる環境を知るために必須.

使用機器

使用する機器は以下の通り.

  • Raspberry Pi 2 model B
  • 温湿度センサモジュール AE-SHT3X(秋月電子で購入)

※この温湿度センサは,データシート上では温度測定精度±0.2℃,相対湿度精度±2%RHとのこと.


Raspberry Pi 2 Model B (1)

配線と接続状態の確認

温湿度センサモジュールとRaspberry Piは以下のように接続する.

  1. 端子1(VDD)→ Raspberry Pi Pin01(3.3V)
  2. 端子2(SDA)→ Raspberry Pi Pin03(SDA1)
  3. 端子3(SCL)→ Raspberry Pi Pin05(SCL1)
  4. 端子4(ADR)→ 接続なし
  5. 端子5(GND)→ Raspberry Pi Pin06(GND)

f:id:EleTECH:20190218223800p:plain
配線した状態
この状態で,Raspberry PiのI2Cの機能を使ってまず簡単にI2C接続のテストをしておく.まずは以下のコマンド.

pi@raspberrypi:~ $ sudo raspi-config

すると以下のような画面になる.

f:id:EleTECH:20190218224634p:plain
Raspi-config
5つ目のInterfacing Optionsを選択すると,以下の画面となる.
f:id:EleTECH:20190218224741p:plain
I2Cを有効にする
これの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の波形確認などそういうのは無しで…時間あればいつか追記・解説します…