У меня есть PI с 4 входными портами GPIO. Цель состоит в том, что если будет нажата одна из 4 кнопок, должен быть воспроизведен файл mp3, то есть button1 = file1.mp3, button2 = file2.mp3 и так далее. Вроде бы все не так сложно, но «дьявол кроется в деталях» :-) Это мой код для двух кнопок на данный момент:
#!/usr/bin/env python
#coding: utf8
import time
from time import sleep
import os
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(24, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
GPIO.setup(23, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
def my_callback_1(channel):
print("Button 23 Pressed")
os.system('omxplayer -o both /root/1.mp3')
sleep(10)
def my_callback_2(channel):
print("Button 24 Pressed")
os.system('omxplayer -o both /root/2.mp3')
sleep(10)
GPIO.add_event_detect(23, GPIO.RISING, callback=my_callback_1, bouncetime=200)
GPIO.add_event_detect(24, GPIO.RISING, callback=my_callback_2, bouncetime=200)
try:
while 1:
time.sleep(0.5)
except KeyboardInterrupt:
# exits when you press CTRL+C
print(" Bye Bye")
except:
print("Other error or exception occurred!")
finally:
GPIO.cleanup() # this ensures a clean exit
Время сна устанавливается на большее время для файла mp3. Он работает, но не так, как я ожидал. Проблема в том, что когда кнопка будет нажата во время воспроизведения файла, PI удерживает нажатой кнопку в буфере и воспроизводит файл после текущего файла в цикле. Представьте, кто-то 5 раз нажмет одну и ту же кнопку, 5 раз один и тот же mp3-файл будет воспроизводиться в цикле.
Поэтому я искал решение вроде этого: пока файл воспроизводится, все кнопки ввода должны быть на это время "отключены". Когда оплата mp3-файла будет завершена, кнопки должны быть «повторно включены», и можно будет нажать другую кнопку.
Как я могу это сделать? Спасибо за вашу помощь.