GrovePi+の温湿度センサー(DHT22)からのデータをmatplotlibでリアルタイムグラフ化
前のブログではGrove-Temperature & Humidity Sensor Pro (DHT22)からpython3.5でRaspberry Pi2からデータの取り込みができたので、今度はmatplotlibでリアルタイムグラフ化を試みたいと思います。
2台目のRaspberry Pi2にmatplotlibの導入やリアルタイムグラフ化がうまくゆかなかったので備忘録として残しておこうと思います。
最初、Webページで探して適当にpipで導入すればよいのかと思いpipでの導入を試みました。plt.savefig('figure.png')で画像としてグラフは得られることから導入はうまくいっているようですが、plt.draw()やplt.show()コマンドをスルー(エラー表示は出ないのに描画されない)してしまいます。Webぺージで調べるうちにTkというライブラリ?が必要であることが分かり色々試行錯誤をしているうちにpipで導入途中にフリーズしてしまい仕方なく電源を抜いたらRaspberry Pi2を起動時にFailed to Start.....と表示が出るようになってしまいました。起動こそするもののちょっと問題が有るものと思いRaspbianを再度導入しました。
matplotlibの導入にあたってこのままでは、同じ轍を踏んでしまうと思いWebページを探しているうちに「THE GATAMIX BLOG」>「ラズパイ(29)NumpyとMatplotlibをインストールする」にたどり着いたのでした。その中に「Matplotlibは、apt-getからもインストールできるので、こちらからインストールします。(パッケージ管理的にあまりよくないけどしかたない。)」と書いてあります。あれれ、そういえば当方、以前導入したときapt-getで行ったような気がしたのでこれにならうことにしました。
2台目のRaspberry Pi2にmatplotlibの導入やリアルタイムグラフ化がうまくゆかなかったので備忘録として残しておこうと思います。
最初、Webページで探して適当にpipで導入すればよいのかと思いpipでの導入を試みました。plt.savefig('figure.png')で画像としてグラフは得られることから導入はうまくいっているようですが、plt.draw()やplt.show()コマンドをスルー(エラー表示は出ないのに描画されない)してしまいます。Webぺージで調べるうちにTkというライブラリ?が必要であることが分かり色々試行錯誤をしているうちにpipで導入途中にフリーズしてしまい仕方なく電源を抜いたらRaspberry Pi2を起動時にFailed to Start.....と表示が出るようになってしまいました。起動こそするもののちょっと問題が有るものと思いRaspbianを再度導入しました。
matplotlibの導入にあたってこのままでは、同じ轍を踏んでしまうと思いWebページを探しているうちに「THE GATAMIX BLOG」>「ラズパイ(29)NumpyとMatplotlibをインストールする」にたどり着いたのでした。その中に「Matplotlibは、apt-getからもインストールできるので、こちらからインストールします。(パッケージ管理的にあまりよくないけどしかたない。)」と書いてあります。あれれ、そういえば当方、以前導入したときapt-getで行ったような気がしたのでこれにならうことにしました。
$sudo apt-get install python-matplotlib
で導入したところ、plt.draw()では描画されませんがplt.show()では描画されました。それで、以前書いたコードを参考にリアルタイムグラブ化を試みたところplt.show()でもうまくゆきません。さらに、Webページで探したところ「Qiita」>「matplotlibでリアルタイム描画」がありその中でplt.pause(interval)コマンドを使うとうまくゆくと書いてあったのでそれでサンプルプログラムを動かして見たところ動きました。ここで、Grove-Temperature & Humidity Sensor Pro (DHT22)をGrovePi+からよみこんでリアルタイムグラフ化がようやくうまくいったのでソースコードを載せておきます。まだ、「backend_bases.py:2445: MatplotlibDeprecationWarning: Using default event loop until function specific to this GUI is implemented
warnings.warn(str, mplDeprecation)」と言う警告が出ますが、Webページで探して翻訳したところあまり害は無いようです。また、GrovePi+からの読み込みも試行錯誤がありましたがここでは、割愛します。
warnings.warn(str, mplDeprecation)」と言う警告が出ますが、Webページで探して翻訳したところあまり害は無いようです。また、GrovePi+からの読み込みも試行錯誤がありましたがここでは、割愛します。
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import pygame
from pygame.locals import *
import sys
import time
import datetime
import grovepi#GrovePiを使うときに必要
import math
from time import sleep #ループを遅くするのにsleep()を使うため必要
from matplotlib.font_manager import FontProperties#日本語化に必要
#Grove Temperature & Humidity Sensor ProをGrovePiのD4ポートにつなぐ
#このファイルで the White colored sensorを使うため以下を設定
#ケーブル線はSIG,NC,VCC,GND
sensor = 4 # デジタルポート4に設定(後でgrovepiで変数を渡す)
#温湿度センサーの型(タイプ)
#センサーの色
blue = 0 # The Blue(青) colored sensor.
white = 1 # The White(白) colored sensor.
font_path = '/usr/share/fonts/truetype/vlgothic/VL-Gothic-Regular.ttf'#日本語化
font_prop = FontProperties(fname=font_path)
plt.rcParams['font.family'] = font_prop.get_name()
def main():
temps = [0.0]*120 # 気温格納
humis = [0.0]*120 # 湿度格納
zyoukis = [0.0]*120 # 水蒸気量格納
t = np.arange(0,120,1) # 横軸
# plt.ion()
pygame.init() # Pygameを初期化
screen = pygame.display.set_mode((300, 100)) # 画面作成(横300×100)
pygame.display.set_caption("温湿度") # タイトルバー
font = pygame.font.Font(None, 50) # 文字の設定
#グラフ下地
fig, host = plt.subplots()
fig.subplots_adjust(right=0.75)#X軸の長さ
while True:
screen.fill((0,0,0)) # 画面のクリア
temp,humi = grovepi.dht(sensor,white)# grovepi内のdht関数にポート番号と型番号を渡し気温、湿度を受け取る
temp = str(temp) # 気温を文字列にする
humi = str(humi) # 湿度を文字列にする
text = font.render(temp + "[℃]" + humi +"[%]", False, (255,255,255)) # 表示する文字の設定
screen.blit(text, (10, 10)) # レンダ,表示位置
pygame.display.flip() # 画面を更新して、変更を反映
# 温度データのリスト更新
temps.pop(119)
humis.pop(119)
zyoukis.pop(119)
temps.insert(0,float(temp)) # 文字列にしたデータ(温度)を少数を含む数値に変換
humis.insert(0,float(humi)) # 文字列にしたデータを(湿度)少数を含む数値に変換
zyoukis.insert(0,(0.794*(humis[0]/100*6.1078*pow(10,(7.5*temps[0])/(temps[0]+237.3))))/(1+0.00366*temps[0])) # 気温及び相対湿度より空気1立米当たり水蒸気量に変換
# センサーがエラーになってもグラフを補間するためエラーの場合前の数字を代入
if temps[0]=='nan' and humis[0]=='nan':
temps[0]=temps[1]
humis[0]=humis[1]
zyoukis[0]=zyoukis[1]
print(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")+" temp = %.01f C humidity =%.01f%%"%(temps, humis))#.strftime()
# グラフ表示設定
host = plt.subplot()
par1 = host.twinx()
par2 = host.twinx()
par2.spines["right"].set_position(("axes", 1.2))#右に3番めY軸メモリを作成
p1, = host.plot(t, temps, 'r-',label="気温[℃]") # X軸を約1分になるように調整、Y軸更新
p1.set_ydata(temps)
p2, = par1.plot(t, humis, 'b-',label="湿度[%]") # X軸を約1分になるように調整、Y軸更新
p2.set_ydata(humis)
p3, = par2.plot(t, zyoukis, 'g-',label="水蒸気量[$g/m^3$]") #X軸を約1分になるように調整、Y軸更新
p3.set_ydata(zyoukis)
host.set_xlim(0, 120)#X軸の範囲指定
host.set_ylim(20, 35)#Y1軸の範囲指定
par1.set_ylim(0, 100)#Y2軸の範囲指定
par2.set_ylim(0, 25)#Y3軸の範囲指定
plt.title("Real-time 気温 湿度、水蒸気量[$g/m^3$]")
host.set_xlabel("Time [min]")
host.set_ylabel("気温 [℃]")
par1.set_ylabel("湿度[%]")
par2.set_ylabel("水蒸気量[$g/m^3$]")
tkw = dict(size=4, width=1.5)#メモリの大きさと太さ
host.yaxis.label.set_color(p1.get_color())#Y1軸ラベルの文字色
par1.yaxis.label.set_color(p2.get_color())#Y2軸ラベルの文字色
par2.yaxis.label.set_color(p3.get_color())#Y3軸ラベルの文字色
lines = [p1, p2, p3]
host.legend(lines, [l.get_label() for l in lines])#凡例
plt.grid()#グラフ補助線の記載
# plt.show(block=False)
plt.pause(.01)#グラフをFigure1に記載(プロット)
plt.clf()#表示窓をクリアにする
sleep(55.53)#約1分でグラフ描画されるよう調整
print(datetime.datetime.now())
for event in pygame.event.get():
# 終了ボタンが押されたら終了処理
if event.type == QUIT:
pygame.quit()
plt.close()
sys.exit()
if __name__ == '__main__':
main()
お決まりですが、grovepi.pyを本ソースコード保存したのと同じディレクトリ(フォルダー)に配置しないとうまく動きません。
約1分毎にデータを取り込むようにしています。なお、センサーからの読み込み失敗はほとんどありません。
約1分毎にデータを取り込むようにしています。なお、センサーからの読み込み失敗はほとんどありません。
朝から昼にかけて気温がが上がっていると同時に湿度が下がり水蒸気量は変化しないグラフが得られました。
もう一つは冷房を入れたときのグラフです。
気温が0.4~0.5度前後、湿度が4~5%前後で15分程度周期で波打っているのが分かります。最近のインバーターエアコンといえども気温一定ではないことが分かります。
<当ブログ参考>
GrovePi+のフリーズほぼ解消(28日分のCSVファイルをmatplotlibでグラフ化)
GrovePi+のフリーズ解消のもよう
GrovePi+の温湿度センサー(DHT22)からのデータをmatplotlibでリアルタイムグラフ化(その5)
GrovePi+の温湿度センサー(DHT22)からのデータをmatplotlibでリアルタイムグラフ化(その4)GrovePi+のフリーズへの対応
GrovePi+の温湿度センサー(DHT22)からのデータをmatplotlibでリアルタイムグラフ化(その3)GrovePi+のフリーズへの対応
GrovePi+の温湿度センサー(DHT22)からのデータをmatplotlibでリアルタイムグラフ化(その2)GrovePi+のフリーズへの対応
GrovePi+のフリーズ
« 当方の資産増加率は11%弱に | トップページ | 「軍事のリアル」冨澤 暉著(新潮新書)を読んで »
「パソコン・インターネット」カテゴリの記事
- logicool M720 Triathlon マルチデバイスマウスが故障(2022.08.20)
- UbuntuのFirefoxだと雑音が入る(未解決)(2022.02.13)
- イントロンのブログが60,000カウントを達成(2022.01.13)
- GrovePi+をRaspberry Pi 4に導入してみた(上手くゆかなかった)(2021.12.26)
- Raspberry Pi 4でVLCメディアプレイヤー起動時にフリーズがなぜか解消(2021.12.20)



コメント