基于Arduino与Python的移动物体检测触发视频切换项目求助
解决方案
一、修复Arduino与Python的PIR信号传输问题
排查与修复步骤
替换Firmata固件
放弃FirmataExpress,直接使用Arduino IDE自带的Standard Firmata:- 打开Arduino IDE,依次选择
文件 > 示例 > Firmata > StandardFirmata - 匹配你的Arduino板型与串口端口,重新上传固件
- 打开Arduino IDE,依次选择
改用中断回调读取信号
避免轮询读取,用回调函数实时获取PIR状态,示例代码:from pymata4 import pymata4 import time PIR_PIN = 2 current_pir_state = 0 def pir_signal_callback(data): global current_pir_state # data格式:[报告类型, 引脚号, 当前电平值, 时间戳] current_pir_state = data[2] print(f"PIR状态: {'检测到人' if current_pir_state else '无检测'}") # 初始化Arduino连接 board = pymata4.Pymata4() # 配置引脚为数字输入,启用上拉电阻,绑定回调 board.set_pin_mode_digital_input(PIR_PIN, callback=pir_signal_callback, pullup=True) try: while True: time.sleep(0.1) except KeyboardInterrupt: board.shutdown()硬件验证
- 先用Arduino串口监视器直接读取PIR引脚值,确认传感器本身工作正常
- 检查接线:PIR的VCC接5V,GND接GND,OUT引脚连接到代码中指定的数字引脚
二、实现视频平滑无痕迹切换
放弃pyautogui,使用python-vlc库实现专业视频控制,支持无缝切换、全屏播放、隐藏控件。
实现步骤与代码
- 安装依赖
pip install python-vlc - 核心功能代码
import vlc import time from pymata4 import pymata4 # 视频路径配置 INIT_VIDEO = "初始视频.mp4" TRIGGER_VIDEO = "触发视频.mp4" PIR_PIN = 2 is_triggered = False def pir_callback(data): global is_triggered is_triggered = data[2] == 1 # 初始化VLC播放器实例 vlc_instance = vlc.Instance("--quiet --fullscreen --no-video-title-show") player = vlc_instance.media_player_new() # 播放初始循环视频 def play_loop_video(): media = vlc_instance.media_new(INIT_VIDEO) media.add_option("input-repeat=-1") # 无限循环 player.set_media(media) player.play() # 播放触发视频(单次) def play_single_video(): media = vlc_instance.media_new(TRIGGER_VIDEO) player.set_media(media) player.play() # 等待视频播放结束 while player.is_playing(): time.sleep(0.5) # 初始化Arduino board = pymata4.Pymata4() board.set_pin_mode_digital_input(PIR_PIN, callback=pir_callback, pullup=True) # 启动初始视频 play_loop_video() try: while True: if is_triggered and player.is_playing(): # 切换到触发视频 player.stop() play_single_video() # 切回初始循环视频 play_loop_video() is_triggered = False # 重置触发状态,避免重复触发 time.sleep(0.2) except KeyboardInterrupt: player.stop() board.shutdown() - 体验优化细节
- 添加
--no-video-title-show参数隐藏视频标题栏 - 可通过VLC的
video-filter=fade选项添加淡入淡出过渡效果 - 如果需要多显示器输出,可通过
--display=1指定输出屏幕
- 添加
内容的提问来源于stack exchange,提问作者blockerinho
相关产品推荐
相关产品推荐

