2016年8月14日

迷你空氣盒子的繪圖資料處理

IMAG2179




七月中旬參加MAKERPRO的「自造迷你空氣盒子實戰工作坊」之後,我把原先的盒子另外加了藍牙模組,就增加了簡單單向通訊功能。

原始從Serial Print出來的資料長這樣,每10秒會吐出一次這樣的資料。為了讓它的資料可以被手機的bluetooth graphic接收,所以我去把其中PM2.5的資料前面加個E,另外print一條出來

State #0.
loop
State #1.
T = 30.00,H = 54.00
PM1.0=11 ug/m3
PM2.5=14 ug/m3
E14
PM10=21 ug/m3
complete




為了長期紀錄資料,所以我用電腦藍牙與之連接。ubuntu的藍牙連接埠是/dev/rfcomm0
增加時間戳記的指令是ts,ts後面跟著'%Y-%m-%d %H:%M:%S',  是時間戳記的格式,可以自訂。最後再把資料送到logfile這個檔案裡

ts '%Y-%m-%d %H:%M:%S', < /dev/rfcomm0|grep E >>logfile

出來的資料就是長這樣,每筆serial print的資料都會加上電腦的本地時間

2016-07-17 04:39:56, State #0.
2016-07-17 04:39:56, loop
2016-07-17 04:39:56, State #1.
2016-07-17 04:39:56, T = 30.00,H = 54.00
2016-07-17 04:39:56, PM1.0=11 ug/m3
2016-07-17 04:39:56, PM2.5=14 ug/m3
2016-07-17 04:39:56, E14
2016-07-17 04:39:56, PM10=21 ug/m3
2016-07-17 04:39:56, complete



由於只需要PM2.5的資料,所以另外用指令把logfile的資料擷取出單純PM2.5的資料,存在logfile2,以下的資料處理就只針對logfile2去作。
cat logfile| awk 'match($0, /PM2.5=(.*)\sug/, a) {print $1" "$2" " a[1]}' >logfile2

直接使用logfile2來繪圖,可以得到將近一個月的室內PM2.5起伏狀況。




===gnuplot script START====
#!/usr/local/bin/gnuplot -rv
set xdata time
set datafile separator ","
set timefmt "%Y-%m-%d %H:%M:%S"
#set format x "%H:%M:%S"
set format x "%m/%d\n%H:%M"
#set xrange ["2016-07-02 23:00:00":"2016-07-02 24:00:00"]
#set xtics "2016-07-02 20:00:00",600,"2016-07-02 24:00:00"
set yrange [0:100]
#unset mxtics
set xlabel "time"
set ylabel "PM2.5"
set title "PM2.5"
set grid
unset key
plot "logfile3" using 1:2 with lines title "value1" linetype rgb "blue"
pause -1
===gnuplot script END====





我想要再看看另外的圖片,是把這一個月的資料,畫在一天24小時內,看看是否會看得出週期性,一開始用線來畫,一條線就是一天的資料。


後來改用point來畫,看起來比較能看出趨勢。總之室內的PM2.5濃度大多是落在40以下,偶而有衝上100以上的,其實是自己焊接東西造成的。



作法紀錄在底下:

依照日期,切割每天資料到個別的文件中,比方說7月16日的就切到16這個文件裡。接著把每行中的「秒」資料刪除,目的是最後繪圖時,把每一分鐘內的量測資料平均成一個值,不然的話,這一分鐘內上下起伏的資料,會起伏很大。




===bash script START===
#!/bin/bash 
for ((i=1;i<=8;i++))
do
cat logfile2|grep "2016-08-0$i" >result/$i
cut -d" " -f 2,3 result/$i|sed 's/:[0-9][0-9],//g'>result/pm$i
#echo -ne "$i\n"

done

for ((i=16;i<=31;i++))
do
        cat logfile2|grep "2016-07-$i">result/$i
cut -d" " -f 2,3 result/$i|sed 's/:[0-9][0-9],//g'>result/pm$i
done
===bash script END===





為了要快速製作每一天的資料,所以直接用bash loop產生,執行後,把產生的文字貼到gnuplot的 script
==bash script START==
#!/bin/bash 
for ((i=1;i<=31;i++))
do
        #echo -ne "$i\n"
        echo "\"result/pm$i\" using 1:2 smooth unique with points pointtype 7 ps 0.1 lc rgb \"red\" notitle,\\"
done
==bash script END==


幾個gnuplot平均資料的方式,可以看此篇文章:平均データを平均化する


===gnuplot script START=====

#!/usr/local/bin/gnuplot -rv
set xdata time
#set datafile separator ","
set timefmt "%H:%M"
#set format x "%H:%M:%S"
set format x "%H:%M"
#set xrange ["2016-07-02 23:00:00":"2016-07-02 24:00:00"]
#set xtics "2016-07-02 20:00:00",600,"2016-07-02 24:00:00"
set yrange [0:150]
#unset mxtics
set xlabel "time"
set ylabel "PM2.5"
set title "PM2.5"
set grid
unset key
#set term pngcairo size 800,600
#set output "test.png"
plot \
"result/pm1" using 1:2 smooth unique with points pointtype 7 ps 0.1 lc rgb "red" notitle,\
"result/pm2" using 1:2 smooth unique with points pointtype 7 ps 0.1 lc rgb "red" notitle,\
"result/pm3" using 1:2 smooth unique with points pointtype 7 ps 0.1 lc rgb "red" notitle,\
"result/pm4" using 1:2 smooth unique with points pointtype 7 ps 0.1 lc rgb "red" notitle,\
pause -1
===gnuplot script END=====