編集履歴一覧に戻る
akira.keiのアイコン画像

akira.kei が 2026年06月21日21時47分31秒 に編集

コメント無し

本文の変更

-

[<前の記事](https://elchika.com/article/52bc6697-ec67-44e5-bb41-cb855c59d945/) : 次の記事>

+

[<前の記事](https://elchika.com/article/52bc6697-ec67-44e5-bb41-cb855c59d945/) : [次の記事>](https://elchika.com/article/c10b45e3-2d5a-4a5b-856a-94913bf7d287/)

## 次はSHT40iを使う [前の記事](https://elchika.com/article/52bc6697-ec67-44e5-bb41-cb855c59d945/)ではAHT21Bを使ってみたが、ここでは[SHT40i](https://akizukidenshi.com/catalog/g/g130207/)を使ってみる。[データシート](https://akizukidenshi.com/goodsaffix/SHT4xI.pdf)を見てみると、AHT21Bよりも若干高機能になっているが基本的な使い方は同じようなものだ。というより限定した使い方をまずは試してみて、必要に応じて拡張していくという感じだろうか。 ![SHT40i使用モジュール](https://akizukidenshi.com/img/goods/L/130207.jpg) 自前ライブラリの構成はAHT21Bと同じにするため、スケッチは名前以外は全て同一になる。 ```Arduino: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```と同一だ。 ```Arduino: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一択で十分だ。更にヒータを炊くコマンドもあるにはあるが、結露を晴らすとか自己診断に使うなどの機会があれば実装するようにしようか。 ```temperature```も```humidity```もfloatで返しているので計算コストが高いが、今回はこれで良しとする。ただ割り算の分母が65536では無く65535なのでシフト演算に直すにはちょっと工夫が必要だ。 ```Arduino: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%」なので、湿度表示に若干の乖離がある。 ![シリアルモニタ](https://camo.elchika.com/c1cdf6125de5deab783edd065c89d9de51782074/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f33363031626666382d633530632d343762382d613765362d3531663731393163323336642f35336563653838612d666536382d343136662d393838382d373062653161376663663664/) ---

-

[<前の記事](https://elchika.com/article/52bc6697-ec67-44e5-bb41-cb855c59d945/) : 次の記事>

+

[<前の記事](https://elchika.com/article/52bc6697-ec67-44e5-bb41-cb855c59d945/) : [次の記事>](https://elchika.com/article/c10b45e3-2d5a-4a5b-856a-94913bf7d287/)