2017年2月4日

太陽能板市電並聯系統架設,含監測硬體(軟體篇)

架設完硬體後,接下來就是設定樹梅派的軟體部份。
樹梅派版本為Raspberry pi 2,RASPBIAN JESSIE LITE (2017-01-11),Kernel version 4.4

撰寫接收跟發送訊息的腳本跟交流計量模組溝通。

讀取的腳本為 read.sh
stty -F /dev/ttyUSB0 raw speed 9600 -echo

while read -rs -n 1 c #&& [[ $c != 'q' ]]
do
        echo -en "<$c>"|hexdump -x # Replace this with code to handle the characters read
done < /dev/ttyUSB0

由於輸出是binary的hex格式,使用hexdump處理成字串
也可以使用 cat 直接貯存成log檔,再用 hexdump 處理

發送訊息只要透過echo 送入裝置即可,例如
echo -en "\xB0\xc0\xa8\x01\x01\x00\x1A" > /dev/ttyUSB0
#查詢電壓 
echo -en "\xB1\xc0\xa8\x01\x01\x00\x1B" > /dev/ttyUSB0
#查詢電流
echo -en "\xB2\xc0\xa8\x01\x01\x00\x1C" > /dev/ttyUSB0
#查詢功率
echo -en "\xB3\xc0\xa8\x01\x01\x00\x1D" > /dev/ttyUSB0
#查詢累積度數

在一個終端機執行read.sh,另一個終端機使用echo發送,即可以讀到hex的訊息。
發送兩次訊息時間應該要間隔兩秒比較恰當。

完整的腳本如下run.sh
#!/bin/bash
stty -F /dev/ttyUSB0 raw speed 9600 -echo
cat /dev/ttyUSB0 > /home/pi/Sync/log &
sleep 5s
echo -en "\xB0\xc0\xa8\x01\x01\x00\x1A" > /dev/ttyUSB0
#/home/pi/Sync/send.sh b0 
sleep 2s
echo -en "\xB1\xc0\xa8\x01\x01\x00\x1B" > /dev/ttyUSB0
sleep 2s
echo -en "\xB2\xc0\xa8\x01\x01\x00\x1C" > /dev/ttyUSB0
sleep 2s
echo -en "\xB3\xc0\xa8\x01\x01\x00\x1D" > /dev/ttyUSB0
sleep 5s
kill $(ps aux | grep 'cat /dev/ttyUSB0' | awk '{print $2}')
date +"%Y-%m-%d-%H-%M-%S" >> /home/pi/Sync/log2.csv
cat /home/pi/Sync/log |od -tx1d1 -w7 >> /home/pi/Sync/log2.csv

該腳本會先執行 cat 監聽該設備(ttyUSB0),5秒後查詢電壓,間隔2秒才是電流、功率與度數。
傳回的訊息紀錄成log檔,結束後關閉 cat 監聽,將目前時間寫入log2.cav,然後把log轉成16進位的hex格式與10進位的數字格式後,繼續寫入log2.csv。

log2.csv資料內容如下,
2017-02-04-13-27-17
0000000   a0   00   72   08   00   00   1a
         -96    0  114    8    0    0   26
0000007   a1   00   00   53   00   00   f4
         -95    0    0   83    0    0  -12
0000016   a2   00   58   00   00   00   fa
         -94    0   88    0    0    0   -6
0000025   a3   00   0d   68   00   00   18
         -93    0   13  104    0    0   24
0000034
2017-02-04-13-28-18
0000000   a0   00   72   08   00   00   1a
         -96    0  114    8    0    0   26
0000007   a1   00   00   57   00   00   f8
         -95    0    0   87    0    0   -8
0000016   a2   00   5d   00   00   00   ff
         -94    0   93    0    0    0   -1
0000025   a3   00   0d   69   00   00   19
         -93    0   13  105    0    0   25
0000034

有16進位的格式,也有10進位的格式。詳細請查閱 od -tx1d1 -w7 這條指令
只要使用 sudo crontab -e 每分鐘執行 run.sh 腳本,樹梅派就會每分鐘監測一次,過程大約17~18秒。注意要使用 sudo 不然會有權限上的問題。

log2.csv仍有些餘贅,使用 cat 再處理一次,如下 sed.sh
cat /home/pi/Sync/log2.csv|sed "s/0000000//g" |sed "s/0000007//g"|sed "s/0000016//g"|sed "s/0000025//g"|sed "s/0000034//g"|sed "s/   / /g"|sed "s/  / /g"|sed "s/  / /g"|sed ':a;N;$!ba;s/\n\n/\n/g' >/home/pi/Sync/log5.csv

將餘贅、空格、空行刪除,寫入 log5.csv 中。
再透過crontab -e 每五分鐘執行一次

資料將存入Sync資料夾,透過 Syncthing 軟體自動同步到雲端,這個軟體如同Dropbox一樣,但是開源,支援各式平台,包含android。沒有固定ip也可彼此聯繫,是 IOT 的好朋友。

雲端伺服器接收到後,透過R的套件,shiny server 提供即時的網站輸出。

沒有留言:

張貼留言