web-dev-qa-db-ja.com

GPIO.setupおよびGPIO.cleanupのRuntimeWarningsがKeyboardInterruptで機能しない

Raspberry Piで動作するコードに問題があります。 pythonで始めたばかりなので、助けが必要です。

これはコードです:

_import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

led1=22
led2=17

GPIO.setup(led1, GPIO.OUT)
GPIO.setup(led2, GPIO.OUT)

def blink():
    GPIO.output(led1, 1)
    time.sleep(1)
    GPIO.output(led1, 0)

    GPIO.output(led2, 1)
    time.sleep(1)
    GPIO.output(led2, 0)

while(blink):
    blink()

try:
    main()
except KeyboardInterrupt:
    GPIO.cleanup()
_

このエラーを実行すると、コンソールに表示されます:

RuntimeWarning:このチャネルはすでに使用されており、とにかく続行されます。警告を無効にするには、GPIO.setwarnings(False)を使用します。 GPIO.setup(led1、GPIO.OUT)および:

RuntimeWarning:このチャネルはすでに使用されており、とにかく続行されます。警告を無効にするには、GPIO.setwarnings(False)を使用します。 GPIO.setup(led2、GPIO.OUT)

私が正しく理解していれば、コマンドGPIO.cleanup()はGPIOポートのすべてのピンをリ​​セットし、LEDをオフにする必要があります。

しかし、これは実際には起きていません。

この問題を解決するためにコードをどのように変更できますか?

7
Denis0189

関数を効果的に分離し、より一般的なものにする方法について少し説明します。これは動作するPythonスクリプトですが、raspiでテストしていませんが、動作すると思います-とにかく、私に知らせてください問題がありました!

import RPi.GPIO as GPIO
import time

# Module level constants
LED1 = 22
LED2 = 17

# Sets up pins as outputs
def setup(*leds):
    GPIO.cleanup()
    GPIO.setmode(GPIO.BCM)
    for led in leds:
        GPIO.setup(led, GPIO.OUT)
        GPIO.output(led, GPIO.LOW)

# Turn on and off the leds
def blink(*leds):
    # Blink all leds passed
    for led in leds:
        GPIO.output(led, GPIO.HIGH)
        time.sleep(1)
        GPIO.output(led, GPIO.LOW)

if __name__ == '__main__':
    # Setup leds
    setup(LED1, LED2)
    # Run blinking forever
    try:
        while True:
            blink(LED1, LED2)
    # Stop on Ctrl+C and clean up
    except KeyboardInterrupt:
        GPIO.cleanup()

フレンドリーな推奨事項:

専用のRaspberry Pi StackExchangeサイトもあります: https://raspberrypi.stackexchange.com/

8
Peter Varo

質問にmainが含まれていないようです。ただし、プログラムがKeyboardInterrupt以外の何らかの理由で終了した場合、問題が発生する可能性があります。 finallyブロックでリソースを解放することをお勧めします

try:
    main()
except KeyboardInterrupt:
    pass
finally:
    GPIO.cleanup()
8
John La Rooy

main()関数を呼び出していますが、宣言(定義)されていないため、while(blink)を使用しています。したがって、「main()」を削除し、「Try」をメイン関数の前に置く必要があります。これはwhile(blink)ループです。そこで適切なタブを忘れないでください。

2
user5890381