PICキット マイコン実験シリーズ 「温湿度計の製作」
PICキット 周辺モジュールの用意
NO-01 14ピンCPU基板(PIC16F1823)
NO-12 LCD表示器 AQM1602
NO-15 I2Cバス増設モジュール
NO-20 温湿度センサ 「HDC1000」
以上の4種のモジュールを使用します
もちろん、5V電源や配線コード類も必要です。
NO-01 14ピンCPU基板(PIC16F1823)
NO-12 LCD表示器 AQM1602
NO-15 I2Cバス増設モジュール
NO-20 温湿度センサ 「HDC1000」
以上の4種のモジュールを使用します
もちろん、5V電源や配線コード類も必要です。
↑ 14ピンCPUモジュール
PIC16F1823が差し込まれています
↑ I2Cバス増設モジュール
画像左側が電源分岐
画像右側がSCL/SDAライン分岐
画像上側にある半端なピンは
プルアップピンです。
この基板上ではプルアップしていません
↑ AE-HDC1000 温湿度センサ
↑ 全体構成画像
LCDが見ずらいです
↑ I2C接続SC1602に差し替え
NO-14のLCD、見易くて良いです。
プログラムの変更はありません。
14ピンPIC16F1823CPUモジュール
今回はI/OピンにI2Cバスとして2本使用します。
8ピンPICでも構成できますが、8ピンも14ピンもPIC本体価格が変わらないので、
14ピンPIC 16F1823を使用します。
温湿度センサ及びLCD表示には、このI2Cバスで接続します。
それぞれスレーブアドレスが違いますので、パーティーを組めます。
バスアクセスにはPIC内蔵MSSPモジュールを使用して、送受信を行います。
I2CバスはRC0がSCL、RC1がSDAとなります。
これをI2Cライン分配モジュールに接続し、そこからセンサとLCDに分岐します。
PIC16F1823機能設定
・システムクロックは内部発振および4XPLLで32MHZ
・I/Oピンはすべてデジタルで、RC0-1は入力設定
・RA4-5は出力設定とし、LEDモジュール駆動可能です。
プログラム(すべてアッセンブラです)
・MSSP低レベルルーチンはVer0.2を使用しています。
・LCDドライバルーチンは、AQM1602用を使用しています。
5V用にコントラスト値を設定しています。
3.3Vの電池駆動とするには、この値を変更します。
・メインプログラム
1秒おきにセンサにアクセス、そして演算およびLCDに表示とを行っているだけです。
割込み等は使用していません。
NO-20 温度・湿度センサモジュール AE-HDC1000
主な仕様
温度(摂氏)-20℃~+85℃ 計測精度±0.2℃
湿度0%~100% 計測精度±3%
ピン配置(②③④プルアップ抵抗内蔵)
① +V 3~5V(絶対最大定格6V)
② SDA
③ SCL
④ RDY 出力のみで、1=計測中、0=スタンバイあるいは計測終了
⑤ GND
NO-012 シリアル接続液晶モジュール(I2C接続)
LCD画面設計
2行ありますので、上段が温度表示、下段が湿度表示とします
TEMP ±XX ℃ 計11桁
HUMI XXX % 計10桁
温度では、プラス表示はしない事にしました。
マイナス時は、- を表示します。
今回はI/OピンにI2Cバスとして2本使用します。
8ピンPICでも構成できますが、8ピンも14ピンもPIC本体価格が変わらないので、
14ピンPIC 16F1823を使用します。
温湿度センサ及びLCD表示には、このI2Cバスで接続します。
それぞれスレーブアドレスが違いますので、パーティーを組めます。
バスアクセスにはPIC内蔵MSSPモジュールを使用して、送受信を行います。
I2CバスはRC0がSCL、RC1がSDAとなります。
これをI2Cライン分配モジュールに接続し、そこからセンサとLCDに分岐します。
PIC16F1823機能設定
・システムクロックは内部発振および4XPLLで32MHZ
・I/Oピンはすべてデジタルで、RC0-1は入力設定
・RA4-5は出力設定とし、LEDモジュール駆動可能です。
プログラム(すべてアッセンブラです)
・MSSP低レベルルーチンはVer0.2を使用しています。
・LCDドライバルーチンは、AQM1602用を使用しています。
5V用にコントラスト値を設定しています。
3.3Vの電池駆動とするには、この値を変更します。
・メインプログラム
1秒おきにセンサにアクセス、そして演算およびLCDに表示とを行っているだけです。
割込み等は使用していません。
NO-20 温度・湿度センサモジュール AE-HDC1000
主な仕様
温度(摂氏)-20℃~+85℃ 計測精度±0.2℃
湿度0%~100% 計測精度±3%
ピン配置(②③④プルアップ抵抗内蔵)
① +V 3~5V(絶対最大定格6V)
② SDA
③ SCL
④ RDY 出力のみで、1=計測中、0=スタンバイあるいは計測終了
⑤ GND
NO-012 シリアル接続液晶モジュール(I2C接続)
LCD画面設計
2行ありますので、上段が温度表示、下段が湿度表示とします
TEMP ±XX ℃ 計11桁
HUMI XXX % 計10桁
温度では、プラス表示はしない事にしました。
マイナス時は、- を表示します。
PICキットシリーズ用
HDC1000温湿度計プログラム
ソースファイル
16F1823_HDK1K_01.asm
HEXファイル
16F1823_HDK1K_01.hex
HDC1000温湿度計プログラム
XC8用ソースファイル
16F1705_HDC1K_01.c
HDC1Kv1.h
HDC1Kv1.c
AQM1602v1.h
AQM1602v1.c
MSSP02b.h
MSSP02b.c
HDC1000温湿度計プログラム
ソースファイル
16F1823_HDK1K_01.asm
HEXファイル
16F1823_HDK1K_01.hex
HDC1000温湿度計プログラム
XC8用ソースファイル
16F1705_HDC1K_01.c
HDC1Kv1.h
HDC1Kv1.c
AQM1602v1.h
AQM1602v1.c
MSSP02b.h
MSSP02b.c
ソースファイル 補足
詳細はソースファイルを見て頂きたく思います。
(1)MSSP・I2Cマスタモード低レベルルーチン
今回はI2Cバス送受信を行いますので、Ver0.2となっています。。
まだまだI2Cバスの仕様を満たしていませんが、今回の製作では、とりあえず動作します。
AQM1602で最初に使用したVer0.1では、マスタ送信しかできませんでしたが、
今回はマスタ受信も可能となりました。
(2)HDC1000 温湿度センサ アクセスルーチン
初期設定で温度・湿度データ連続送信(16bit×2)としています。
実質データは14bitの最高解像度としています。
計測は約1秒間隔としています。
(3)演算およびLCD表示(ほぼメインルーチン)
ここでは、温度表示が「ゼロ」を跨るので、浮動小数点ルーチンを・・・
と言いたい所ですが、当局のアッセンブラ技術では制作が面倒なので没
今までの16bitおよび32bit符号無整数演算ルーチンを使い回す事にしました。
センサからのデータは16bitですので、16bitの数値として計算していきます。
乗除算までは整数演算、その後符号付き整数に変換して、最後の減算をしています。
減算も加算も、すべて加算ルーチンで行っています。
これにより、ゼロを跨る変動も簡単に表示されるようになりました。
小数点以下は3位を四捨五入して、以下切り捨て、
2位は4(0.4)の時だけ3位の四捨五入を受け入れる事にして、四捨五入はしない事に。
1位は一切、四捨五入はしていません。
これらの手抜きで、演算が簡素化しますし、小数点以下2位までは表示できます。
また、小数点以下2位以下は結構ちらちら変動する事への対処としての意味もあります。
ただし、完全計算と比較して、誤差が生じているはずです。
しかし、センサの仕様を考えると、事実上問題無いと思います。
この温度用演算ルーチンは汎用性が無く、これ専用です。
また、全範囲でオーバーフロー無で演算する保証はありません。
ただ、センサの計測範囲は大丈夫です。
湿度データの演算は特に問題無いと思います。
小数点以下の扱いは温度用と同じです。
(4)デバッグ用ルーチン
1)DEBUG01
LCD動作確認用です。
つまんないですが、これが動作しない様では話になりません。
2)DEBUG02
温度用演算ルーチンのデバッグ用です。
温度センサにアクセスせずに、1F00H(約-20℃)からF000H(約+114℃)まで、
連続で模擬センサデータを投入して、その表示を確認します。
センサ仕様の―20℃から85℃まで、スムーズに表示するならOKで、
このデバッグプログラムが動作すれば、本プログラムは出来上がった様な物です。
詳細はソースファイルを見て頂きたく思います。
(1)MSSP・I2Cマスタモード低レベルルーチン
今回はI2Cバス送受信を行いますので、Ver0.2となっています。。
まだまだI2Cバスの仕様を満たしていませんが、今回の製作では、とりあえず動作します。
AQM1602で最初に使用したVer0.1では、マスタ送信しかできませんでしたが、
今回はマスタ受信も可能となりました。
(2)HDC1000 温湿度センサ アクセスルーチン
初期設定で温度・湿度データ連続送信(16bit×2)としています。
実質データは14bitの最高解像度としています。
計測は約1秒間隔としています。
(3)演算およびLCD表示(ほぼメインルーチン)
ここでは、温度表示が「ゼロ」を跨るので、浮動小数点ルーチンを・・・
と言いたい所ですが、当局のアッセンブラ技術では制作が面倒なので没
今までの16bitおよび32bit符号無整数演算ルーチンを使い回す事にしました。
センサからのデータは16bitですので、16bitの数値として計算していきます。
乗除算までは整数演算、その後符号付き整数に変換して、最後の減算をしています。
減算も加算も、すべて加算ルーチンで行っています。
これにより、ゼロを跨る変動も簡単に表示されるようになりました。
小数点以下は3位を四捨五入して、以下切り捨て、
2位は4(0.4)の時だけ3位の四捨五入を受け入れる事にして、四捨五入はしない事に。
1位は一切、四捨五入はしていません。
これらの手抜きで、演算が簡素化しますし、小数点以下2位までは表示できます。
また、小数点以下2位以下は結構ちらちら変動する事への対処としての意味もあります。
ただし、完全計算と比較して、誤差が生じているはずです。
しかし、センサの仕様を考えると、事実上問題無いと思います。
この温度用演算ルーチンは汎用性が無く、これ専用です。
また、全範囲でオーバーフロー無で演算する保証はありません。
ただ、センサの計測範囲は大丈夫です。
湿度データの演算は特に問題無いと思います。
小数点以下の扱いは温度用と同じです。
(4)デバッグ用ルーチン
1)DEBUG01
LCD動作確認用です。
つまんないですが、これが動作しない様では話になりません。
2)DEBUG02
温度用演算ルーチンのデバッグ用です。
温度センサにアクセスせずに、1F00H(約-20℃)からF000H(約+114℃)まで、
連続で模擬センサデータを投入して、その表示を確認します。
センサ仕様の―20℃から85℃まで、スムーズに表示するならOKで、
このデバッグプログラムが動作すれば、本プログラムは出来上がった様な物です。
結果および感想
お盆休み時にプログラミングを行っていました・・・
暑いなと思いながら動作させると・・・
画像の様に高温高湿度でした・・・
センサに手を近づけると、そそくさに温度が変動します。
やはり、乾電池駆動として、実用品とするのが良いかも
その他
温度・湿度共に小数点以下2位は計測のたびに変動します。
やはり小数点1位までが実用範囲かな。
消費電力が少ないので、電池駆動も可能と思われます。
その際は、システムクロックの低速化等でさらなる低電力化が出来そうです。
追記 2017年03月28日
XC8版ソースファイルを追加しました
使用PICは16F1705となっています。
メモリ容量の関係で16F1823では動作しません。
追記 2019年10月10日
久々に起動したら湿度表示がやたら高い数値を示します・・・
「環境計」の表示に比較して20%前後差があります。
プログラムを弄ってみましたが変化なし、バグでは無さそうですが・・・
現在の所原因不明の事態に陥りました <m(_ _)m>
因みに、温度表示は大丈夫そうです。
そもそも秋月電子で、もう販売していないので、墓場行きになるかも
お盆休み時にプログラミングを行っていました・・・
暑いなと思いながら動作させると・・・
画像の様に高温高湿度でした・・・
センサに手を近づけると、そそくさに温度が変動します。
やはり、乾電池駆動として、実用品とするのが良いかも
その他
温度・湿度共に小数点以下2位は計測のたびに変動します。
やはり小数点1位までが実用範囲かな。
消費電力が少ないので、電池駆動も可能と思われます。
その際は、システムクロックの低速化等でさらなる低電力化が出来そうです。
追記 2017年03月28日
XC8版ソースファイルを追加しました
使用PICは16F1705となっています。
メモリ容量の関係で16F1823では動作しません。
追記 2019年10月10日
久々に起動したら湿度表示がやたら高い数値を示します・・・
「環境計」の表示に比較して20%前後差があります。
プログラムを弄ってみましたが変化なし、バグでは無さそうですが・・・
現在の所原因不明の事態に陥りました <m(_ _)m>
因みに、温度表示は大丈夫そうです。
そもそも秋月電子で、もう販売していないので、墓場行きになるかも