Pi跑命令等

时间:2014-12-18 05:48:02

标签: python raspberry-pi wait

我是新手,所以请耐心等待。 我试图写一段代码来运行一个命令,当继电器关闭一个电路而另一个打开时。 我已经改变了我发现的一段代码示例,它似乎完成了我想要的大部分代码。 在我测试/学习的过程中,我已将其设置为运行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')

1 个答案:

答案 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)