【Python/Arduino】気温をパソコンでリアルタイムグラフ表示

この記事では、Arduinoマイコンで計測した温度をPythonを用いてPCで受け取って表示する方法をソースコード付きで解説します。

気温をリアルタイムグラフ表示

Arduinoマイコンと温度センサ(LM35DZ)を用いて気温(温度)を計測し、その結果をシリアル通信でPCに転送してPythonでリアルタイム表示してみました。

回路構成(配線図)

Arduinoと電子部品の構成・配線は下記の通りです。

【電子部品】
・Arduino UNO (1個)
・温度センサ(LM35DZ)
・ジャンプワイヤー(数本)

プログラムの処理手順は下記の通りです。

①Arduinoが接続されているコムポート(ここではCOM5)を指定して開く
②画面サイズを設定する
③Pygameを初期化する
④画面を作成する
⑤タイトルバーの文字列をセットする
⑥表示する文字のtype,サイズを決める
⑦画面のクリア(真っ黒に塗りつぶす)
⑧シリアルポートから温度データを行終端まで読み込む
⑨読み込んだ温度データの行終端コードを削除する
⑩温度データを画面の指定した位置に表示する
⑪画面を更新して、変更を反映する
⑫配列に左詰めで温度データを挿入する
⑬Y軸のデータ(温度)を更新する
⑭シリアルポートから温度データを行終端まで読み込む
⑮リアルタイムグラフを表示する
⑯温度計測の画面にある終了ボタンが押されるまで7~15を繰り返す

ソースコード

サンプルプログラムのソースコードです。

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);
}

パソコン側(Python)

# -*- 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()

※上記のプログラムを動作させるのはライブラリ「Matplotlib」「NumPy」「Pygame」が必要です。

実行結果

サンプルプログラムの実行結果は下記の通りです。

※ グラフ画面を動かそうとしたり,グラフ画面の終了ボタンを押すとフリーズします。
プログラムを終了させる時は温度計測と書かれている画面の終了ボタンを押してください。
【動画版】

【関連記事】
Arduino入門 基本的な使い方
Python入門 基本文法
Pygameのインストール方法
Matplotlibのインストール方法
NumPyのインストール方法

関連記事