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)
.
我不知道我的问题出在哪里。如果有人能够帮助我,那就太好了。 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)
.