Intel Edisonで遊ぶページ

Intel Edisonで遊んだ結果を残すページです。
garretlab
HDC1000(温湿度センサモジュール)の実験

概要

HDC1000というTexas InstrumentsのI2C接続の温湿度センサを使った実験です。温度センサと湿度センサの両方が入っています。

実際には、秋月電子通商で販売している、2.54mmピッチSIPモジュールを使用しました。また、I2Cレベル変換のために、PCA9306を利用したレベル変換モジュールを利用しました。こちらも、秋月電子通商で購入しました。

Mini Breakout Boardを接続したIntel EdisonとMRAAライブラリを利用して、C言語で試してみました。

データシート

データシートについては、HDC1000をArduinoと接続して実験した際のページに記載しているので、そちらを参照してください。

実験

HDC1000とIntel Edisonとの接続

HDC1000とIntel Edisonとを以下のように接続しました。Mini Breakout Boardは、1.8Vで動作するとのことなので、レベル変換モジュールをEdisonとHDC1000との間に挟みました。

また、EdisonもHDC1000もプルアップ抵抗がついているとのことなので、レベル変換モジュールのプルアップ抵抗を無効にするために、J2/J3/J4/J5のジャンパを切断しました。

Intel Edison PCA9306 HDC1000
VREF1側 VREF2側
J17-8 I2C_1_SDA SDA1 SDA2 SDA
J18-6 I2C_1_SCL SCL1 SCL2 SCL
J19-2 1.8V VREF1 - -
J19-3 GND - GND GND
J20-2 3.3V - VREF2 +V

まったく参考にはなりませんが、一応写真を載せておきます。Mini Breakout Boardとの結線は、はんだ付けする勇気がなかったので、スルーホール用テストワイヤを利用しました。

Intel Edisonプログラミング

説明など

HDC1000については、温度・湿度とも分解能を14ビットに設定しました。また、温度と湿度を同時に取得するモードに設定しました。

エラー処理はいい加減です。

ソースコード

hdc1000.h、hdc1000.c、main.c、Makefileをそれぞれ示します。全てのファイルを、一つのディレクトリに配置して、make コマンドを実行すると、hdc1000という実行ファイルが出来上がります。

hdc1000.h

#ifndef HDC1000_H
#define HDC1000_H

#include <mraa.h>
#define HDC1000_I2C_ADDRESS 0x40

#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_CONFIGURE_MSB 0x10 /* Get both temperature and humidity */
#define HDC1000_CONFIGURE_LSB 0x00 /* 14 bit resolution */

mraa_i2c_context hdc1000Configure(int bus);
int hdc1000GetManufacturerId(mraa_i2c_context, uint16_t *version);
int hdc1000GetTemperatureAndHumidity(mraa_i2c_context i2c, double *temperature, double *humidity);

#endif /* HDC1000_H */

hdc1000.c

#include "hdc1000.h"

mraa_i2c_context hdc1000Configure(int bus) {
        mraa_i2c_context i2c;
        uint8_t mode[3] = {HDC1000_CONFIGURATION_POINTER,
                           HDC1000_CONFIGURE_MSB, HDC1000_CONFIGURE_LSB};

        if ((i2c = mraa_i2c_init(bus)) == NULL) {
                fprintf(stderr, "mraa_i2c_init failed().\n");
                return NULL;
        }

        if (mraa_i2c_address(i2c, HDC1000_I2C_ADDRESS) != MRAA_SUCCESS) {
                fprintf(stderr, "mraa_i2c_address() failed.\n");
                return NULL;
        }

        if (mraa_i2c_write(i2c, mode, 3) != MRAA_SUCCESS) {
                fprintf(stderr, "mraa_i2c_write() failed.\n");
                return NULL;
        }

        return i2c;
}

int hdc1000GetManufacturerId(mraa_i2c_context i2c, uint16_t *version) {
        uint8_t data[2];
        if (mraa_i2c_read_bytes_data(i2c, HDC1000_MANUFACTURER_ID_POINTER, data, 2) == -1) {
                fprintf(stderr, "mraa_i2c_read_bytes_data() failed.\n");
                return -1;
        }
        *version = data[0] << 8 | data[1];
        return 0;
}

int hdc1000GetTemperatureAndHumidity(mraa_i2c_context i2c, double *temperature, double *humidity) {
        uint16_t tData, hData;
        uint8_t data[4];

        data[0] = HDC1000_TEMPERATURE_POINTER;
        if (mraa_i2c_write(i2c, data, 1) != MRAA_SUCCESS) {
                fprintf(stderr, "mraa_i2c_write() failed.\n");
                return -1;
        }
        usleep(20000);
        if (mraa_i2c_read(i2c, data, 4) != 4) {
                fprintf(stderr, "mraa_i2c_read() failed.\n");
                return -1;
        }

        tData = data[0] << 8 | data[1];
        hData = data[2] << 8 | data[3];

        *temperature = tData / 65536.0 * 165.0 - 40.0;
        *humidity = hData / 65536.0 * 100.0;

        return 0;
}

main.c

#include "hdc1000.h"

int main(void) {
        mraa_result_t ret;
        mraa_i2c_context i2c;
        uint16_t version;
        double temperature, humidity;

        ret = mraa_init();
        if ((ret != MRAA_SUCCESS) && (ret != MRAA_ERROR_PLATFORM_ALREADY_INITIALISED)) {
                fprintf(stderr, "mraa_init failed(). %d\n", ret);
                return 1;
        }

        if ((i2c = hdc1000Configure(1)) == NULL) {
                fprintf(stderr, "hdc1000Configure() failed.\n");
                return 1;
        }

        if (hdc1000GetManufacturerId(i2c, &version) < 0) {
                fprintf(stderr, "hdc1000GetManufacturerId() failed.\n");
                return 1;
        }

        printf("Manufacturer ID = 0x%x\n\n", version);

        for (;;) {
                if (hdc1000GetTemperatureAndHumidity(i2c, &temperature, &humidity) < 0) {
                        fprintf(stderr, "hdc1000GetTemperatureAndHumidity() failed.\n");
                }
                printf("Temperature = %.2f C,  Humidity = %.2f %%\n", temperature, humidity);
                sleep(1);
        }

        return 0;
}

Makefile

CC      = cc
OBJS    = hdc1000.o main.o
LIBS    = -lmraa
TARGET  = hdc1000

$(TARGET): $(OBJS)
        $(CC) -o $(@) $(OBJS) $(LIBS)

.c.o:
        $(CC) -c $<

hdc1000.o: hdc1000.h

.PHONY: clean
clean:
        rm -f $(TARGET) $(OBJS)

実行の様子

上記のソースコードを実行している様子です。

その他

  • Edisonに付属のviって、"u"と"."が実装されておらず疲れました。

バージョン

  • Intel Edison Mini Breakout Board
  • MRAA v0.6.2


メニューを表示するためにJavaScriptを有効にしてください。

Intel Edisonで遊ぶページ
Copyright © 2015 garretlab all rights reserved.
inserted by FC2 system