質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

1595閲覧

Pythonプログラムの結果をウェブブラウザで表示する方法について

mamecoro

総合スコア1

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/06/14 02:01

前提・実現したいこと

バイタルセンサーをPythonプログラムで動かすシステムを作っています。
開発環境はAnacondaのjupyter notebookを使用しています。
jupyter notebook上ではプログラムが正常に動くようになりました。

今後の使い道などを考え、ウェブブラウザ上に、その時の瞬時心拍と呼吸数を表示できるシステムを作成したいと思っています。
できたらスタート、ストップボタンを押して制御できるようにしたいのですがうまくいきません。

出力結果は画像のように表示されます。
5秒おきに結果が表示され、停止ボタンまたはキーボードで入力するとプログラムが停止する仕組みになっています。
イメージ説明

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

エラーメッセージ

該当のソースコード

ソースコード

試したこと

Webアプリを使用して、作成できないかと考えflaskを使ってプログラムを作成したのですが、動的に動かず最初の値しか表示することができませんでした。(ずっとウェブブラウザが表示されなかったりしました)

以下がとりあえずjupyternotebook上で成功したプログラムです。

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

Python

1import time 2import serial 3import glob 4import openpyxl 5import ambient 6 7try: 8 while True: 9 10 #シリアル通信(センサーを動かす部分) 11 comport = serial.Serial("COM3",baudrate=57600,parity=serial.PARITY_NONE) 12 comport.write(b"4") 13 recv_data4 = comport.read(31) 14 comport.close() 15 16 #取得したデータを数値に変換 17 hr = int(recv_data4[1:4].decode("shift_jis")) 18 rr = int(recv_data4[4:7].decode("shift_jis")) 19 20 vs=[hr,rr] 21 #エクセルファイルを起動→シートに値を追加→保存 22 wb = openpyxl.load_workbook('/Users/sishi/Downloads/Vital sensor/hr_rr_data.xlsx') 23 sheet=wb.worksheets[0] 24 25 sheet.append(vs) 26 27 wb.save('/Users/sishi/Downloads/Vital sensor/hr_rr_data.xlsx') 28 29 #Ambientを使ってクラウド上に結果のグラフを作成(保存) 30 ambi = ambient.Ambient(22251, "ed5ac6fcda8b4f62") 31 r = ambi.send({"d3": hr, "d4": rr}) 32 33 #結果の表示 34 print(hr,rr,vs) 35 36 #5秒間隔でプログラムを実行 37 time.sleep(5) 38 39except KeyboardInterrupt: 40 print("FINISH") 41

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

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

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

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

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

guest

回答2

0

常時動いているセンサーの動作結果を逐次、WEBブラウザーで表示させたいような場合は、WEBサーバー側で動くセンサープログラムと閲覧の為のプログラムを分けて考え、そう作らないと要望どおりには動作しません。WEBシステムで一般的な方法を理解する必要があります。(Python以外では非同期にするなど工夫すればひとつにまとめることはできますが、難しいです)

簡単に考えられるのは例えば以下、です。

  1. 常時センシングを行う常駐型のプログラムをWEBサーバー上で稼働する。取得したセンターデータはデータベースやファイルに逐次、保存する。
  2. WEBブラウザーから「開始」「停止」などの操作をしたいのであれば、「開始」、「停止」を行う別のプログラムを用意する。そのプログラムを用いて、常時センシングを行っているプログラムを開始、停止する。
  3. センサーデータの一覧を要求するようなHTMLのフォームを作り、GETやPOSTでHTTPリクエストする。(要はフォームのサブミットです)

 WEBサーバー側では、そのHTTPリクエストを受信したときに、あらかじめセンサーデータが保存されたデータべースやファイルからデータを取り出し、見目好いHTMLに整形して、WEBブラウザーに返す。

  1. 「開始」「停止」などの操作もHTMLのフォーム経由でHTTPリクエストし、WEBサーバー側で担当するプログラムが動くようにする。

Pythonのサーバー用フレームワークとしてFlaskもいいでしょうが、Python3標準で使えるcgiモジュールを用いてCGIとして実装するのもあるいは簡単になります。その他にもjQuery(Ajax)を使うなどすれば、よりリアルタイムなデータ更新表示ができるようになるでしょう。

投稿2020/06/14 02:43

dodox86

総合スコア9256

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

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

mamecoro

2020/06/14 07:35

回答ありがとうございます。 cgiやGETやPOSTでHTTPリクエストについてよくわかっていなかったので、そのあたりをしっかりと調べて考えてみます!
guest

0

#シリアル通信(センサーを動かす部分)

comport = serial.Serial("COM3",baudrate=57600,parity=serial.PARITY_NONE) comport.write(b"4") recv_data4 = comport.read(31) comport.close()

これではシリアル通信の受信ができてません
Webブラウザどーこーの前に、コンソールに受信結果を出すなりして、きっちり受信できているのを確認しよう

投稿2020/06/14 02:14

y_waiwai

総合スコア88042

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

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

mamecoro

2020/06/14 02:32

解答ありがとうございます。 シリアル通信の可否自体は確認できているはずです…。 この前にcomport.write(b"0")というコマンドを打ち、1(センサーの通信可能)は確認できています。 受信できているので、画像のような結果が表示されるというわけではないのでしょうか? プログラミングやシリアル通信自体も初心者なのでよくわからず申し訳ありません…
y_waiwai

2020/06/14 02:36

print(recv_data4) いれてまわしてみようよ。
mamecoro

2020/06/14 07:34

それについては回してみました。 ちゃんと必要な情報が返ってきています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問