樹梅派版本為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 提供即時的網站輸出。
沒有留言:
張貼留言