线程类来控制Raspberry Pi GPIO

时间:2013-11-20 11:27:03

标签: python multithreading raspberry-pi gpio

我正在使用我的Raspberry Pi控制继电器,作为我正在建造的浇水系统的一部分。我终于让我的线程类设置基于简单的SQL查询创建多个线程。以下代码用于迭代记录并创建每个线程(GPIO引脚号和延迟的持续时间以保持继电器打开):

with con:

con.row_factory = lite.Row       
cur = con.cursor() 
cur.execute(joinProgramZoneQuery)
rows = cur.fetchall()        

for row in rows: 

    duration = int(row["programDuration"]) 
    deviceGPIO = int(row["deviceGPIO"])         

    t = MyThreadWithArgs(deviceGPIO=deviceGPIO, duration=duration)
    t.start()

以下是我为处理每个线程而创建的类(它是用于为每个GPIO引脚创建线程的整个类):

# use P1 header pin numbering convention
GPIO.setmode(GPIO.BOARD)

class MyThreadWithArgs(threading.Thread):
    def __init__(self, deviceGPIO="default value", duration="default value", **kwargs):
        threading.Thread.__init__(self, **kwargs)

        self.deviceGPIO = deviceGPIO
        self.duration = duration       

    def run(self):

        logging.debug('Current GPIO pin: %s', self.deviceGPIO)       

        #SETUP THE PIN FOR OUTPUT AND DEFAULT TO LOW OUTPUT
        GPIO.setup(self.deviceGPIO, GPIO.OUT, initial=GPIO.LOW)
        #output the GPIO pin to HIGH                
        GPIO.output(deviceGPIO, GPIO.HIGH) 
        #Pause for specified duration        
        time.sleep(self.duration) 
        #SET THE GPIO OUTPUT BACK TO LOW AGAIN AFTER THE SLEEP
        GPIO.output(self.deviceGPIO, GPIO.LOW)
        #clean up all GPIO pins after the script has run..
        GPIO.cleanup()            

        logging.debug('ending')

问题是当我已经将GPIO引脚的输出设置为true时,我收到RuntimeError: The GPIO channel has not been set up as an OUTPUT错误。我甚至在课程结束时做了GPIO.cleanup(),以确保一旦延迟结束它就不会引起任何问题。对于我设置的每个GPIO引脚,似乎并不总是如此,但它始终至少为2 ..

我虽然这可能是我正在创建类实例的方式的一个问题,但是当我删除GPIO代码时它没有问题(例如,多个线程需要睡眠)。

这里有什么简单的东西吗?如果我有,请提前道歉!我对此很新......

干杯

0 个答案:

没有答案