GPIO Raspberry Pi Python

GPIO Raspberry Pi Python

我不知道我的问题出在哪里。如果有人能够帮助我,那就太好了。 Mqtt 运行良好,但每次 GPIO 被触发时程序崩溃。

错误:

Connected with result code 0

/test/light1 0 0 Traceback (most recent call last): File "garage.py", line 33, in client.loop_forever() File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 1481, in loop_forever rc = self.loop(timeout, max_packets) File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 1003, in loop rc = self.loop_read(max_packets) File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 1284, in loop_read rc = self._packet_read() File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 1849, in _packet_read rc = self._packet_handle() File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 2305, in _packet_handle return self._handle_publish() File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 2500, in _handle_publish self._handle_on_message(message) File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 2647, in _handle_on_message self.on_message(self, self._userdata, message) File "garage.py", line 22, in on_message GPIO.output(pin, GPIO.LOW) RuntimeError: The GPIO channel has not been set up as an OUTPUT

#!/usr/bin/env python
import paho.mqtt.client as mqtt
import RPi.GPIO as GPIO

pin = 15

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

GPIO.setup(pin, GPIO.OUT)
GPIO.setup(pin, GPIO.HIGH)

def on_connect(client, userdata, flags, rc):
    print("Connected with result code " + str(rc))

    client.subscribe("/test/light1")

def on_message(client, userdata, msg):
        print(msg.topic + " " + str(msg.payload))
        if msg.payload == "0":
                print("0")
                GPIO.output(pin, GPIO.LOW)
        if msg.payload == "1":
                print("1")
                GPIO.output(pin, GPIO.HIGH)

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect("192.168.178.60", 1883, 60)

client.loop_forever()

乍一看,我认为问题是 GPIO.setup 没有传播到定义的函数。与其在顶部全局定义它们,不如创建一个子方法

def gpio_setup():
  pin = 15

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

  GPIO.setup(pin, GPIO.OUT)
  GPIO.setup(pin, GPIO.HIGH)

然后在每个其他方法中调用该方法:

def on_message(client, userdata, msg):
  gpio_setup()

您甚至可以通过在每个方法中手动设置 GPIO.setup 来查找中断的位置。

当您应该调用 GPIO.output(pin, GPIO.HIGH) 时,您正在调用 GPIO.setup(pin, GPIO.HIGH) 来设置初始值(在设置模式输出之后)。或者你可以使用 GPIO.setup(pin, GPIO.OUT, initial=GPIO.HIGH).