🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

1回答

944閲覧

湿球温度算出プログラムの連続実行

ryo-over_ridge

総合スコア1

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

0クリップ

投稿2021/01/07 07:30

前提・実現したいこと

最近プログラムを勉強し始めた初心者です。

Python3で湿球温度算出プログラムを作成しています。
Raspberry PiとセンサーのBME280を用いてブラウザ上で湿球温度をリアルタイム表示する
温度計の作成を目指しています。

発生している問題・エラーメッセージ

現在自分が作成した湿球温度算出プログラムを用いてブラウザ上に温度表示をさせているのですが、
一度計算した値を繰り返し表示するのみで温度のリアルタイム表示ができない

該当のソースコード

Python3

1import math 2import bme 3from flask import * 4import time 5import json 6 7w = bme.readData() 8t,p,h = w 9K = 273.15 #kelvin 10Tc = 647.3 #Critical temperature 11Pc = 221200 #critical pressure 12Td = float(t) 13HR = float(h) 14 15 16def Pv1(): 17 X1 = (1-(Td+K)/Tc) 18 A1 = (-7.76451*X1) 19 B1 = (1.45838*X1**1.5) 20 C1 = (-2.7758*X1**3) 21 D1 = (-1.23303*X1**6) 22 Fr1 = (A1+B1+C1+D1)/(1-X1) 23 exp1 = math.exp(Fr1) 24 Ps1 = (Pc*exp1) 25 Pv1 = (HR/100*Ps1) 26 27 return Pv1 28 29def Pv2(Tw): 30 X2 = 1-((Tw+K)/Tc) 31 A2 = (-7.76451*X2) 32 B2 = (1.45838*X2**1.5) 33 C2 = (-2.7758*X2**3) 34 D2 = (-1.23303*X2**6) 35 Fr2 = (A2+B2+C2+D2)/(1-X2) 36 exp2 = math.exp(Fr2) 37 Ps2 = (Pc*exp2) 38 Pv2 = Ps2-(0.000662*1013.25*(Td-Tw)) 39 40 return Pv2 41 42Tw = float(1) 43V1 = Pv1() 44V2 = Pv2(Tw) 45 46 47while V1 > V2: 48 Tw +=0.01 49 V2 = Pv2(Tw) 50 if V1 >=(V2-0.1): 51 wb = (round(Tw,1)) 52 elif V1 < V2: 53 Tw -=0.01 54 V2 = Pv2(Tw) 55 if V1 >=(V2+0.1): 56 wb = (round(Tw,1)) 57 elif V1 == V2: 58 wb = (round(Tw,1)) 59 60 61app = Flask(__name__) 62 63 64 65 66@app.route("/") 67def index(): 68 temp = wb 69 return render_template('index.html', temp=temp) 70 71 72 73@app.route("/update") 74def updates(): 75 def UpdatesValues(): 76 while True: 77 78 # Build up a dict of the current thing state. 79 temp_state = { 80 'temperature': wb 81 } 82 yield('data: {0}\n\n'.format(json.dumps(temp_state))) 83 time.sleep(1.0) 84 return Response(UpdatesValues(), mimetype='text/event-stream') 85 86if __name__ == "__main__": 87 app.run(host='0.0.0.0') 88 89

試したこと

計算式を関数化していないため繰り返しができないのかと考えましたがうまくいきませんでした。

補足情報(FW/ツールのバージョンなど)

python3.7.3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2021/01/07 07:49

呈示された update は定周期で呼ばれているのですか?
guest

回答1

0

ベストアンサー

HTTPはリクエストをしてレスポンスを受けるという基本動作だけ行います。
@app.route()に対応した関数内でwhile Trueをされたらレスポンスが返ってきません。
pythonにwhile Trueを書いたらブラウザ側で何度も再描写してくれるというような認識でしたら間違っています。

ブラウザにリアルタイムなデータを都度表示したい場合、以下のいずれかの対応が必要です。

  1. 最新のデータを返すエンドポイント(def updates()のwhileなし)を作成し、ブラウザ側のコード(Javascriptでajaxを使うなど)からポーリングする。
  2. [1]でデータだけでなくhtmlも返すようなエンドポイント作成し、<meta http-equiv="refresh" content="; URL=">の様な記述を使って定期的に描写し直すように実装する。
  3. 1でajaxを使うのではなくWebSocket等を使い接続し、サーバ側からプッシュされたデータをブラウザで描写するように実装する。

他にもあるかもしれませんが、[2]が一番簡単と思います。
[2]は融通が利かないので、HTMLページを作成し、その中にJavaScriptを記述し、AjaxでGETやPOSTを定期的に投げるようにして、データを取得しDOMを書き換えるのが楽だと思います。

投稿2021/01/07 09:36

FiroProchainezo

総合スコア2421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryo-over_ridge

2021/01/08 02:53

ご回答ありがとうございます。初心者なもので実行結果をすぐに出すことはできませんんが、いただいた回答をもとに試してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問