BME 280을 통한 환경 측정(octave 읽기 및 차트화)

8141 단어 OctaveBME280
octave로 로그를 그래프로 변환하세요.
로그 파일의 첫 번째 열은time그래서 시간t를 날짜로 바꾸는 방법을 찾다.
T = strftime("%F %T",localtime(1551846602))
C와 호환되는 방법입니다.그런데 이 녀석은
octave
octave:25> A = [
>     1551843601, 17.28;
>     1551844201, 17.99;
>     1551844802, 18.32;
>     1551845401, 18.23; ];
octave:26> 
octave:26> T = strftime("%F %T",localtime( A(:,1) ))
T = 2019-03-06 12:40:01
octave:27> T = strftime("%F %T",localtime( A(1,1) ))
T = 2019-03-06 12:40:01
octave:28> T = strftime("%F %T",localtime( A(2,1) ))
T = 2019-03-06 12:50:01
어쨌든 첫 번째 요소만 읽을 줄 안다.
또 뭐 없나?이 함수는datenum () 입니다.
날짜와 시간을 데이터 시퀀스 날짜 값으로 변환하는 함수입니다.
octave
octave:42> datenum('2019-03-03 10:10:10')
ans =     737487.423726852
octave:43> datenum('2019-03-04 10:10:10')
ans =     737488.423726852
하루에 한 번씩 가산점을 줘야 할 것 같아서 시간t에 맞추려면 24h*60m*60s=86400을 치는 것이 좋습니다.
카운트 시작 날짜 시간 확인t=0의 날짜를 확인하고 당일의 직렬 날짜 값(DateNumber)을 확인합니다.
tcsh
Ras1:~> date --date=@0 +"%F %T"
1970-01-01 09:00:00
octave
octave:49> datenum('1970-01-01 09:00:00')
ans =           719529.375
time_t=0시, DateNumber = 719529.375
관련 공식은 $\rac{mbox{time t}{24\times60\times60}=\mbox{datenum()}-7719529.375달러
즉, 날짜로 바꾸지 않더라도 octave의 직렬 날짜 값으로 바꾸면 OK?
octave
octave:95> A = [1551843601, 17.28;
>     1551844201, 17.99;
>     1551844802, 18.32;
>     1551845401, 18.23 ];
octave:96> 
octave:96> A (:,1) = A(:,1) ./ (24*60*60) + 719529.375
A =

      737490.527789352                 17.28
      737490.534733796                 17.99
      737490.541689815                 18.32
      737490.548622685                 18.23

알기 쉬운 날짜로 바꿔야 돼요.
octave
octave:131> datestr(A(:,1) / (24*60*60) + 719529.375, "'yyyy-mm-dd HH:MM:SS'")
ans =

'2019-03-06 12:40:01'
'2019-03-06 12:50:01'
'2019-03-06 13:00:02'
'2019-03-06 13:10:01'

네, 하지만 문자열이기 때문에 행렬에 들어갈 수 없습니다.그리고 시퀀스 값이 더 쉽게 처리될 것 같아서 DateValue로 가기로 했습니다.
cvs 파일을 직접 읽어서 도표를 만듭니다.
어쨌든 기온도부터 한 장 써.
drow_temp.m
logfile = '/var/log/BME280/201903.csv';
logs=dlmread(logfile, ",");

# time_t / 24/60/60 = datenum() -719529.375
log_date = logs(:,1) / (24*60*60) + 719529.375;
log_temp = logs(:,2);

plot(log_date, log_temp, '-x;Temp;');

ylabel('Temperature')
xlabel('Date')

# X軸の表記を日時にする
datetick('x', "%m/%d %H");

선을 그릴 때 매우 은폐되어 기호를 그려 보았다.
응, 선을 적당히 그릴 뿐이야.이건 표시만 하는 게 좋을 것 같아요.
X축이 날짜로 성공적으로 표시됩니다.그럼 이 기압을 표시하려면 Y축을 하나 더 써야 하나요?
plotyy를 사용할 수 있을 것 같습니다.그렇구나.
그래서 쏜살같이 뛰어나와 이런 느낌으로 변했다.
write_graph.m
#!/usr/bin/octave-cli -qf
#{

 write_graph.m <input.cvs> <output dir>

 input.cvs のファイルを読んで output_dir/ の下に jpeg ファイルを出力する
 出力するファイル名は input.cvs のファイル名の拡張子を jpg に変えたもの

#}

format long
clear

# 引数のチェック
# 入力ファイル、出力ディレクトリの存在を確認
#{
if (nargin != 2)
    printf ("%s <input.cvs> <output dir>\n", program_name);
    return
endif
#}

# 引数に指定が無いときのダミー用ファイル
log_file = '/var/log/BME280/2019-03.csv';
graph_dir = tilde_expand("~pi/BME280/");

if (1 <= nargin)
    log_file = tilde_expand(argv(){1})
endif
if (exist(log_file,"file") == 0)
    error("input file not found!: %s", log_file)
    return
endif

if (2 == nargin)
    graph_dir = tilde_expand(argv(){2})
endif
if (exist(graph_dir,"dir") == 0)
#   mkdir(graph_dir)
    error("output directory not found!: %s", graph_dir)
    return
endif
# make path
[path ,name, ext] = fileparts(log_file);
graph_file = fullfile(graph_dir, strcat(name, '.png'));


# CVS ファイルを読む
logs=dlmread(log_file, ",");

# time_t / 24/60/60 = datenum() -719529.375
log_date = logs(:,1) / (24*60*60) + 719529.375;
log_temp = logs(:,2);
log_pres = logs(:,3);
log_humm = logs(:,4);

g_handle = figure('visible', 'on');

### #{
############################
### スプライン曲線で補間 ###
############################
log_date_div = min(log_date):(1/24/60):max(log_date);
log_temp_pp = spline (log_date, log_temp);
log_pres_pp = spline (log_date, log_pres);
log_humm_pp = spline (log_date, log_humm);

[Yaxis,  g_temp,  g_pres ] = plotyy(
    log_date_div, ppval(log_temp_pp,log_date_div),
    log_date_div, ppval(log_pres_pp,log_date_div))
hold on
[~    ,  g_humm,  ~      ] = plotyy( Yaxis(1),
    log_date_div, ppval(log_humm_pp,log_date_div), 0, 0)
set(g_humm, 'color', [0  0  .3])
set(g_temp, 'color', [.3 0  0 ])
set(g_pres, 'color', [0  .3 0 ])
graphs=[g_temp,g_pres,g_humm]
set(graphs, 'marker','.', "markersize", 3, 'linestyle', 'none')
### #}

############################
###   データをプロット   ###
############################
[Yaxis, g_temp, g_pres ] = plotyy(log_date, log_temp, log_date, log_pres);
grid on
grid minor on
hold on
[~     , g_humm, ~      ] = plotyy(Yaxis(1), log_date, log_humm, 0, 0);
# g_humm = plot(log_date, log_humm, 'g');

title(name,
    'fontsize', 14,
    'fontname', 'Noto Mono',
    'color', [0 0 0])
################
# 線の色, 種類 #
################
graphs=[g_temp,g_pres,g_humm];
set(g_temp, 'color', [0.9 0.3 0.3])
set(g_pres, 'color', [0.3 0.9 0.3])
set(g_humm, 'color', [0.3 0.3 0.9])
set(graphs, 'marker','x', "markersize", 3, 'linestyle', 'none')

legend(graphs, 'Temperature [^\\circC]', 'Pressure [hPa]', 'Relative Humidity [%]', 'location', 'northwest')
legend("boxoff")

################
###   Y 軸   ###
################
ylim(Yaxis(1), [floor(min([log_temp;log_humm])/10)*10, ceil(max([log_temp;log_humm])/10)*10])
ylim(Yaxis(2), [floor(min(log_pres)/10)*10, ceil(max(log_pres)/10)*10])

set(Yaxis(1), 'ylabel', 'Temperature[^\\circC] and R.H.[%]', 'ycolor', [0.9 0.3 0.3])
set(Yaxis(2), 'ylabel', 'Atmospheric pressure[hPa]',         'ycolor', [0.3 0.9 0.3])
set(Yaxis, 'fontsize', 14)

################
###   X 軸   ###
################
# ラベルを表示するのは一つだけにする
set(Yaxis, 'XTickLabel', "");

# 書式を日時にする
datetick();     # 日付の自動書式
datetick('x', "%d"); # 指定書式の場合

xlabel('Date')
# X 軸の範囲を揃える
xlim(Yaxis(1), [floor(min(log_date)), ceil(max(log_date))])
xlim(Yaxis(2), [floor(min(log_date)), ceil(max(log_date))])

# 1時間前 = datenum(0,0,0,1)
# 1日前   = datenum(0,0,1)
# xlim(Yaxis(1), [now()-datenum(0,0,0,1), now()])
# xlim(Yaxis(2), [now()-datenum(0,0,0,1), now()])

saveas(g_handle, graph_file)

매개 변수의 대응은 이후에 잘 진행될 것이며, 어쨌든 먼저 도표를 만들었다.
적: 온도 [℃], 청: 습도 [%], 녹색: 대기압 [hPa]
밝은 x기호는 실제 측정값이고 농점은 플라워 키 곡선에 삽입된 값이다.6일 저녁부터 7일 아침까지의 온도와 습도는 매우 이상하다.끼어들면 안돼.

삽입 부분에 대한 평론은 x 기호가 아니라 점으로 그린 도표입니다.12일 습도가 급격히 떨어진 것은 전날 비가 내린 뒤 창문이 열렸기 때문이다.

눈.


plot 속성 일람
https://octave.org/doc/interpreter/Line-Properties.html#Line-Properties
ax = plotyy(~,~)
set (ax, 'xscale', 'log','xminortick', 'on');
X축은 대수 스토리지이고 minortick은 ON입니다.

좋은 웹페이지 즐겨찾기