BME 280을 통한 환경 측정(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
octaveoctave: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입니다.
Reference
이 문제에 관하여(BME 280을 통한 환경 측정(octave 읽기 및 차트화)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/jp_yen/items/378535410c9cbfffc934텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)