● 実験テーマ87
「PIC24F+UL024TF+HDC1000+LPS25Hで温湿度・気圧グラフ表示実験」
(QVGAカラー液晶に置換え、そこに温湿度・気圧の、3ch分離表示をする事が出来ました。)
※ 170811:
ソフトを更新し、_TEST_6としました。
<修正点>
@ 時間軸を拡張しました。
・0.5h/D(1分間隔)・5目盛(2.5時間/1画面)→
0.5h/D(1分間隔)・8目盛(4時間/1画面)に拡張
・5h/D(10分間隔)・5目盛(25時間/1画面)→ 6h/D(12分間隔)・8目盛(2日分/1画面)に拡張
A @に伴い、各測定値と、時間軸レンジの表示位置を変更しました。
B Aの都合で、今迄、30min/Dと表現していたのを、0.5h/Dに変更しました。
※ 詳細は、末尾にアップした、ソースを参照ください。(思ったより簡単に修正出来ました。)
※ 170328:
ソフトを更新し、_TEST_5としました。
<修正点>
@ Y軸の分解能を倍にし、0.5/dot(温湿度・気圧共)で、グラフを多重描画するようにしました。
A @に伴い、分離座標から、共通座標に変更し、目盛も共通で扱うように変更しました。
B カレンダ時計などの、画面レイアウトを一部変更しました。
3月21日からの記事を参照してください。
※ 170310:
ソフトを更新し、_TEST_4としました。(TEST_3は、バックアップ無し版です。)
<修正点>
@ I2C-RTCモジュール:RTC-8564NBを追加し、バックアップ電池による、BUP付きの
カレンダ時計とし、年/月/日と、時刻表示を追加しました。
A 時計合わせは、SW1:プロット間隔設定SWを、桁送りと兼用し、
SW2:HOLD SWを、数値合わせと兼用しました。
SW2を押しながら、P_ONすると、時計合わせモードに移行します。
B 時間管理は、RTCの、CLKOUTピンからの、1Hzクロックによる、外部割込みで行いました。
2月28日からの記事を参照してください。
※ 170224:
→ ソフトを更新し、_TEST_2としました。
<修正点>
@ 時間軸の管理を、メインループで行っていたのを、1秒周期の、T1割込みに修正しました。
A 画面更新時のチラツキを大幅に低減しました。
2月21日からの記事を参照してください。
※ 170204:
→ 使える形にまとめました。
ソフトは、TEST版で動きます。
1月27日からの記事を参照してください。
以下、この実験の顛末記です。
■ 2017.1.17
・解像度の高いQVGA液晶:UL024TF(340 x 240dot)を使い、温湿度・気圧の、3ch分離表示を
する実験を行ってみます。
28pinの、PIC24Fで、QVGAを動かすのは、初めてだが、これとピンコンパチの、
dsPIC33F(28pin)では、FFTアナライザの実験の時などで動かしている。
この時のライブラリが、ヘッダファイルの書き換えだけでほぼそのまま使えるはず
である。
ただ、両者では、クロック構成が異なる(dsPIC33Fの方が高速)ので、CLOCK定義と
遅延関数は、書換えないといけない。
・UL024TFを、PIC24Fトレーニング基板に接続する、ケーブル冶具を作成し、
早速、ソースを書いて、通例の表示テストプログラムを実行した。
以下、その結果例(何時もの、ASCII文字の描画テスト)です。
・3ch分離表示の画面デザインを検討し、デモ画面表示をテストプログラムに追加してみた。
Y軸方向は、
下から、101dot分を、湿度(0〜100%、1%/dot)に、1dot空けて、次のドットから、
51dot分を、温度(0〜50℃、1℃/dot)に、そして1dot空けて、次のドットから、
81dot分を、気圧(960〜1040hPa、1hPa/dot)に、割り当てた。
各刻みは、11dot等分(y+10)刻みとした。
そして、X軸方向は、
31dot等分(x+30)刻みの時間軸で、計151dotとした。
そして、左右の空いたエリアに、それぞれ、計測値と、時間軸レンジ(30min/D)、
各目盛の数値を表示することにした。
以下に、デモ画面の表示例を示します。(この時は、緑の座標線にするつもりでしたが、後日変更しました。)
■ 2017.1.19
・画面デザインが出来たので、これに、センサ・計測表示部の、ソフトを追加し、最初のソースを作成した。
緑の座標線なので、3chともに白でプロットしてみた。
一応、動いてはいるようだが、1秒毎に全画面クリアのため画面がチカチカしてしまう。
まこれは、自作オシロと同じで、モノクロと比較すると、カラーの場合、クリア処理に時間が掛かってし
まうので、ある程度はしょうがないのだが・・・
また配色も考慮が必要そうである。
ちょっと、座標線の主張が強く、やかましい感じがする。
・配色を変えてみました。
座標線は、目立たない、ブラウン、気圧は、イエロー、温度は、マゼンタ、湿度は、シアン
文字色は、ホワイト
これで少しは、見易くなったと思います。
■ 2017.1.20
・一応、画面のチラツキは多いが、当初の考えは実現出来た。
ここで、以下のチラツキ緩和策を、試してみる。
@ 単位と、目盛数値は、固定値なので、メインループに入る前で、1回だけ実行し、ループ
内でのリフレッシュはしないようにする。
A ループ内の、1秒毎のクリアは、画面全体でなく、座標線エリアのみにする。
B 計測値の更新は、ループ内で行うが、その最大桁数分の、bufの要素数にして、
どのような条件(数値桁数)でも、上書きした時、前の数値の一部が残らないようにする。
(上書きの前に、テキスト単位で最大桁分をクリアする操作を追加する。)
・Aに関しては、ライブラリには全画面クリアの関数しかないので、原点とエリアサイズ(X,
Y方向それぞれのドット数)
を引数として指定すると、そのエリアだけクリア(同色のドットで埋める。)出来る関数
void lcd_Area_Clear(short Xpos, short Ypos, short XareaDot, short YareaDot, unsigned short Color)を
作成しメインプログラム内に置いて、これをコールすることにした。
この対策で、少しは、チラツキ感が緩和されたと思う。
・それでもチラツキはあるので、写真撮りの時とかに、画面をホールする機能は必要になる。
HOLD SWを、押す毎に、ホールド⇔ホールド解除(計測途中再開)を繰返せるようにした。
SW読込みには、CN割込み(状態変化割込み)を使った関係で、計測中にもCN割込みを許可させる
と、I2Cタイミングに影響を与えてストップしてしまう可能性があるので、計測が終了した後の、
約1秒の更新待ちのところのみ許可にして、SWを読込むことにした。
なので、少し長めに押さないと、タイミングが合わなく検知されないことがあります。
これでも問題ないので、これで行くことにしました。
■ 2017.1.21
・ここで勘違いに気が付く。
履歴グラフ描画関数は、トラ技のものを使わさせて頂いているが、最初のプロットは、
1分後からと思っていたが、実際、前作のノキア液晶のを見ても、最初の開始点からプロットしていた。
今のプログラムでは、右側のY軸上でなく、その次の左側のドットからプロットを開始するようになっている。
また、履歴ポイント:HIST
VAL=
150に設定して、左側のY軸上のドットまでをプロットするようになっている。
なので次のように修正した。(座標描画は修正無し(X+30刻みの時間軸で、計151dotでok)
@ HIST
VAL= 150→ 151に修正
A プロット開始点は、1分後でなく、スタート点(0)なので、X=248でなく、座標Y線上の、X=
249からスタートに修正
■ 2017.1.22
・現在のプロット間隔は、1分/dot(30min/Dで、5目盛maxなので、1画面、2.5時間フルスケール)だが、
イニシャル時の、SW2の状態を読込んで、押されていたら、(押されてなかったら、1分/dot)
10分/dot(5h/Dで、5目盛maxなので、1画面、25時間フルスケール)になるようにソフトを修正した。
・ここで、時間軸目盛(30min/D及び、5h/D)が、プロット間隔(1分/dot及び、10分/dot)と合っているか
確認してみた。
30min/Dで確認したところ、dot描画(プロット)の方が、5分位遅くなっているようだ。
これは、計測間隔の、1秒インターバルを、簡易的に、履歴グラフの表示後に、delay_ms(1000);
としている為だ。
この時間は、画面をリフレッシュしたり、計測値を出力、履歴バッファへの格納、読出し表示等の処理時間
も含まれるので、遅延関数に設定している値は、1000より少なくしないと合わないはず。
本来は、タイマー割込みを使うのがよいのだろうが、今回はメインで処理しているので、各センサーから
生の計測値を読出す前までの、ループ時間を実測して、1秒ぴったりになるように遅延定数を調整して
みることにした。
具体的には、HDC_Read() ;の前に、LEDトグル:LATAbits.LATA3 = !LATAbits.LATA3;を入れて
その周波数をカウンタで測定し、(1/測定値)/2で、時間を、0.99〜1.00秒になるように定数を決めた。
その結果、delay_ms(360);とすることで、カウンタ値:0.503Hz(1.988秒)なので、計算上
1.988秒/2= 0.99秒とすることが出来た。
これで動かしてみると、ほぼぴったり時間軸目盛と合うようになった。
・これで、トレーニング基板での実験は終わりです。
動作模様は、このページトップの写真を参照してください。
---<ここから、追試:「使える形にまとめる」の記事>-------------------------------------
■ 2017.1.27
・出来るだけ手間の掛からない方法にしました。
コントロール基板には、実験テーマ79:「UL024TFの、タッチパネルを試す簡単な実験」の時
作った、dsPIC33F基板(ユニバーサル)が丁度、使いやすくてよいので、これを使うことに
しました。(タッチパネルを試す簡単な実験のために作ったので他に使うあても無く、暫くは部品箱に眠っていました。)
dsPIC33Fと、PIC24Fは、どちらも28pinで、ピン互換です。
数か所の改造で済みます。
追加:SW 2個と、センサ2個
修正:WR/, RS線のピン割り付け変更・外部8Mクリスタルの取り外し・LEDポートの変更・
Vcoreピンの、コンデンサ定数の変更
位です。
構造も、これと、自作液晶接続変換基板を、スタックする形になっているので、簡単に組み込めます。
下の写真のように、修正改造と、UL024TFによる動作確認まで完了しました。
上2枚(表・裏)が、コントロール基板で、下2枚(表・裏)が、液晶接続変換基板です。
■ 2017.1.31
・aitendoから、UT024TF代替えの液晶パネル:「S95417-AAA」が、2枚届きました。
ところが、その内の、1枚の外観に、破損部分があった。(4隅の白いツメ(出っ張り)の内、1つが取れていた。)
誤送による不良品と判断し、aitendoさんに、メールフォーム経由で、その旨、連絡し、返却・良品交換
を依頼した。
速やかな対応で、後日、無事、良品が送らてきた。
同送されてきた、切手添付済の、茶封筒に、不良品を入れて返却も済ませた。やれやれである。
・早速、JA1WBYさんから送られてきた「UL24TF代替えPT基板」に、実装してみた。
(この基板の詳しい内容は、JA1WBYさんの、このページを御覧ください。)
思ったより、液晶パネルのフレキシブルのパッドと、このPT基板のパッドの、ハンダ付け作業には神経を使ったが、
2枚目(別用途で使用)は、作業にも慣れ、問題なく済んだ。
簡単に、作業内容をまとめてみました。これで無事、使える形になりました。
尚、動作時の、5V入力消費電流は、約60mAほどでした。
バックライトLEDだけで、約40mA消費しています。
---<ここから、追試:「ソフト更新」の記事>-------------------------------------
■ 2017.2.21
・前回の更新から、約1ヶ月が経過してしまったが、実は、2月の初めから、この日までは、
今のバージョンに、時計表示を追加する実験を行っていた。
外付けの、RTCクロック振動子:32.768kHzを追加し、PIC24F内蔵の、RTCC機能を
使って、時刻合わせ付きの、時計表示を考えていた。
大方は上手く動いたのだが、何せ時刻精度が悪い。
時刻合わせ後、10分ほど経つと、少しずつ進みだし、約12hで、2分ほど進んでしまう。
このRTCCには、進み・遅れ補正レジスタビット:CAL<7:0>があり、ここに適当な値を
ロードすると、1分毎に、進み・遅れを自動補正する機能が付いている。
これを試すも、何故か補正が効かない?
RTCクロック振動子周りのC定数変更とか、ダンピング抵抗追加も試したが、効果なし。
この先、さらに追求する集中力も途切れ、この件は一時保留とすることにした。
この先、進めるに当たっては、内蔵RTCCでなく、I2C-RTCデバイスを使う予定である。
せっかくなので、実験中の写真を以下にアップしておきます。
■ 2017.2.22
・上記の実験をしている途中で、今まで気になっていた、グラフ画面更新時のチラツキを大幅に
減少出来たので、RTCCは駄目でも、このことは、TEST版にも反映させようと、ソフトを
更新することにしました。
ついでに、時間管理をメインループでなく、1秒周期のタイマー割り込みで行うように修正しました。
念のために、割り込み周期を、カウンタで実測してみました。
割込みルーチンの先頭に、トグルLEDを追加し、その周波数をカウンタで測定したところ、
下の写真のように、499.7mHz= 0.4997Hz= 2.0012秒となりました。
これにより、割り込み周期= 2.0012/2= 1.0006秒ということになります。
チラツキの改善は、エリア指定の全クリアでなく、1分毎の計測データをリングバッファに保存する
前に、過去の履歴ライン(ドット)のみクリアするように修正したら上手く行きました。
詳細は、末尾のソースを参照してください。
---<ここから、追試:「ソフト更新:RTC-8564NB追加」の記事>-------------------------------------
■ 2017.2.28
・時計表示実験を続行することにした。
内蔵RTCCでは、時刻精度が悪かったので、何時もの、I2C-RTCモジュール:RTC-8564NB
を使って試してみる。
I2Cプルアップ抵抗は、モジュールに内蔵の、2.2kは使わず、温湿度センサモジュール:HDC1000
内蔵の、10kを使うことにした。
また、バックアップ電池として、ボタン型リチューム電池:CR2032を使うことにする。
タイムレジスタの読出しと時計表示は、CLKOUTピンから出力されている、1Hzを、PIC24Fの
外部割込みピン:INT1(RB4ピンを、機能割付けレジスタにより、RP4に設定し、INT1ピンとして使用)
に入力し、この立上りで外部割込み(1秒毎)を掛け、INT1割込み関数の頭で実行することにした。
最初は、このモジュールのみのテストを、B_UP無しで行った。
■ 2017.3.1
・最初、I2Cアドレス(デバイスアドレス)の定義を、8ビットで書いてしまった。
7bitで表すのが普通なので、そう修正した。
また、RP4(RB4)ピンの、INT1機能割付けの記述を、ビット単位にしてなかった。
それを修正して動作OKになった。
時計精度も、特に問題ないようである。
基準に使っている大型LEDの置時計(分表示まで)の表示と合っているようなので、
今回の用途には問題ないと判断。
(少なくとも、内蔵RTCCの時の、約12Hで分単位の進みは無くなった。)
※ 参考までに、これがメインソースです→ PIC24F_RTC8564NB_TEST.c
■ 2017.3.2
・これに、センサ類を加えて実験を進めた。
まずは、B_UP無しで。特に問題無し。
※ 参考ソース: PIC24F_QVGA_TmpHumPres_TEST_3.c
■ 2017.3.5
・ボタン型リチューム電池:CR2032によるバックアップの実験を行った。
これは以前にも、2回ほど冶具を作って行っているので、今回もその時の冶具を少し改造して
使うことにした。
改造点は、以下である。
@ モジュールの外に置いた、2.2kのプルアップは削除。(10kを別の場所に実装)
A CLKOUTピンと直列に、10kの抵抗を追加。
これは、このピンは、シンク・ソース共に電流が流れる(±1mAmax)ので、バックアップ時の
逆流抑制の為必要のようなので、入れておきました。(web例だと、ショットキーダイオードの例があった)
・バックアップ機能は、長時間使ってみないと判りませんが、今のところ特に問題なく動いています。
※ 参考までに、これがメインソースです→ PIC24F_RTC8564NB_TEST_2.c
■ 2017.3.7
・B_UP有り+センサを加えて、TEST_4の実験も特に問題なし。
■ 2017.3.8
・現行の、_TEST_2のユニバーサル基板に、RTC+バックアップ回路を追加実装し
TEST_4バージョンの完成となりました。
---<ここから、追試:「ソフト更新:Y軸の分解能を倍にする」の記事>-------------------------------------
■ 2017.3.21
・今日アップされていた、JA1WBYさんの、追試した結果の、画面写真に感化され、
私のソフトもバージョン・アップすることにしました。
カラー液晶なので、分離表示でなく、座標線共通の、多重表示が可能なので、これを
試してみることにしました。
共通座標の各目盛デザインに関しては、JA1WBYさんのものが、よく考えられているので、
これをそのまま借用させて頂くことにしました。
多重表示により、最低気圧は、960hPaから、940hPaに、
最高温度は、50℃cから、85℃(HDC1000のレンジmxaが、85℃)に拡張されました。
■ 2017.3.22
・今のリング・バッファによる、履歴グラフ描画方式はそのままにしたい。
そのうえで、Y軸の分解能を倍(1→0.5)にしたい。
そうすると、今迄、一度取得した、浮動小数点型の、生データを、整数型にキャストして処理
していたのを、全て、浮動小数点型のまま、座標計算の際の判断をする必要がある。
その前提で、0.5変化を、1dot変化のドット描画とする為、例えば、温度であれば、
Ypos= 239-(int)(temp x 2); // 但し、tempは、double型
とすれば、0.5℃で、1dot変化するはずである。
トラ技のリングバッファ処理のソースは、ポインタと、ポインタ演算子を多用しているため、理解に苦しむ
ところだが、何とか、湿度についてだけ修正することが出来た。
とりあえず、座標線はそのままにして、湿度のドット描画を確認したところ、変化幅が倍になる波形
を確認できた。(下の写真ちょっと写りが悪く、湿度の色が黄色のように見えますが、シアンです。)
まだまだソースを整理しないといけない部分があるが、それは追々やることにした。
またこの修正により、ワード単位のバッファ配列になるので、メモリ消費を心配していたが、
PIC24FJ64GA002の、プログラムメモリ:64Kバイト/データメモリ:8.182Kバイトあるので、
まだ余裕があるようである。
■ 2017.3.23
・座標線はそのままだが、温度・気圧につても分解能を倍にする変更を確認してみた。
よさそうである。
・最後に多重描画(座標線共通の目盛)の座標に変更し、さらに、カレンダ時計表示と、時間軸レンジ表示
の位置を、それぞれ右上、左上に移動。また、測定値の色も、各グラフ・ドット色と合わせ変更した。
かなり良い見栄えになったと思う。(自己満足だが・・・)
※ 後日、取ったサンプル写真は、このページトップの写真を参照してください。
<最終回路図>
・こちらから、どうぞ→ 「QVGAグラフ表示温湿度・気圧計実験」 (PIC24Fトレーニング基板による実験回路)
「QVGA_グラフ表示温湿度・気圧計」 (使える形にまとめた版:ソフトは、TEST版のままで動きます。V1相当としました。)
「QVGA_グラフ表示温湿度・気圧計(BUP_時計付き)」: ※ 170310更新: ソフトは、TEST_4版で動きます。
<最終ソース及びヘッダファイル>
・こちらから、どうぞ→ 「PIC24F_QVGA_TmpHumPres_TEST.c」 (メインソース)
「PIC24F_QVGA_TmpHumPres_TEST_2.c」 (※ 17022:ソフト更新: 表示チラツキ大幅改善+タイマー割り込みで時間管理)
「PIC24F_QVGA_TmpHumPres_TEST_4.c」 (※ 170310:ソフト更新: RTC-8564NB+バックアップ電池追加版)
「PIC24F_QVGA_TmpHumPres_TEST_5.c」 (※ 170328:ソフト更新: Y軸の表示分解能を倍にし、座標共通の多重描画にした版)
「PIC24F_QVGA_TmpHumPres_TEST_6.c」 (※ 170811:ソフト更新: 時間軸拡張版)
///
QVGAカラー液晶ライブラリ: dsPIC33Fの物を、PIC24F用に一部修正しましたが、名前は、そのままにしました。
colorlcd_libdsPICVH.c
colorlcd_libdsPICVH.h
///
アスキーフォント
ASCII12dot.h
※ この他の、ライブラリは、実験テーマ85と同じです。