编写程序让智能手表久坐提醒,结合步数判断,不足30分钟提示活动。

张开发
2026/5/4 5:35:36 15 分钟阅读
编写程序让智能手表久坐提醒,结合步数判断,不足30分钟提示活动。
项目名称ActiveLife Watch (智能手表久坐提醒系统)一、 实际应用场景描述场景设定为用户佩戴的智能手表在办公场景下的后台监测。手表内置的 MEMS 加速度传感器如 MPU6050以 50Hz 的频率采集手腕的三轴加速度数据。系统通过算法实时计算用户的步数 (Step Count) 和活动状态。当用户连续静坐超过 60 分钟且在过去 30 分钟内步数增加少于 10 步时手表震动马达启动屏幕显示“该起来活动了”。二、 引入痛点现代办公族面临的健康与交互痛点1. 隐形久坐专注工作时很容易一坐就是两小时身体僵硬。2. 被动健康只有感到腰酸背痛时才想起站起来缺乏预防性干预。3. 误报干扰传统软件计时器不管你在不在动到点就响如果在开会或专注时被打断会很烦躁。4. 数据孤岛手环只计步不结合时间维度无法给出有效健康建议。三、 核心逻辑讲解本系统的核心逻辑基于时间窗口滑动统计 (Sliding Window Statistics) 与 状态机 (State Machine)1. 数据采集与预处理* 模拟加速度传感器数据。* 计算合加速度矢量 a_{mag} \sqrt{a_x^2 a_y^2 a_z^2} 。* 使用高通滤波 (High-Pass Filter) 去除重力分量保留动态动作信号。2. 步数检测 (Peak Detection)* 当动态加速度超过阈值如 1.5g时判定为一步。* 加入步长间隔约束 (Inter-step Interval)防止高频抖动误判。3. 久坐判定算法 (Sedentary Logic)* 时间窗口滑动窗口大小为 30 分钟。* 判定条件IF (Current_Time - Last_Move_Time) 60_minutes AND Steps_In_Last_30min 10 THEN ALARM。* 这意味着即使过了60分钟如果你中间起身走动了一下步数增加计时器会重置。四、 代码模块化实现我们将代码分为三个模块config.py (生理与算法阈值)、sensor_sim.py (加速度计模拟)、activity_engine.py (计步与决策引擎)、main.py (主循环)。1. 配置文件config.py配置文件运动检测与久坐提醒阈值# 久坐提醒参数SEDENTARY_ALARM_MINUTES 60 # 静坐超过60分钟触发LOW_ACTIVITY_STEPS 10 # 30分钟内少于10步视为活动不足# 计步算法参数STEP_DETECTION_THRESHOLD 1.5 # 加速度阈值 (g)MIN_STEP_INTERVAL_S 0.3 # 两步之间的最小间隔 (秒)# 传感器参数SAMPLING_RATE_HZ 50 # 采样率UPDATE_INTERVAL_S 2 # 状态更新间隔2. 传感器模拟模块sensor_sim.py智能仪器课程相关MEMS加速度传感器模拟模拟 MPU6050 或类似 IMU 的数据流import randomimport mathimport timeclass AccelerometerSimulator:虚拟加速度计类模拟手腕佩戴时的静止、行走和随机抖动def __init__(self):self.is_moving Falseself.move_start_time 0def generate_noise(self):生成高斯白噪声return random.gauss(0, 0.1)def get_acceleration(self, t):获取三轴加速度数据 (g)包含重力 (1g Z轴) 和动态运动成分ax self.generate_noise()ay self.generate_noise()az 1.0 self.generate_noise() # 静止时Z轴有1g重力# 模拟行走时的周期性摆动if self.is_moving:freq 2.0 # Hz, 步频amplitude 0.8ax amplitude * math.sin(2 * math.pi * freq * t)ay amplitude * math.cos(2 * math.pi * freq * t)return {x: ax, y: ay, z: az}def simulate_walk(self, duration_s5):模拟一段行走self.is_moving Trueself.move_start_time time.time()# 实际运行中这个状态由外部逻辑控制3. 活动检测引擎activity_engine.py智能仪器核心计步算法与久坐判定引擎import timeimport mathfrom collections import dequefrom config import STEP_DETECTION_THRESHOLD, MIN_STEP_INTERVAL_Sclass ActivityEngine:活动检测与决策引擎def __init__(self):self.step_count 0self.last_step_time 0self.last_movement_time time.time()self.activity_window deque(maxlenLOW_ACTIVITY_STEPS)def calculate_magnitude(self, accel_data):计算合加速度矢量return math.sqrt(accel_data[x]**2 accel_data[y]**2 accel_data[z]**2)def detect_step(self, accel_data, current_time):基于峰值的步数检测mag self.calculate_magnitude(accel_data)# 动态阈值检测if mag STEP_DETECTION_THRESHOLD:# 检查时间间隔防止重复计数if current_time - self.last_step_time MIN_STEP_INTERVAL_S:self.step_count 1self.last_step_time current_timeself.last_movement_time current_time # 更新最后活动时间self.activity_window.append(current_time)return Truereturn Falsedef check_sedentary(self, current_time):检查是否满足久坐提醒条件time_since_last_move current_time - self.last_movement_time# 条件1: 超过静坐时间if time_since_last_move (SEDENTARY_ALARM_MINUTES * 60):# 条件2: 近期活动量不足recent_steps len([t for t in self.activity_window if t (current_time - 30*60)])if recent_steps LOW_ACTIVITY_STEPS:return Truereturn False4. 主程序逻辑main.pyActiveLife Watch - 主执行文件import timeimport datetimefrom config import SEDENTARY_ALARM_MINUTES, UPDATE_INTERVAL_Sfrom sensor_sim import AccelerometerSimulatorfrom activity_engine import ActivityEngineclass SmartWatch:def __init__(self):self.sensor AccelerometerSimulator()self.engine ActivityEngine()self.alarm_triggered Falsedef trigger_alarm(self):触发久坐提醒if not self.alarm_triggered:print(\n * 30)print( 久坐提醒您已静坐过久请起身活动)print( * 30 \n)self.alarm_triggered True # 防止重复报警def run(self):主运行循环print(⌚ 智能手表健康监测启动 ⌚)print(f监测逻辑静坐超过 {SEDENTARY_ALARM_MINUTES} 分钟且步数不足将提醒)print(- * 60)start_time time.time()try:while True:current_time time.time()elapsed_time current_time - start_time# 1. 模拟用户行为 (为了演示)# 前30秒模拟走路然后静止if elapsed_time 30:self.sensor.is_moving Trueelse:self.sensor.is_moving False# 2. 数据采集accel self.sensor.get_acceleration(elapsed_time)# 3. 数据处理与决策step_detected self.engine.detect_step(accel, current_time)if step_detected:self.alarm_triggered False # 只要有新步伐重置报警状态print(f\n[{datetime.datetime.now().strftime(%H:%M:%S)}] 检测到步伐! 总步数: {self.engine.step_count})# 4. 定期检查久坐状态if int(elapsed_time) % UPDATE_INTERVAL_S 0:if self.engine.check_sedentary(current_time):self.trigger_alarm()time.sleep(0.1) # 100ms 循环except KeyboardInterrupt:print(\n手表已关闭。)if __name__ __main__:watch SmartWatch()watch.run()五、 README 文件# ActiveLife Watch - 智能手表久坐提醒系统## 项目简介这是一个基于 Python 的可穿戴设备算法模拟项目。项目模拟了智能手表中的加速度传感器数据处理流程实现了精准的步数检测和基于时间窗口分析的久坐提醒功能。## 核心功能* **IMU 数据模拟**: 模拟 MEMS 加速度计的三轴数据流。* **峰值检测计步**: 通过动态阈值和间隔约束准确识别有效步伐。* **智能久坐判定**: 结合时间长度和活动量双因子判断避免误报。* **状态机管理**: 只有在真正需要时才触发提醒减少干扰。## 环境依赖* Python 3.8## 使用说明1. 确保 config.py, sensor_sim.py, activity_engine.py, main.py 在同一目录。2. 运行主程序bashpython main.py3. 程序启动后前 30 秒会模拟走路你会看到步数增加。4. 30 秒后进入静止状态系统开始倒计时模拟静坐。5. 观察控制台当达到设定时间且无活动时会触发久坐提醒。## 扩展建议* 接入真实的 MPU6050 传感器使用 I2C 读取原始数据。* 增加心率传感器 (PPG)结合心率变异性 (HRV) 判断压力水平。* 实现更复杂的活动识别 (Activity Recognition)区分走路、跑步、骑车。* 增加陀螺仪数据实现手势识别 (如抬腕亮屏)。六、 核心知识点卡片 (Key Takeaways)类别 知识点 说明智能仪器 MEMS 传感 微机电系统在可穿戴设备中的应用处理微小信号。信号处理 矢量运算与滤波 计算合加速度使用高通滤波去除重力基线。算法设计 峰值检测 (Peak Detection) 从噪声信号中提取特征点步伐。嵌入式逻辑 滑动窗口分析 在时间维度上对数据进行统计分析而非瞬时判断。人机交互 非侵入式提醒 在满足强条件时才打扰用户提升产品可用性。七、 总结在这个智能手表久坐提醒项目中我们深入了信号处理与生物运动学的交叉领域。1. 工程思维的精密化不同于之前的“阈值触发”如体温37.5℃开风扇这次我们处理了时间序列数据。真正的计步算法远比if acc threshold 复杂它需要activity_engine.py 中的时间窗口约束和状态记忆。2. 用户体验的权衡LOW_ACTIVITY_STEPS 和SEDENTARY_ALARM_MINUTES 的设置体现了工程妥协。太敏感会烦人太迟钝没效果。好的算法是在两者之间找到平衡点。3. 模块化复用sensor_sim.py 提供了一个标准的 IMU 数据接口。如果你以后想做无人机姿态解算或机器人平衡控制这套数据模拟框架是可以直接复用的。利用AI解决实际问题如果你觉得这个工具好用欢迎关注长安牧笛

更多文章