次はSHT40iを使う
前の記事ではAHT21Bを使ってみたが、ここではSHT40iを使ってみる。データシートを見てみると、AHT21Bよりも若干高機能になっているが基本的な使い方は同じようなものだ。というより限定した使い方をまずは試してみて、必要に応じて拡張していくという感じだろうか。
自前ライブラリの構成は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一択で十分だ。更にヒータを炊くコマンドもあるにはあるが、結露を晴らすとか自己診断に使うなどの機会があれば実装するようにしようか。
temperatureもhumidityも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
さんが
前の日曜日の2:12
に
編集
をしました。
(メッセージ: 初版)
-
akira.kei
さんが
前の日曜日の2:39
に
編集
をしました。
-
akira.kei
さんが
前の日曜日の21:47
に
編集
をしました。
ログインしてコメントを投稿する