前エントリの続きです。前エントリでは、大気圧・温度センサのRaspberry Piへの接続を行っています。
概要
次の機能を一つのpythonコードに押し込んで、(root権限の)crontabで定期的に(5分ごとないしは、20分ごと)実行して、pngグラフ作成までを行う。
- i2cでLPS331から、大気圧と温度を読んできて、ファイルに書き出す。
- ファイルから読み込んで、グラフにする。
このグラフを外のPCから読めるように簡易httpサーバを立てて、pngにリンクする。
他のPCのブラウザから接続すると、こんな感じになる。
httpサーバ
pythonの一行で建てれる簡易サーバを使った。
SimpleHTTPServer
次の一行をコマンドラインから実行するとサーバが立ちます。well-knownポートを使う場合はroot権限がいるかもしれないので、8000番とした。コマンドを実行したディレクトリ以下を外から見ることができる。pngのあるディレクトリをまるごと見せるか、そこにindex.htmlでも置けば良い。
python -m SimpleHTTPServer 8000
crontabの設定
$ sudo crontab -e
として次の行を追加。
*/5 * * * * /home/pi/pressure-logger.py
データファイル形式
次のよう。
20140726-2210 1006.48 31.45
20140726-2212 1006.35 31.40
20140726-2215 1006.37 31.34
スクリプト(pressure-logger.py)はこちら。
matplotlibによるグラフ作成の部分はトラ技2014年7月号(これもお借りしてきた)をだいぶ参考にした。
#!/usr/bin/python
import smbus
import time
import datetime
import matplotlib as mpl
matplotlib.use('Agg')
import matplotlib.dates
import matplotlib.pyplot
logpath = '/home/pi/press/'
logfile = 'pressure.log'
graphfile = 'graph.png'
nh = 2000 #number of history to plot
class pressureSens:
""" pressure sensor LPS331 controled through i2c interface """
def __init__(self, addr = 0x5d):
self.i2c = smbus.SMBus(1)
self.addr = addr
self.i2c.write_byte_data(self.addr, 0x20, 0x94) #CTRL_REG1 dev. on, 1 Hz update, block data update
def get_press(self):
return ((self.i2c.read_byte_data(self.addr, 0x2a) * 0x10000) + (self.i2c.read_byte_data(self.addr, 0x29) * 0x100) + self.i2c.read_byte_data(self.addr, 0x28)) / 4096.0
def get_temp(self):
#print "%X" % ((self.i2c.read_byte_data(self.addr, 0x2c) * 0x100) + self.i2c.read_byte_data(self.addr, 0x2b))
return -((((self.i2c.read_byte_data(self.addr, 0x2c) * 0x100) + self.i2c.read_byte_data(self.addr, 0x2b)) - 1) ^ 0xffff) / 480. + 42.5
def chk(self):
return (0xbb == self.i2c.read_byte_data(self.addr, 0x0f))
def makeGraph():
f = open(logpath + logfile, 'r')
dates = []
prs = []
tmp = []
for line in f:
#print line[0:13],line[14:21], line[22:27]
dates.append(datetime.datetime.strptime(line[0:13], "%Y%m%d-%H%M"))
prs.append(float(line[14:21]))
tmp.append(float(line[22:27]))
#print dates
x = mpl.dates.date2num(dates)
#print len(x), x[len(x)-2:len(x)]
fig = mpl.pyplot.figure()
ax1 = fig.add_subplot(111)
l = len(x)
ax1.plot_date(x[l-nh:l], prs[l-nh:l], 'r')
ax2 = ax1.twinx()
ax2.plot_date(x[l-nh:l], tmp[l-nh:l], 'b')
ax1.set_title("Pressure and Temperature")
ax1.set_xlabel("Date and Time")
ax1.set_ylabel("Pressure (mbar)", color='r')
ax2.set_ylabel("Temperature (degC)", color='b')
y_formatter = mpl.ticker.ScalarFormatter(useOffset=False)
ax1.yaxis.set_major_formatter(y_formatter)
fig.savefig(logpath + graphfile)
def main():
p = pressureSens()
#print p.chk()
#print "%.2f" % p.get_press()
#print "%.1f" % p.get_temp()
wbuf = "%s %.2f %.2f\n" % (time.strftime('%Y%m%d-%H%M'), p.get_press(), p.get_temp())
#print wbuf
f = open(logpath + logfile, 'a')
f.write(wbuf)
f.close()
makeGraph()
if __name__ == '__main__':
main()
おすすめのラズパイ用センサー
このように、センサー類があるとラズパイの応用の幅がぐっと広がります。
2017年2月現在、Amazonで取扱の20種類のセンサーセットが3,980円に値下げされています。
このセットをひとつ買っておけばしばらく遊べるので、おすすめです。
ベスト センサーモジュール キット 20種セット for Arduino / raspberry pi 3 モデル B raspberry pi 2 Model B 収納ケース付き
センサーの一覧は次のとおりです。
温度センサー/ホール効果センサー/赤外線トラッキングセンサー/タッチセンサー/マイク・サウンドセンサー/デジタル温度&湿度センサー/3色フルカラー SMD LEDモジュール/赤外線リモコン受信モジュール/赤外線送信モジュール/Bluetooth モジュールリレー モジュール/レーザーセンサー/遮光センサー/水銀チルトセンサー/リードスイッチ/火炎検知センサー/赤外線障害物検知センサー/土壌湿度検出モジュール/光センサー/可燃ガス&煙センサー
センサー1種類あたり200円と、なかなかお買い得です。
おすすめのラズパイ本
センサー類を扱う方法を知りたい場合には、次の本がおすすめです。
2017/1/31に出版されたばかりのRspberry Pi 3対応の本です。
基本に立ち返って勉強し直したい場合は、定番のこの本でしょうか。
以上、Raspberry piで大気圧と温度を記録してグラフにして他のPCからグラフを見る、でした。