使用 PyQT5 在 QLCDNumber 上显示传感器输出

Display Sensor Output on QLCDNumber using PyQT5

所以我开发了一个代码,可以检测传感器的电压,然后输出一个平均电压,我的问题是如何让这个值随着我的传感器值的变化而更新,目前它正在打印初始值值然后不更新,我使用 QTDesigner 创建了一个主窗口,我正在使用 Python3 和 PyQt5 库来编写代码。

这可能吗?如果是怎么办?

这是我的代码:

    import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QPixmap
import RPi.GPIO as GPIO
import Test_rc
import time
import board
import busio
from adafruit_ads1x15.single_ended import ADS1115

i2c = busio.I2C(board.SCL,board.SDA)

adc = ADS1115(i2c)
GAIN = 2/3

c1 = 525.4
c2=28152

GPIO.setmode(GPIO.BCM)
Relay_1 = 27
Transducer = 17
GPIO.setup(Transducer,GPIO.IN)
GPIO.setup(Relay_1, GPIO.OUT)
GPIO.output(Relay_1, GPIO.HIGH)
GPIO.output(Relay_1, GPIO.LOW)


def Pressure_Reading():
    while True:
        time.sleep(0.02)
        r0 = adc.read_volts(0,gain = GAIN, data_rate=None)
        r1 = adc.read_adc(0, gain = GAIN, data_rate =None)
        Pressure_Volts = r0*94.72436287
        Pressure_adc = r1*(c1/c2)

        time.sleep(0.02)
        r01= adc.read_volts(0,gain = GAIN, data_rate=None)
        r11= adc.read_adc(0, gain = GAIN, data_rate =None)
        Pressure_Volts2 = r01*94.72436287
        Pressure_adc2 = r11*(c1/c2)

        time.sleep(0.02)
        r02= adc.read_volts(0,gain = GAIN, data_rate=None)
        r12= adc.read_adc(0, gain = GAIN, data_rate =None)
        Pressure_Volts3 = r02*94.72436287
        Pressure_adc3 = r12*(c1/c2)

        time.sleep(0.02)
        r03 = adc.read_volts(0,gain = GAIN, data_rate=None)
        r13 = adc.read_adc(0, gain = GAIN, data_rate =None)
        Pressure_Volts4 = r03*94.72436287
        Pressure_adc4 = r13*(c1/c2)

        time.sleep(0.02)
        r04= adc.read_volts(0,gain = GAIN, data_rate=None)
        r14= adc.read_adc(0, gain = GAIN, data_rate =None)
        Pressure_Volts5 = r04*94.72436287
        Pressure_adc5 = r14*(c1/c2)

        Pressure_Volts_Avg = (Pressure_Volts+Pressure_Volts2+Pressure_Volts3+Pressure_Volts4+Pressure_Volts5)/5
        Pressure_adc_Avg = (Pressure_adc+Pressure_adc2+Pressure_adc3+Pressure_adc4+Pressure_adc5)/5
        Pressure_Avg = (Pressure_Volts_Avg+Pressure_adc_Avg)/2

        return Pressure_Avg

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(788, 424)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.stackedWidget = QtWidgets.QStackedWidget(self.centralwidget)
        self.stackedWidget.setGeometry(QtCore.QRect(10, 0, 761, 501))
        self.stackedWidget.setObjectName("stackedWidget")
        self.page_3 = QtWidgets.QWidget()
        self.page_3.setObjectName("page_3")
        self.label = QtWidgets.QLabel(self.page_3)
        self.label.setGeometry(QtCore.QRect(200, 0, 341, 61))
        font = QtGui.QFont()
        font.setFamily("Arial Black")
        font.setPointSize(22)
        font.setBold(True)
        font.setWeight(75)
        self.label.setFont(font)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.pushButton_2 = QtWidgets.QPushButton(self.page_3)
        self.pushButton_2.setGeometry(QtCore.QRect(220, 170, 141, 41))
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton = QtWidgets.QPushButton(self.page_3)
        self.pushButton.setGeometry(QtCore.QRect(380, 170, 141, 41))
        self.pushButton.setObjectName("pushButton")
        self.label_2 = QtWidgets.QLabel(self.page_3)
        self.label_2.setGeometry(QtCore.QRect(120, 260, 541, 141))
        self.label_2.setObjectName("label_2")
        self.groupBox_2 = QtWidgets.QGroupBox(self.page_3)
        self.groupBox_2.setGeometry(QtCore.QRect(90, 40, 101, 221))
        self.groupBox_2.setTitle("")
        self.groupBox_2.setObjectName("groupBox_2")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.groupBox_2)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.label_7 = QtWidgets.QLabel(self.groupBox_2)
        self.label_7.setObjectName("label_7")
        self.verticalLayout_2.addWidget(self.label_7)
        self.lcdNumber = QtWidgets.QLCDNumber(self.groupBox_2)
        self.lcdNumber.setObjectName("lcdNumber")
        self.verticalLayout_2.addWidget(self.lcdNumber)
        self.lcdNumber.display(Pressure_Reading())

我已经输入了所有的代码,直到 lcdnumber 调用。

主窗口之后的其余代码 class,我让我的代码控制一个继电器和按钮导航几页,这部分代码运行良好

class ControlMainWindow(QtWidgets.QMainWindow):
    def __init__(self,parent=None):
        super(ControlMainWindow,self).__init__(parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.ui.SettingsButton.clicked.connect(lambda:self.ui.stackedWidget.setCurrentIndex(1))
        self.ui.pushButton_5.clicked.connect(lambda:self.ui.stackedWidget.setCurrentIndex(0))

        self.ui.pushButton.clicked.connect(self.OnSwitch)
        self.ui.pushButton_2.clicked.connect(self.OffSwitch)
        self.ui.DelayButton.clicked.connect(self.Delay_Switch)

    def OnSwitch(self):
        GPIO.output(Relay_1, GPIO.HIGH)

    def OffSwitch(self):
        GPIO.output(Relay_1, GPIO.LOW)

    def Delay_Switch(self):
            time.sleep(5)
            GPIO.output(Relay_1,GPIO.HIGH)



if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    mySW = ControlMainWindow()
    mySW.show() 
    sys.exit(app.exec_())  

对不起。我不熟悉您使用的某些模块。 一般来说,它可能看起来像这样:

main.py

import sys
from random          import randint
from PyQt5.QtWidgets import QApplication, QMainWindow 
from PyQt5.QtCore    import QTimer

from ui import Ui_MainWindow

class Form(QMainWindow):
    def __init__(self):
        super().__init__()

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.i = 0 
        self.voltageMin = 180 
        self.voltageMax = 180
        self.ui.lcdNumberCur.display(self.i)

        self.ui.pushButton.clicked.connect(self.startTimer)

        self.timer = QTimer(self)  
        self.timer.setInterval(1000)
        self.timer.timeout.connect(self.updateData)

        self.show()        

    def startTimer(self):  
        if self.ui.pushButton.text() == "Start Timer":
            self.timer.start(1000) 
            self.ui.pushButton.setText("Stop Timer")            
        else:
            self.ui.pushButton.setText("Start Timer")
            self.timer.stop() 

    def updateData(self):
        voltage = randint(90, 260)                  # <--- insert your average voltage here
        self.ui.lcdNumberCur.display(voltage) 
        if voltage > self.voltageMax:
            self.voltageMax = voltage
            self.ui.lcdNumberMax.display(self.voltageMax) 
        elif voltage < self.voltageMin:
            self.voltageMin = voltage
            self.ui.lcdNumberMin.display(self.voltageMin)            


if __name__ == '__main__':
    app = QApplication(sys.argv)
    frm = Form()
    sys.exit(app.exec_())

ui.py

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(500, 300)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox.setGeometry(QtCore.QRect(0, 0, 400, 200))
        self.groupBox.setObjectName("groupBox")

        self.lcdNumberMax = QtWidgets.QLCDNumber(self.groupBox)
        self.lcdNumberMax.setGeometry(QtCore.QRect(225, 10, 151, 41))
        self.lcdNumberMax.setObjectName("lcdNumberMax")
        self.lcdNumberCur = QtWidgets.QLCDNumber(self.groupBox)
        self.lcdNumberCur.setGeometry(QtCore.QRect(225, 55, 151, 41))
        self.lcdNumberCur.setObjectName("lcdNumberCur")
        self.lcdNumberMin = QtWidgets.QLCDNumber(self.groupBox)
        self.lcdNumberMin.setGeometry(QtCore.QRect(225, 100, 151, 41))
        self.lcdNumberMin.setObjectName("lcdNumberMin")        

        self.label = QtWidgets.QLabel(self.groupBox)
        self.label.setGeometry(QtCore.QRect(20, 50, 150, 50))
        self.label.setObjectName("label")
        self.labelMax = QtWidgets.QLabel(self.groupBox)
        self.labelMax.setGeometry(QtCore.QRect(20, 8, 150, 50))
        self.labelMax.setObjectName("labelMax")
        self.labelMin = QtWidgets.QLabel(self.groupBox)
        self.labelMin.setGeometry(QtCore.QRect(20, 95, 150, 50))
        self.labelMin.setObjectName("labelMin")        

        self.pushButton = QtWidgets.QPushButton("pushButton", self.groupBox) #(self.scrollAreaWidgetContents)
        self.pushButton.setGeometry(QtCore.QRect(180, 165, 75, 23))
        self.pushButton.setObjectName("pushButton")

        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "LCDNumber - Timer(Start-Stop)"))
        self.groupBox.setTitle(_translate("MainWindow", "Data"))
        self.label.setText(_translate("MainWindow", "Current voltage in the network"))
        self.labelMin.setText(_translate("MainWindow", "Min voltage in the network"))
        self.labelMax.setText(_translate("MainWindow", "Max voltage in the network"))
        self.pushButton.setText(_translate("MainWindow", "Start Timer"))

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

好吧,因为陷入所有 gui 的东西,我不得不实现线程并从 gui 线程中删除函数。因为问题是关于传感器的输出,所以我删除了所有与之无关的代码,只包含了传感器所需的代码。我希望这是有道理的。

这解决了问题:

class Worker(QtCore.QThread):
    valueFound = QtCore.pyqtSignal(int, name="valueFound")
    GAIN = 2/3
    c1 = 525.4
    c2=28152
    Relay_1 = 27

    def __init__(self, parent=None):
        super(Worker, self).__init__(parent)
        self.runFlag = False
        self.i2c = busio.I2C(board.SCL,board.SDA)
        self.adc = ADS1115(self.i2c)
        GPIO.setmode(GPIO.BCM)        
        GPIO.setup(self.Relay_1, GPIO.OUT)
        GPIO.output(self.Relay_1, GPIO.HIGH)
        GPIO.output(self.Relay_1, GPIO.LOW)

    def startThread(self):
        self.runFlag = True
        self.start()

    def stopThread(self):
        self.runFlag = False



    def run(self):
        while self.runFlag:
            self.valueFound.emit(self.Pressure_Reading())

......

   def run(self):
        while self.runFlag:
            self.valueFound.emit(self.Pressure_Reading())

.......

self.worker = Worker(self)
    self.worker.valueFound.connect(self.OnValueFound)

.......

self.worker.startThread()

    def closeEvent(self, event):
        self.worker.stopThread()
        while self.worker.isRunning():
            pass
        event.accept()

    def OnValueFound(self, value):
        self.ui.lcdNumber.display(value)

添加这些允许程序不断更新 LCD 编号。