簡體   English   中英

樹莓派線程

[英]raspberry pi threading

我是編程新手。 我用雙腳跳了起來,並建立了一個項目,該項目將讀取GPIO引腳(該機器是Raspberry Pi)輸入電壓,最終將顯示在qt creator中的lcdnumber小部件上。 現在,我使用光電管作為o2電池的替代品,這將是最終組件。 多虧每個人都發布了代碼,我有了光電管的工作代碼,它可以很好地打印電壓。 為了獲得恆定和連續的電壓,我使用一會兒真正的循環。 當然,當我運行程序時,循環將接管,而程序的另一部分則不會運行。 另一部分是帶有lcdnumber顯示屏和一些按鈕的gui,這些按鈕最終將連接到數字電位計。 gui本身運行出色。 光電管代碼本身可以很好地工作。 將兩者結合是我遇到的問題。 根據過去幾天的閱讀,采用python或Qt進行線程似乎是行之有效的方法。 我已經閱讀了所有可以找到的示例和說明,但遇到了麻煩。 gui彈出並起作用,循環似乎沒有運行。 光電管的輸出現在正在打印到終端,或者通常在我自己運行該代碼時執行,因為我還不知道如何將其連接到Qt LCD。

如果有人可以看一下我的代碼,讓我知道線程出錯的地方以及自從我還在學習的任何其他內容,我將不勝感激。 將光電管信號連接到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_())

您必須創建線程的實例,並從主線程使用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_())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM