Arduinoと温度センサ(LM35DZ)を用いて気温(温度)を計測し、その結果をシリアル通信でPCに転送してPythonでリアルタイムグラフ化しました。
2014年10月11日15:40
【Python】Arduinoで測定した温度をグラフ化
スポンサーリンク
簡易温度計の作成
Arduinoで計測した温度をPythonを用いてPCで受け取るプログラムを作成しました。
回路の構成
回路の構成は以下のとおりです。
Pythonの処理手順はつぎのとおりです。
1
Arduinoが接続されているコムポートを指定して開く
2
シリアルポートからデータを行終端まで読み込む
3
読み込んだデータの行終端コード削除
4
現在時刻と読み取ったデータ(摂氏温度)を表示する
実行結果
Arduino側
float a_in; // アナログ入力値(0〜203)
float temp_c = 0; // 摂氏値( ℃ )
void setup(){
Serial.begin(9600); // シリアル通信速度
}
void loop(){
// アナログピンから計測値を取得(0〜203)
a_in = analogRead(0);
// 入力値を摂氏に換算
temp_c = ((5 * a_in) / 1024) * 100;
// 改行しながら出力
Serial.println( temp_c );
// 1000ms待機
delay(1000);
}
PC側 (Python2.7)
# -*- coding: utf-8 -*-
import serial
import datetime
def main():
i = 0
ser = serial.Serial("COM5") # Arduinoが接続されているコムポートを指定
while(i !=10):
todaydetail = datetime.datetime.today()
line = ser.readline() # 行終端まで読み込む
line = line.rstrip() # 行終端コード削除
print todaydetail.strftime("%Y/%m/%d %H:%M:%S") + " > " + line + "[C]"
i+=1
ser.close()
print"End"
# -----------------------
if __name__ == '__main__':
main()
リアルタイムグラフ温度計を作成
Arduinoから受信した温度データをPC上でリアルタイムでグラフに表示します。
Pythonの処理手順はつぎのとおりです。
1
Arduinoが接続されているコムポート(ここではCOM5)を指定して開く
2
画面サイズを設定する
3
Pygameを初期化する
4
画面を作成する
5
タイトルバーの文字列をセットする
6
表示する文字のtype,サイズを決める
7
画面のクリア(真っ黒に塗りつぶす)
8
シリアルポートから温度データを行終端まで読み込む
9
読み込んだ温度データの行終端コードを削除する
10
温度データを画面の指定した位置に表示する
11
画面を更新して、変更を反映する
12
配列に左詰めで温度データを挿入する
13
Y軸のデータ(温度)を更新する
14
シリアルポートから温度データを行終端まで読み込む
15
リアルタイムグラフを表示する
16
温度計測の画面にある終了ボタンが押されるまで7~15を繰り返す
※ グラフ画面を動かそうとしたり,グラフ画面の終了ボタンを押すとフリーズします。プログラムを終了させる時は温度計測と書かれている画面の終了ボタンを押してください。
実行結果
PC側 (Python2.7)
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import pygame
from pygame.locals import *
import serial
import sys
def main():
ser = serial.Serial("COM7") # COMポート(Arduino接続)
temps = [0]*100 # 温度格納
t = np.arange(0,100,1)
plt.ion()
pygame.init() # Pygameを初期化
screen = pygame.display.set_mode((200, 200)) # 画面作成(100×100)
pygame.display.set_caption("傾斜角度") # タイトルバー
font = pygame.font.Font(None, 50) # 文字の設定
while True:
screen.fill((0,0,0)) # 画面のクリア
temp = ser.readline().rstrip() # \nまで読み込む(\nは削除)
text = font.render(temp + "[C]", False, (255,255,255)) # 表示する文字の設定
screen.blit(text, (10, 10)) # レンダ,表示位置
pygame.display.flip() # 画面を更新して、変更を反映
# 温度データのリスト更新
temps.pop(99)
temps.insert(0,float(temp))
# グラフ表示設定
line, = plt.plot(t, temps, 'r-',label="Temperature[C]") # Y軸更新
line.set_ydata(temps)
plt.title("Real-time temperature")
plt.xlabel("Time [s]")
plt.ylabel("Temperature [Celsius]")
plt.legend()
plt.grid()
plt.xlim([1,100])
plt.ylim([0,40])
plt.draw()
plt.clf()
for event in pygame.event.get():
# 終了ボタンが押されたら終了処理
if event.type == QUIT:
pygame.quit()
ser.close()
plt.close()
sys.exit()
if __name__ == '__main__':
main()
※Arduino側は先程のプログラムと同じなので省略
参考文献・サイト様
スポンサーリンク
コメント一覧
-
- 2015年11月12日 21:43
- ※やまうちファーム 様
>グラフの移動をしてもフリーズしない方法はないのでしょうか?
私もまだ方法を見つけられていません。申し訳ありません。
(Linux上で動かすとフリーズしないらしいです)
-
- 2015年11月20日 20:30
- 早速、コメント頂いて感謝です。
もう一つ教えて下さい、今は、
21.5
21.6
21.4
・
・
・
の数値?だけのarduinoからの送信ですが、温度、湿度、土壌水分をカンマ区切りで
21.05,54.05,58.32
21.12,54.10,58.41
・
・
・
のようにarduino側から送信した場合のplotの方法を御教授いただければありがたいです。いろいろとネット内で学んでみましたが、自分には出来ません。
よろしくお願いします。
-
- 2015年11月28日 02:24
- ※やまうちファーム 様
色々と方法があると思いますが、
私ならpythonのsplitを使ってカンマ分割して各値を取り出してplotします。
2つの数値データをカンマで区切った場合は下記事で紹介していますので
よろしければ参考にしてください。
http://denshi.blog.jp/arduino/%E5%82%BE%E3%81%8D%E3%82%92python%E3%81%A7%E3%82%B0%E3%83%A9%E3%83%95%E5%8C%96
コメントする
※1.コメントは承認制です。内容によっては非公開にすることがあります。
スポンサーリンク
サイト内検索
Twitter
グラフの移動をしてもフリーズしない方法はないのでしょうか?