求适用于树莓派3B+的LSM6DSOX加速度计运动检测拍照Python代码
LSM6DSOX加速度计运动检测触发树莓派拍照代码
原代码存在的问题
- 导入语句格式错误,未正确初始化I2C总线,模块导入方式也不符合规范
- 代码缩进完全违反Python语法,类和函数的结构混乱不堪
Watcher类的使用逻辑错误,未实例化对象就直接调用类方法- 仅通过单轴加速度值变化判断运动,极易产生误触发
main函数重复定义,缺少持续检测加速度的循环逻辑
修复后的完整代码
import time import board from adafruit_lsm6ds.lsm6dsox import LSM6DSOX from picamera import PiCamera import math # 初始化I2C总线与传感器 i2c = board.I2C() sensor = LSM6DSOX(i2c) # 初始化相机并设置分辨率 camera = PiCamera() camera.resolution = (1920, 1080) # 运动检测参数(可根据实际场景调整) MOTION_THRESHOLD = 1.5 # 加速度变化超过该值判定为运动 COOLDOWN_TIME = 2 # 拍照冷却时间,避免短时间重复触发 last_accel_magnitude = 0 last_capture_time = 0 def calculate_accel_magnitude(x, y, z): """计算合加速度的模值""" return math.sqrt(x**2 + y**2 + z**2) def capture_photo(): """触发相机拍照并按时间命名保存""" current_time = time.strftime("%Y%m%d-%H%M%S") photo_path = f"/home/pi/Pictures/motion_{current_time}.jpg" camera.capture(photo_path) print(f"已保存照片:{photo_path}") def main(): global last_accel_magnitude, last_capture_time print("运动检测已启动...") while True: # 获取当前三轴加速度数据 accel_x, accel_y, accel_z = sensor.acceleration # 计算当前合加速度 current_magnitude = calculate_accel_magnitude(accel_x, accel_y, accel_z) # 计算加速度变化量 magnitude_diff = abs(current_magnitude - last_accel_magnitude) # 判断是否触发拍照 current_time = time.time() if magnitude_diff > MOTION_THRESHOLD and (current_time - last_capture_time) > COOLDOWN_TIME: capture_photo() last_capture_time = current_time # 更新上次加速度记录 last_accel_magnitude = current_magnitude # 控制检测频率 time.sleep(0.1) if __name__ == "__main__": try: main() except KeyboardInterrupt: print("\n检测已停止") camera.close()
关键逻辑说明
- 合加速度检测:通过计算三轴加速度的模值判断运动,比单轴检测更稳定,减少误触发
- 冷却机制:设置冷却时间避免短时间内重复拍照,节省存储空间
- 动态命名:按当前时间命名照片,避免覆盖旧文件
- 优雅退出:捕获Ctrl+C信号,确保程序停止时正确关闭相机
内容的提问来源于stack exchange,提问作者Lemickey
相关产品推荐
相关产品推荐

