SHT3x(SHT30 SHT31 SHT35)で温湿度管理

本日2本目です♪

Otohiがボールパイソンのにょろちゃんを飼っているので、ケージの温湿度管理をRaspberryPi + SHT3xでやってみた記録です♪

構成としてはPythonでsmbus2というライブラリを使い、I2C経由でSHT3xの温湿度をデータベースに記録して、そのデータをPHPで読み出してLAN内Webサーバで配信というものです。

Webサーバでの配信に関しては、SHT3xは関係ないので、今回はPythonで値を読み出すところまでにしようと思います。

まず、RaspberryPiの事前設定として、config.txtに”dtparam=i2c_arm=on”という1行を追加して再起動し、I2Cインターフェースが”/dev/i2c-1″として認識されるようにしておきます。

その上で”apt”や”dnf”にて”i2c-tools”というパッケージをインストールして、GPIOピンに接続したSHT3xが検出されているかを確認できるようにしておきます。

$ sudo apt-get install i2c-tools
or
$ sudo dnf install i2c-tools

一旦電源を落とした上でSHT3xを接続し、起動します。

接続する際のピンは物理ピン番号(公式のドキュメント)で、
Vcc→1pin(3.3V)
GND→6pin(GND)
SDA→3pin(SDA)
SCL→5pin(SCL)
としましたが、Vccは3.3V or 5V・GNDはGNDであればどのpinでもOKです。

再起動した後にターミナルで”i2cdetect -y 1″と実行するのですが、RaspberryPi OSの場合、i2cグループに入っているユーザならsudoしなくてもアクセスできるようです。

その他のOSを利用されている方やユーザがi2cグループに所属していない場合はsudoをつけてroot権限で実行してください。

$ i2cdetect -y 1
or
$ 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: -- -- -- -- 44 -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

正常に認識されていれば、上記のように44(もしくは45)という表示がされています。

表示されていない場合や、コマンドでエラーが出る場合は、i2ctoolsのインストールがキチンとされているかや、センサーモジュールが指定のピンに確実に接続されているか等を確認してください。

表示が出ていればあとは、PythonからI2Cのライブラリ経由で値を読み出すだけです。

実行する前に”pip”で”smbus2″ライブラリをインストールしておきます。

$ pip install smbus2

“venv”等の仮想環境を利用したい方は仮想環境内のPythonにインストールしてください。

そして下記のコードをファイルに保存し、実行してみてください。

import smbus2, time # i2cを扱うためのsmbus2と、sleepを使うためのtimeをimport

bus = smbus2.SMBus(1) # i2c-1
のバスを選択

SHT3x_ADDR              = 0x44 # SHT3xのアドレス
SHT3x_MODE                = 0x2C # シングルショット
SHT3x_HIGH              = 0x06 # 高精度
SHT3x_READ              = 0x00 # 読み出しアドレス

# SHT3xを高精度シングルショットモードにて読み出し
bus.write_i2c_block_data(SHT3x_ADDR,SHT3x_MODE,SHT3x_HIGH)

# 最大測定時間待つ
time.sleep(0.2)

# データ読み出し
data = bus.read_i2c_block_data(SHT3x_ADDR,SHT3x_READ,6)

# 最初の2バイトが温度データ
t_data = data[0] << 8 | data[1]

# 4・5バイト目が湿度データ
h_data = data[3] << 8 | data[4]

#3・6バイト目は温度・湿度の各チェックサムだが、今回は利用しない

# 温度(℃)の計算式 = -45 + 175 * t_data / (2^16 -1)
Temp = round(-45.0 + 175.0 * float(t_data) / 65535.0, 1) # 小数点第1位までに丸める
# 湿度の計算式 = 100 * h_data / (2^16 -1)
Humi = round(100.0 * float(h_data) / 65535.0, 1) # 小数点第1位までに丸める

# 表示
print('温度 : ' + str(Temp))
print('湿度 : ' + str(Humi))

上記コードを実行すると、

$ python sht3x.py
or
$ sudo python sht3x.py
温度 : 28.7
湿度 : 65.3

のように出力されます。

上記のコードに書かれている定数等はデータシートに記載されているので、その他のモードでの測定等をされたい方は適宜書き換えてみてください。

こんな感じで、cronで定期的に実行して取得したデータをデータベースに保存して、ブラウザから確認できるようにしています。

I2Cを使うとコードの数も少なく、スッキリ配線できる上に測定等も簡単なので、その他センサー等も試してみたくなりますね!

今回はここまでです。ではまた~♪

コメントを残す