更新:问题解决了。叹。就像在打开和关闭引脚时添加一点延迟一样简单。根本不是权限问题。我想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引脚。
我在启动时尝试运行此方法的两种方法是
sudo nano /etc/rc.local
我添加代码行: sudo python3 /home/pi/dogflapcontrol2.py& amp;
我也尝试在crontab中执行@reboot。两种方法都允许程序在MQTT响应时运行,而不是引脚。我在脚本中添加了30秒和60秒的时间延迟,看看这是否会有所帮助,但它没有任何区别。我能想到的最好的是有某种许可问题吗?但是在运行它时,我正在使用sudo,所以我认为这样可以解决这个问题。
任何人的想法或反馈都会非常有帮助!非常感谢。哦!我正在使用RPi0W