Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
36
Help us understand the problem. What is going on with this article?
@satorukun

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

以上

36
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
36
Help us understand the problem. What is going on with this article?