<前の記事 : 次の記事>
お次はSHT31を使ってみる
AHT21B、SHT40iときて次はSHT31だ。名前の冒頭にSHTが付いているSHT40iとほぼ同じような感じなんだが、より高精度なのかも知れない。これも機能は多いが単純な単発測定のみを使うような構成としておく。アドレスは0x44と0x45が切り替えられるので、2台を同じバスに接続できる。
これも自前ライブラリの構成を同じにしてあるので、スケッチは名前違いでほぼ同じ内容になる。
SHT31libTest.ino
#include "Wire.h"
#include "SHT31.h"
SHT31 meas=SHT31(0x45);
void setup() {
Serial.begin(115200);
Wire.begin();
meas.begin();
}
byte cnt=0;
void loop() {
meas.measure();
Serial.print(cnt++);
Serial.print(", SHT31, MEAS-T-H. ");
Serial.print(meas.temperature()); Serial.print(", ");
Serial.println(meas.humidity());
delay(1000);
}
ライブラリ本体「SHT31.cpp」
ヘッダファイルの内容はSHT40iやAHT21Bと同じ(名前だけ違う)ので割愛して、ライブラリ本体の特徴点だけ以下に示す。データシートに基づきbeginではソフトウェアリセットをかけている。
begin
void SHT31::begin(void) {
delay(100);
Wire.beginTransmission(_adrs);
Wire.write(0x30);
Wire.write(0xA2);
Wire.endTransmission();
delay(5);
}
measureでは繰り返し精度「高」でクロックストレッチ無効の単発測定を指示している。クロックストレッチ無効なので、測定時間をdelayで待ってからデータ取得を行なった。CRCのチェックはやっていない。
measure
void SHT31::measure(void) {
Wire.beginTransmission(_adrs);
Wire.write(0x24);
Wire.write(0x00);
Wire.endTransmission();
delay(15);
Wire.requestFrom((int)_adrs,(int)6);
byte i=0;
while(Wire.available()) data[i++]=Wire.read();
Wire.endTransmission();
}
temperature()およびhumidity()は共にfloat型の関数だが、将来的には固定小数点+シフト演算で考え直すかも知れない。
手元の温湿度計が「29.5℃、68%」なので精度はまぁまぁといたところか。どっちが合ってるのかは分からない。
<前の記事 : 次の記事>
投稿者の人気記事

-
akira.kei
さんが
前の日曜日の21:46
に
編集
をしました。
(メッセージ: 初版)
ログインしてコメントを投稿する