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

## 概要
Raspberry pi 2 Model B (Raspbian)での 秋月電子通商 [AE-HDC1000](http://akizukidenshi.com/catalog/top.aspx "AE-HDC1000")(HDC1000使用 温湿度センサーモジュール) 設定覚書き

---
## 参考
参考にしました、ありがとうございます。
* [温湿度センサモジュールの実験←すごく丁寧に説明してくださっている](http://garretlab.web.fc2.com/arduino/lab/temperature_and_humidity_sensor/index.html "温湿度センサモジュールの実験")
* [取扱説明書](http://akizukidenshi.com/download/ds/akizuki/AE-HDC1000.pdf "取扱説明書")
* [Wiring Pi](http://wiringpi.com)

---
## センサーモジュール接続
[ここ](http://pi.gadgetoid.com/pinout/pin1_3v3_power "Raspberry Pinout")のピンアウト表を参照しました。今回は、1,3,5,7,9ピンを使用し設定します。
WiringPiライブラリで指定するピン番号は、Broadcom(BCM) Pin番号です。
※Wiring Pi pin番号ではありません。

![image](https://qiita-image-store.s3.amazonaws.com/0/74786/41876186-2b45-192c-037e-0a48d4039464.png)

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

#### SPI有効

```bash:SPI有効
$ sudo raspi-config
```

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

#### I2C有効

```bash:I2C有効
$ sudo raspi-config
```

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

#### I2Cモジュール設定

```bash:I2Cモジュール読み込み設定
$ sudo nano /etc/modules
```

```
snd-bcm2835
i2c-dev
```

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

```bash:I2Cライブラリインストール
$ sudo apt-get install libi2c-dev
```

#### gitインストール

```bash:gitインストール
$ sudo apt-get install git-core
```

#### アップデート

```bash:アップデート
$ sudo apt-get update
$ sudo apt-get upgrade
```

#### WiringPiインストール

```bash:WiringPiインストール
$ git clone git://git.drogon.net/wiringPi
$ cd wiringPi
$ ./build
```

#### ライブラリパス設定

```bash:ライブラリパス追加設定
$ sudo nano /etc/ld.so.conf
$ sudo ldconfig
```

```
include /etc/ld.so.conf.d/*.conf
/usr/local/lib
```

#### センサーモジュールアドレス確認
たぶん、0x40だと思います。

```bash:アドレス確認
$ 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: -- -- -- -- -- -- -- --
```

#### 再起動

```bash:再起動
$ sudo reboot
```

#### サンプルコード
このサンプルコードは、温度と湿度同時測定で精度はともに14ビット取得です。HDC1000は、使い方がちょっと変わったセンサーなのかもしれないです。センサーを扱うのが初めてでよく分かってないですが…

変換時間を待って値を取る処理をやるのに、四苦八苦しました。
WiringPiのソースを追っていったら、結局はreadとwriteしているだけだったので、
その処理を参考にサンプルコードをおこしています。

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

テストしたところ、値が高めにでるなと思っていました。
ブレッドボードに直挿ししテストしていたんですが、基盤に光が当たらないよう覆いをしたらある程度下がったのでキチンとしたケースに入れて基板自体が温まらないように工夫しないといけないようです。
って、当たり前の話なんですが…気がつかなかった。
計算で補正することもできると思うのですが、キチンと入れるケースを決めてからいろんな状況で計測してみないとダメですね。
難しいですね。同じ部品を使っていても、そういう処理ををキチンとしている製品が良い製品なんでしょうね。新しいことやると勉強になります。

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

```c: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;
}
```

#### 実行

```bash:実行
$ gcc -Wall -o hdc1000_sample -lwiringPi hdc1000_sample.c
$ sudo ./hdc1000_sample
```

以上