尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

保姆级教程:用Arduino UNO和MPU6050做个老人防摔监测器(附完整代码)

保姆级教程:用Arduino UNO和MPU6050做个老人防摔监测器(附完整代码) 用Arduino UNO和MPU6050打造高灵敏度老人防摔监测器家里有老人或独居长辈的朋友们是否经常担心他们在无人看护时发生意外摔倒今天我们就来动手制作一个成本不到百元的智能防摔监测器它能在检测到摔倒动作后立即触发警报后续还能升级为短信通知功能。这个项目不需要复杂的编程基础跟着步骤一步步来两小时内就能完成。1. 硬件准备与电路连接1.1 所需材料清单制作这个防摔监测器你需要准备以下硬件Arduino UNO开发板作为整个系统的控制核心MPU6050六轴传感器模块用于检测加速度和角速度变化有源蜂鸣器模块比LED更有效的警报装置面包板和杜邦线用于快速搭建电路USB数据线为Arduino供电和上传程序手机充电宝(可选)作为移动电源使用提示MPU6050建议购买带电平转换的模块版本避免5V/3.3V电平不匹配问题。1.2 电路连接详解按照以下方式连接各组件Arduino UNO引脚MPU6050引脚蜂鸣器连接5VVCC-GNDGNDGNDA4 (SDA)SDA-A5 (SCL)SCL-数字引脚8-I/O连接时注意先断开USB连接防止短路检查杜邦线插接是否牢固MPU6050的INT引脚可不接2. 软件环境配置2.1 安装必要库文件在Arduino IDE中需要安装两个关键库打开IDE点击工具-管理库搜索并安装以下库Adafruit MPU6050官方传感器驱动库Adafruit Unified Sensor基础传感器支持库安装完成后重启IDE使库生效。2.2 基础测试代码上传以下代码测试传感器是否正常工作#include Adafruit_MPU6050.h #include Adafruit_Sensor.h #include Wire.h Adafruit_MPU6050 mpu; void setup() { Serial.begin(115200); if (!mpu.begin()) { Serial.println(MPU6050初始化失败); while (1); } mpu.setAccelerometerRange(MPU6050_RANGE_8_G); mpu.setGyroRange(MPU6050_RANGE_500_DEG); mpu.setFilterBandwidth(MPU6050_BAND_21_HZ); } void loop() { sensors_event_t a, g, temp; mpu.getEvent(a, g, temp); Serial.print(加速度 X:); Serial.print(a.acceleration.x); Serial.print( Y:); Serial.print(a.acceleration.y); Serial.print( Z:); Serial.println(a.acceleration.z); delay(200); }打开串口监视器(波特率115200)正常时会看到三轴加速度数据流。3. 摔倒检测算法实现3.1 动态阈值设定原理传统固定阈值法容易误报我们采用动态基线突变检测算法持续监测加速度矢量和√(x²y²z²)计算最近30次采样的移动平均值作为基准当瞬时值超过基准值2.5倍时触发警报持续超过阈值500ms才确认为真实摔倒#define SAMPLE_SIZE 30 #define THRESHOLD_FACTOR 2.5 #define CONFIRM_TIME 500 float samples[SAMPLE_SIZE]; int sampleIndex 0; float baseline 0; unsigned long alertStart 0; float getAccelMagnitude() { sensors_event_t a, g, temp; mpu.getEvent(a, g, temp); return sqrt(a.acceleration.x*a.acceleration.x a.acceleration.y*a.acceleration.y a.acceleration.z*a.acceleration.z); }3.2 完整防摔检测代码整合动态阈值算法和警报逻辑#include Adafruit_MPU6050.h #include Adafruit_Sensor.h #include Wire.h Adafruit_MPU6050 mpu; const int buzzerPin 8; // 省略getAccelMagnitude()函数... void setup() { Serial.begin(115200); pinMode(buzzerPin, OUTPUT); if (!mpu.begin()) { Serial.println(MPU6050初始化失败); while (1); } mpu.setAccelerometerRange(MPU6050_RANGE_8_G); mpu.setGyroRange(MPU6050_RANGE_500_DEG); mpu.setFilterBandwidth(MPU6050_BAND_21_HZ); // 初始化采样数组 for(int i0; iSAMPLE_SIZE; i) { samples[i] getAccelMagnitude(); delay(50); } } void loop() { float current getAccelMagnitude(); // 更新基准值 baseline - samples[sampleIndex]/SAMPLE_SIZE; samples[sampleIndex] current; baseline current/SAMPLE_SIZE; sampleIndex (sampleIndex1) % SAMPLE_SIZE; // 检测异常 if(current baseline * THRESHOLD_FACTOR) { if(alertStart 0) { alertStart millis(); } else if(millis() - alertStart CONFIRM_TIME) { triggerAlarm(); alertStart 0; } } else { alertStart 0; digitalWrite(buzzerPin, LOW); } delay(50); } void triggerAlarm() { for(int i0; i3; i) { digitalWrite(buzzerPin, HIGH); delay(300); digitalWrite(buzzerPin, LOW); delay(200); } }4. 系统优化与功能扩展4.1 佩戴方式与误报减少实际使用时应注意将设备固定在腰部位置这是检测摔倒的最佳位置避免剧烈运动时佩戴如跑步、跳舞等不同体型的人可能需要调整THRESHOLD_FACTOR参数可增加一个物理开关用于临时禁用警报4.2 升级短信通知功能添加SIM800L GSM模块实现远程报警硬件添加SIM800L模块3.7V锂电池电压转换模块电路连接SIM800L的TXD接Arduino的RXSIM800L的RXD接Arduino的TX共地连接短信发送代码片段#include SoftwareSerial.h SoftwareSerial sim800l(2, 3); // RX, TX void sendAlertSMS() { sim800l.println(ATCMGF1); // 设置短信模式 delay(100); sim800l.println(ATCMGS\8613800138000\); // 替换为接收号码 delay(100); sim800l.print(紧急警报检测到摔倒事件); // 短信内容 delay(100); sim800l.write(26); // CtrlZ发送 }4.3 低功耗优化技巧延长电池续航的方法将MPU6050设置为低功耗模式使用硬件中断唤醒代替轮询降低采样频率到10Hz选用低功耗Arduino兼容板如Pro Mini// 在setup()中添加 mpu.setSleepEnabled(true); // 修改loop(): void loop() { mpu.setSleepEnabled(false); delay(10); // 等待传感器稳定 // 采集数据逻辑... mpu.setSleepEnabled(true); delay(90); // 合计100ms间隔 }实际测试中发现将设备佩戴在腰部皮带位置THRESHOLD_FACTOR设为2.3时对缓慢坐下和真实摔倒的区分效果最好。蜂鸣器警报模式建议采用间歇性鸣响既能引起注意又不会太过刺耳。
返回列表