SHT31 はセンシリオン製の高精度温湿度センサです。 精度は,温度が ±0.2℃,湿度が ±2% となっています。 今回は,STM32 マイコン(STM32F446RE)と接続して,温湿度を取得してみます。
SHT31 そのものは極小の表面実装パッケージで扱いにくいので,SHT31 を搭載した秋月電子の「SHT31使用 高精度温湿度センサモジュールキット AE-SHT31」(通販コード K-12125)を使用しました。
マイコンボードは,STMicroelectronics の STM32F446RE を搭載した NUCLEO-F446RE を使用しました。
マイコンとセンサの接続は I2C なので,SCL と SDA の2本を接続します。プルアップ抵抗は AE-SHT31 に内蔵されているので外付け不要です。
電源は 3.3 V を供給します。
ADR 端子のレベルでスレーブアドレスが決まります。 今回は ADR 端子を開放としました。 AE-SHT31 上でプルアップされているので,SHT31 の入力としてはハイレベルとなります。 この場合,スレーブアドレスは,0x45 となります。
温湿度を測定するには I2C で,測定用のコマンドを送信し,測定完了後に値を読み出すという流れになります。 測定コマンドはクロックストレッチの有無と,繰り返し精度の高,中,低の組み合わせで 6 通りあります。 今回は,クロックストレッチは使わずに,精度は高で測定してみます。測定開始のコードは以下のようになります。
uint8_t data[] = { 0x24, 0x00 }; // 測定コマンド,クロックストレッチ:無効,精度:高
HAL_I2C_Master_Transmit(phi2c, 0x45 << 1, data, 2, 1000);
測定にかかる時間は繰り返し精度によって変わります。 精度:高の場合,最大 15 ms かかるので,15 ms 以上待ってから,測定結果を読み取ります。
読み出すデータは全部で 6 バイトで,温度の測定値 2 バイトと CRC 1 バイト,湿度の測定値 2 バイトと CRC 1 バイトの順で送られてきます。 生の測定値を読み出すコードは以下のようになります。CRC のチェック等は省略しています。
uint8_t buf[6];
HAL_I2C_Master_Receive(phi2c, 0x45 << 1, buf, 6, 1000);
int ST = buf[0] << 8 | buf[1]; // 温度
int SRH = buf[3] << 8 | buf[4]; // 湿度
生の測定値を通常使われている単位(温度:℃,湿度:%RH) に換算するには次のようにします。
double T = -45.0 + 175.0 * ST / 65535.0;
double RH = 100.0 * SRH / 65535.0;
この記事で使ったものと違いますが,SHT31 を搭載したモジュールはアマゾンでも買えます。プルアップ抵抗も内蔵しているので AE-SHT31 と同じように使えそうです。