画像をクリックすると拡大表示されます。
拡大画像からはブラウザの「←戻る」ボタンで戻ってください。
温室内の温度を記録するために以前にも温度記録計を製作しましたが、装置側にCCSC、PC側にVB6.0を使用
しました。
現在、両方とも使える環境がありませんので、メンテナンスが出来ません。
ハードウエアも別電源が必要だったり、防水性が悪かったり、使い勝手が悪いので作り直すことにしました。
今回、装置側が完成しましたのでアップします。
PC側のソフトは、いつ出来るか分かりませんので、データ送信フォーマットを2種類用意しました。
1つは自作ソフトで読みとるのに都合の良いフォーマット。
もう一つはターミナルソフトで数値として読みとれるもので、エクセルファイルにインポートすれば、とりあえずグラフが
作成できます。
CH数 | 4CH |
---|---|
温度センサー | 103ATサーミスタ(リード線5m) |
表示温度範囲 | −5℃〜46℃(0.2℃ステップ) |
インターバル | 3分 |
計測時間 | 25時間 |
計測件数 | 500件/CH |
PCとの接続 | RS232C 19.2Kbps |
作業項目 | ヒョウジ、ケイソク、ヨミダシ、ソウシンH、ソウシンD、ショウキョ |
電源 | 単三電池2本(アルカリ、ニッケル水素) |
消費電流 | 電池電圧2.4Vの時、記録時平均7mA、計測表示中18mA、送信中37mA |
回路図をクリックすると拡大表示されます。
拡大図から本文に戻るにはブラウザの←戻る釦を使用してください。
消費電流の面から電源電圧は3.3Vにしたかったのですが手持ち部品の関係から5Vになっています。
電池2本から昇圧しているので消費電流の点で不利になっています。
待機時の電流を下げる為にリファレンス電圧をオンオフしています。
ついでにRS232Cのレベルコンバータ同時にもオンオフしていますが、ポートに余裕があれば別々にオンオフしたい
ところです。
ポートに余裕があれば計測後、自動で電源を落としたかったのですが。
リファレンス電圧をオフすると電源電流は7mA程度ですがオンすると18mA程度になります。
さらにRS232CケーブルでPCと接続すると37mA程度に増加します。
計測インターバルは3分ですが、計測タイミングでリファレンス電圧をオンし、電圧が安定するまで1秒間待ってから計測を
開始します。
計測自体は1秒以内に終了するので、即、リファレンス電圧を落としています。
計測中の消費電流は、ほぼ7mAと言えます。
電源部が非力な為、リファレンス電圧をオンした瞬間にブラウンアウトリセットが効いてしまうので、ブラウンアウトリセットは
オフにしています。
電源ICのHT7750Aは性能の良いICではありません。
・ 負荷により出力電圧が変化する。
・ 動作条件によりリップル、ノイズが変動し、かなり大きくなる場合がある。
他に安くて性能の良いICがあれば良いのですが。
CPUのクロックは消費電流を下げる為に4MHzに下げていますが、これ以下にするとRS232CやI2Cのボーレートを
設定するのが大変になります。
リファレンス電圧は20回転のトリマで3.072Vに合わせます。(1bit 3mV)
サーミスタの直線近似も3.072Vで計算していますので正確に合わせます。
プログラムはC18コンパイラを使用しています。
評価版のためメモリの使用量が多くなっています。
最適化機能のある製品版を使えば減ると思います。
ディレー関数以外のライブラリーは使用していません。
ディレー関数も引数が255までしかとれず、サイクルタイムの整数倍という記述になるので使いづらい為、delay_ms(int)の
形に組み直しています。
adconv.c
A/D 変換に関する関数です。
C18のライブラリーは使用していません。
cnf2420.c
PIC18F2420 のコンフィギュレーションが書かれています。
記述内容と設定方法はMPLABのヘルプファイルの Topics > C18 config setting に記述されています。
i2func.c
I2Cの基本関数です。
C18のライブラリーは使用していません。
PICのハードウエアを使用しています。
メインクロックの周波数が低いのでボーレートは100KHzに設定しています。
バスの衝突検出やエラー処理はしていません。
interrupt.c
割り込み関数です。
処理内容は以下...
・ タイマー0割り込み(入力SWのチャッタ取り)
・ CCP1割り込み(ソフトウエアタイマーと計測インターバルの基準クロック1mS)
・ RS232C受信割り込み
・ MSSP割り込み(I2C)
尚、MSSP割り込みでは割り込みフラグのコピーをセットし、割り込みフラグ自体は即クリアしています。
lcdlib4l.c
キャラクタ液晶のライブラリーです。
main.c
メインルーチンです。
measure.c
表示、計測、消去、読み出し、EEPROM の読み書きが書かれています。
計測データを1バイトに抑えた為、0.2℃ステップとなっています。
−5℃〜46℃の表示値を−50〜460とし、+50すると0〜510となり、2で割ると0〜255となるので符号無し
1バイトに収まります。
serial.c
PCとの通信処理です。
自作PC側ソフト(未完)用とターミナルソフト(エクセル)用、2種類の形式があります。
C18のRS232Cライブラリーは使用していません。
timer.c
ソフトウエアタイマーです。
ディレーと違い、スタート後、他の処理が出来ます。
タイムアップはポーリングでチェックします。
global.h
ファイル数が増える為、ヘッダ ファイルを一つに纏めています。
その他、組み込みのリンカースクリプトを追加する必要があります。
ファームウエアのダウンロード (ZIP圧縮されています。)
プロジェクトファイルは削除して新規にプロジェクトを作る方が良いと思います。
4CH温度記録計 | 内部 |
ケースはタカチの防水プルボックスを使用しました。
部品を取り付けたので防水にはなりませんが、少しくらい水滴が掛かっても大丈夫です。
内部はガラガラですので、もっと小さく作ることが出来たのですが、手持ちのボックスを使った為大きくなりました。
リード線5mのサーミスタを端子台に取り付けました。
電源を入れると作業選択画面が表示されます。
最初は「ヒョウジ」が選択されていますが、DOWN釦とUP釦で項目を移動し、ENT釦の長押しで実行します。
項目は「ヒョウジ」、「ケイソク」、「ヨミダシ」、「ソウシンH」、「ソウシンD」、「ショウキョ」の6個です。
「ヒョウジ」を実行すると現在の温度を繰り返し表示しますが、1分経過すると項目選択画面に戻ります。
1分以内に打ち切りたい時はMODE釦を押せば項目選択画面に戻ります。
「ケイソク」を実行すると温度記録を開始します。
スタートしてから3分後に第1回の計測をし、3分毎にEEPROMに記録します。(1時間に20回)
上の写真は2回目の計測待ちの時を示しています。
表示されている温度値は1回目の計測済みの値です。
1回目の計測待ちの時は温度値は表示されません。
左端のWは書き込みを表し、スペースの関係で計測回数を2行にわたって表示します。
3分間、前回の計測温度表示は変化しないので、固まっていると思われないように計測件数表示は点滅しています。
500回計測すると項目選択画面に戻ります。
計測中にMODE釦を長押しすると強制終了する事が出来ます。
「ヨミダシ」では記録した内容を読み出す事が出来ます。
上の写真でRは読み出しを表し、12件目の値が表示されています。
件数位置はUP釦、DOWN釦で移動します。
押し続けるとスキャンスピードが上がり、500件を40秒弱でスキャンします。
MODE釦で項目選択画面に戻ります。
「ショウキョ」は計測した内容を消去するものです。
計測値は上書きされるので消去の必要は無いですが、読み出し、書き込みのデバッグには必要です。
デバッグ終了後にも残してあります。
一応、確認画面を追加しました。
消去といっても0〜FFまでの全ての値がデータとして使用されているので、特定の温度値を書き込むだけです。
今回は0℃を表示するような値(具体的には0x19)を書き込んでいます。
上の写真は消去後の128件目のデータです。
「ソウシンH」は記録したデータを読み出し、RS232CでPCに送信します。
ここではPC側の自作プログラムにデータを送ります。
自作プログラムはまだ出来ていませんがターミナルソフトで動作を確認しています。
記録計とPCをRS232Cケーブルで接続し、「ソウシンH」を実行すると
PCからのコマンドを待ちます。
PCのターミナルソフトを起動し、”THL02¥r”と送信すると記録したデータを送り返します。
フォーマットは1バイトの温度データをヘキサ文字2文字で連続して500件×4CH分送り、最後に’¥r’を
送ります。
受け取ったPC側では2文字づつ取り出して配列に格納し、数値に変換します。
”THL02”以外のコマンドを送ると「コマンドエラー」と3秒間表示されます。
その後、コマンドを送り直すことができますが、3分以内に正しいコマンドを遅れない場合は処理を終了して項目選択画面に
戻ります。
MODE釦でも処理を打ち切ることが出来ます。
下の画面はターミナルで受け取ったデータの一部です。
「ソウシンD」もPCに計測値を送りますが、こちらは10進文字列で送ります。
コマンドは”THL01”です。
フォーマットは計測件数、CH1〜4の温度データ、”¥r¥n”で、各項目はスペース(0x20)で区切ります。
ターミナル側でテキストファイルとして保存し、エクセルで読みとれば簡単にグラフにすることが出来ます。
温室内の温度を計測してみました。
参考 全データ
2014年11月15日の14時25分にスタートし25時間記録したものです。
場所によって温度はバラツキます。
温室と言っても、まだ戸を取り外した状態で吹きさらしですので結構、冷えました。
それにしても2〜3℃低い感じがしたので、レファレンス電圧の値、AD入力端子の電圧と温度表示値の比較をしたのですが
異常は発見出来ませんでした。
直線近似の傾きと切片の計算も問題無いようです。
後はサーミスタですが、こちらも専門メーカーの精密タイプですので、実際にこの温度だったと思われます。
パソコン側アプリケーションを追記します。
エクセルでサンプルデータをグラフにすることが出来ましたが、まずターミナルソフトでデータを読み取り、テキストファイルに
してエクセルで読み取り、グラフを作成するという手順が必要です。
今回、直接、記録計からデータを読み込んでグラフを表示するアプリケーションを作ったので紹介します。
私はプログラムは素人ですので、かなり手こずりましたが何とか完成しました。
開発環境はビジュアルC++6.0で何年ぶりかの挑戦になります。
XPとウインドウズ7での動作は確認していますが、ウインドウズ8で動作するかは判りません。
(自宅にW8はありません。)
プログラムはCからAPI関数を呼ぶ「SDK」で書かれています。
メインウインドウは灰色で、グラフの描画専用の白色の子ウインドウを貼り付けています。
メニューの下のスタティックコントロールの窓は「受信中」と表示するためのものです。
まだバグが残っているかもしれませんがビジュアルC6.0のプロジェクトを置いておきます。
参考 サンプルプロジェクト
ファイルの読み書きはウインドウズ標準のコモンダイアログが出ます。
こちらはウインドウズの機能として上書きの警告が出ます。
拡張子は適当に「lgd」と付けましたがテキストファイルですのでエディタで開く事ができます。
内容は照合用の文字列、追加記入された説明用の文字列、データ文字列(計測番号を付加しています。)、
最高温度、最低温度とその計測番号の文字列で、区切り文字には"\r\n"を使っています。
「終了は」データが残っていても終了します。
データの編集をしている訳ではないので再度、受信するかファイルを開けば良いだけの話です。
「通信ポート」は設定用のダイアログが出ます。
設定結果はレジストリ等に書き込んでいないので起動時に"COM1"になります。
"COM10"以上は文字列の指定を"\\\\.\\COM10"としないと認識してくれないとのことです。
関数が受け取る文字列は\\.\COM10ですが\を文字とするには\\としなければならない為\の数が増えています。
今回、デバッグに使ったデスクトップのPC(XP)はCOMポートが有り、ポート番号は"COM1"でした。
動作確認に使ったノートPC(W7)はCOMポートが無いため変換ケーブルを使っています。
最初"COM4"でしたが突然、勝手に新しいドライバをインストールして"COM5"になりました。
という訳で2桁のポート番号を認識してくれるかどうかは確認出来ていません。
「見出し」は受信データに説明テキストを付加するダイアログが出ます。
記入内容はウィンドウに表示されファイルに保存されます。
「データ消去」は読みとったデータと記入した説明文書を消去します。
表示メニュー「最高最低温度」では計測データの最高温度、最低温度を表示します。
エディットコントロール内に表示された数字が小さかったのですが、リソースエディタでは大きくならず、プログラムで
各エディットコントロールにメッセージを送りサイズを調整しています。
リソースエディタ
リソースエディタはメニューやダイアログを作るには便利で、各コントロールのIDを決めてヘッダファイルを
作成してくれます。
デホルトではメニューやダイアログ自体も名前がIDになっているので、” ”で囲まれた文字列に変更しておきます。
IDのままにしておきたい場合はIDをリソース名に変更する関数を使います。
ダイアログに沢山のコントロールを配置した時、コントロールを付けたり外したりしている内に各コントロールのIDの
値が不連続になったり重複したりします。
不連続の場合は特に問題ないですが、重複すると問題です。
そこで、コントロールの配置が終わったらresource.hを確認し手で数値を書き直します。
数値自体に意味は無く一意であればいいです。
下の方に次に使われるIDの値が書かれているので、ついでにこれも書き直しておきます。
IDを書き直す事は参考書には書かれていませんがVC6では必須の作業です。
リソースエディタはダイアログに配置されたコントロールのIDは処理してくれますがウインドーに配置されたコントロール
は処理してくれません。
今回、メインウインドウに子ウインドウを貼り付けていますが、メインウインドウにエディットコントロールも貼り付けて
います。
これらは位置と寸法、スタイルを指定して関数で作成しなければなりません。
IDも手書きで作成しなければなりませんが、リソースエディタで作成されたIDと重複しないように注意します。
そういう意味ではダイアログにウインドウを貼り付けた方が楽ですがダイアログは大きさを変えられないことが欠点です。
最適化のトラブル
今回、このアプリケーションを完成するのに大苦労しました。
今まで類似のプログラムを何回か作っていたので、作成自体に大きな苦労はありませんでした。
デバッグ版がなんとか動作したので、リリース版に変えると不安定になります。
どこかに拙い記述があるはずだと思い、細かい部分をいろいろ書き直し、試したのですが好転しません。
症状はRS232Cが文字化けしたり、通信できなくなったりすることです。
最適化に問題があるのではないかと気が付いたのは大部、時間が経ってからです。
VC6ではデホルトで実行速度に関して最適化されていました。
最適化を外したところ安定して動作するようになりました。
どこかに拙い記述が残っているかもしれませんが、疲れたので、これで良しとします。