データロガーのサンプリング日時出力形式
Arduino-UNO 12bit×4chアナログ データロガーほぼ完成に
記しましたが、データをサンプルした日時の出力をどうした
ものかと悩んでおりました。
GNUPLOTに食わせるんで食わせやすい書式で、1日を越えた
記録でも扱いやすくというのが要求仕様。
GNUPLOTをあれこれ触ってみて、なんとかなりそうなんで、
単純にこうしておきます。
『 d H:M:S data1 data2 data3 data4』
先頭のdは1から始まる経過日。
H:M:Sは時分秒。
最初のデータは「 1 00:00:00 data1~」からスタート。
GNUPLOTに食わせるサンプルデータ。
1 00:00:00 0.00
1 06:00:00 0.20
1 12:00:00 0.40
1 18:00:00 0.60
2 00:00:00 0.80
2 06:00:00 1.00
2 12:00:00 0.80
2 18:00:00 0.60
3 00:00:00 0.40
3 06:00:00 0.20
3 12:00:00 0.00
3 18:00:00 -0.20
4 00:00:00 -0.40
4 06:00:00 -0.60
4 12:00:00 -0.80
4 18:00:00 -1.00
5 00:00:00 -0.80
5 06:00:00 -0.60
5 12:00:00 -0.40
5 18:00:00 -0.20
まず、GNUPLOTの「set xdata time」での処理。
こんなスクリプト。
set grid
set xdata time
set timefmt "%j %H:%M:%S" # 「%j」の範囲が1~366
set xrange [0:"6T0:0:0"] # この「T」で日を指定
set xtics 3600*12
set xlabel "\nDate/Time"
set format x "%1dday\n%H:%M"
set yrange [ -2:+2]
set ytics format "%4.2f"
set ytics 0.5
set key right top
plot "L1.txt" using 1:3 with lines lw 2 ti "Test"
結果のグラフ。 X軸の目盛が日と時分に。
次が「time」を使わずに、plotコマンドに書式指定を
導入して、日、時、分、秒に分けて、秒数を計算します。
日は1から始まるんで「-1」してゼロスタートに。
それがこれ。
X軸を「時間」にしています。
#秒で読んでから時間に直してみる
# 1 12:00:00 1.000
# $1 $2 $3 $4 $5
set grid
set xrange [0:120]
set xtics 12
set yrange [ -2:2]
set ytics format "%4.2f"
set ytics 0.5
set key right top
plot "L1.txt" using (((($1-1)*3600*24)+($2*3600)+
($3*60)+($4))/3600):($5) '%lf %lf:%lf:%lf %lf'
with lines lw 2 ti "Test"
「plot」のところの「'%lf~」が入力文の書式指定。
$1が日、$2~$4が時分秒。
$5からデータ部を続けます。
「%lf」は小数点付の数値指定。
そのグラフ。 X軸の単位は「時」に。
これで、まぁ、なんとかなりそうです。
※追記 10/30
gnuplotで文字列変数に入れてある文をコマンドとして差し込む方法(@を変数名の前に付ける)
を見ますと、長ったらしいし式を略して記せるとのこと。
しかし現用しているgnuplot4.6にはまだ搭載されてませんでした。
で、新しいgnuplotをダウンロード。
ちょっとテスト。
データ列をもう一つ増やして・・・
Yデータが一つだと。
plot "L1.txt" using (((($1-1)*3600*24)+($2*3600)+($3*60)+($4))/3600):($5) '%lf %lf:%lf:%lf %lf' with lines lw 2 ti "Test"
二つになると、
plot "L1.txt" using (((($1-1)*3600*24)+($2*3600)+($3*60)+($4))/3600):($5) '%lf %lf:%lf:%lf %lf %lf' with lines lw 2 ti "Test1" ,\
"L1.txt" using (((($1-1)*3600*24)+($2*3600)+($3*60)+($4))/3600):($6) '%lf %lf:%lf:%lf %lf %lf' with lines lw 2 ti "Test2"
長い。
($6)に変わるのと%lfが増える。
それを、
cc = "(((($1-1)*3600*24)+($2*3600)+($3*60)+($4))/3600)"
cs = "'%lf %lf:%lf:%lf %lf %lf'"
として、プロット実行で
plot "L1.txt" using @cc:($5) @cs with lines lw 2 ti "Test1",\
"L1.txt" using @cc:($6) @cs with lines lw 2 ti "Test2"
と。
短くなります。
・・・ところが・・・
想定してる電文、
1 00:00:00 1.084 0.262 0.000 0.000
$1 $2 $3 $4 $5 $6 $7 $8
これだと、$nは1~8まで。
8つのデータを取り出してグラフにしようとすると、
gnuplotがこんなエラーメッセージで拒否。
『format must have 1-7 conversions of type double (%lf)』
1~7の7コまでやで! 8コはあかん。っと。
※例
JIS C8708充放電中の電池電圧とLM35による温度出力。
取り込むとこんなデータが出てきます。
経過時間 電圧 温度:LM35(10mV/度)
1 00:00:00 1.084 0.262 0.000 0.000
1 00:00:10 1.084 0.262 0.000 0.000
1 00:00:20 1.083 0.262 0.000 0.000
:
1 04:06:00 1.479 0.269 0.000 0.000
1 04:06:10 1.479 0.268 0.000 0.000
1 04:06:20 1.479 0.268 0.000 0.000
10秒サイクルで取り込んで4時間あまり放置。
それをこんなgnuplotスクリプトでグラフ化。
~~~~~~~~~~~~~~~~~~~~~~~~~~~
#秒で読んでから分に直す
# 1 00:00:00 1.084 0.262 0.000 0.000
# $1 $2 $3 $4 $5 $6 $7 $8
set term wxt 0
set grid
set xrange [0:250]
set xtics 30
set yrange [0.8:1.8]
set ytics format "%4.2f"
set ytics 0.1
set y2range [10.0:60.0]
set y2tics format "%.1f"
set y2tics 10.0
set xlabel "経過時間(分)"
set ylabel "電圧(V)"
set y2label "温度(℃)"
set key right bottom
cc = "(((($1-1)*3600*24)+($2*3600)+($3*60)+($4))/60)" # 経過時間:分
cs = "'%lf %lf:%lf:%lf %lf %lf %lf'"
# $1 $2 $3 $4 $5 $6 $7 ($8がダメ)
plot "M10.txt" using @cc:($5) @cs with lines lw 2 ti "電圧",\
"M10.txt" using @cc:($6 * 100) @cs with lines lw 2 ti "温度" axes x1y2
~~~~~~~~~~~~~~~~~~~~~~~~~~~
出てきたグラフ。
新しいgnuplot、これまでのと色がチョイ違います。
充放電電圧変化と電池側面の温度変化が2サイクル分。
-Δ検出の様子やその時の電池温度上昇が分かります。
チャートレコーダーのようにリアルタイムでは見られません。
けど、こまかいところを見ようとしたとき、データですんで
手があります。
※『set xdata time』だとこんなスクリプトに。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 1 00:00:00 1.084 0.262 0.000 0.000 memo...
# 1 2 3 4 5 6 7
set term wxt 0
set grid
set xdata time
set timefmt "%j %H:%M:%S"
set xrange [0:15000]
set xtics 1800
set format x "%H:%M"
set yrange [0.8:1.8]
set ytics format "%4.2f"
set ytics 0.1
set y2range [10.0:60.0]
set y2tics format "%.1f"
set y2tics 10.0
set xlabel "経過時間(時)"
set ylabel "電圧(V)"
set y2label "温度(℃)"
set key right bottom
plot "M10.txt" using 1:3 with lines lw 2 ti "電圧" ,\
"M10.txt" using 1:($4 * 100) with lines lw 2 ti "温度" axes x1y2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
短縮するための「@cc」や「@cs」は不要。
普通に書けます。
出てくるグラフはこんなの。
「波」は同じですが、X軸の目盛が異なり「時:分」の
表現になっています。
とりあえず備忘録ということで。
| 固定リンク
「ツール」カテゴリの記事
- 初めて買ったArduino UNO・・・今は(2023.05.25)
- 電池ホルダーから電源供給するためのアダプタ(ダミー電池)#2(2023.03.24)
- 電池ホルダーから電源供給するためのアダプタ(ダミー電池)(2023.03.23)
- 基板ショート・チェッカ、役に立つ(2023.02.14)
- Arduino UNOで0.00~40.00mA定電流負荷回路(2023.01.13)
「Arduino」カテゴリの記事
- 初めて買ったArduino UNO・・・今は(2023.05.25)
- 液晶表示コントローラ HD44780で迎撃(2023.05.16)
- Arduino UNOで3相モーターを回す(2023.05.01)
- Arduino サーミスタを使った温度測定で 【ゼロ除算問題】(2023.03.23)
- A/Dコンバータでサーミスタの抵抗値を読む サーミスタをつなぐ場所は?(2023.03.21)
「gnuplot」カテゴリの記事
- コードレス電話の充電池がアウト #3(2022.08.29)
- コードレス電話の充電池がアウト #2(2022.08.28)
- DHT11を使った出窓の結露対策用ヒータ制御回路試験(2021.12.13)
- タクトスイッチを押してみる …何万回も その4(2021.11.16)
- サーミスタ温度計、何ビットのA/Dコンバータがいるか?(2021.08.11)
コメント