我正在使用我的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代码时它没有问题(例如,多个线程需要睡眠)。
这里有什么简单的东西吗?如果我有,请提前道歉!我对此很新......
干杯