CircuitPython实现光线传感器持续遮挡3秒后触发LED与音效的功能咨询
CircuitPython实现光线传感器持续遮挡3秒后触发LED与音效的功能咨询
嗨,我来帮你搞定这个问题~你现在的代码思路有点小问题,用time.sleep(3)的话,程序会直接暂停3秒,这期间哪怕你把遮挡物移开了,它还是会继续执行后面的LED点亮和音效播放,这显然不是你想要的「持续遮挡3秒及以上才触发」的效果对吧?
要实现真正的“持续遮挡3秒后触发”,我们不能让程序中途“休眠”,而是要实时监测光线传感器的状态,同时统计持续遮挡的时长。这里可以用CircuitPython内置的time.monotonic()函数,它能返回一个不断递增的时间数值,用来计算时间差非常合适。
下面是调整后的代码,我给你加了详细的注释:
import time # 假设你的cp模块已经正确导入了 # 初始化变量:记录遮挡开始的时间,初始为None表示未遮挡 block_start_time = None # 标记是否已经触发过动作,避免重复执行 triggered = False while True: current_light = cp.light print("Light:", current_light) if current_light < 10: # 第一次检测到遮挡,记录开始时间 if block_start_time is None: block_start_time = time.monotonic() triggered = False # 重置触发标记 # 计算已经遮挡的时长 elapsed_time = time.monotonic() - block_start_time # 持续遮挡满3秒,且还没触发过动作 if elapsed_time >= 3 and not triggered: cp.red_led = True cp.play_tone(262, 1) cp.play_tone(294, 1) triggered = True # 标记为已触发,避免重复播放音效 else: # 没有遮挡,重置所有状态 block_start_time = None triggered = False cp.red_led = False # 短暂休眠,避免循环太频繁占用资源 time.sleep(0.2)
这样修改后,程序会一直监测光线状态:只有当光线持续低于10 lux满3秒时,才会触发LED点亮和音效;如果中途遮挡物被移开,计时会立刻重置,不会误触发。
备注:内容来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

