我是新手,所以请耐心等待。 我试图写一段代码来运行一个命令,当继电器关闭一个电路而另一个打开时。 我已经改变了我发现的一段代码示例,它似乎完成了我想要的大部分代码。 在我测试/学习的过程中,我已将其设置为运行mp3。 但我的问题是我只想让它播放一次相应的mp3,但它一直在播放mp3。
我考虑过使用time time.sleep()并使用大量的数据,因此需要很长时间的停顿。 但是电路可能在那段时间关闭,并且在那段时间里它不会播放mp3。
这是我的代码
import os
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(22, GPIO.IN)
print("------------------")
print(" trigger test ")
print("------------------")
print GPIO.input(22)
while True:
if ( GPIO.input(22) == False ):
print("Triggered")
os.system('omxplayer -o hdmi cow.mp3')
else:
print ("Waiting to be triggered again")
os.system('omxplayer -o hdmi sample.mp3')
答案 0 :(得分:1)
如果我理解你的问题,你想要的是每次状态从True变为False时播放MP3,而只要状态保持为False,你的代码就会一遍又一遍地播放。
作为旁注,if ( GPIO.input(22) == False ):
违反了大约六种Pythonic风格的规则,所以我要修复它而不是尝试用你的风格写下其他所有内容。
解决此问题的一种方法是添加另一个旋转直到状态为True的循环,然后才返回外循环
while True:
if not GPIO.input(22):
print("Triggered")
os.system('omxplayer -o hdmi cow.mp3')
while not GPIO.input(22):
time.sleep(.1)
else:
print ("Waiting to be triggered again")
os.system('omxplayer -o hdmi sample.mp3')
while GPIO.input(22):
time.sleep(.1)
但是,更好的解决方案是使用GPIO
库中内置的边缘检测功能,如文档的Interrupts and Edge detection部分所述:
边沿是电信号从低电平到高电平(上升沿)或从高电平到低电平(下降沿)的状态变化。很多时候,我们更关心的是输入状态的变化而不是它的价值。这种状态变化是一个事件。
为避免在程序忙于其他操作时错过按钮,有两种方法可以解决这个问题:
wait_for_edge()
功能event_detected()
功能- 检测到边缘时运行的线程回调函数
(是的,这是三种方式,而不是两种方式......)
所以,你可以这样做:
while True:
if not GPIO.input(22):
print("Triggered")
os.system('omxplayer -o hdmi cow.mp3')
GPIO.wait_for_edge(22, GPIO.RISING)
else:
print ("Waiting to be triggered again")
os.system('omxplayer -o hdmi sample.mp3')
GPIO.wait_for_edge(22, GPIO.FALLING)