I am using Python, PyQt5, QThread. İ have GUİ which displays registered objects from sensor. Connection scheme - sensor + Arduino + PC.
import serial
import glob
import datetime
# from serial import Serial
import sys
from PyQt5.QtWidgets import (QDialog, QApplication, QWidget, QPushButton,
QComboBox, QVBoxLayout, QCheckBox, QLCDNumber,
QSlider, QProgressBar, QHBoxLayout, QLabel)
from PyQt5 import QtCore
from PyQt5.QtCore import QThread, pyqtSignal, QTimer
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
import matplotlib.pyplot as plt
timespan = 10000
load = [0] * timespan
production = [0] * timespan
pdc = [0] * timespan
class WorkerThread(QThread):
# mysignal_i=pyqtSignal( int, name='Signal_i') ### 1) declare the signal
measurements_signals = pyqtSignal(int, float, name='m_signals')
def __init__(self, parent=None):
QThread.__init__(self)
def run(self):
print('reading')
a = 100 #
fq = [0] * a
tot = 0
sum = 0
v = 0.0
ser = serial.Serial(
port='COM4', # use "dmesg | grep tty" to find out the port
baudrate=9600,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE
)
while ser.isOpen():
c = ser.readline().decode('ASCII')
if c == '':
pass
else:
i = int(c)
sum -= fq[0]
for j in range(1, a):
fq[j - 1] = fq[j]
tot += i
fq[a - 1] = i * 10
sum += fq[a - 1]
v = float(sum) / a
self.measurements_signals.emit(int(tot), float(v))
ser.close()
def pause(self):
self.sleep(10)
print('sleep')
def stop(self):
# self.ser.close()
self.terminate()
print("stop")
class Window(QWidget):
def __init__(self, parent=None):
super(Window, self).__init__(parent)
self.setGeometry(100, 100, 300, 200) # pos pos width height
self.PortLabel = QLabel("Port:")
self.LabelProd = QLabel("Total:")
self.LabelLoad = QLabel("Frequency:")
port_selectBox = QComboBox(self)
ports = self.available_serial_ports()
for port in ports:
port_selectBox.addItem(port)
self.buttonConnect = QPushButton('Start')
self.buttonPause = QPushButton('Pause')
self.buttonStop = QPushButton('Stop')
self.lcdProd = QLCDNumber(self)
self.lcdLoad = QLCDNumber(self)
self.lcdProd.setFixedHeight(100)
self.lcdLoad.setFixedHeight(100)
self.figure_timeseries = plt.figure()
self.canvas_timeseries = FigureCanvas(self.figure_timeseries)
# --------------------------- Layout
col1 = QVBoxLayout()
col1.addWidget(self.PortLabel)
col1.addWidget(port_selectBox)
col1.addWidget(self.buttonConnect)
col1.addWidget(self.buttonPause)
col1.addWidget(self.buttonStop)
col2 = QVBoxLayout()
col2.addWidget(self.LabelProd)
col2.addWidget(self.lcdProd)
col2.addWidget(self.LabelLoad)
col2.addWidget(self.lcdLoad)
toprow = QHBoxLayout()
toprow.addLayout(col1)
toprow.addLayout(col2)
layout = QVBoxLayout()
layout.addLayout(toprow)
layout.addWidget(self.canvas_timeseries)
self.setLayout(layout)
# --------------------------------------
self.wt = WorkerThread() # This is the thread object
self.buttonConnect.clicked.connect(self.wt.start)
# Connect the signal from the thread to the slot_method
self.wt.measurements_signals.connect(self.slot_method) ### 3) connect to the slot
self.buttonPause.clicked.connect(self.wt.pause)
self.buttonStop.clicked.connect(self.wt.stop)
timespan = 600
load = [0] * timespan
production = [550] * timespan
pdc = [0] * timespan
def slot_method(self, p, l):
print("p =", p)
print('l =', l)
self.lcdProd.display(p)
self.lcdLoad.display(l)
self.update_chart_timeseries(p, l)
def update_chart_timeseries(self, produzione, carico): # time series
# load.pop(0)
# load.append(carico)
production.pop(0)
production.append(produzione)
self.figure_timeseries.clear()
plt.figure(num=self.figure_timeseries.number)
plt.plot(production, color="b")
# plt.plot(load, color="r")
# plt.set_ylim([0,max(load, production)])
plt.ylim(ymin=0)
plt.legend(['PV'], loc='upper left')
self.canvas_timeseries.draw()
def available_serial_ports(self):
ports = ['COM%s' % (i + 1) for i in range(256)]
result = []
for port in ports:
try:
s = serial.Serial(port)
s.close()
result.append(port)
except (OSError, serial.SerialException):
pass
return result
if __name__ == '__main__':
app = QApplication(sys.argv)
main = Window()
main.show()
sys.exit(app.exec_())
But I am trying to Pause and Resume thread. I want that when I click button pause then registering will stop and after clicking start registering will continue. For Example: Before clicking reg obj: 56 and after clicking start will continue 56+..... I tried to use wait() and sleep() QThread functions, but it does not work correctly.