前提・実現したいこと
ラズベリーパイで毎秒温度を取得することに成功したので、matplotlibで毎秒反映されるようなグラフを作成したい。
温度取得に使ったセンサーはGROVE-I2C 熱電対アンプというものです。
※あと私自身プログラミング歴は1ヶ月ちょっとです。
温度測定のソースコード
様々なサイトを参考にして作りました。
※ほとんどコピペなのですが、理解出来るようになりたいと思っています。
Python
1import smbus 2from time import sleep 3 4# I2C device: /dev/i2c-1 5bus = smbus.SMBus(1) 6 7# MCP9600: slave address 8address_mcp9600 = 0x60 9 10# MCP9600: register 11reg_devid = 0x20 12reg_temp = 0x10 13 14# Get Temperature 15try: 16 devid = bus.read_byte_data(address_mcp9600, reg_devid) 17 18 typeJ = 0x10 19 typeJ = typeJ <<4 20 filterJ = 0x00 21 typeJ = typeJ | filterJ 22 23 while True: 24 block = bus.read_i2c_block_data(address_mcp9600, 0x100, 2) 25 26 temp_sign = block[0] & 0x80 27 temp_upper = block[0] * 16 28 temp_lower = block[1] * 0.0625 29 30 temp = temp_upper + temp_lower 31 32 if temp_sign == 0x80: 33 temp = (4096 - temp) * -1 34 35 print('%2.2f' % (temp)) 36 37 sleep(1) 38 39except KeyboardInterrupt: 40 pass 41 42
このコードを実行すると下のShellに毎秒温度が測定されるようになっています。
この温度をmatplotlibに突っ込んでグラフを作りたい。
matplotlibでグラフ作成
めちゃくちゃなコードになっております。
シンプルにグラフを作るコードを参考にして、先程の温度測定のソースコードとくっつけようと考えました。
x軸にdatetimeで現在時刻、Y軸に取得温度を入れたいと思い。考え付いたのがdefでtempsという関数を作るというものです。
Python
1import smbus 2from time import sleep 3 4import matplotlib.pyplot as plt 5import numpy as np 6import datetime 7 8def temps(): 9 # I2C device: /dev/i2c-1 10 bus = smbus.SMBus(1) 11 12 # MCP9600: slave address 13 address_mcp9600 = 0x60 14 15 # MCP9600: register 16 reg_devid = 0x20 17 reg_temp = 0x10 18 19 # Get Temperature 20 try: 21 devid = bus.read_byte_data(address_mcp9600, reg_devid) 22 23 typeJ = 0x10 24 typeJ = typeJ <<4 25 filterJ = 0x00 26 typeJ = typeJ | filterJ 27 28 while True: 29 block = bus.read_i2c_block_data(address_mcp9600, 0x100, 2) 30 31 temp_sign = block[0] & 0x80 32 temp_upper = block[0] * 16 33 temp_lower = block[1] * 0.0625 34 35 temp = temp_upper + temp_lower 36 37 if temp_sign == 0x80: 38 temp = (4096 - temp) * -1 39 40 #グラフに表示したいのでコメント化 41 #print('%2.2f' % (temp)) 42 43# x軸:時刻 Y軸:温度 44x = datetime.datetime.now() 45y = temps() 46# グラフを描画する 47plt.plot(x, y, color='blue') 48# 次の描画まで1秒待つ 49plt.pause(1) 50# グラフをクリア 51line.remove()
エラーなど
実行すると
Shell
1IndentationError: unexpected unindent
x = datetime.datetime.now() にインデントのエラーが出ていました。
↑
教えていただきたいこと
エラーの解決方法。
このコードで毎秒反映されるようなグラフは実現出来るのか。
ソースコードを書きましたが、これよりも良い方法などがございましたら教えていただきたいです。