google-site-verification: google3bd66dd162ef54c7.html

Arduinoで作るSDカードを使ったデーターロガー

 前の記事で簡単なデーターロガーを作りましたが、やはり液晶表示があった方が使い易そうなので、改良版を作ってみました。

▼液晶表示を付けたデーターロガー
ロガーのブレッドボード
 ご覧のように16x2のキャラクタ液晶を付けました。この写真では見づらいですが、液晶の接続基板は本来の向きとは裏返しに使いました。こうした方が構造的に安定するし、フットプリントも少し小さくなります。

▼回路図 (クリックで別窓に拡大)
ロガーの回路図
 I2C液晶なので接続は4本だけで済みます。この手軽さは嬉しいです。

 右下の明るさセンサーは周囲の明るさをモニターするためのものですが、これは無くてもOKです。

 ロガーのスケッチはこちら (拡張子をinoに要変更。S-JISでエンコードしています)

 ログの記録条件はLogConf.txtで指定しますが、下記はその設定例です
Data Logger test 2017/10/3
Log00450.csv
60
N, time(s), ch0, ch1, ch2, brightness, cpuTemp(C), cpuVcc(V)

説明
これはSDロガーの設定ファイルです。最初の4行だけ有効で、
以降はメモ領域(何を書いても読み飛ばされる)
1行目:ここに書いたテキストはログデーターの最初に記録される
2行目:ログファイル名(8+3形式で指定)
3行目:記録間隔。秒単位で指定
4行目:列の名前
 以下は実行時の液晶画面です

▼ログ記録開始前
開始時の液晶表示
 ログの名称(LogConf.txtの1行目の最初の16文字)とログファイル名、ログ記録間隔(秒)を表示します。

▼記録中
記録中の液晶表示
 1行目は左から、記録インターバル残り時間、記録した行数、CPUの温度。2行目は、各チャンネルの電圧で、表示の内容は1秒周期で更新されます。

▼ログの例
出力例
 brightnessはフォトトランジスタで検出した周囲の明るさです。このロガーはRTCが無いので正確な時刻は判りませんが、明るさセンサーがあれば、昼夜の区別くらいはつけることが出来ます。なおbrightnessの値は、夜間は5V近くになり、昼間は1V以下の値になります。この感度を調整したい場合は、フォトトラのコレクタ抵抗(Rp)をCPU内蔵のプルアップ抵抗から外部抵抗に変更すればいけると思います。

 cpuTempはCPUに内蔵された温度センサーの値、cpuVccはCPUの電源電圧です。このあたりの測定原理は以前の記事をご覧ください。なおCPUに内蔵されている温度センサの分解能はとても粗いので、何度も測定してアベレージングすることで無理やり 0.1 度単位の値にしています。また絶対精度も怪しいので、無いよりがマシくらいに考えて下さい。それにCPUチップの発熱の影響もモロに受けますし、、

 CPU電源電圧(cpuVcc)はADCの内部基準電圧(1.1V)を使って測定しているので、そこそこ正確な値が得られるはずです。なお、ch0~3 の測定結果は、フルスケール(電源電圧)が5Vという前提で換算した値なので、絶対値が問題になる場合は注意が必要です。

◆まとめ
 Arduinoで作るデーターロガーとしては結構高機能なものが出来たと思います。これをベースに改造でもなんでもやって試していただけば、と思います。

 次はこれを電力ロガーとして仕上げていきたいと思います。電力量計を買ったのが7月の終わりなので、あれから2ケ月経ったわけですが、納期など無いので自分のペースでのんびりとやっていきたいと思います。

 ところで、今回のプログラムは液晶に固定フォーマットで数値を表示させていますが、そのプログラムが何とも美しくないのが気になっています。lcd.printf( )とやって書式指定が出来ればいいのですが、液晶のライブラリにはそんな機能はサポートされていないようです。ということで、他の手を探す必要があります。
 String形式を操作する関数を使うか、sprintf()を使えば良さそうですが、うまくいったら記事にしたいと思います。
関連記事

コメントの投稿

管理者にだけ表示を許可する

No title

こんにちは、右詰め表示ですね。
8桁の周波数表示にsprintfを使ったことがあります。

char disp_buf[16];
を用意しておき、(桁数はこんなにいらないと思いますが)

int freqL = freq % 1000;
int freqM = (freq / 1000) % 1000;
int freqH = freq / 1000000;
sprintf(disp_buf, "%2d,%03d,%03d", freqH, freqM, freqL);
lcd.print(disp_buf);

周波数freqを3桁区切りで表示できます。

edyさん、おはようございます

書いていただいたコードに、変数の定義などを追加したら見事に動きました。ありがとうございます。なお、液晶を準備するのが面倒なので、シリアルに出力しました。

今回やりたいのは、右詰めで上位をゼロサプレスですが、ここまで出来ていればあとは書式指定の文字列の修正でいけそうです。
カレンダー
06 | 2018/07 | 08
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。

記事が気に入ったらクリックを!
最新記事
カテゴリ
最新コメント
リンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード