You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Arduino与Python的移动物体检测触发视频切换项目求助

解决方案

一、修复Arduino与Python的PIR信号传输问题

排查与修复步骤

  1. 替换Firmata固件
    放弃FirmataExpress,直接使用Arduino IDE自带的Standard Firmata:

    • 打开Arduino IDE,依次选择文件 > 示例 > Firmata > StandardFirmata
    • 匹配你的Arduino板型与串口端口,重新上传固件
  2. 改用中断回调读取信号
    避免轮询读取,用回调函数实时获取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()
    
  3. 硬件验证

    • 先用Arduino串口监视器直接读取PIR引脚值,确认传感器本身工作正常
    • 检查接线:PIR的VCC接5V,GND接GND,OUT引脚连接到代码中指定的数字引脚

二、实现视频平滑无痕迹切换

放弃pyautogui,使用python-vlc库实现专业视频控制,支持无缝切换、全屏播放、隐藏控件。

实现步骤与代码

  1. 安装依赖
    pip install python-vlc
    
  2. 核心功能代码
    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()
    
  3. 体验优化细节
    • 添加--no-video-title-show参数隐藏视频标题栏
    • 可通过VLC的video-filter=fade选项添加淡入淡出过渡效果
    • 如果需要多显示器输出,可通过--display=1指定输出屏幕

内容的提问来源于stack exchange,提问作者blockerinho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 05:05:13