Есть ли способ играть в pygame.mixer.Sound только на время, когда цепь сломана? - PullRequest
0 голосов
/ 08 июля 2019

Я строю музыкальные лестницы с датчиками движения и малиновым пи, и я совсем новичок в Python.В настоящее время, когда пользователь проходит мимо датчика движения, нота будет воспроизводиться в течение всего времени действия файла .wav, но мне было интересно, есть ли способ, которым звук будет воспроизводиться только в течение времени, в течение которого передается датчик движения?

 import RPi.GPIO as GPIO
 import pygame.mixer
 pygame.mixer.init()

 '''GPIO setup'''
GPIO.setmode(GPIO.BCM)
GPIO.setwarningS(False)

'''Define stairs and GPIO pins'''
step1 = 4
step2 = 17
step3 = 27

'''Motion sensor setup'''
GPIO.setup(step1, GPIO.IN, GPIO.PUD_UP)
GPIO.setup(step2, GPIO.IN, GPIO.PUD_UP)
GPIO.setup(step3, GPIO.IN, GPIO.PUD_UP)

'''Sound files'''
C1 = pygame.mixer.Sound("piano/C1.wav")
D = pygame.mixer.Sound("piano/D.wav")
E = pygame.mixer.Sound("piano/E.wav")

def play(pin):
    sound = sound_pins[pin]
    sound.play()

'''Dictionary  of steps and sounds'''
sound_pins  = {
    step1: C1,
    step2: D,
    step3: E,
    }

for pin in sound_pins:
    GPIO.setup(pin, GPIO.IN, GPIO.PUD_UP)
    GPIO.add_even_detect(pin, GPIO.RISING, play, 100)

1 Ответ

0 голосов
/ 08 июля 2019

Добавить прослушиватель событий для GPIO.BOTH. Когда это срабатывает, проверьте, является ли это нарастающим или падающим фронтом с помощью input, а затем назовите play() или stop() соответственно.

Примерно так, вы поймете:

def play(pin):
    sound = sound_pins[pin]
    if GPIO.input(pin):
        sound.play()
    else:
        sound.stop()

for pin in sound_pins:
    GPIO.setup(pin, GPIO.IN, GPIO.PUD_UP)
    GPIO.add_even_detect(pin, GPIO.BOTH, play, 100)
...