36
36

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-04-29

概要

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


参考

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


センサーモジュール接続

ここのピンアウト表を参照しました。今回は、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

以上

36
36
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
36

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?