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
書籍更新情報
2016-10-21
Pythonによる科学技術計算 基礎編
PDF版の販売を開始しました。
販売ページはこちら

2016-09-09
Pythonによる科学技術計算 基礎編
1.2版への更新が可能になりました。
サポートページはこちら
電子書籍
Pythonによる科学技術計算 基礎編
Kindle ストア、Leanpubで販売中です
Pythonによる科学技術計算 基礎編
PDF版の販売はこちら
同人誌
技術書典(2016/6/25)
Emacs/org-modeのPDF作成術
電子版をBOOTHで販売中です
Emacs/org-modeのPDF作成術
Share