Raspberry piで大気圧と温度を記録してグラフにして他のPCからグラフを見る

前エントリの続きです。前エントリでは、大気圧・温度センサのRaspberry Piへの接続を行っています。

概要

次の機能を一つのpythonコードに押し込んで、(root権限の)crontabで定期的に(5分ごとないしは、20分ごと)実行して、pngグラフ作成までを行う。

  • i2cでLPS331から、大気圧と温度を読んできて、ファイルに書き出す。
  • ファイルから読み込んで、グラフにする。

このグラフを外のPCから読めるように簡易httpサーバを立てて、pngにリンクする。
他のPCのブラウザから接続すると、こんな感じになる。
f:id:beiz23:20140726222355p:image:w350

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 収納ケース付き

ベスト センサーモジュール キット 20種セット for Arduino / raspberry pi 3 モデル B raspberry pi 2 Model B 収納ケース付き(温度センサー/ホール効果センサー/赤外線トラッキングセンサー/タッチセンサー/マイク・サウンドセンサー/デジタル温度&湿度センサー/3色フルカラー SMD LEDモジュール/赤外線リモコン受信モジュール/赤外線送信モジュール/Bluetooth モジュールリレー モジュール/レーザーセンサー/遮光センサー/水銀チルトセンサー/リードスイッチ/火炎検知センサー/赤外線障害物検知センサー/土壌湿度検出モジュール/光センサー/可燃ガス&煙センサー)

センサーの一覧は次のとおりです。

温度センサー/ホール効果センサー/赤外線トラッキングセンサー/タッチセンサー/マイク・サウンドセンサー/デジタル温度&湿度センサー/3色フルカラー SMD LEDモジュール/赤外線リモコン受信モジュール/赤外線送信モジュール/Bluetooth モジュールリレー モジュール/レーザーセンサー/遮光センサー/水銀チルトセンサー/リードスイッチ/火炎検知センサー/赤外線障害物検知センサー/土壌湿度検出モジュール/光センサー/可燃ガス&煙センサー

センサー1種類あたり200円と、なかなかお買い得です。

 

おすすめのラズパイ本

センサー類を扱う方法を知りたい場合には、次の本がおすすめです。

2017/1/31に出版されたばかりのRspberry Pi 3対応の本です。

Raspberry Pi 3でつくる IoTプログラミング

Raspberry Pi 3でつくる IoTプログラミング

基本に立ち返って勉強し直したい場合は、定番のこの本でしょうか。

これ1冊でできる! ラズベリー・パイ 超入門 改訂第3版

これ1冊でできる! ラズベリー・パイ 超入門 改訂第3版

 

以上、Raspberry piで大気圧と温度を記録してグラフにして他のPCからグラフを見る、でした。