Raspberry Piで湿度を測ってみる

シェアする

Raspberry PiとTWE-Liteを使って色々なデータが測れるようになったので、調子に乗って湿度も測ってみることにした。

I2Cなら簡単に読めるだろうと思ってHDC1000を選択したらこれも大ハマり。趣味なので苦労も楽しみなのだが、ハマりすぎである。


i2cget/i2csetを試す

BMP085やADT7410などはi2cget/i2csetコマンドだけで操作でき楽勝でした。HDC1000も同じように試してみます。

Configration Register(0x02)は読めます。HDC1000は0x40に繋がっています。
(0xFB〜0xFFにあるIDも正しく読み出せます)

# i2cdetect -y 1 
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: 40 -- -- -- -- -- -- -- 48 -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- 77
# i2cget -y 1 0x40 0x02 w
0x0000
# i2cset -y 1 0x40 0x02 0x0010 w
# i2cget -y 1 0x40 0x02 w
0x0010

温度と湿度である0x00と0x01レジスタはどうやっても読めません。


# i2cget -y 1 0x40 0x00 w
Error: Read failed

HDC1000のデータシートを読む

泥縄式にデータシートを読みます。I2Cも名前ぐらいしか知らないのでついでに勉強。

分かったのは i2cset/i2cget は I2Cデバイスのアドレス・レジスタ番号・データを纏めて扱うけど、HDC1000の測定開始・データ読み込みはこれとは違う方法だということ。

  • 測定開始:0x40宛に0x00(or 0x01)を書き込む。
  • 測定完了通知:DRDYピンの通知を見るか、指定された時間待つ
  • データ読み込み:0x40から2 or 4バイト読み込む

開始の時はレジスタを指定するけどデータは書かないし、読み込みのときは単にSLAVEから送られてきたデータを読むだけです。
ArduinoやmedではI2Cを直接叩いて簡単に読めるようですが、Raspberry Piだと一工夫必要みたい。

wiringPiを使う

Raspberry PiのGPIOを叩くライブラリであるWiringPiを使って、下記のようなコードで読む事ができました。

測定完了の待ち時間は固定値でusleepしていますが、DRDYをGPIOにつないで測定待ちを検出した方がいいのかな?

    fd = wiringPiI2CSetup(0x40);
//printf("setup return : %dn",fd);

//printf("configration beginn");
    if ((wiringPiI2CWriteReg16(fd, 0x02, 0x0000)) < 0) {
//      printf("# write error register 0x02n");
    }
    usleep(500);
    //printf("start sensorn");
    if ((ret = wiringPiI2CWriteReg8(fd, 0x01, 0x00)) < 0) {
//          printf("# write error register 0x01n"); 
    }
    usleep(6350 + 500);

    unsigned char buf[2];
    ret = read(fd, buf, 2);
//  printf("humidity : %02x,%02x,%02xn",ret,buf[0],buf[1]);
    printf("humidity.value %.2fn",
	       ((buf[0] * 256 + buf[1]) * 100 / 65536.0));

測定結果

アメダスによる那覇市の湿度も拾ってグラフ化してみました。今日は天気が悪く夕方から雨だったので、アメダス側の湿度は急上昇しています。

HDC1000側の凸凹は部屋の出入りを拾ってるのかな?

20150313-humidity-1