2017-05-08 135 views
0

我的新節目。我用雙腳跳躍和建立一個項目,將讀出的GPIO管腳(該機器是樹莓PI)的輸入電壓,並最終將顯示在Qt Creator中的lcdnumber插件。現在我使用光電池作爲o2電池的代用品,它將成爲最終的組件。感謝大家發佈的代碼,我有工作代碼的光電管打印電壓就好了。爲了獲得恆定和連續的電壓,我使用了一段時間的真正循環。當然,當我運行該程序時,循環接管並且我的程序的其他部分不運行。另一部分是帶有lncnumber顯示屏的gui和一些最終連接到數字電位器的按鈕。 gui本身運行得很好。光電池代碼本身非常有用。將兩者結合在一起就是我遇到的問題。從過去幾天我讀到的內容來看,python或Qt中的線程似乎是要走的路。我已經閱讀了所有可以找到的例子和解釋,並且我被卡住了。 gui彈出並運行,循環似乎不運行。光電管的輸出現在正在打印到終端,或者通常在我自己運行該代碼時執行,因爲我不知道如何將其連接到Qt液晶顯示器。幫助Qt Creator中/樹莓派線程

我將非常感謝,如果有人可以看看我的代碼,讓我知道我錯了與線程和其他任何你可能會看到,因爲我仍然在學習。關於將光電池信號連接到Qt LCD的任何提示也將是一個巨大的幫助。

我使用Raspbian(Debian的Linux的一個變體)以及Qt4/Qt Creator的3.2.1

請讓我知道你需要什麼其他信息或希望。

import sys 
import RPi.GPIO as GPIO 
import time 
import re 
from PyQt4 import QtGui, uic, QtCore 
from PyQt4.QtCore import QThread 
import spidev 
import os 
import threading 
from threading import Thread 

GPIO.setmode(GPIO.BCM) 
GPIO.setwarnings(False) 

o2zero = 26 
o2span = 19 
cozero = 13 
cospan = 6 
co2zero = 5 
co2span = 21 

status = "nil" 

light_channel = 0 
spi = spidev.SpiDev() 
spi.open(0,0) 

class MyWindow(QtGui.QMainWindow): 

    def __init__(self): 
     super(MyWindow, self).__init__() 
     uic.loadUi('mainwindow.ui', self) 
     self.show() 
     QtCore.QObject.connect(self.o2_zero_up,QtCore.SIGNAL("clicked()"), self.o2zeroup) 
     QtCore.QObject.connect(self.o2_zero_down,QtCore.SIGNAL("clicked()"), self.o2zerodown) 
     QtCore.QObject.connect(self.o2_span_up,QtCore.SIGNAL("clicked()"), self.o2spanup) 
     QtCore.QObject.connect(self.o2_span_down,QtCore.SIGNAL("clicked()"), self.o2spandown) 
     QtCore.QObject.connect(self.co_zero_up,QtCore.SIGNAL("clicked()"), self.cozeroup) 
     QtCore.QObject.connect(self.co_zero_down,QtCore.SIGNAL("clicked()"), self.cozerodown) 
     QtCore.QObject.connect(self.co_span_up,QtCore.SIGNAL("clicked()"), self.cospanup) 
     QtCore.QObject.connect(self.co_span_down,QtCore.SIGNAL("clicked()"), self.cospandown) 
     QtCore.QObject.connect(self.co2_zero_up,QtCore.SIGNAL("clicked()"), self.co2zeroup) 
     QtCore.QObject.connect(self.co2_zero_down,QtCore.SIGNAL("clicked()"), self.co2zerodown) 
     QtCore.QObject.connect(self.co2_span_up,QtCore.SIGNAL("clicked()"), self.co2spanup) 
     QtCore.QObject.connect(self.co2_span_down,QtCore.SIGNAL("clicked()"), self.co2spandown) 
     QtCore.QObject.connect(self.close_button,QtCore.SIGNAL("clicked()"), self.gpiocleanup) 

    def o2zeroup(self): 
     GPIO.setup(o2zero, GPIO.OUT) 
     GPIO.output(o2zero, 1) 
    def o2zerodown(self): 
     GPIO.setup(o2zero, GPIO.OUT) 
     GPIO.output(o2zero, 0) 

    def o2spanup(self): 
     GPIO.setup(o2span, GPIO.OUT) 
     GPIO.output(o2span, 1) 
    def o2spandown(self): 
     GPIO.setup(o2span, GPIO.OUT) 
     GPIO.output(o2span, 0) 

    def cozeroup(self): 
     GPIO.setup(cozero, GPIO.OUT) 
     GPIO.output(cozero, 1) 
    def cozerodown(self): 
     GPIO.setup(cozero, GPIO.OUT) 
     GPIO.output(cozero, 0) 

    def cospanup(self): 
     GPIO.setup(cospan, GPIO.OUT) 
     GPIO.output(cospan, 1) 
    def cospandown(self): 
     GPIO.setup(cospan, GPIO.OUT) 
     GPIO.output(cospan, 0) 

    def co2zeroup(self): 
     GPIO.setup(co2zero, GPIO.OUT) 
     GPIO.output(co2zero, 1) 
    def co2zerodown(self): 
     GPIO.setup(co2zero, GPIO.OUT) 
     GPIO.output(co2zero, 0) 

    def co2spanup(self): 
     GPIO.setup(co2span, GPIO.OUT) 
     GPIO.output(co2span, 1) 
    def co2spandown(self): 
     GPIO.setup(co2span, GPIO.OUT) 
     GPIO.output(co2span, 0) 

    def gpiocleanup(self): 
     GPIO.cleanup() 

    def closeEvent(self, event): 
     print ("GPIO CleanUP") 
     GPIO.cleanup() 
     event.accept()  

class O2_Channel(QtCore.QThread): 

    def __init__(self): 
     QtCore.QThread.__init__(self) 

    def O2_Channel(self): 

     ReadChannel(channel) 
     adc = spi.xfer2([1,(8+channel)<<4,0]) 
     data = ((adc[1]&3) << 8) + adc[2] 
     return data 

     ConvertVolts(data,places) 
     volts = (data * 3.3)/float(1023) 
     volts = round(volts,places) 
     return volts 

    def run(self): 

     while True: 

      light_level = ReadChannel(light_channel) 
      light_volts = ConvertVolts(light_level,2) 

      print "--------------------------------------------" 
      print("Light: {} ({}V)".format(light_level,light_volts)) 

      light_channel = 0 
      temp_channel = 1 

      delay = .3       

      time.sleep(delay) 

      self.O2_Channel.start() 

if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    window = MyWindow() 
    sys.exit(app.exec_()) 

回答

0

您必須創建一個線程實例,並使用主線程的start()函數啓動它。如果你想在你的GUI中顯示數據,你必須從主線程爲此創建一個插槽和一個新的讀數時發出的信號。

我也改變了信號和槽之間連接的連接風格更現代的一個。

import sys 
import RPi.GPIO as GPIO 
import time 
import re 
from PyQt4 import QtGui, uic, QtCore 
from PyQt4.QtCore import QThread 
import spidev 

GPIO.setmode(GPIO.BCM) 
GPIO.setwarnings(False) 

o2zero = 26 
o2span = 19 
cozero = 13 
cospan = 6 
co2zero = 5 
co2span = 21 

status = "nil" 

light_channel = 0 
spi = spidev.SpiDev() 
spi.open(0,0) 

class MyWindow(QtGui.QMainWindow): 

    def __init__(self): 
     super(MyWindow, self).__init__() 
     uic.loadUi('mainwindow.ui', self) 

     self.o2_zero_upclicked.connect(self.o2zeroup) 
     self.o2_zero_down.clicked.connect(self.o2zerodown) 
     self.o2_span_up.clicked.connect(self.o2spanup) 
     self.o2_span_down.clicked.connect(self.o2spandown) 
     self.co_zero_up.clicked.connect(self.cozeroup) 
     self.co_zero_down.clicked.connect(self.cozerodown) 
     self.co_span_up.clicked.connect(self.cospanup) 
     self.co_span_down.clicked.connect(self.cospandown) 
     self.co2_zero_up.clicked.connect(self.co2zeroup) 
     self.co2_zero_down.clicked.connect(self.co2zerodown) 
     self.co2_span_up.clicked.connect(self.co2spanup) 
     self.co2_span_down.clicked.connect(self.co2spandown) 
     self.close_button.clicked.connect(self.gpiocleanup) 

     self.thread = O2_Channel() 
     self.thread.changedValue.connect(self.onChangeValue) 
     self.thread.start() 

     self.show() 

    def onChangeValue(self, values): 
     light_level, light_volts = values 

     print "--------------------------------------------" 
     print("Light: {} ({}V)".format(light_level,light_volts)) 


    def o2zeroup(self): 
     GPIO.setup(o2zero, GPIO.OUT) 
     GPIO.output(o2zero, 1) 
    def o2zerodown(self): 
     GPIO.setup(o2zero, GPIO.OUT) 
     GPIO.output(o2zero, 0) 

    def o2spanup(self): 
     GPIO.setup(o2span, GPIO.OUT) 
     GPIO.output(o2span, 1) 
    def o2spandown(self): 
     GPIO.setup(o2span, GPIO.OUT) 
     GPIO.output(o2span, 0) 

    def cozeroup(self): 
     GPIO.setup(cozero, GPIO.OUT) 
     GPIO.output(cozero, 1) 
    def cozerodown(self): 
     GPIO.setup(cozero, GPIO.OUT) 
     GPIO.output(cozero, 0) 

    def cospanup(self): 
     GPIO.setup(cospan, GPIO.OUT) 
     GPIO.output(cospan, 1) 
    def cospandown(self): 
     GPIO.setup(cospan, GPIO.OUT) 
     GPIO.output(cospan, 0) 

    def co2zeroup(self): 
     GPIO.setup(co2zero, GPIO.OUT) 
     GPIO.output(co2zero, 1) 
    def co2zerodown(self): 
     GPIO.setup(co2zero, GPIO.OUT) 
     GPIO.output(co2zero, 0) 

    def co2spanup(self): 
     GPIO.setup(co2span, GPIO.OUT) 
     GPIO.output(co2span, 1) 
    def co2spandown(self): 
     GPIO.setup(co2span, GPIO.OUT) 
     GPIO.output(co2span, 0) 

    def gpiocleanup(self): 
     GPIO.cleanup() 

    def closeEvent(self, event): 
     self.thread.stop() 
     self.thread.quit() 
     self.thread.wait() 
     self.thread.deleteLater() 
     print ("GPIO CleanUP") 
     GPIO.cleanup() 
     event.accept() 

def ReadChannel(channel): 
    adc = spi.xfer2([1,(8+channel)<<4,0]) 
    data = ((adc[1]&3) << 8) + adc[2] 
    return data 

def ConvertVolts(data, places): 
    volts = (data * 3.3)/float(1023) 
    volts = round(volts,places) 
    return volts  

class O2_Channel(QtCore.QThread): 
    changedValue = QtCore.pyqtSignal(tuple) 
    def __init__(self): 
     QtCore.QThread.__init__(self) 
     self.mRunning = True 

    def run(self): 
     while self.mRunning: 

      light_level = ReadChannel(light_channel) 
      light_volts = ConvertVolts(light_level,2) 

      print "--------------------------------------------" 
      print("Light: {} ({}V)".format(light_level,light_volts)) 
      self.changedValue.emit((light_level, light_volts)) 
      light_channel = 0 
      temp_channel = 1 
      delay = .3       
      time.sleep(delay) 

    def stop(self): 
     self.mRunning = False 

if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    window = MyWindow() 
    sys.exit(app.exec_()) 
+0

太謝謝你了。這是一個巨大的幫助,我看到我現在失去的東西。 – kjohns

+0

如果我的回答可以幫助,將其標記爲正確,請,這裏是一個類似[示例](https://github.com/CodeHuntersLab/RaspberryPi/blob/master/pyqt/lib/Measure/DHTGPIO.py)https://開頭github.com/CodeHuntersLab/RaspberryPi/tree/master/pyqt – eyllanesc