Arduino と SHT71 センサーで実験室の温湿度ログを Mac から取得する。

実験室で温度・湿度を記録する、あるいは長時間でのログを取りたいがあります。この目的に合うStrawberry Linux 社の温度・湿度計モジュール USBRH が市販されていますが、Windows の driver しか公開されおらず、有志の開発したソフトで Linux でまでなら対応しているようです(先輩の例)。ただ、Mac User なので、できれば直接 Mac から制御したいところです。


そこで、Arduino とSENSIRION 社製のデジタル温湿度センサー SHT71 を使って、直接 Mac でデータ収集してみました。SHT シリーズは比較的高性能で、上記のモジュールにも使われています。今回は、PIN の足がついている SHT71 を用います。日本国内だと Strawberry Linux からも SHT71SHT11 を購入できます。自分は、アメリカで Newark 経由で購入して $33 でした。


SHT71 は、公称値で、 25℃ において湿度の精度が±3.0%、温度の精度が±0.4℃となっています。 詳しくは、SHT71 dataheet (pdf) をご覧ください。この SHT71 はデジタル値で出力してくれるので、PIN の足は順番に

  1. SCL : Serial Clock, input only (同期用)
  2. VDD : Source Voltage
  3. GND : Ground
  4. DATA : Serial Data, bidirectional (シリアルデータ通信)

となっています。


Arduino との配線は、10 kOhm のプルアップ抵抗をつけて、以下のようにしました。


肝心のスケッチですが、ライブラリを利用できます。SHT1X や SHT7X のライブラリが、サイトから sht1x.tgz としてダウンロードできます。あるいは、GitHub にもあるようです(ref)。ライブラリは以下に収容します。
~enoto/Documents/Arduino/libraries/sht1x

なお、Arduino Uno を使っており、sht1x_hw.h の中身で

# define SHT1X_CLOCK_LINE PD2
# define SHT1X_DATA_LINE  PD3

という箇所を

# define SHT1X_CLOCK_LINE PORTD2
# define SHT1X_DATA_LINE  PORTD3

のように修正しないとコンパイルが通りません。


その上で、スケッチは以下の通り。データシートにある補正式のままです。

#include <sht1x.h>
#include <sht1x_hw.h>

unsigned int h;
unsigned int t;
double temp;
double hlin;
double htrue;

void setup()
{
  Serial.begin(9600);
  delay(15);
  sht1x_init();
  Serial.println("Start");

  if (sht1x_read_humidity() < 0) {
    Serial.println("Reset");
    sht1x_reset();
  }
}

void loop()
{
  h = sht1x_read_humidity();
  t = sht1x_read_temp();

  while (millis() % 1000);

  temp  = -39.66 + 0.01 * t; // 14 bit
  hlin  = -2.0468 + 0.0367 * h - 1.5955e-6 * h * h; // 12 bit
  htrue =  (temp - 25.0) * (0.01 + 8e-5 * h) + hlin; // 12 bit

  Serial.print(temp, 3);
  Serial.print("C ");
  Serial.print(htrue, 3);
  Serial.println("% ");
}

大体、仕様の誤差範囲で、正しい温度のようですが、較正はまた確認してみようと思います。

参考サイト