湿度センサー(HDC1000)を動作させて見ます

〔PICの動かせ方入門に戻る〕


湿度を測るセンサーのHDC1000を接続して動作させて見たいと思います。
このセンサーは温度と湿度の両方を測る事が出来ます

HDC1000  HDC1000です、秋月電子のこちらで購入しています。
 電源は2.7V〜5.5Vで、I2C接続のモジュールです。
 このモジュールは、SDA/SCL/RDY端子に10KΩのプルアップ
 抵抗付きとなります。

 RDY(DRDYn)ピン
 データの変換が終了するとLOWを出力する信号ピンです。

 I2Cアドレス
 HDC1000自体は4種類のアドレスが選択できますが、
 このモジュールは1種類固定(0b1000000x)となります。

 データシートは、秋月電子の販売サイトからダウンロードすれば良いでしょう。

※ HDC1000ですが、”新規設計に用いることは推奨しません”らしく代替えがHDC2010らしい、
  秋月電子通商でも取り扱いを止めたみたいでSHT31使用のこちらを販売しているが操作方法は異なる。
  SHT31については、PIC16F18326での記事だがこちらをご覧ください。 *1)

《 配線図 》

ピンの構成図(PIC)   AQM0802ALCDピン構成図

 左が今回使用するPICピンの構成図です。

 表示用は、上図のLCDで秋月電子の
 "I2C接続小型LCDモジュール"を使っています、
 LCDの詳しい記事はこちらを参照下さい。


配線図  左図がHDC1000と16F1938の実態配線図です

 電源は3.3Vで動作させていますが、5Vでも
 OKです。

 LCDのRESET端子はLOWでリセットがかかる
 ので通常はVDDに接続です。
 HDC1000のRDY端子は今回使用していません

 I2C用のプルアップ抵抗はHDC1000モジュール
 に内蔵されているのでそれを使います。

《ダウンロードプログラムについて》

↓ここからサンプルプログラムソースファイルをダウンロードして下さい。
HDC.lzh

プログラムソースをダウンロードしたら、MPLAB Xにてプロジェクトを作成します。
以下のファイルをプロジェクトディレクトリにコピーしてプロジェクトに取込んで下さい。
次にコンパイルPIC書き込みを実行して下さい。
MPLAB(R) XC8 C Compiler Version 1.32コンパイラを使用しています。

ダウンロードファイルを解凍すると下記の様なファイル構成です。
 HDC.c・・・・・・・・・・ 本体のプログラムソースファイル
 skHDC.c・・・・・・・・ HDC1000ライブラリ関数ソースファイル
 skHDC.h・・・・・・・・ HDC1000ライブラリ用インクルードファイル
 skI2CLCDlib.c・・・ I2C接続LCDライブラリ関数ソースファイル
 skI2CLCDlib.h・・・ I2C接続LCDライブラリ用インクルードファイル
 skI2Clib.c・・・・・・・ I2C通信を行う関数ソースファイル
 skI2Clib.h・・・・・・・ I2C通信を行う関数のインクルードファイル

 尚、CPUのクロックは8MHzを想定しています。
 なので通信速度等(I2C)はシステムクロック8MHzで計算されています。

HDC.c

動作結果図  上手く行けばLCDに"Init OK"が表示され、
 約3秒後位で左な感じに表示すると思います、
 1行目が湿度(%)で2行目が温度(℃)です。
 尚、"Init NG"が表示された場合は、
 IDチェックエラーか、デバイスが応答していません、
 配線等を見直して見ましょう。

 因みにこの時の気象台発表数値は、
 湿度62%で温度15.7℃でした。


skHDC.h

HDC1000関数のインクルードファイルです。
"skHDC.c"を利用する場合に
#include "skHDC.h" をプログラムの先頭で記述して下さい。

今回は8MHzで利用しているので、
 #ifndef _XTAL_FREQ
  // Unless already defined assume 8MHz system frequency
  // This definition is required to calibrate __delay_us() and __delay_ms()
  #define _XTAL_FREQ 8000000    // 使用するPIC等により動作周波数値を設定する
 #endif
と記述しています、8MHz以外で利用する人は"8000000"を書き換えて下さい。

HDC1000のコンフィグレーションレジスタの設定は、
”温度・湿度とも14bitデータ長でデータは個別に読み出すモード”にて設定されています、
これを変更する人は
#define CONFIG_DT_H 0b00000000 // 温度(14bit)・湿度(14bit)個別に読出し
を変更しましょう。(詳しい設定はデータシートを見ましょ)

skHDC.c

このライブラリはHDC1000から湿度と温度をI2C接続で読み出す関数集です。
ですので、この関数集にはskI2Clib.c/skI2Clib.hのファイルが必要です。

この関数集を利用する場合は、"skI2Clib.c"の"InitI2C_Master( )"関数を呼び出した後使います、
使い方の例は、"HDC.c"を参照下さい。
また、この関数集自体は他のPICでも利用可能でしょう。

尚、HDC1000には、温度・湿度データを一緒に読み出すモードが有りますが、
ここでは温度・湿度データを別々に読み出すモードのみ対応です。

HDC1000用関数の使い方を説明します。

ans = HDC_Init(id,address)
 デバイスの初期値設定を行う処理です。
 デバイスの動作を確かめる為にデバイスIDのチェックを行い、エラーならans=6を返します。
 尚、エラー時は制御レジスタの設定は行っていません。

  id         :デバイスの識別IDを指定します(HDC1000_ID=0x1000)
  address :デバイス(スレーブ)のI2Cアドレスを指定します(HDC1000_ADRS=0x40)
  ans       :戻り値   0=正常終了、それ以外はエラーです
               1=異常(相手からACKが返ってこない)
               6=デバイスのIDチェックエラー

ans = HDC_Read( )
 湿度・温度をデバイスから読込む処理です。
 読み込まれた湿度(%)はHumi変数に、温度値(℃)はTemp変数に其々格納されます。
 尚、Humi/Temp変数はfloat変数で宣言されています。
  ans       :戻り値、0=正常終了 1=異常(相手からACKが返ってこない)

※ この関数の処理は約15ms程時間が掛かります、それが嫌な人は、
  コンフィギュレーションレジスタの設定"MODE"を温度・湿度のデータ読込みは一度に取込むとして
  "DRDYn"ピンのデータ変換終了信号を割込みで利用すれば良いでしょう。
  (プログラムはご自分で作成して下さい)

skI2CLCDlib.c
skI2CLCDlib.h
skI2Clib.c
skI2Clib.h

この内容は”秋月電子I2C接続小型LCDモジュールに表示を行う”を参照下さい。

尚、システムクロックを変えた人は"skI2Clib.c"ファイル内の"InitI2C_Master( )"関数と、
"skI2CLCD.h"のファイルを変更する必要が有ります。
また、HDC1000はI2C通信速度が最大400KHz対応です、ここでは400KHzで行っています。

《その他》

HDC1000のIC自体は4種類のアドレスが選択出来るので、ピンを出していて欲しいです。

もっとぉ精度の良い物が欲しいって人は、ストロベリー・リナックスのこれ(SHT25:I2C)なんかぁ
如何でしょう?



記事一部追記(*1) 2020/01/30


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.