我是Python的新手,我正在做一个项目,我希望人们按下按钮来播放视频事件。视频#1将是默认的普通视频,而视频#2将播放并闪烁来自GPIO 13(BCM)的LED。
这是我的难题:按钮1,按钮2和按钮3。如果我按1,然后按按钮3中断它,通常我可以继续运行程序。但是,当我按下按钮2时,按钮3不会停止视频,但会终止工作,并且闪烁的LED不会在GPIO中清除。它通常位于“ ON”位置。我一直为此奋斗一两个星期,希望能有所帮助。如果有必要,欢迎您重写它;我正在盯着屏幕这么长时间盯着头痛。该代码来自该网站上的其他各种代码,其他代码也经过我自己的修改而合并。请您帮忙?
#!/usr/bin/env python3
import RPi.GPIO as GPIO
from omxplayer.player import OMXPlayer
from pathlib import Path
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(13, GPIO.OUT)
GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_UP)
VIDEO_PATH1 = Path("/home/pi/Videos/ship.mp4")
VIDEO_PATH2 = Path("/home/pi/Videos/twist.mp4")
def blink():
for j in range(0,5):
GPIO.output(13, GPIO.HIGH) # led on
time.sleep(0.8)
GPIO.output(13, GPIO.LOW) # led off
time.sleep(0.8)
last_state1 = True
last_state2 = True
input_state1 = True
input_state2 = True
quit_video = True
playit = False
playit2 = False
while True:
#Read states of inputs
input_state1 = GPIO.input(17)
input_state2 = GPIO.input(18)
quit_video = GPIO.input(24)
#If GPIO(17) is shorted to Ground
if input_state1 == last_state1:
if (playit and not input_state1):
player.quit()
player = OMXPlayer(VIDEO_PATH1)
playit = True
elif not input_state1:
player = OMXPlayer(VIDEO_PATH1)
playit = True
#If GPIO(18) is shorted to Ground
if input_state2 == last_state2:
if (playit2 and not input_state2):
player.quit()
player = OMXPlayer(VIDEO_PATH2)
blink()
playit2 = True
elif not input_state2:
player = OMXPlayer(VIDEO_PATH2)
blink()
playit2 = True
#If omxplayer is running and GIOP(17) and GPIO(18) are not
elif (playit and playit2 and input_state1 and input_state2):
player.quit()
playit = False
playit2 = False
#GPIO(24) to close omxplayer manually - used during debug
if quit_video == False:
player.quit()
GPIO.output(13,GPIO.LOW) # led off
GPIO.cleanup() # Release resource
playit = False
playit2 = False
#Set last_input states
last_state1 = input_state1
last_state2 = input_state2'
已更新:
'#!/usr/bin/env python3
import RPi.GPIO as GPIO
import time
from omxplayer.player import OMXPlayer
from pathlib import Path
from time import sleep
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(13,GPIO.OUT)
GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_UP)
VIDEO_PATH1 = Path("/home/pi/Videos/ship.mp4")
VIDEO_PATH2 = Path("/home/pi/Videos/twist.mp4")
last_state1 = True
last_state2 = True
last_state3 = True
input_state1 = True
input_state2 = True
quit_video = True
playit = False
playit2 = False
def blink():
while player.is_playing():
GPIO.output(13,GPIO.HIGH)
time.sleep(0.8)
print("LED is ON!")
GPIO.output(13,GPIO.LOW)
time.sleep(0.8)
print("LED is OFF!!")
while True:
#Read states of inputs
input_state1 = GPIO.input(17)
input_state2 = GPIO.input(18)
quit_video = GPIO.input(24)
#If GPIO(17) is shorted to Ground
if input_state1 == last_state1:
if (playit and not input_state1):
player.quit()
player = OMXPlayer(VIDEO_PATH1)
playit = True
elif not input_state1:
player = OMXPlayer(VIDEO_PATH1)
playit = True
#If GPIO(18) is shorted to Ground
if input_state2 == last_state2:
if (playit2 and not input_state2):
player.quit()
player = OMXPlayer(VIDEO_PATH2)
blink()
playit2 = True
elif not input_state2:
player = OMXPlayer(VIDEO_PATH2)
print("program is running")
blink()
playit2 = True
#If omxplayer is running and GIOP(17) and GPIO(18) are not shorted to Ground
elif (playit and playit2 and input_state1 and input_state2):
player.quit()
playit = False
playit2 = False
#GPIO(24) to close omxplayer manually - used during debug
if quit_video == False:
player.quit()
playit = False
playit2 = False
GPIO.output(13, GPIO.LOW) # led off
#Set last_input states
last_state1 = input_state1
last_state2 = input_state2
答案 0 :(得分:0)
我会使用紧密的循环来检查按钮,并根据时间变化来切换LED。类似于以下内容:
#!/usr/bin/env python3
import RPi.GPIO as GPIO
import time,datetime,signal,sys
from omxplayer.player import OMXPlayer
def playerExit(code):
print('exit',code)
GPIO.output(ledGPIO,GPIO.LOW)
global videoPlaying
videoPlaying=False
def playVideo(video):
global player,videoPlaying
if player==None:
player=OMXPlayer(video)
player.exitEvent += lambda _, exit_code: playerExit(exit_code)
else:
player.load(video)
videoPlaying=True
def signalHandler(sig,frame):
print('Ctrl+C pressed')
quitting()
sys.exit(0)
def quitPlayerLED():
GPIO.output(ledGPIO,GPIO.LOW)
if player!=None:
player.quit()
# gpio,video/quit,blink T/F
buttonVideos = [[17,"/home/pi/Videos/ship.mp4",False],
[18,"/home/pi/Videos/twist.mp4",True],
[24,"quit",False]]
ledGPIO = 13
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(ledGPIO,GPIO.OUT)
GPIO.output(ledGPIO,GPIO.LOW)
for buttonVideo in buttonVideos:
GPIO.setup(buttonVideo[0], GPIO.IN, pull_up_down=GPIO.PUD_UP)
signal.signal(signal.SIGINT,signalHandler)
player = None
videoPlaying = False
blink = False
ledOn = False
toggle=datetime.datetime.now()
while True:
# check buttons
for buttonVideo in buttonVideos:
if GPIO.input(buttonVideo[0]) == GPIO.LOW:
print(buttonVideo[0],'pressed')
if buttonVideo[1] == "quit":
quitPlayerLED()
else:
playVideo(buttonVideo[1])
blink = buttonVideo[2]
if blink:
ledOn = True
toggle=datetime.datetime.now()+datetime.timedelta(seconds=0.8)
else:
GPIO.output(ledGPIO,GPIO.LOW)
break
# blink led
if blink and videoPlaying:
if datetime.datetime.now() > toggle:
print(ledOn)
GPIO.output(ledGPIO,ledOn)
ledOn = not ledOn
toggle = datetime.datetime.now()+datetime.timedelta(seconds=0.8)
time.sleep(0.1)