【生じている問題・どうしたいか】
タクトスイッチを押した場合LEDがつき、もう一度押した場合LEDが消える回路を作りました。
LEDが消えているときにスイッチを押した場合は、問題なくLEDがつきます。
しかし、LEDがついているときにスイッチを押した場合、①完全に消える場合、と
②1回消えた後もう一度つく場合、があります。常に①の場合を達成できるコードを書きたいです。
【コード】
Python
1import RPi.GPIO as GPIO 2from time import sleep 3 4def my_callback(x): 5 global ledstate 6 if x==24: 7 ledstate=not ledstate 8 if led state==1: 9 GPIO.output(25.GPIO.HIGH) 10 else: 11 sleep(0.5) #後述 12 GPIO.output(25,GPIO.LOW) 13 14GPIO.setmode(GPIO.BCM) 15GPIO.setup(25,GPIO.OUT,initial=GPIO.LOW) 16GPIO.setup(24,GPIO.IN,pull_up_down=GPIO.PUD_DOWN) 17GPIO.add_event_detect(24,GPIO.RISING,callback=my_callback,bouncetime=200) #タクトスイッチを押すとmy_callbackを呼び出す 18 19ledstate=0 20 21while True: 22 sleep(0.01) 23
この回路とコードにより、LEDが消えているときにスイッチを押すとLEDがつき、
LEDがついているときにスイッチを押すと、0.5secスリープした後、LEDが消えます。
しかし上述のように、ついているときに押した場合は、消える場合と、消えた後もう一度つく場合の2通りがでてしまいます。
【試したこと】
my_callback中の
sleep(0.5)
の行を削除すると、問題なく作動します(LEDがついている場合に押しても100%完全に消える)。
おそらくですが、callbackで呼ばれる関数がある程度の時間を伴う場合、今回のようなバグ(おそらくチャタリング)が
生じるのだと思います。
しかし、この行は残したまま解決できるようにしたいのです。なぜなら今後、イベント時に呼び出す関数が
この関数のようにある程度の長さの時間を伴った出力になる場合が想定されるためです。
原理として今回なぜこのようなバグが生じたか、どのようにしたらコードの意図を損なわずに解決できるのか、
ご教示いただけますと助かります。

回答3件
あなたの回答
tips
プレビュー