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

昨日 の続きです。 モニタリングのスタート、ストップボタンを付けてみました。 Arduino には ここ のプログラムを書き込んでいます。

# coding: utf-8
import sys
import signal
import serial
import numpy as np
from PyQt5.QtCore import QTimer
from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton,
                             QHBoxLayout, QVBoxLayout)
import matplotlib as mpl
mpl.use("Qt5Agg")
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas


class ApplicationWindow(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        dc = dynamicMplCanvas(self, width=6, height=5, dpi=100)
        startButton = QPushButton("Start")
        startButton.clicked.connect(dc.onStartButton)
        stopButton = QPushButton("Stop")
        stopButton.clicked.connect(dc.onStopButton)

        hbox1 = QHBoxLayout()
        hbox1.addWidget(dc)
        hbox2 = QHBoxLayout()
        hbox2.addWidget(startButton)
        hbox2.addWidget(stopButton)

        vbox = QVBoxLayout()
        vbox.addLayout(hbox1)
        vbox.addLayout(hbox2)

        self.setLayout(vbox)

        self.setWindowTitle("Realtime Monitor")

class mplCanvas(FigureCanvas):
    def __init__(self, parent=None, width=6, height=5, dpi=100):
        fig = mpl.figure.Figure(figsize=(width, height), dpi=dpi)
        self.axes = fig.add_subplot(111)
        self.axes.hold(False)
        super(mplCanvas, self).__init__(fig)
        self.setParent(parent)

        self.initFigure()

class dynamicMplCanvas(mplCanvas):
    def __init__(self, *args, **kwargs):
        mplCanvas.__init__(self, *args, **kwargs)

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

    def initTime(self):
        ser.write("*".encode())
        self.data = ser.readline().strip().rsplit()            
        self.t0 = float(self.data[0])

    def initFigure(self):
        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)

    def updateFigure(self):
        ser.write("*".encode())
        self.data = ser.readline().strip().rsplit()
        self.t = np.append(self.t, (float(self.data[0])-self.t0)/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()

    def onStartButton(self):
        self.initFigure()
        self.initTime()
        self.timer.start()

    def onStopButton(self):
        self.timer.stop()


if __name__ == "__main__":
    signal.signal(signal.SIGINT, signal.SIG_DFL)
    ser = serial.Serial(port="/dev/ttyACM0", baudrate=9600)
    app = QApplication(sys.argv)
    aw = ApplicationWindow()
    aw.show()
    app.exec_()
15070501.gif

参考

コメント

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