以前、温室の明るさを記録するために照度記録計を製作しました。
内容は別のページ「あれば便利な機材」で紹介しています。
あれから何年か経過したので作り直してみました。
ただし、筐体はそのまま流用したので外見は殆ど代わりません。
記録計の回路とファームウエア、PC側ソフトウエアは新規に製作したので内容的には全く別物になっています。
温室内の明るさは天候の影響を受けるので記録当日の屋外の照度も同時に記録する必要があります。
したがって最低でも2CHが必要となります。
温室内も場所によって明るさが違うので本当はもっとCH数があれば便利ですが、製作が大変になるので
2CHで我慢します。
計測範囲ですが、真夏の正午の照度は10万ルックスを少し超える場合があるのでフルスケールを20万ルックスに
しました。
ソフト、ハードを簡単にするためにレンジ切り替えをしていませんので室内等の暗い場所の照度の記録は出来ません。
12ビットのA/D変換器を使っているので分解能は50ルックスとなります。
温室内は遮光してあるので屋外より、かなり暗くなりますが、昼間の照度は最低でも3000ルックス程度はあります。
場所により、屋外の1/4〜1/16の範囲になるように遮光しています。
照度の絶対値より遮光率に関心があります。
計測間隔ですが、今回は1分の固定としています。
計測件数は840件の固定としました。
計測は朝の5時00分に自動スタートし、夕方6時59分に終了して電源が自動で切れます。
1時間60件で14時間で840件となります。
電源は単3電池2本(3V又は2.4V)で5Vに昇圧しています。
稼働時間は記録時が大部分(14時間の記録時間+待機時間)を占めますが、この間は1分間隔の計測時間の殆どでCPUが
スリープしているので、消費電流は2.4Vの時8mA以下、3Vの時6mA以下です。
RS232CでPCにデータを送信するときに最も消費電流が増え、2.4Vで23mA程度、3Vで18mA程度と
なります。
新品のアルカリ電池、又は充電されたニッケル水素電池で5〜6回は計測可能と思います。
回路図をクリックすると拡大表示されます。
拡大図から本文に戻るにはブラウザの←戻る釦を使用してください。
CPUは12ビットのA/D変換器を内蔵したPIC18F2523を使用しています。
(手持ちの関係でLF2523を使っています。)
電源電圧は電池2本から5Vに昇圧しています。
電源SWはモメンタリーのプッシュSWでONしCPUの自己保持でON状態を維持します。
計測終了やタイムアップで自動的に切れます。
1分の計測間隔はRTCの定周期割り込み出力を使い、PICのINT0割り込みに入力し、スリープから
目覚めさせています。
計測開始はRTCのアラーム機能を使っています。
計測開始前の待機時にも1分間隔の表示だけはしているので、RTCの割り込み出力が定周期割り込みかアラームか
読み取ってチェックする必要があります。
もしアラームの場合は「計測」に移行します。
この時、RTCのフラグを消去しないと割り込み出力が出たままになってしまいます。
定周期割り込みの場合は割り込み出力はパルス出力(自動解除)となります。
RTCのバックアップは以前はスーパーキャパシタを使っていたのですが、今回はコイン電池を使っています。
RB0端子をINT割り込みで使った関係で、表示器のデータバスはRB1〜RB4と変則的になっています。
RS232Cのドライバは無負荷で1mA程度の電流を消費します。
昇圧している関係で電池電流は2mA程度増えます。
従ってRS232Cを使うとき以外はドライバの電源を切るようにしています。(ポートが余ったので)
今回に限らず、部分的に電源を落とす時は注意するポイントがあります。
それは「入力端子がGNDに引き込まれる。」ということです。
PICのTX出力端子がGNDに引き込まれて電流が流れると消費電流が減りません。
そこで、TX端子を入力に切り換えます。
これだけでは駄目です。
送信用のレジスタに送信出力をイネーブルにするビットがあります。
これがイネーブルになっているとTRISCで入力にしても無視されて出力ピンとなり、しかもHレベルが出力されます。
従って、イネーブルビットも切り換える必要があります。
尚、ドライバのケーブルに接続される側の端子は問題ない様です。
LT1112はバイポーラ構造にも拘わらず、入力バイアス電流がピコアンペアオーダーで、オフセット電圧が極めて小さく、
このような用途には最適です。
前回はFET入力のOPアンプでオフセット調整が必要でしたが今回は省略しています。
入力端子はダイオードでクランプされているので逆相入力電圧の規定は無いですが、クランプダイオードの最大電流が10mAと
規定されています。
今回は反転入力を外部に引き出すので気持ちが悪く、保護抵抗を入れています。
バイアス電流が小さく、周波数も低いので問題は無いと思います。
デバッグ時は電源スイッチをオールタネートのものに変えると楽です。
(デバッグが済んだらモメンタリーに戻す。)
ケースは以前のものを流用したので殆ど変わりません。
1CHの温度センサーが外され、電源SWがスナップスイッチからプッシュスイッチに換わっただけです。
多少、水が掛かった位では大丈夫です。
センサーは以前のものを、そのまま流用しました。
従って何年も前に製作したものです。
フォトダイオードはBS520です。
視覚補正フィルターの付いた照度計用のダイオードです。
現在ではBS520は入手出来ないかもしれませんが、探せば別の品種が有ります。(別のページ:「照度計」参照)
フォトダイオードには明暗程度を検出する安価なものがありますが、必ず照度計用の品種を使います。
BS520に10万ルックスの自然光を入射すれば飽和してしまいます。
従って外部に減光フィルターを取り付けなければなりません。
今回は写真撮影に使う露出計用の平面受光版を取り付けました。
実は露出計の受光版を外した時、受光素子が見えるのですが、この形状がBS520と同じような形状をしていたのを
以前から知っていたので、すぐ思いついた訳です。
この受光板は張り合わせ構造になっていて、雨に濡れた時、水を吸い込んで抜けなくなってしまった事がありました。
そこで、防水の意味で透明アクリル板を接着してあります。
平面受光版は高価で入手性も悪いので、その後、乳白アクリルで自作したこともあります。
屋外と温室内という離れた場所を計測するためにセンサーは5mの同軸ケーブル(RG−58)で引き出しています。
ケース内部は黒く塗った方が良いと思います。
照度センサーは水平に設置しないといけません。
太陽の方向に向ければ値は大きくなるのので再現性がなくなります。
屋外の場合、水平であれば設置高さが1〜2m変わったところで全く問題になりませんが、屋内で人工光源であれば照度は
光源からの距離の影響を大きく受けます。
開発環境はMPLAB Ver8.36/C18 Ver3.31(評価版です。)
コンパイラは評価版ですが、製品版を使えばメモリの使用量が減ると思います。
ディレー関数以外の組み込みライブラリーは使用せず、レジスタに直接書き込んでいます。
ソースは複数のファイルに分割されています。
adconv.c はA/D変換関係の関数が記述されています。
clock.c はRTC関係の関数が記述されています。
cnf2523.c はCPUのコンフィギュレーションが記述されています。
i2func.c はI2Cの基本関数ライブラリーです。
innterrupt.c は割り込みルーチンが書かれています。
ccp1 割り込みは1mS間隔で、ソフトウエアタイマーの分解能となります。
timer2 割り込みは押しボタンスイッチのチャッタ取りに使っています。
int0 割り込みはRTCからの1分間隔の割り込み信号ででスリープから目覚めます。
I2C の各動作の完了を知るためにI2C割り込みを使っています。
RS232C の受信完了割り込みを使用しています。
lcdlib4sc は液晶表示起用の自作ライブラリーです。
データバスがB1〜B4と変則的ですので、専用となっています。
main.c はメインルーチンとメニュー選択関数等が記述されています。
measure.c には計測、表示関係の関数が記述されています。
serial.c にはRS232C関係の関数が記述されています。
timer.c にはソフトウエアタイマー関連の関数が記述されています。
global.h には複数ファイルで呼ばれる変数、関数のプロトタイプ宣言、マクロが記述されています。
ファームウエアのダウンロード (ZIP圧縮されています。)
ダイオードの照度と短絡電流の関係から理論的に校正する方法もあるとは思いますが、素子のバラツキが大きく、
減光フィルターの影響も考慮しなければならないので困難です。
2CHあるのでCH間の誤差は気になります。
最も簡単な校正方法は校正済みの照度計と比較することです。
今回、12ビットのA/D変換器と4.09Vの基準電圧を使用しているので1ビットが1mVとなります。
従って分解能を50ルックスとすればフルスケールが20万ルックス強となります。
後はIV変換のVRを調整して校正済みの照度計と同じ数値を示す様にすれば良いわけです。
私は既製の照度計は持っていないのですが、写真撮影用のフラッシュメーターを持っていて、定常光も計れます。
ただし、表示がLUXではなく、EV値となっています。
それで換算表をエクセルで作成しました。
校正は快晴の日の正午付近に行います。
太陽に雲が懸かると照度がダイナミックに変化するので比較校正が困難になります。
(後でダイナミックに変化した照度のグラフを紹介します。)
電源の入り切り
電源入り用の押しボタンで電源が入ります。
電源は回路で自己保持されます。
電源が入るとメニュー選択画面に移ります。
この状態でMODEボタンを長押しすると電源が切れます。
最初、電源オンボタンで入り切りをしていたのですが(トグル)昇圧コンバータを使っていることと平滑用の電解コンデンサー
の残留電荷の時定数等の影響で、短時間でオンオフを繰り返すと暴走することがあり、切りをMODEボタンに変更しました。
状況は少し良くなりましたが、電源オフ後、電荷が放電するまでは(2秒程度待てば済みます)再投入しない方が良いです。
この他、メニューにも電源を切る項目があります。
さらに、電源を入れたまま放置した場合、数分から十数分で電源が自動でオフします。
ただし、計測中は終了まで電源は保持されます。
作業メニュー
電源投入後、作業メニューが表示されます。
メニューは以下の8つの項目があります。
・ ヒョウジ
・ ケイソク
・ ヨミダシ
・ ソウシンH
・ ソウシンD
・ ショウキョ
・ トケイ
・ シュウリョウ
項目はDOWNボタン、UPボタンで移動し、ENTボタンの長押しで実行されます。
11分間何もしないで放置すると電源が切れます。
「ヒョウジ」メニュー
この項目は現在の時刻、照度、電池電圧を絶えず表示します。
電池電圧は表示するだけで低下で電源を落とす等の処理はしていません。
6分間でメニュー画面に戻ります。
「ケイソク」メニュー
この項目は照度を1分間に1回EEPROMに書き込みます。
記録は5時00分に開始されるので、それまでは待機します。
待機中も1分に1回、照度値と時間を更新しますが書き込みません。
待機中は2行目中央に「WAIT]の文字が表示されます。
記録が開始されると「WAIT]が「W001」に変わります。
Wは書き込み001は書き込み回数を示しW840で終了し、電源が切れます。
強制終了はDOWNボタンUPボタンを同時に押し続けます。
CPUは計測タイミング以外はスリープしているので最大で1分間押し続ける必要があります。
「ヨミダシ」メニュー
この項目は前回の記録を読み出して表示します。
計測位置はDOWNボタン、UPボタンでスキャンします。
スキャンスピードは2段変速になっていて840件を1分少々でスキャンします。
日時は計測した日時となります。
R***は計測位置です。
電池電圧は記録していないので読み出せません。
6分でメニュー画面に戻ってしまいます。
「ソウシンH」メニュー
この項目は記録データをRS232CでPCに送信します。
後述する自作PC側ソフトの為のフォーマットです。
840×2CHの照度データを送信し、次に記録開始日時を送信します。
照度はヘキサ文字3個、カレンダーは1項目2文字のヘキサ文字で送信されます。
区切り文字は無く、最後に¥r¥n文字を送ります。
19.2KBPS、N8、S1で4.5秒で送信出来ます。
ターミナルでも受信出来ます。
項目を実行すると「RS232C コマンドマチ」と表示されますので、この状態でターミナルから「LUX22¥r」
と入力するとデータが送信されます。
サンプルデータは2月で、終了時は暗く、0の多いデータになっています。
データの最後はカレンダーで 00(0分)、05(5時)、0C(12日)、04(木曜日)0F(2015年)と
なっています。
「ソウシンD」メニュー
この送信フォーマットはデータを10進文字で送信します。
テラターム等のテキストファイルを作成出来るターミナルソフトで読みとればエクセルに簡単にインポート出来ます。
この場合、送信に25.6秒掛かりました。
ターミナルからの送信要求コマンドは「LUX21」です。
エクセルで作成したグラフを下に示します。
「ショウキョ」メニュー
ショウキョメニューは記録したデータを消去します。
計測データは上書きされるので実際の使用では必要有りませんがデバッグ時には必要です。
消去が完了するとメニュー選択画面に移ります。
「トケイ」メニュー
この項目はカレンダーの設定をします。
セイレキ(西暦)、ツキ(月)、ヒ(日)、ヨウビ(曜日)、ジカン(時間)、フン(分)の順に設定します。
各項目はDOWNボタン、UPボタンで値を変え、ENTボタンでRTCに書き込み、次の項目に進みます。
そのままで良い場合もENTボタンで次に進めます。
分の入力が完了すればメニュー画面に戻ります。
途中で放置した場合、タイムアップタイマーでメニュー画面に戻ります。
バックアップ電池が切れた場合は記憶が消えてしまうので、電源投入時にこの画面が呼ばれます。
「シュウリョウ」メニュー
電源を切ります。
照度記録計からデータを受信し、グラフを表示するアプリケーションを作成しました。
相変わらずVC6.0(sp6)SDKで作成しています。
XPとW7で動作を確認しました。
データ受信
照度記録計とPCをRS232Cストレートケーブルで接続します。
記録計のメニューから「ソウシンH」を選択し実行します。
記録計の表示が「RS232C コマンドマチ」になっていることを確認します。
PCメニューの「データ受信」をクリックすれば記録計からデータが送信されます。
通信条件は双方で合わせてあります。
通信ポートはポート0〜15まで順次開いていって使えるポートを自動的に探します。
それでも開けない場合は「ポートがオープン出来ません」というメッセージボックスが出ます。
ところでポート番号10以上は呼び出し方法が少し変わります。
自宅のPCでポート番号10以上になる物が無いので開けるかどうか確認出来ていません。
ポートが開けた場合、メニュー下のスタティックテキストにポート番号が表示され、通信完了で消えます。
RS232Cケーブルの未接続等の不具合のある場合は「通信出来ません」というメッセージボックスが表示されます。
受信完了後、グラフが表示されます。
画像をクリックすると原寸大になります。
(ブラウザの「戻る」ボタンで戻ってください。)
画像の横軸目盛りは計測時間で5時から19時までを示しています。
12時少し前からグラフが大きく乱れていますが、太陽に雲が懸かった為です。
ファイルを開く
名前を付けて保存
データはファイルとして保存出来ます。
また、保存したデータを読み出すことが出来ます。
これらのメニューをクリックするとウインドウズの標準ダイアログが出ます。
拡張子は1号機が[.lxd]だったので今回は[.lx2]と勝手にやっています。
照合メッセージを埋め込んであるので違うファイルを読み込むことはありません。
ファイルを読み書きした場合はタイトルバーにファイル名が表示されます。
表示レンジ
表示レンジの最大値はデホルトで10万ルックスになっています。
これを12500ルックスに変更してみます。
テキスト入力
データに説明文書を付加出来ます。
この内容はデータと共に保存でき、ファイルを開いたときに再現出来ます。
データ表示
任意の計測時刻のデータを数値で表示する為のダイアログです。
計測番号を6個のボタンで変更します。
最大照度
CH1,CH2の最大照度と計測時刻が表示されます。
同一の値が2ヶ所以上あったら、最初の時刻を表示します。
プロジェクトのダウンロード (ZIP圧縮されています。)