« 東芝インパルス TNH-3A(2400mAh)JIS C8708:2019充放電試験 | トップページ | アナログデバイセズのF/Vコンバータ「451J」 »

2020年10月28日 (水)

データロガーのサンプリング日時出力形式

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軸の目盛が日と時分に。

Cap001

次が「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軸の単位は「時」に。
Cap002
これで、まぁ、なんとかなりそうです。

※追記 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
~~~~~~~~~~~~~~~~~~~~~~~~~~~

出てきたグラフ。
21_20201030161301
  新しい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」は不要。
普通に書けます。
出てくるグラフはこんなの。
Cap001_20201031100601
「波」は同じですが、X軸の目盛が異なり「時:分」の
表現になっています。

とりあえず備忘録ということで。


|

« 東芝インパルス TNH-3A(2400mAh)JIS C8708:2019充放電試験 | トップページ | アナログデバイセズのF/Vコンバータ「451J」 »

ツール」カテゴリの記事

Arduino」カテゴリの記事

gnuplot」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« 東芝インパルス TNH-3A(2400mAh)JIS C8708:2019充放電試験 | トップページ | アナログデバイセズのF/Vコンバータ「451J」 »