概要
Raspberry pi 2 Model B (Raspbian)での 秋月電子通商 AE-HDC1000(HDC1000使用 温湿度センサーモジュール) 設定覚書き
参考
参考にしました、ありがとうございます。
センサーモジュール接続
ここのピンアウト表を参照しました。今回は、1,3,5,7,9ピンを使用し設定します。
WiringPiライブラリで指定するピン番号は、Broadcom(BCM) Pin番号です。
※Wiring Pi pin番号ではありません。
センサーモジュール設定手順
SPI有効
$ sudo raspi-config
「8 Advanced Options」 → 「A6 SPI」 → 「SPI enable」
I2C有効
$ sudo raspi-config
「8 Advanced Options」 → 「A7 SPI」 → 「I2C enable」
I2Cモジュール設定
$ sudo nano /etc/modules
snd-bcm2835
i2c-dev
I2Cライブラリインストール
$ sudo apt-get install libi2c-dev
gitインストール
$ sudo apt-get install git-core
アップデート
$ sudo apt-get update
$ sudo apt-get upgrade
WiringPiインストール
$ git clone git://git.drogon.net/wiringPi
$ cd wiringPi
$ ./build
ライブラリパス設定
$ sudo nano /etc/ld.so.conf
$ sudo ldconfig
include /etc/ld.so.conf.d/*.conf
/usr/local/lib
センサーモジュールアドレス確認
たぶん、0x40だと思います。
$ sudo 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 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
再起動
$ sudo reboot
サンプルコード
このサンプルコードは、温度と湿度同時測定で精度はともに14ビット取得です。HDC1000は、使い方がちょっと変わったセンサーなのかもしれないです。センサーを扱うのが初めてでよく分かってないですが…
変換時間を待って値を取る処理をやるのに、四苦八苦しました。
WiringPiのソースを追っていったら、結局はreadとwriteしているだけだったので、
その処理を参考にサンプルコードをおこしています。
サンプルコードだと実行するたびに設定をしてしまうので定期的に実行する場合は、処理を外してください。
テストしたところ、値が高めにでるなと思っていました。
ブレッドボードに直挿ししテストしていたんですが、基盤に光が当たらないよう覆いをしたらある程度下がったのでキチンとしたケースに入れて基板自体が温まらないように工夫しないといけないようです。
って、当たり前の話なんですが…気がつかなかった。
計算で補正することもできると思うのですが、キチンと入れるケースを決めてからいろんな状況で計測してみないとダメですね。
難しいですね。同じ部品を使っていても、そういう処理ををキチンとしている製品が良い製品なんでしょうね。新しいことやると勉強になります。
気になるとこや間違いなどあればコメントいただけると助かります。
#include <stdio.h>
#include <unistd.h>
#include <wiringPi.h>
#include <wiringPiI2C.h>
#define HDC1000_ADDRESS 0x40
#define HDC1000_RDY_PIN 4
#define HDC1000_TEMPERATURE_POINTER 0x00
#define HDC1000_HUMIDITY_POINTER 0x01
#define HDC1000_CONFIGURATION_POINTER 0x02
#define HDC1000_SERIAL_ID1_POINTER 0xfb
#define HDC1000_SERIAL_ID2_POINTER 0xfc
#define HDC1000_SERIAL_ID3_POINTER 0xfd
#define HDC1000_MANUFACTURER_ID_POINTER 0xfe
#define HDC1000_DEVICE_ID_POINTER 0xff
#define HDC1000_CONFIGURE_MSB 0x10
#define HDC1000_CONFIGURE_LSB 0x00
int main(void) {
int fd;
int ret;
int tData; // 温度
int hData; // 湿度
unsigned char result[4];
unsigned char set_value[3];
unsigned char get_value[1];
// RDYピン準備
wiringPiSetupGpio();
pinMode(HDC1000_RDY_PIN, INPUT);
// I2C準備
fd = wiringPiI2CSetup(HDC1000_ADDRESS);
// センサー設定値
set_value[0] = HDC1000_CONFIGURATION_POINTER;
set_value[1] = HDC1000_CONFIGURE_MSB;
set_value[2] = HDC1000_CONFIGURE_LSB;
// センサー設定
ret = write(fd, set_value, 3);
if (ret < 0) {
printf("error: set configuration value\n");
return 1;
}
// 温度・湿度の値を同時取得
get_value[0] = HDC1000_TEMPERATURE_POINTER;
ret = write(fd, get_value, 1);
if (ret < 0) {
printf("error: get value\n");
return 1;
}
// 変換待ち
while(digitalRead(HDC1000_RDY_PIN) == 1) {
;
}
// 値取得
ret = read(fd, result, 4);
if (ret < 0) {
printf("error: read value\n");
return 1;
}
tData = result[0] << 8;
tData |= result[1];
printf("%.2f ", ((tData / 65536.0 * 165.0) - 40.0));
hData = result[2] << 8;
hData |= result[3];
printf("%.2f\n", (hData / 65536.0 * 100));
return 0;
}
実行
$ gcc -Wall -o hdc1000_sample -lwiringPi hdc1000_sample.c
$ sudo ./hdc1000_sample
以上