1

更新:问题解决了。叹。就像在打开和关闭引脚时增加一点延迟一样简单。根本不是权限问题。我猜 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

4

0 回答 0