更新:问题解决了。叹。就像在打开和关闭引脚时增加一点延迟一样简单。根本不是权限问题。我猜 IDLE3 ide 的运行速度比 arduino 检测到的信号慢了一点点。从控制台运行它时,它发生得太快了。在将引脚从低电平切换到高电平之间添加 time.sleep(.5) 可以让 ard 有足够的时间进行阅读。现在一切正常。
我有一个 python 脚本,它充当 MQTT 客户端,并根据它从 MQTT 提要获得的信号控制一些 GPIO 引脚。从 IDLE3 运行时,此脚本可以正常工作。但是,当我尝试在启动时同时使用 /etc/rc.local 和 crontab 运行它(我分别使用了两者,但无济于事)或从控制台运行,脚本运行(我知道,因为我看到它正在发布到 MQTT 源),但 GPIO 引脚不起作用。
脚本是:
import sys
import RPI.GPIO as GPIO
import serial
import time
from Adafruit_IO import MQTTClient
ADAFRUIT_IO_KEY = 'mykeyhere'
ADAFRUIT_IO_USERNAME = 'myusernamehere'
GPIO.setmode(GPIO.BCM)
FEED_ID = 'DoorFeed'
reset_feed_id = 'GameReset'
door_override = 18
reset_pin = 17
GPIO.setup(door_override, GPIO.OUT)
GPIO.setup(reset_pin, GPIO.OUT)
GPIO.output(door_override, True)
GPIO.output(reset_pin, True)
def connected(client):
print('connected to adafruit io')
client.subscribe(FEED_ID)
client.subscribe(reset_feed_id)
def disconnected(client):
print('disconnected from adafruit io')
client.connect()
def handle_msg(payload):
if(payload == '1'):
GPIO.output(door_override, False)
print('manual override sent')
GPIO.output(door_override, True)
def handle_reset(payload):
if(payload == '1'):
GPIO.output(reset_pin, False)
print('reset signal sent')
GPIO.output(reset_pin, True)
client.publish('GameReset', 'F')
def message(client, feed_id, payload):
print('feed {0} received new value {1}'.format(feed_id, payload))
if(feed_id == 'GameReset'):
handle_reset(payload)
if(feed_id == 'DoorFeed'):
handle_msg(payload)
client = MQTTClient(ADAFRUIT_IO_USERNAME, ADAFRUIT_IO_KEY)
client.on_connect = connected
client.on_disconnect = disconnected
client.on_message = message
client.connect()
client.loop_blocking()
当它从 IDLE 运行时,输出引脚工作。它们连接到 arduino 并用于手动控制开关或将 arduino 打破它所在的循环。但是,当我从控制台或启动运行脚本时,代码的 MQTT 客户端方面工作,但是不是 GPIO 引脚。
我尝试在启动时运行它的两种方法是
须藤纳米 /etc/rc.local
我添加代码行:sudo python3 /home/pi/dogflapcontrol2.py &
我也尝试过在 crontab 中执行 @reboot。这两种方法都允许程序在 MQTT 响应时运行,但不是引脚。我在脚本中添加了 30 秒和 60 秒的时间延迟,以查看是否有帮助,但这并没有什么不同。我能想到的最好的是存在某种许可问题?但是在运行它时,我使用的是 sudo,所以我认为这可以解决这个问题。
任何人的任何想法或反馈都会非常有帮助!非常感谢。哦!我正在使用 RPi0W