1

更新: 問題は解決しました。はぁ。ピンのオンとオフを切り替えるときに少し遅延を追加するのと同じくらい簡単でした. 権限の問題ではありません。IDLE3 ide は、信号が arduino によって検出されたよりも少しだけ遅く実行されたと思います。コンソールから実行すると、あまりにも速く発生しました。ピンを Low から High に切り替える間に time.sleep(.5) を追加すると、読み取りに十分な時間が与えられました。すべてが機能するようになりました。

MQTT クライアントとして機能し、MQTT フィードから取得した信号に基づいていくつかの GPIO ピンを制御する Python スクリプトを用意しました。このスクリプトは、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 ピンではありません。

起動時にこれを実行するために試した2つの方法は次のとおりです

須藤ナノ/etc/rc.local

コード行を追加します: sudo python3 /home/pi/dogflapcontrol2.py &

また、crontab で @reboot を実行してみました。どちらの方法でも、MQTT が応答するときにプログラムを実行できますが、ピンは実行できません。スクリプトに 30 秒と 60 秒の時間遅延を追加して、それが役立つかどうかを確認しましたが、違いはありませんでした。私が理解できる最善のことは、ある種の許可の問題があるということですか? しかし、実行するときはsudoを使用しているので、その問題は解決すると思っていました。

誰かが持っている考えやフィードバックは非常に役に立ちます! どうもありがとう。おー!RPi0Wを使用しています

4

0 に答える 0