湿度センサー(HDC1000)を動作させて見ます
〔PICの動かせ方入門に戻る〕
湿度を測るセンサーの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ピンの構成図です。
表示用は、上図の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.