【问题标题】:Is there a way to play pygame.mixer.Sound only for the duration of time a circuit is broken?有没有办法只在电路断开期间播放 pygame.mixer.Sound?
【发布时间】:2019-11-18 02:53:52
【问题描述】:

我正在构建一组带有运动传感器和树莓派的音乐楼梯,我对 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)

【问题讨论】:

    标签: python-2.7 pygame raspberry-pi3


    【解决方案1】:

    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)
    

    【讨论】:

    • 您好,感谢您的建议。当我尝试时遇到“运行时错误:已为此 GPIO 通道启用冲突边缘检测”。声音对象已存储在映射到其相应 GPIO 引脚的字典中。我会将它们存储在声音字典中的什么位置?
    • 是的,你是对的,第二个字典不是必需的。我很久以前使用过一次 GPIO,所以 IIRC 你必须添加一个 GPIO.BOTH 处理程序而不是 RAISING 和 FALLING 处理程序。但关键信息仍然是:如果不再播放声音对象,请在声音对象上调用 stop()
    猜你喜欢
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 2023-03-16
    • 2020-05-21
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多