我有这个代码我正在为篮球比赛(一种使用振动传感器的街机风格篮球比赛和用于检测篮板命中和得分投篮的HC-SR04)。我试图弄清楚如何在几秒钟后将全局布尔值从True变为False。
因此,例如,球击中篮板 - 将全球背板设置为True - 从那里它将保持True几秒钟以确定球是否从篮板反弹到网中。如果篮球通过球网时篮板变量仍然是真的,那么它就会知道它可以从篮板射门开始,并且可以发挥其他一些很酷的特殊声音效果。
现在在回调函数中,当球击中篮板时,篮板变量设置为True,但它会保持为真,直到球员得分而不是几秒钟后变回假。
以下是代码:
import RPi.GPIO as GPIO
from gpiozero import DistanceSensor
import pygame
import time
ultrasonic = DistanceSensor(echo=17, trigger=4)
ultrasonic.threshold_distance = 0.3
pygame.init()
#Global
backboard = False
#GPIO SETUP
channel = 22
GPIO.setmode(GPIO.BCM)
GPIO.setup(channel, GPIO.IN)
#music
score = pygame.mixer.Sound('net.wav')
bb = pygame.mixer.Sound("back.wav")
def scored():
#the ball went through the net and trigged the HC-SR04
global backboard
if backboard == True:
print("scored")
backboard = False
score.play()
time.sleep(0.75)
else:
print("scored")
score.play()
time.sleep(0.75)
def callback(channel):
#the ball hit the backboard and triggered the vibration sensor
global backboard
if GPIO.input(channel):
backboard = True
print("backboard")
bb.play()
time.sleep(0.75)
GPIO.add_event_detect(channel, GPIO.BOTH, bouncetime=300) # let us know when the pin goes HIGH or LOW
GPIO.add_event_callback(channel, callback) # assign function to GPIO PIN, Run function on change
ultrasonic.when_in_range = scored
答案 0 :(得分:1)
我建议简单地实现一个计时器对象。尝试实现这个:
from threading import Timer
import time
def switchbool():
backboard = false
t = Timer(3.0, switchbool) #will call the switchbool function after 3 seconds
每当球击中篮板时(无论何时设置背板= true),只需创建一个类似于上例中的计时器对象。