はじめに
前回は、シフトレジスタを使ったシリアル→パラレル変換でのマトリックスLEDの3色表示を紹介しました。今回は、温湿度センサーからの温度と湿度を3色交えながらスクロール表示します。
方法
温度や湿度は環境で変化するので、逐次表示を更新する必要があります。ここでは、表示フォーマット Array に memmove関数 を使って温度と湿度バッファの内容をコピー/上書きしています。(下図)
温湿度測定のたび、測定値を基に内蔵EEPROMから数字キャラクター(0~9)が読み出され、Temp10(温度10の位),Temp01(温度1の位),Humi10(湿度10の位),Humi01(湿度1の位)の各バッファにコピーされます。バッファの内容は、memmoveで指定されたArrayの場所にコピーされるので、バッファが更新されると表示内容も更新されます。
memmove関数について
memmove関数は、指定byte分のメモリブロックをコピーする関数です。次の文字配列Strの例で説明します。なお、memmove関数を使うには、ヘッダーファイル string.h をインクルードしておく必要があります。
char Str[] = “abcdefghijklmnopqrstu”; //Strは文字配列 (1文字=1 byte)
memmove(Str+5,Str,10); //Strの先頭から5 byte進めた位置に、Strの先頭から10 byteをコピー
memmove後のStrの内容は abcdeabcdefghijpqrstu となります。
また、似たような関数にmemcpyがあります。違いは、memcpyはコピー元とコピー先の領域が重なるのはNGなのに対し、memmoveは重なってもOKということです。従って、上記Strの例でmemcpyは使えません。なお、memmove,memcpyとも配列の中身が文字、数値に関係無くコピーしてくれます。但し、コピー元のメモリ領域がコピー先より大きいと、バッファオーバーフローに繋がるので、データメモリの操作は注意が必要です。
内容
下は、回路図とブレッドボードでの実験の様子です。実験(その3)の回路に、温湿度センサー SHT31を追加しています。SHT31は、過去記事「7セグメントLEDデジタル時計+温湿度計」などで使用していますので参照して下さい。
以下は、本例プログラムの抜粋です。温度は赤、湿度は緑、それ以外は橙(赤+緑)で表示します。
なお、この実験では表示色の制御にポインタを使っています。ポインタを使うと、カソード列単位つまり1列ごとに細かく表示色を制御できます。(理由は分かりません。試行錯誤の結果です)
結果
本例の動画はこちら。温度と湿度が変化しながら、スクロールも速くなります。
まとめ
このように、状況に応じてマトリックスLEDの表示内容を変更する場合、memmove関数が簡単で便利です。但し、繰り返しになりますが、データメモリの操作は十分注意して下さい。実験(その5)は、リアルタイムクロックモジュールを使った電光時計にトライします。
– 以上 –
Appendix
PIC16F18857は、PPS(Peripheral Pin Select)を備えています。PPSとは、デジタル周辺モジュールのI/Oを任意のピンに割り当てることができる機能※です。(※デジタルピンのみ。アナログピンは不可)
本実験では、スクロール調整にANC3(RC3ピン)を使用しています。一方、温湿度センサーに使うSCL1はデフォルトがRC3ピンなので競合します。この場合でもPPSがあるので、下に示すPin Manager Grid Viewから別のピン(RC5)に割り当てることができます。PPSを備えるPICマイコンであれば、周辺モジュールI/Oの競合回避や、部品/配線のレイアウトも柔軟に対応できます。
なお、周辺モジュールによっては、デフォルト以外のポートでピンが割り当てできないものがあります。詳細は、使用するPICマイコンのスペックシートを確認して下さい。