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_()

参考