Raspberry Piで湿度を測ってみる
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も名前ぐらいしか知らないのでついでに勉強。
- HDC1000 Low Power, High Accuracy Digital Humidity Sensor with Temperature Sensor
- Rasberry PIの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につないで測定待ちを検出した方がいいのかな?
[code lang="C"]
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));
[/code]
測定結果
アメダスによる那覇市の湿度も拾ってグラフ化してみました。今日は天気が悪く夕方から雨だったので、アメダス側の湿度は急上昇しています。
HDC1000側の凸凹は部屋の出入りを拾ってるのかな?
ディスカッション
コメント一覧
まだ、コメントがありません