前回の記事
Raspberry Pi タクトスイッチの入力を扱う その1
Raspberry Pi タクトスイッチの入力を扱う その2

その2では、失敗例をあげたが、今回は成功例を書いていく。
変更点はプログラムのみ、スイッチのチャタリング防止のため割り込み処理を書いていく。

プログラム

import RPi.GPIO as GPIO #GPIO制御のためのimport
from time import sleep #sleep命令のimport

#関数の定義
def my_callback(channel):
    global ledstate
    if channel == 24:
        ledstate = not ledstate
        GPIO.output(25, ledstate)

#GPIOの初期化命令
GPIO.setmode(GPIO.BCM)
GPIO.setup(25, GPIO.OUT)
GPIO.setup(24, GPIO.IN)

#割り込み
GPIO.add_event_detect(24, GPIO.RISING, callback=my_callback, bouncetime=200)

#変数の初期化命令,LEDの状態を保存するため
ledstate = GPIO.LOW

#メインループ…といいつつsleepしてるだけ
try:
    while True:
        sleep(0.01)

except KeyboardInterrupt: #Ctrl+C押したら
    pass

GPIO.cleanup() #GPIOを初期化し終了

#… はコメントアウトですが、実行するときは消したほうが安全かもしれない。
日本語フォントがインストールされていない場合は文字化けするだろうし。

importはいつも通り
関数の定義が今回新しく入っていますが、後回し

初期化命令ではGPIOはいつも通り

GPIO.add_event_detect()文を入れています。
イベントを検出したら、割り込み処理をやるために書いています。
()の中身
(24, GPIO.RISING, callback=my_callback, bouncetime=200)
  • 24はGPIO24
  • GPIO.RISINGはLOWからHIGHになるときを検出
  • callbackは関数呼び出し、定義したmy_callback関数を呼び出す。
  • bouncetime=200はイベント検出後、200msはイベント検出をやめる
つまり、GPIO24でLOWからHIGHになったとき、関数my_callbackを呼び出す。
次の検出は200ms後。

変数ledstateは、前回の記事と同じ

メインループは、sleep付きの無限ループ
except以下は、終了時の処理


では関数の説明
defコマンドを使って関数を定義する
def my_callback(channel):
my_callbackが関数名
(channel) は引数

global ledstateは関数内で変数を使うために宣言
if文以下は、LEDのON/OFFを扱っている。

今回初めて登場した、割り込み処理GPIO.add_event_detected()は
 
参考書籍:Raspberry Piクックブック (Make:PROJECTS)の209Pに詳しく書かれている。
この本によれば、スイッチのチャタリング防止のプログラムは他にもあるようだが、詳しく知りたい方はこの本の251Pを見てほしい。

最後に動画を載せておく。