Python脚本中的GPIO引脚在IDLE3中工作,但在从控制台运行时不能(使用Adafruit IO MQTT)

时间:2018-04-02 07:48:39

标签: python python-3.x raspberry-pi gpio adafruit

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

0 个答案:

没有答案