Raspberry Piを使って温度、湿度についてDHT11センサーによりリアルタイムグラフ化(三軸)(その2)
この記事は少し古いので、ソースコードにあるplt.draw()をplt.pause(.01)に変更する必要があります。詳細は「GrovePi+の温湿度センサー(DHT22)からのデータをmatplotlibでリアルタイムグラフ化」を見てください。
さて、DHT11温湿度センサーについては、以前に「Raspberry Pi2を使って温度、湿度についてDHT11センサーによりpython3でグラフ化しモニタ」で書いたところですが、その後改良を加えたので備忘録を書きたいと思います。
前提条件ですが、前回と同じでPython3.4.2で動作させました。また、グラフ化にはmatplotlibを利用しています。
改良した点としては、第一にdht11.pyはタイミングの関係でエラーが多くて0表示になり実用には耐えないとしていましたが、温湿度は時間に対して変化はそれほど大きくないものと考えエラーが出る前の値から補間することしました。例えばエラーが2回続いた場合でもその前の数字を利用します。もっと具体的に例を示すと25℃の次にエラー、またその次もエラーとしたらエラーした数字に25℃が入り、その次のエラーはエラーしたところに既に25℃が入っているので25℃が補間されます。この例だとエラーが続く限り25℃が入ります。エラーの検出としては気温、相対湿度ともに0になるときにエラーが発生したと見なしています。気温0℃で相対湿度0%は実態上ありえないと思いましたのでそうしました。
第二番目の改良点として、グラフのY軸を3軸に対応させました。具体的には1軸目気温、2軸目相対湿度、3軸目水蒸気量(絶対湿度)としそれぞれ目盛があります。
第三番目の改良点として、あまり大きなものではありませんがTaitleや凡例、軸の表示にTexでの数式表記を試みました。具体的には立方メートルの表記m3の3を上付き文字になるようにしました。
第四番目の改良点として、ある水蒸気量以上になるとGPIO 17番ピンのLEDが点灯するようにしました。
最後に、改良点ではありませんが、前回のグラフでは2秒程度でデーター取得を行っていたものが、3軸化により4秒程度でのデータ取得と遅くなったのでこれに伴い気温、湿度等、各100個の変数を作っていたものを50個に少なくしました。
第一番目の改良点でグラフから気温や相対湿度が概ね実態に合った形で示されているのがわかります。まだ、数値の変動が急激に起こる場合がありますがこれはセンサーの特性によるものですので対策としては移動平均で均平化を図ることぐらいでしょうか。
第二番目の改良点は、Webページ「pylab_examples example code: multiple_yaxis_with_spines.py」を参考にして以前に書いた「Raspberry Pi2を使って温度、湿度についてDHT11センサーによりpython3でグラフ化しモニタ」を修正したのですが結構試行錯誤が必要でした。特に3軸目のグラフは計算により求める事からどういった書き方が良いのかわかりませんでした。また、水蒸気量の計算はWebページ「株式会社 第一科学:湿度のあれこれ」から計算方法を参考にしています。
第三番目の改良点は、Webページ「たこ焼き食べた.net>[python][matplotlib]matplotlibのグラフの体裁を整える>数式の入力」により簡単に対処可能でした。
第四番目の改良点は「ラズパイマガジン」2015年秋号p40や「最新RaspberryPiで学ぶ電子工作」金丸隆志著p87からなど、LEDを点灯、消灯させるための方法が載っている各書籍が役に立つかと思います。それにちょっとif文を勉強すれば分かるかと思います。
改良した点としては、第一にdht11.pyはタイミングの関係でエラーが多くて0表示になり実用には耐えないとしていましたが、温湿度は時間に対して変化はそれほど大きくないものと考えエラーが出る前の値から補間することしました。例えばエラーが2回続いた場合でもその前の数字を利用します。もっと具体的に例を示すと25℃の次にエラー、またその次もエラーとしたらエラーした数字に25℃が入り、その次のエラーはエラーしたところに既に25℃が入っているので25℃が補間されます。この例だとエラーが続く限り25℃が入ります。エラーの検出としては気温、相対湿度ともに0になるときにエラーが発生したと見なしています。気温0℃で相対湿度0%は実態上ありえないと思いましたのでそうしました。
第二番目の改良点として、グラフのY軸を3軸に対応させました。具体的には1軸目気温、2軸目相対湿度、3軸目水蒸気量(絶対湿度)としそれぞれ目盛があります。
第三番目の改良点として、あまり大きなものではありませんがTaitleや凡例、軸の表示にTexでの数式表記を試みました。具体的には立方メートルの表記m3の3を上付き文字になるようにしました。
第四番目の改良点として、ある水蒸気量以上になるとGPIO 17番ピンのLEDが点灯するようにしました。
最後に、改良点ではありませんが、前回のグラフでは2秒程度でデーター取得を行っていたものが、3軸化により4秒程度でのデータ取得と遅くなったのでこれに伴い気温、湿度等、各100個の変数を作っていたものを50個に少なくしました。
第一番目の改良点でグラフから気温や相対湿度が概ね実態に合った形で示されているのがわかります。まだ、数値の変動が急激に起こる場合がありますがこれはセンサーの特性によるものですので対策としては移動平均で均平化を図ることぐらいでしょうか。
第二番目の改良点は、Webページ「pylab_examples example code: multiple_yaxis_with_spines.py」を参考にして以前に書いた「Raspberry Pi2を使って温度、湿度についてDHT11センサーによりpython3でグラフ化しモニタ」を修正したのですが結構試行錯誤が必要でした。特に3軸目のグラフは計算により求める事からどういった書き方が良いのかわかりませんでした。また、水蒸気量の計算はWebページ「株式会社 第一科学:湿度のあれこれ」から計算方法を参考にしています。
第三番目の改良点は、Webページ「たこ焼き食べた.net>[python][matplotlib]matplotlibのグラフの体裁を整える>数式の入力」により簡単に対処可能でした。
第四番目の改良点は「ラズパイマガジン」2015年秋号p40や「最新RaspberryPiで学ぶ電子工作」金丸隆志著p87からなど、LEDを点灯、消灯させるための方法が載っている各書籍が役に立つかと思います。それにちょっとif文を勉強すれば分かるかと思います。
それではソースコードですが、dht11.pyは「Raspberry Pi2を使って温度、湿度についてDHT11センサーによりpython3でグラフ化しモニタ」で書いたものと変わりないので省略します。
次にdht11_monitor3.pyを改造したのでdht11_monitor4.pyとします。
次にdht11_monitor3.pyを改造したのでdht11_monitor4.pyとします。
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import pygame
from pygame.locals import *
import serial
import sys
import time
import datetime
import RPi.GPIO as GPIO
import dht11
from matplotlib.font_manager import FontProperties#日本語化に必要
# initialize GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()
GPIO.setup(17,GPIO.OUT)# GPIO17ピンを出力にセットアップ
# read data using pin 4
instance = dht11.DHT11(pin=4)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]*50 # 気温格納
humis = [0]*50 # 湿度格納
zyoukis = [0.0]*50 # 水蒸気量格納
t = np.arange(0,50,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)) # 画面のクリア
result = instance.read() # DHT11インスタンスの作成
temp = str(result.temperature) # 気温を文字列にする
humi = str(result.humidity) # 湿度を文字列にする
text = font.render(temp + "[℃]" + humi+"[%]", False, (255,255,255)) # 表示する文字の設定
screen.blit(text, (10, 10)) # レンダ,表示位置
pygame.display.flip() # 画面を更新して、変更を反映
# 温度データのリスト更新
temps.pop(49)
humis.pop(49)
zyoukis.pop(49)
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]==0 and humis[0]==0:
temps[0]=temps[1]
humis[0]=humis[1]
zyoukis[0]=zyoukis[1]
if zyoukis[0]>=16.5:# もし水蒸気量が××g/m3ならGPIO17のLEDが点灯する。
GPIO.output(17,GPIO.HIGH)
else:
GPIO.output(17,GPIO.LOW)
# グラフ表示設定
host = plt.subplot()par1 = host.twinx()
par2 = host.twinx()par2.spines["right"].set_position(("axes", 1.2))#右に3番めY軸メモリを作成p1, = host.plot(t*4.04+1.25, temps, 'r-',label="気温[℃]") # X軸を約4秒になるように調整、Y軸更新
p1.set_ydata(temps)
p2, = par1.plot(t*4.04+1.25, humis, 'b-',label="湿度[%]") # X軸を約4秒になるように調整、Y軸更新
p2.set_ydata(humis)
p3, = par2.plot(t*4.04+1.25, zyoukis, 'g-',label="水蒸気量[$g/m^3$]") #X軸を約4秒になるように調整、Y軸更新
p3.set_ydata(zyoukis)host.set_xlim(0, 200)#X軸の範囲指定
host.set_ylim(0, 50)#Y1軸の範囲指定
par1.set_ylim(0, 100)#Y2軸の範囲指定
par2.set_ylim(0, 25)#Y3軸の範囲指定plt.title("Real-time 気温 湿度、水蒸気量[$g/m^3$]")
host.set_xlabel("Time [s]")
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.draw()
plt.clf()#表示窓をクリアにする
# print(datetime.datetime.now())
for event in pygame.event.get():
# 終了ボタンが押されたら終了処理
if event.type == QUIT:
GPIO.output(17,GPIO.LOW)
pygame.quit()
plt.close()
sys.exit()if __name__ == '__main__':
main()
dht11.pyはdht11_monitor4.pyと同じフォルダー(ディレクトリ)に入れdht11_monitor4.pyをRUNさせれば作動します。
« UbuntuでELECOMのEX-G Blutooth BlueLED マウス M-XGM10BBの動作不良 | トップページ | 北朝鮮の核・ミサイル開発について起きてきた諸々のことについて考える »
「パソコン・インターネット」カテゴリの記事
- 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)
« UbuntuでELECOMのEX-G Blutooth BlueLED マウス M-XGM10BBの動作不良 | トップページ | 北朝鮮の核・ミサイル開発について起きてきた諸々のことについて考える »


コメント