线程不会像我说的那样在RPi上用Python中的GPIO运行

时间:2016-01-15 22:31:17

标签: python multithreading raspberry-pi gpio

我正在我的覆盆子pi上创建一个脚本,如果按下按钮,按钮上的LED需要闪烁,直到我再次按下按钮。 这是我的代码:

#!/usr/bin/python
import RPi.GPIO as GPIO
import threading
from time import sleep

GPIO.setmode(GPIO.BCM)
pushbutton = 2
led = 3
GPIO.setup(pushbutton, GPIO.IN)
GPIO.setup(led, GPIO.OUT)

class rpiThread(threading.Thread):
        def __init__(self):
                self.running = False
                super(rpiThread, self).__init__()
        def start(self):
                self.running = True
                super(rpiThread, self).start()
        def run(self):
                self.running = True
                while (self.running == True):
                        GPIO.output(led, GPIO.HIGH)
                        print "HIGH"
                        sleep(0.05)
                        GPIO.output(led,GPIO.LOW)
                        print "LOW"
                        sleep(0.05)
        def stop(self):
                self.running = False
                GPIO.output(led, GPIO.LOW)

def main():
        myrpiThread = rpiThread()
        pushed = GPIO.input(pushbutton)
        try:
                while(True):
                        if(pushed == False):
                                if(GPIO.input(pushbutton) == False):
                                        sleep(0.5)
                                        if(GPIO.input(pushbutton) == False):
                                                myrpiThread.start()
                                                pushed = True
                                                print "The button is pushed"
                        else:
                                if(GPIO.input(pushbutton) == True):
                                        GPIO.output(led, GPIO.LOW)
                                        myrpiThread.stop()
                                        pushed = False
                                        print "The button is not pushed"
        except KeyboardInterrupt:
                print "QUIT"
main()

总是当我运行我的脚本时,我的LED不会每0.05秒闪烁一次。有时它需要2秒才能打开,有时它不会闪烁。 我不知道我做错了什么?有人可以帮我弄清楚问题是什么吗?

是否有可能在多线程中使用GPIO引脚?

1 个答案:

答案 0 :(得分:0)

当我需要对GPIO使用线程回调时,我遵循了本教程: how to use interrupts with python on the raspberry pi and rpi gpio。它还在评论中讨论了如何避免使用全局变量从线程传回值。

确切地知道如何连接按钮以及使用什么类型的按钮以便我可以更具体地回答您的问题将会很有帮助。

我编写了以下示例代码,假设您已将按钮从GPIO 2连接到+ 3.3v 如果你将它连接到地面使用" pull_up_down = GPIO.PUD_DOWN"和" GPIO.FALLING" 它还假设您有一个瞬时按钮。当检测到按钮按下时,它会翻转全局布尔值。在主循环中检查该值,如果push = True,则调用blink(led)函数。

import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)
pushbutton = 2
led = 3
GPIO.setup(pushbutton, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(led, GPIO.OUT)
pushed = False

# this will run in another thread when the button is pushed 
def button_callback(channel):  
    pushed = not pushed

GPIO.add_event_detect(pushbutton, GPIO.RISING, callback=button_callback)

while True:
    if pushed:
        blink(led)

def blink(led):
    GPIO.output(led, True)
    sleep(0.5)
    GPIO.output(led, False)

我现在面前没有覆盆子Pi来测试这段代码,但我稍后会检查它。您可能需要根据具体设置对其进行修改,但希望它能帮助您找到正确的方向。