Edited at

Raspberry Pi 2 Model B でI2C 温度+湿度センサーモジュール(HDC1000)を使う

More than 3 years have passed since last update.


概要

Raspberry pi 2 Model B (Raspbian)での 秋月電子通商 AE-HDC1000(HDC1000使用 温湿度センサーモジュール) 設定覚書き



参考

参考にしました、ありがとうございます。

* 温湿度センサモジュールの実験←すごく丁寧に説明してくださっている

* 取扱説明書

* Wiring Pi



センサーモジュール接続

ここのピンアウト表を参照しました。今回は、1,3,5,7,9ピンを使用し設定します。

WiringPiライブラリで指定するピン番号は、Broadcom(BCM) Pin番号です。

※Wiring Pi pin番号ではありません。

image



センサーモジュール設定手順


SPI有効


SPI有効

$ sudo raspi-config


「8 Advanced Options」 → 「A6 SPI」 → 「SPI enable」


I2C有効


I2C有効

$ sudo raspi-config


「8 Advanced Options」 → 「A7 SPI」 → 「I2C enable」


I2Cモジュール設定


I2Cモジュール読み込み設定

$ sudo nano /etc/modules


snd-bcm2835

i2c-dev


I2Cライブラリインストール


I2Cライブラリインストール

$ sudo apt-get install libi2c-dev



gitインストール


gitインストール

$ sudo apt-get install git-core



アップデート


アップデート

$ sudo apt-get update

$ sudo apt-get upgrade


WiringPiインストール


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しているだけだったので、

その処理を参考にサンプルコードをおこしています。

サンプルコードだと実行するたびに設定をしてしまうので定期的に実行する場合は、処理を外してください。

テストしたところ、値が高めにでるなと思っていました。

ブレッドボードに直挿ししテストしていたんですが、基盤に光が当たらないよう覆いをしたらある程度下がったのでキチンとしたケースに入れて基板自体が温まらないように工夫しないといけないようです。

って、当たり前の話なんですが…気がつかなかった。

計算で補正することもできると思うのですが、キチンと入れるケースを決めてからいろんな状況で計測してみないとダメですね。

難しいですね。同じ部品を使っていても、そういう処理ををキチンとしている製品が良い製品なんでしょうね。新しいことやると勉強になります。

気になるとこや間違いなどあればコメントいただけると助かります。


hdc1000_sample.c

#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

以上