回路図
回路は以下の通り接続しました。
Raspberry Pi の設定
OSはRaspbianを使っていることを前提にします。
raspi-config
を使ってI2Cを有効化します。
Interfacing Optionsを選択し、次に I2Cを選択すると有効化できます。選択した後少し待たされますが画面が戻ってきたら以下コマンドで結果を確認します。
ls /dev/*i2c*
で、デバイスが作成されていることが確認できます。
/dev/i2c-1
という、ファイル名が出力されればI2Cが有効になっています。
i2cdetect -y 1
で、SHT31の各ADR(アドレス) 0x44, 0x45が表示されれば問題ありません。
プログラム
言語はpythonで作成しています。
$ sudo pip3 install smbus
$ vi sht31.py
#!/usr/bin/python3
import smbus
from time import sleep
def get_data(ADR):
ic = smbus.SMBus(1)
ic.write_byte_data(ADR, 0x30, 0xA2)
sleep(0.5)
ic.write_byte_data(ADR, 0x24, 0x00)
sleep(0.5)
d = ic.read_i2c_block_data(ADR, 0x00, 6)
t = d[0] << 8 | d[1]
t = int( 175 * t / 65535 - 45 )
h = d[3] << 8 | d[4]
h = int( h / 65535 * 100 )
return t, h
while 1:
ret_temp, ret_humi = get_data(0x44)
print( f'温度: {ret_temp} ℃, 湿度: {ret_humi} %' )
ret_temp, ret_humi = get_data(0x45)
print( f'温度: {ret_temp} ℃, 湿度: {ret_humi} %' )
print()
sleep(10)
$ chmod +x sht31.py
$ ./sht31.py
やってみた感想
繰り返して取得するようにwhileで回してみましたが、DHT11では10秒待ち時間を入れていても取得が何度も空振りする状況でしたが、SHT31では全く取りこぼし無くデータの取得を続けることが出来ました。ただし1個当たりの価格が3倍程違うのでそんなものかなと。
ADRは仕様で決まっており、I2Cバス上に2つしか認識させる事が出来なかった。マルチプレクサを間に挟むことによって接続ICを増やすことが出来ますが、1個で1000円以上するので必要に迫られない限りは見送りかな。。。
また、I2Cは機器内配線などの距離の短い用途の通信方式ですが、リピータなどを用いて数十メートルにまで伸ばすことも可能なので例えばサーバラック8ラック分程度ならマルチプレクサとリピータを用いて1つのRaspberry Piで収容できる構成が組めそうです。
Rasbianでsnmpdを起動してexecで測定結果を出力するようなスクリプトを組めば既存の監視システムなどのグラフを書く機能にそのまま利用できるかもしれません。dockerでzabbixを立ち上げたりして遊んでるので今度試してみようかな…