Arduino で測定したデータを PyQt + Matplotlib でリアルタイムプロット その 1

昨日 の続きです。 Arduino から送信されたデータを Matplotlib で表示するだけでは実用性に欠けるので、GUI アプリに拡張してみようと思います。

GUI ライブラリは個人で使うつもりなので PyQt5 を選びました。 現状は単純に Matplotlib を PyQt5 から使用するところまで。

次は計測のスタート、ストップボタンを付けてみます。

import sys
import signal
import serial
import numpy as np
from PyQt5.QtCore import QTimer
from PyQt5.QtWidgets import QApplication
import matplotlib as mpl
mpl.use("Qt5Agg")
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas


class myApplication(FigureCanvas):
    def __init__(self, parent=None):
        fig = mpl.figure.Figure()
        self.axes = fig.add_subplot(111)
        super(myApplication, self).__init__(fig)
        self.setParent(parent)

        timer = QTimer(self)
        timer.timeout.connect(self.updateFigure)

        self.t = np.zeros(100)
        self.y = np.zeros(100)
        self.li, = self.axes.plot(self.t, self.y)
        self.axes.set_xlabel("Time[s]")
        self.axes.set_ylabel("Voltage[V]")
        self.axes.set_ylim(0, 5)

        self.ser = serial.Serial(port="/dev/ttyACM0", baudrate=9600)

        ser.write("*".encode())
        data = ser.readline().strip().rsplit()        
        self.tInt = float(self.data[0])

        timer.start(100)        

    def updateFigure(self):
        ser.write("*".encode())
        self.data = self.ser.readline().strip().rsplit()
        self.t = np.append(self.t, (float(self.data[0])-self.tInt)/10**6)
        self.t = np.delete(self.t, 0)
        self.y = np.append(self.y, float(self.data[1])*5/1023)
        self.y = np.delete(self.y, 0)

        self.li.set_xdata(self.t)
        self.li.set_ydata(self.y)
        self.axes.set_xlim(min(self.t), max(self.t))        
        self.draw()


if __name__ == "__main__":
    signal.signal(signal.SIGINT, signal.SIG_DFL)
    app = QApplication(sys.argv)
    a = myApplication()
    a.setWindowTitle("Realtime Monitor")
    a.show()
    app.exec_()
15070401.gif

参考

コメント

Comments powered by Disqus
書籍更新情報
2017-04-18
Pythonによる科学技術計算 基礎編
固定版:1.5版、リフロー版:1.2版への更新が可能になりました。
サポートページはこちら
電子書籍