ラズパイ5 pythonの仮想環境 ⑤ 温湿度センサSHT45<その2>
温湿度センサSHT45は、SHT3xの後に出てきたSHT4xの中でも確度の高いモデルです。
SHT31は、このWebでも何度も取り上げています。
Adafruitが販売している温湿度センサSHT4xボードは、執筆時点で3種類あります。I2Cバスのアクセスなどの使い方は、まったく同じです。
SHT40 | SHT41 | SHT45 | |
湿度 | ±1.8% typ (25~75%) |
±1.8% typ (25~75%) |
±1% typ (25~75%) |
---|---|---|---|
0 ~ 100% RH での標準確度は ±3% | 0 ~ 100% RH での標準確度は ±2% | ||
温度 | ±0.2 °C typ (0~75 °C) |
±0.2 °C typ (0~75 °C) |
±0.1 °C typ (0~75 °C) |
I2Cのスレーブ・アドレスは0x44と0x45が利用できるが、工場出荷時の設定なので、ここで利用でするAdafruitの製品は0x44固定です。
●AdafruitのStemma QT/Qwiicボード
Stemma QT/Qwiic(JST SH 4ピン)コネクタは2か所に装着されていて、どちらにつないでもかまいません。このコネクタを使ってI2Cで制御する場合、特に、ジャンパ線をつなぐなどは不要です。
コネクタは、表と裏のどちらも差し込めそうですが、ピンが内部の上部に並んでいるので、差し込める方向は一意です。ロック機構はないですが、すぐに抜けるということはありません。
●温湿度センサSHT45のおもなスペック
- 電源電圧 1.08~3.6V
- 平均供給電流 0.4 µA
- 湿度 確度;±1.0%RH、分解能;0.01%RH 応答速度;4秒
- 温度 確度;±0.1℃、分解能;0.01℃ 応答速度;2秒
- ヒータ内蔵
- インターフェース I2C(0~400kHz)
- スレーブ・アドレス 0x44(固定)
●環境
- ハードウェア Raspberry Pi 5(4GBモデル)
- OS Raspberry Pi OS (64ビット)、リリース日December 5th 2023
- Windows10 22H2にて、ssh(OpenSSH_9.2p1 Debian-2+deb12u2, OpenSSL 3.0.11 19 Sep 2023)および、VNC Viewerを動作させている
●接続
●smbus2を使う
失敗しました。
SHT31と同じようにアクセスできると考え、smbus2ライブラリを利用してプログラムを作りましたが、6バイトのデータ読み出し部分でI/Oエラーになりました。
データシートによれば、I2Cバスからセンサのデータ読み出しは下記の仕様に従います(SHT3xとは異なる)。
i2c.write_byte(addr, 0xfd)
time.sleep(0.2)
data = i2c.read_block_data(addr,6)
i2c.read_byte(addr)を使って1バイト目は読めるのですが、そのあとがI/Oエラーとなって読み出せません。
●デバイス・ドライバを使う
ラズパイ2023年10月更新 bookworm ④ 気圧センサBME280をデバイス・ドライバで利用
の中で、sht4xがサポートされていることがわかります。
Name: i2c-sensor ... sht4x Select the Sensirion SHT4x temperature and |
sudo nano /boot/firmware/config.txtを立ち上げ、最後の行に、次の1行を追加します。
dtoverlay=i2c-sensor,sht4x
CTRL-Oで上書き保存をし、CTRL-Xでnanoを抜けます。rebootします。
リブート後システムが立ち上がったら、I2Cバスにつながっているセンサを表示します。
0x44のところはUUと表示され、SHT45のデバイス・ドライバが組み込まれたことを示しています。
/sys/bus/i2c/devices/1-0044/hwmon/hwmon2
に、temp1_inputとhumidity1_inputのテキスト・ファイルができています。1-0044は1-0045かもしれません、hwmon2はhwmon3かもしれません。
$ cat /sys/bus/i2c/devices/1-0044/hwmon/hwmon2/temp1_input
20133
$ cat /sys/bus/i2c/devices/1-0044/hwmon/hwmon2/humidity1_input
38506
どちらの千倍の整数値なので、20.133℃、38.506%だとわかります。
読み出しのプログラムです。
import time message = "Temp : %sC, Humi : %sRH" |
実行中の様子です。
I2Cバスの様子です。