基于STM32的智能婴儿床毕设:多传感器融合与报警系统设计

基于STM32的智能婴儿床毕设:多传感器融合与报警系统设计 1. 项目缘起与整体设计思路1.1 为什么选智能婴儿床作为毕设题目每年到了毕设选题季电子信息工程和计算机专业的学生都会面临同一个灵魂拷问做什么题目既有技术含量又能在一个学期内落地还能在答辩时让老师眼前一亮我前后带过几届学生的毕设指导也自己动手复现过不少方案实测下来基于STM32的智能婴儿床系统是一个性价比极高的选择。原因很直接。第一STM32这颗芯片在毕设圈的地位不用多说资料多、生态成熟、外设丰富你遇到问题几乎都能搜到答案。第二婴儿床这个场景天然适合堆传感器——温度、湿度、声音、姿态、重量每一个都能独立成一个功能模块工作量可控又可扩展。第三答辩时老师一听“智能婴儿床”立刻能理解应用价值不像某些纯算法题目需要你花五分钟解释背景。这个系统本质上解决的是新手父母夜间看护的痛点宝宝睡觉时家长不可能一直盯着但温度过高过低、被子踢开、哭闹、翻身爬出床栏这些情况都需要及时知道。传统做法是靠人守着而智能婴儿床的思路是用STM32做核心控制器把环境监测、状态检测、报警提示、数据记录这几件事自动化。适合谁来参考如果你正在准备单片机方向的毕设手上有STM32开发板会基本的C语言和Keil开发环境那这篇内容基本可以当作完整的实现路线图。哪怕你是刚接触STM32的小白只要按模块一步步来也能把这个系统搭起来。1.2 系统整体架构怎么划分做毕设最忌讳一上来就写代码先把架构想清楚能省掉后面一半的返工。我建议把整个系统拆成四层来看这样无论是画框图还是写论文都清晰。感知层负责采集数据包括温湿度传感器、声音传感器、压力/称重传感器、红外或超声波测距模块。控制层就是STM32主控负责轮询或中断方式读取各传感器数据做逻辑判断。执行与交互层包括OLED显示屏、蜂鸣器、LED指示灯、按键以及可选的电机驱动用于摇床功能。通信层负责把数据传到手机或上位机可以用蓝牙模块、WiFi模块或者简单点用串口打印到电脑。这么分层的好处是每个模块可以独立调试。我见过太多同学把所有代码堆在一个main函数里结果一个传感器读不出来整个系统都跑不起来排查起来极其痛苦。分层之后温湿度模块调通了再调声音模块互不干扰。1.3 主控芯片与关键器件选型逻辑主控选STM32F103C8T6也就是常说的“最小系统板”或“蓝板”。这颗芯片是Cortex-M3内核72MHz主频64KB Flash20KB RAM对于婴儿床这种多传感器轮询的应用绰绰有余。更重要的是它便宜、好买、资料铺天盖地Keil5装个芯片包就能直接开发。相比之下如果选STM32F4系列性能过剩且成本上去了选51单片机外设和中断资源又捉襟见肘多路传感器加显示屏会很吃力。温湿度传感器我推荐DHT11或SHT30。DHT11便宜但精度一般湿度±5%温度±2℃做毕设够用SHT30是I2C接口精度高很多价格也就贵几块钱如果预算允许直接上SHT30答辩时数据更漂亮。声音检测用普通的模拟声音传感器模块输出模拟量或数字量STM32的ADC采集即可。姿态检测可以用MPU6050六轴传感器判断宝宝是否翻身或异常体动。测距防爬出用HC-SR04超声波模块装在床栏上方往下测检测到宝宝身体接近栏顶就报警。显示用0.96寸OLEDI2C接口四根线搞定比LCD1602省IO口还好看。报警用有源蜂鸣器加LED一个响一个闪夜间提示明显。按键用两三个独立按键做阈值设置和模式切换。通信如果要做手机端HC-05蓝牙模块是最省事的选择串口透传手机装个蓝牙调试助手就能收数据。提示选型时一定要确认模块的工作电压。STM32的IO是3.3V电平DHT11和HC-05可以接3.3V但有些继电器模块和电机驱动是5V的中间要加电平转换或光耦隔离否则可能烧IO口。2. 核心功能模块的细节拆解2.1 温湿度采集与舒适度判断温湿度是婴儿床最基础也最重要的监测项。宝宝体温调节能力弱环境温度建议保持在24到26摄氏度湿度50%到60%。DHT11是单总线协议时序要求比较严格新手容易读不出数据。我的经验是读DHT11时两次读取之间至少间隔2秒因为它内部采样速率有限读太快会返回上一次的旧数据甚至出错。具体操作上先拉低数据线至少18毫秒然后释放等待DHT11响应。它会先拉低80微秒再拉高80微秒之后连续输出40位数据8位湿度整数、8位湿度小数、8位温度整数、8位温度小数、8位校验和。校验和等于前四个字节相加取低八位。如果校验失败直接丢弃这次数据重新读。如果你用SHT30事情简单很多。I2C地址默认0x44发送0x2C06命令启动单次测量等15毫秒后读6个字节前三个是温度后三个是湿度带CRC校验。SHT30的转换公式是温度 -45 175 × (原始值 / 65535)湿度 100 × (原始值 / 65535)。这个公式要记牢答辩时老师很可能问。舒适度判断逻辑我一般这样写温度低于23度或高于27度湿度低于40%或高于70%就触发预警OLED上对应数值闪烁蜂鸣器短鸣一声。如果超出更多比如温度低于20度或高于30度就持续报警。分级报警的好处是不会一点小波动就吵醒家长。2.2 声音检测与哭声识别思路声音检测这块很多同学直接用声音传感器模块的数字输出有声音就高电平。这样做太粗糙环境噪音、关门声都会误触发。稍微好一点的做法是用模拟输出接STM32的ADC采集一段时间内的波形算峰值和有效值超过阈值才认为是哭声。更进一步可以做一个简易的哭声识别。婴儿哭声频率主要集中在300到600Hz而成人说话在100到300Hz环境噪音频谱更宽。你可以用STM32的定时器触发ADC以固定采样率比如2kHz采集声音信号做64点或128点的FFT看主频是否落在300到600Hz区间。这个计算量对STM32F103来说有点吃力但用ARM的DSP库或者简化成过零率检测也能凑合。我实测下来毕设层面用“ADC峰值持续时间”判断就足够了。设定一个阈值声音强度连续超过阈值200毫秒以上才判定为哭声这样能过滤掉短暂的杂音。判定后OLED显示“哭声报警”蜂鸣器以特定节奏鸣叫同时可以通过蓝牙推送一条通知到手机。注意声音传感器的灵敏度电位器要调好。太灵敏了空调风声都触发太迟钝了宝宝小声哭检测不到。建议在安静环境下让一个人正常说话调到刚好不触发然后模拟哭声测试。2.3 姿态与防爬出检测的实现姿态检测用MPU6050它集成了三轴加速度计和三轴陀螺仪I2C接口。判断宝宝翻身主要看加速度计的X轴和Y轴角度变化。宝宝平躺时Z轴加速度接近重力加速度X和Y接近零。如果翻身到侧卧X或Y轴会出现明显分量。具体做法是读加速度计的原始值算出俯仰角和横滚角。俯仰角 arctan(Ax / sqrt(Ay² Az²))横滚角类似。如果俯仰角或横滚角超过45度并持续几秒就认为宝宝翻身幅度较大可以记录一次体动事件。如果角度持续异常比如超过70度可能宝宝处于危险姿势触发报警。防爬出用HC-SR04超声波模块装在床栏顶部向下发射。正常宝宝躺着时传感器到宝宝身体的距离在30到50厘米。如果距离缩短到15厘米以内说明宝宝身体接近栏顶有爬出风险立即报警。HC-SR04的用法是给Trig脚至少10微秒高电平然后读Echo脚高电平持续时间距离 时间 × 340 / 2单位米换算成厘米就是时间 × 0.017。这里有个坑超声波模块的测量角度大约15度如果床栏比较宽可能需要装两个模块覆盖不同区域。另外宝宝被子隆起也会影响测距所以阈值不能设得太激进15厘米是个比较稳妥的值。2.4 数据显示与本地交互设计OLED显示屏用SSD1306驱动I2C接口分辨率128×64。我一般把界面分成三行第一行显示温度和湿度第二行显示声音状态和姿态状态第三行显示距离和系统运行时间。刷新率不用太高500毫秒刷一次足够刷太快反而闪烁。按键设计三个KEY1用于切换设置模式KEY2用于增加阈值KEY3用于减少阈值。比如进入温度阈值设置后按KEY2把上限从27度调到28度按KEY3调回来。设置参数存在STM32的Flash里掉电不丢失。这里要用到Flash的读写操作注意STM32F103的Flash页大小是1KB写之前要先擦除整页。蜂鸣器报警要分级一级预警短鸣一声间隔2秒二级报警连续鸣叫间隔500毫秒三级紧急报警持续长鸣。LED用不同颜色区分绿色正常黄色预警红色报警。夜间可以把OLED亮度调低避免刺眼。3. 实操过程与关键环节实现3.1 开发环境搭建与工程配置开发环境用Keil MDK5安装时注意要同时装C51和STM32的芯片包这样以后51和STM32的项目都能打开。装完Keil后去官网下载STM32F1系列的Device Family Pack双击安装。然后装ST-Link驱动用ST-Link V2下载器连接开发板的SWD接口SWCLK接PA14SWDIO接PA13GND和3.3V对应接好。新建工程时我习惯用STM32CubeMX生成初始化代码。选好芯片型号STM32F103C8T6配置时钟树外部晶振8MHzPLL倍频到72MHz。然后逐个配置外设USART1用于串口打印和蓝牙I2C1用于OLED和MPU6050I2C2或软件I2C用于SHT30ADC1用于声音传感器TIM2用于超声波测距的微秒计时另外配置几个GPIO用于蜂鸣器、LED和按键。生成代码时选MDK-ARM工具链这样直接打开就能编译。注意CubeMX生成的代码里I2C的默认速率是100kHz如果OLED刷新慢可以调到400kHz。ADC的采样时间要设长一点比如239.5个周期否则声音信号采不准。// 超声波测距的微秒延时函数示例 void delay_us(uint32_t us) { uint32_t start TIM2-CNT; while ((TIM2-CNT - start) us); }上面这段代码利用TIM2的计数器做微秒级延时比空循环准确得多。TIM2配置成1MHz计数频率也就是每微秒计一个数。3.2 多传感器数据融合与任务调度系统跑起来后不能让每个传感器都阻塞式等待。我的做法是用一个时间片轮询结构把不同任务分配到不同的时间间隔执行。任务执行周期说明温湿度采集2秒DHT11需要间隔SHT30可更快声音检测50毫秒ADC采集128点后判断姿态检测100毫秒读MPU6050并计算角度超声波测距200毫秒避免多次反射干扰OLED刷新500毫秒人眼舒适即可蓝牙发送1秒打包所有数据发送按键扫描20毫秒带消抖主循环里用一个全局变量记录系统运行毫秒数每个任务判断是否到达自己的执行时刻。这样结构清晰加新任务也方便。注意DHT11读取时会阻塞约20毫秒这段时间其他任务要等所以DHT11的优先级要安排好或者用定时器中断方式读。数据融合方面我建议做一个简单的状态机。系统有四种状态正常、预警、报警、紧急。每个传感器给出自己的判断结果综合起来决定系统状态。比如温度超标是预警声音超标是报警防爬出触发是紧急。状态切换时OLED和蜂鸣器做出对应反应。3.3 蓝牙通信与手机端数据查看蓝牙用HC-05模块接STM32的USART1。HC-05默认波特率9600配对密码1234。配置时用AT指令改名字和波特率比如ATNAMESmartCribATUART115200,0,0。注意HC-05在未配对时才能进AT模式配对后就是透传模式。STM32这边用串口中断接收手机发来的指令用printf重定向发送数据。发送格式我一般用JSON风格的字符串比如printf({\temp\:%.1f,\humi\:%.1f,\sound\:%d,\dist\:%d}\r\n, temp, humi, sound_flag, distance);手机端装个蓝牙串口助手就能看到实时数据。如果想做得更完整可以用微信小程序或者App Inventor做一个简单界面把数据解析后显示成仪表盘。不过毕设层面串口助手截图放进论文已经足够。提示HC-05的VCC接5V因为模块内部有稳压但它的TX输出是3.3V电平可以直接接STM32的RX。如果接反了或者电压不对模块会发热甚至损坏。3.4 电源管理与低功耗考虑婴儿床系统通常插电使用但毕设答辩时如果要求展示便携性就要考虑电池供电。STM32F103在72MHz全速运行时电流约30到50毫安加上传感器和OLED整体可能到100毫安。用一块2000mAh的锂电池能撑20小时左右。如果要做低功耗可以在不需要采集时让STM32进入Stop模式用RTC定时唤醒。但这样会牺牲实时性声音报警可能延迟。折中方案是降低主频到24MHz关闭不用的外设时钟OLED在无人操作时熄屏。实测下来这样能把电流降到40毫安左右。电源部分要注意锂电池电压在3.7到4.2V之间STM32需要3.3V所以要用LDO稳压比如AMS1117-3.3。电机或继电器如果要用5V得加升压模块。所有电源引脚旁边都要加0.1微法去耦电容否则ADC采集会跳动。4. 常见问题与排查技巧实录4.1 传感器读取失败的排查顺序做这个系统传感器读不出来是最常见的问题。我总结了一个排查顺序按这个来基本能解决九成问题。第一步查供电。用万用表量传感器VCC和GND之间是不是3.3V或5V。很多模块标称3.3V但实际要5V才工作比如某些继电器模块。第二步查接线。I2C的SDA和SCL有没有接反STM32的I2C1默认是PB6和PB7I2C2是PB10和PB11。如果用了软件I2C确认GPIO配置成开漏输出并使能了上拉。第三步查地址。I2C设备都有地址MPU6050默认0x68OLED默认0x78SHT30默认0x44。用I2C扫描程序扫一下总线看能不能找到设备。找不到就是硬件问题找到了但读不出数据就是协议问题。第四步查时序。DHT11和HC-SR04对时序敏感用示波器或者逻辑分析仪看波形最直接。没有仪器的话在代码里加延时打印看卡在哪一步。问题现象可能原因解决方法OLED不亮供电不足或I2C地址错量电压换地址0x78或0x7ADHT11返回全1时序不对或未接上拉数据线加4.7k上拉检查延时MPU6050数据不变I2C未使能或睡眠模式写0x6B寄存器唤醒超声波一直返回0Trig未触发或Echo未接检查10微秒高电平换IO口蓝牙连不上波特率不匹配或未配对恢复默认9600重新配对4.2 程序跑飞与HardFault的定位方法STM32程序跑飞进入HardFault_Handler是新手最头疼的问题。原因通常是数组越界、空指针、栈溢出或者中断优先级冲突。定位方法我常用两个。第一个是在HardFault_Handler里加死循环并点亮一个LED确认是不是真的进了HardFault。然后查看LR寄存器的值判断是从哪里跳过来的。在Keil的Watch窗口里看LR的值如果是0xFFFFFFF9说明用的是MSP0xFFFFFFFD是PSP。第二个是用Keil的Event Recorder或者串口打印在可疑代码前后加打印语句看执行到哪一步跑飞。我遇到过最隐蔽的一次是printf重定向时没开串口时钟一调用就HardFault。预防措施所有数组访问前判断下标指针使用前判空中断服务函数尽量短不要在中断里调用printf或延时。栈大小在启动文件里改默认0x400不够就改0x800。4.3 报警误触发与灵敏度调优报警误触发会让人崩溃尤其是半夜蜂鸣器突然响。调优的核心是加确认时间和加迟滞。声音报警不要一超过阈值就响要连续超过阈值200毫秒才确认。温度报警不要一超过27度就响要超过27度并持续10秒。防爬出不要一进入15厘米就紧急报警先进入预警状态持续3秒还在15厘米内才升级为紧急。迟滞的意思是触发报警的阈值和解除报警的阈值不一样。比如温度超过27度报警但要降到26度以下才解除。这样避免在阈值附近反复触发。另外传感器数据要做滑动平均滤波。比如温度读5次取平均声音读10次取平均。滤波会带来一点延迟但稳定性大幅提升。我一般用中值滤波加均值滤波组合先去掉最大最小值再平均效果很好。4.4 答辩演示的稳定性保障技巧答辩现场演示最怕系统突然死机或者数据乱跳。我分享几个保障技巧。提前一天把系统连续跑8小时记录有没有异常重启。如果有查看门狗有没有开电源是否稳定。演示时用电池供电比用USB供电更稳因为电脑USB口可能有噪声。准备两套代码一套是完整功能版一套是简化演示版。简化版只保留温湿度、声音和OLED显示减少出错概率。如果老师问为什么功能少了就说演示环境限制完整版在论文里有。演示前把所有阈值调到容易触发的值比如温度阈值设成25度用手捂一下传感器就能触发报警。声音阈值调低拍一下手就报警。这样演示效果明显老师一看就懂。最后把关键数据用串口打印到电脑上同时录屏。万一现场OLED坏了还能用串口数据救场。我见过有同学演示时屏幕不亮急得满头汗其实数据都在串口里只是没提前准备。5. 系统扩展与论文写作建议5.1 可以继续深挖的功能方向如果时间充裕这个系统还能往几个方向扩展。加一个电机驱动模块用PWM控制小电机做自动摇床宝宝哭的时候自动摇动。加一个SD卡模块把温湿度和报警记录存成CSV文件方便后续分析。加一个摄像头模块用ESP32-CAM做图像传输手机能看实时画面。加一个空气质量传感器监测甲醛和PM2.5新装修的房子很需要。这些扩展不需要全部做选一两个加到论文里作为“未来工作”或者“系统扩展”答辩时能体现你的思考深度。但注意扩展功能不要影响核心功能的稳定性先把基础版跑通再说。5.2 论文各章节的写作要点论文写作我建议按“需求分析-方案设计-硬件实现-软件实现-测试分析”的结构来。需求分析部分要写清楚你调研了哪些痛点为什么这些功能是必要的。方案设计部分画系统框图说明每个模块选型理由。硬件实现部分给出原理图和PCB没有PCB就画洞洞板接线图。软件实现部分放流程图和关键代码。测试分析部分用表格列出测试数据和误差。关键一点测试数据要真实。不要编数据老师一眼就能看出来。你实际测了温度误差±1度就写±1度不要写±0.1度。误差分析反而能体现你的严谨。5.3 我踩过的坑和最后的小建议最后分享几个我实际踩过的坑。第一DHT11的库函数很多网上版本有bug读出来的湿度一直是0后来发现是延时函数不准换成定时器延时就好了。第二OLED的I2C地址有的模块是0x78有的0x7A买的时候问清楚或者写个扫描程序自动识别。第三HC-05的AT模式要在未配对时进我一开始配对后发AT没反应以为模块坏了后来查手册才知道。还有焊接洞洞板的时候电源线和地线要用粗一点的线信号线可以细。所有模块的GND要共地否则I2C通信会不稳定。调试时先用杜邦线连接确认功能都正常了再焊板子不然焊完发现有问题拆起来很麻烦。这个系统从零到能演示我大概花了两周业余时间。如果你全职做一周应该能出原型。关键是别贪多先把温湿度和OLED显示跑通再一个一个加模块。每加一个模块就测试一次不要全部接完再调那样出了问题根本不知道是哪个模块的锅。