Python 言語の理解 その9

GPIO接続したスイッチ入力とLED出力を組み合わせてみる

LED 6個を順に光らせ、スイッチが押されたら反転させる

 

GPIO_inout_LED6.py

 

#Raspberry Pi3 GPIO 入出力

#ライブラリの読み込み
import RPi.GPIO as GPIO
from time import sleep

SW_PIN = 4
LEDNO = [23,24,25,16,20,21]

#初期化
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

#入力モードとして設定
GPIO.setup (SW_PIN,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
#出力モード設定
for LED_PIN in LEDNO:
    GPIO.setup (LED_PIN,GPIO.OUT,initial = GPIO.LOW)


#出力設定
try:
    LED_PIN = 0
    LED_ADD = 1
    while True:
        GPIO.output (LEDNO[LED_PIN],GPIO.HIGH)
        sleep(0.3)
        GPIO.output (LEDNO[LED_PIN],GPIO.LOW)
        LED_PIN = LED_PIN + LED_ADD
        if (LED_PIN == 6):
            LED_PIN = 0
        if (LED_PIN == -1):
            LED_PIN = 5
        # スイッチが押されていたら反転
        if (GPIO.input(SW_PIN) == GPIO.HIGH) :
            print ( 'SW on :GPIO' + str(SW_PIN) + ' HIGH' )
            if (LED_ADD == 1) :
                LED_ADD = -1
                print ( 'LED_ADD = -1' )
            else :
                LED_ADD = 1
                print ( 'LED_ADD = 1' )
        else :
            print ( 'SW off:GPIO' + str(SW_PIN) + ' LOW' )

except KeyboardInterrupt:
    print ( 'CTRL + C' )
    pass

#GPIOリセット終了
GPIO.cleanup()

 

それなりに機能するのですが、スイッチの反応が悪くてなんかうまくいきません。
押されたトリガを捕まえられるとよいのですが、押された時に読み込まないと反応しないし、押されたままだと続けて反応してしまうので、ボタンを押したことがうまくLEDの光らせ順を変えるようには機能しない事が多いです。

で、押されたら話されるまで反転させないようにちょっとプログラムをいじってみました。

 

 

GPIO_inout-2_LED6.py

 

#Raspberry Pi3 GPIO 入出力

#ライブラリの読み込み
import RPi.GPIO as GPIO
from time import sleep

SW_PIN = 4
LEDNO = [23,24,25,16,20,21]

#初期化
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

#入力モードとして設定
GPIO.setup (SW_PIN,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
#出力モード設定
for LED_PIN in LEDNO:
    GPIO.setup (LED_PIN,GPIO.OUT,initial = GPIO.LOW)


#出力設定
try:
    SWC_CHK = 0
    LED_PIN = 0
    LED_ADD = 1
    while True:
        GPIO.output (LEDNO[LED_PIN],GPIO.HIGH)
        sleep(0.3)
        GPIO.output (LEDNO[LED_PIN],GPIO.LOW)
        LED_PIN = LED_PIN + LED_ADD
        if (LED_PIN == 6):
            LED_PIN = 0
        if (LED_PIN == -1):
            LED_PIN = 5
        if (GPIO.input(SW_PIN) == GPIO.HIGH) :
            print ( 'SW on :GPIO' + str(SW_PIN) + ' HIGH' )
            if (SWC_CHK == 0) :
                SWC_CHK = 1
                if (LED_ADD == 1) :
                    LED_ADD = -1
                    print ( 'LED_ADD = -1' )
                else :
                    LED_ADD = 1
                    print ( 'LED_ADD = 1' )
        else :
            print ( 'SW off:GPIO' + str(SW_PIN) + ' LOW' )
            SWC_CHK = 0

except KeyboardInterrupt:
    print ( 'CTRL + C' )
    pass

#GPIOリセット終了
GPIO.cleanup()

 

 

バッチリです!

ボタンを押すとLEDの光順が反転するようになりました。