Вывод датчика на QLCDNumber с использованием PyQT5 - PullRequest
0 голосов
/ 12 сентября 2018

Итак, я разработал код, который будет определять напряжение на преобразователе, а затем выводить среднее напряжение. Мой вопрос здесь заключается в том, как получить это значение для обновления при изменении значения моего датчика, в настоящее время оно печатает начальное значение изатем, не обновляя, я создал главное окно, используя 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.

Остальная часть кода послекласс mainwindow, мой код управляет реле и кнопки перемещаются по нескольким страницам, эта часть кода работает нормально

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

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Ладно, так что, увлекшись всем, что связано с графическим интерфейсом, мне пришлось реализовать многопоточность и удалить функции из потока графического интерфейса.Поскольку вопрос касался выходных данных датчика, я удалил весь код, не относящийся к нему, и включил только код, необходимый для датчика. Надеюсь, это имеет смысл.

Это решило проблему:

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)

Добавлениеэто позволило программе постоянно обновлять номер ЖК-дисплея.

0 голосов
/ 12 сентября 2018

Извините.Я не знаком с некоторыми модулями, которые вы используете.В целом это может выглядеть следующим образом:

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

enter image description here

...