akira.keiのアイコン画像
akira.kei 2026年06月21日作成 (2026年06月21日更新) © MIT
セットアップや使用方法 セットアップや使用方法 閲覧数 27
akira.kei 2026年06月21日作成 (2026年06月21日更新) © MIT セットアップや使用方法 セットアップや使用方法 閲覧数 27

Arduino IDEでI2C接続温湿度センサーを使う(その2):SHT40i

<前の記事 : 次の記事>

次はSHT40iを使う

前の記事ではAHT21Bを使ってみたが、ここではSHT40iを使ってみる。データシートを見てみると、AHT21Bよりも若干高機能になっているが基本的な使い方は同じようなものだ。というより限定した使い方をまずは試してみて、必要に応じて拡張していくという感じだろうか。
SHT40i使用モジュール

自前ライブラリの構成はAHT21Bと同じにするため、スケッチは名前以外は全て同一になる。

SHT40i-Test.ino

#include "Wire.h" #include "SHT40i.h" SHT40i meas = SHT40i(0x44); void setup() { Serial.begin(115200); Wire.begin(); meas.begin(); } byte cnt=0; void loop() { meas.measure(); Serial.print(cnt++); Serial.print(", SHT40i, MEAS-T-H. "); Serial.print(meas.temperature()); Serial.print(", "); Serial.println(meas.humidity()); delay(1000); }

ヘッダファイル「SHT40i.h」

オリジナルライブラリのヘッダファイルSHT40i.hの内容を以下に示す。内容はAHT21B.hと同一だ。

SHT40i.h

#ifndef SHT40i_h #define SHT40i_h #include <inttypes.h> #include "Arduino.h" class SHT40i { public: SHT40i(uint8_t); void begin(void); void measure(void); float temperature(void); float humidity(void); private: uint8_t _adrs; uint8_t data[6]; }; #endif

ライブラリ本体「SHT40i.cpp」

ライブラリの中身はAHT21B.cppと同程度にシンプルにした。SHT40iはステータスを返さないのでbeginではソフトウェアリセットをして初期化終了だ。測定のmeasureもHigh Precision測定要求コマンドである0xFDを送るだけだ。コマンドにはこの他にMediumとLow Precisionがあるが、1秒毎程度にずっと計測するなら0xFD一択で十分だ。更にヒータを炊くコマンドもあるにはあるが、結露を晴らすとか自己診断に使うなどの機会があれば実装するようにしようか。
temperaturehumidityもfloatで返しているので計算コストが高いが、今回はこれで良しとする。ただ割り算の分母が65536では無く65535なのでシフト演算に直すにはちょっと工夫が必要だ。

SHT40i.cpp

#include "SHT40i.h" #include "Wire.h" #include <inttypes.h> #include "Arduino.h" SHT40i::SHT40i(uint8_t adrs) { _adrs=adrs; } void SHT40i::begin(void) { delay(100); Wire.beginTransmission(_adrs); Wire.write(0x94); // ソフトリセットコマンド Wire.endTransmission(); delay(1); } void SHT40i::measure(void) { Wire.beginTransmission(_adrs); Wire.write(0xfd); Wire.endTransmission(); delay(9); Wire.requestFrom((int)_adrs,(int)6); byte i=0; while(Wire.available()) data[i++]=Wire.read(); Wire.endTransmission(); } float SHT40i::temperature(void) { uint16_t raw=((uint16_t)data[0])<<8 | (uint16_t)data[1]; float t=-45.0 + 175.0 * (float)raw / 65535.0; return t; } float SHT40i::humidity(void) { uint16_t raw=((uint16_t)data[3])<<8 | (uint16_t)data[4]; float h = -6.0 + 125.0 * (float)raw / 65535.0; return h; }

実行してみると、シリアルモニタには以下のように表示される。隣に置いた安物の温湿度計表示は「29.9℃、63%」なので、湿度表示に若干の乖離がある。

シリアルモニタ


<前の記事 : 次の記事>

akira.keiのアイコン画像
機械系エンジニアだが電子工作を趣味としている。週末はひとりバーベキュー。
ログインしてコメントを投稿する