news 2026/9/24 23:46:17

基于STM32的智能婴儿床毕设:硬件设计、软件实现与避坑指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于STM32的智能婴儿床毕设:硬件设计、软件实现与避坑指南

1. 项目缘起与整体设计思路

1.1 为什么选智能婴儿床作为毕设题目

每年到了毕设选题季,电子信息、自动化、计算机相关专业的学生都会面临同一个灵魂拷问:做什么题目既有技术含量,又能顺利通过答辩,还能在简历上写一笔?我带了几年毕设,也帮不少学弟学妹看过方案,说实话,智能婴儿床这个题目属于那种“看起来简单、做起来有深度、答辩时老师也挑不出大毛病”的类型。

它的核心逻辑很清晰:用STM32做主控,采集婴儿床内的温度、湿度、声音、是否尿湿等信息,再通过显示屏或者手机端把状态反馈给家长,同时具备自动安抚、异常报警等功能。这个题目覆盖了传感器采集、数据处理、人机交互、电机控制、无线通信等多个模块,正好把大学四年学的东西串起来。而且它有一个天然优势——应用场景明确,答辩老师一听就懂,不需要你花十分钟解释“我这个东西到底有什么用”。

从技术栈来看,STM32F103系列是毕设里最稳妥的选择。原因很简单:资料多、教程全、价格便宜、性能足够。你不需要上H7或者F4,F103C8T6或者RCT6就能把整个系统跑起来。外设方面,温湿度用DHT11或者SHT30,声音检测用驻极体麦克风加放大电路,尿湿检测用简单的电极式传感器,显示用OLED或者TFT屏,电机用减速直流电机或者舵机做摇床功能,报警用蜂鸣器和LED,无线通信用蓝牙或者WiFi模块。整套BOM成本控制在两百块以内,对学生党非常友好。

1.2 系统整体架构怎么搭

我在做方案设计的时候,习惯先把系统拆成“感知层—控制层—执行层—交互层”四块,这样画框图的时候思路不会乱。

感知层负责采集环境数据和婴儿状态。温度湿度用DHT11就够了,精度±2℃、±5%RH,对婴儿床场景完全够用,没必要上SHT30那种高精度传感器,多花几十块钱答辩也不会加分。声音检测我用的是驻极体麦克风加LM358放大,输出模拟量给STM32的ADC,通过阈值判断婴儿是否在哭。尿湿检测用两片铜箔做电极,利用尿液导电的原理,通过比较器输出高低电平。这里要注意,电极不能直接通直流电,否则会电解尿液产生异味,最好用交流信号或者脉冲方式检测,这个坑后面会细说。

控制层就是STM32最小系统,负责跑主循环、处理中断、驱动外设。我选的是STM32F103RCT6,64引脚、256KB Flash、48KB RAM,资源绰绰有余。时钟树配置到72MHz,ADC、定时器、USART、I2C、SPI全部用上,正好把STM32的常用外设练一遍。

执行层包括摇床电机和报警模块。摇床用SG90舵机或者28BYJ-48步进电机都行,舵机便宜、驱动简单,但噪音稍大;步进电机安静、扭矩大,但需要驱动模块。我最后选了步进电机加ULN2003驱动板,因为婴儿睡觉的环境对噪音很敏感,舵机那种“吱吱”声反而会吵醒孩子。报警模块就是蜂鸣器加LED,蜂鸣器用有源的无源都行,有源的直接给电平就响,无源的可以用PWM调音调。

交互层包括OLED显示屏和手机端。OLED用0.96寸I2C接口的,显示温度、湿度、状态信息,刷新率不用太高,1秒一次就行。手机端我用的是HC-05蓝牙模块,配合手机APP显示数据和控制摇床开关。这里有个小技巧:HC-05默认波特率是9600,但STM32的USART配置要跟它匹配,否则收到的全是乱码。

1.3 方案选型背后的取舍逻辑

很多同学做毕设喜欢堆模块,觉得功能越多越好,其实答辩老师更看重的是“每个功能都讲得清楚”。我在方案设计阶段砍掉了几个花哨但不实用的功能,比如摄像头监控、语音识别、自动喂奶。摄像头需要跑图像处理,STM32F103根本扛不住;语音识别模块价格贵,识别率还低;自动喂奶涉及机械结构,容易出故障。把这些砍掉之后,系统稳定性大幅提升,答辩时也能把每个模块的原理讲透。

另一个取舍是通信方式。蓝牙和WiFi我都试过,蓝牙配对快、功耗低、手机APP开发简单,但传输距离短;WiFi可以远程查看,但需要配网,答辩现场网络环境复杂,容易翻车。最后我选了蓝牙作为主通信方式,同时在代码里预留了WiFi接口,答辩时如果老师问“能不能远程监控”,我可以回答“硬件上预留了ESP8266接口,软件上封装了通信层,替换模块只需要改几行代码”。这样既展示了扩展性,又不用承担现场演示的风险。

2. 硬件电路设计与关键细节

2.1 主控最小系统与电源管理

STM32F103RCT6的最小系统包括晶振电路、复位电路、启动模式选择、电源滤波。晶振用8MHz无源晶振加两个22pF电容,复位电路用10K上拉电阻加100nF电容,启动模式BOOT0和BOOT1都接地,从Flash启动。这些是标准电路,照着画就行,但有几个细节容易出错。

电源部分我用的是AMS1117-3.3,输入5V输出3.3V。这里要注意,AMS1117的压差大概是1.1V,所以输入不能低于4.4V,否则输出不稳。锂电池供电的话,3.7V直接输入是不够的,需要升压到5V再降压到3.3V,或者直接用低压差稳压器。我在板子上留了两种供电接口:Micro USB和DC插座,方便调试和演示。

滤波电容的布局很关键。我在每个电源引脚旁边都放了100nF陶瓷电容,在电源入口放了10uF钽电容和100uF电解电容。实测下来,不加这些电容的话,ADC采样值会跳得很厉害,尤其是电机启动的瞬间,电压波动能到几百毫伏。加了滤波之后,ADC波动控制在±2个LSB以内。

2.2 传感器电路的设计要点

DHT11的电路很简单,数据线接STM32的GPIO,加上4.7K上拉电阻就行。但DHT11的时序要求很严格,启动信号要拉低至少18ms,然后释放,等待DHT11响应。我在代码里用微秒级延时实现,但要注意,如果系统里开了中断,延时可能会被打断,导致读取失败。解决办法是在读取DHT11的时候关中断,读完再开。实测下来,关中断的时间大概5ms,对系统实时性影响可以忽略。

声音检测电路我用的是驻极体麦克风加两级放大。第一级用LM358做同相放大,增益100倍;第二级做半波整流和滤波,输出包络信号给ADC。这里有个坑:LM358的带宽只有1MHz,放大100倍之后带宽只剩10kHz,对于音频信号来说勉强够用,但高频成分会衰减。如果要求不高,可以用LM358;如果要求高,换成NE5532或者TL072,效果会好很多。

尿湿检测电路我改了三版。第一版直接用两个电极加比较器,结果电极很快被腐蚀,而且尿液电解产生异味。第二版改用交流信号,用NE555产生1kHz方波,通过电极加到比较器上,这样电极上没有直流分量,腐蚀问题解决了。第三版在电极表面镀了一层金,虽然成本高了点,但稳定性大幅提升。如果只是做毕设,第二版方案就够用了,NE555加LM393比较器,成本不到五块钱。

2.3 电机驱动与报警电路

步进电机我用的是28BYJ-48,5V供电,四相八拍驱动。ULN2003驱动板自带续流二极管,直接接STM32的四个GPIO就行。这里要注意,步进电机的启动频率不能太高,否则会失步。28BYJ-48的启动频率大概是500Hz,加速到1000Hz需要逐步提速。我在代码里做了梯形加减速,启动时频率从200Hz慢慢加到800Hz,停止时反过来。实测下来,摇床动作很平滑,噪音也小。

蜂鸣器电路我用的是S8050三极管驱动,基极接STM32的GPIO,集电极接蜂鸣器,发射极接地。这里要注意,蜂鸣器是感性负载,关断时会产生反向电动势,需要在蜂鸣器两端并联一个续流二极管,否则三极管容易被击穿。我一开始没加二极管,结果调试的时候烧了两个三极管,后来加上1N4148就好了。

LED指示灯我用的是共阳极接法,三个LED分别表示电源、报警、通信状态。限流电阻用1K,电流大概3mA,亮度足够,也不会太刺眼。这里有个小技巧:LED的限流电阻不要用太小,否则STM32的GPIO输出电流有限,多个LED同时亮的时候电压会被拉低,导致亮度不均。

3. 软件架构与核心代码实现

3.1 主程序框架与任务调度

STM32的裸机程序一般用前后台架构,主循环里轮询任务,中断里处理紧急事件。我在主循环里放了四个任务:传感器采集、数据处理、显示刷新、通信处理。每个任务用一个软件定时器控制执行周期,传感器采集100ms一次,数据处理200ms一次,显示刷新500ms一次,通信处理50ms一次。

这种架构的优点是简单、可靠,不需要RTOS。缺点是任务多了之后,主循环的周期会变长,实时性下降。我实测下来,四个任务跑一遍大概20ms,完全满足需求。如果任务再多,建议上FreeRTOS,但毕设阶段没必要,裸机足够。

中断方面,我用到了SysTick、USART、EXTI。SysTick做系统时基,1ms一次;USART接收中断处理蓝牙数据;EXTI处理按键和尿湿检测的边沿触发。这里要注意,中断服务函数里不要做耗时操作,比如DHT11读取、OLED刷新,这些都要放到主循环里。我见过有同学在中断里调用DHT11读取函数,结果系统直接卡死,因为DHT11的延时是阻塞式的,中断里阻塞会导致其他中断无法响应。

3.2 传感器数据采集与滤波

DHT11的读取代码网上很多,但质量参差不齐。我推荐用状态机的方式实现,不要用阻塞式延时。状态机的好处是不占用CPU,可以在等待DHT11响应的时候去处理其他任务。具体实现是:先发启动信号,然后切换到等待响应状态,检测到响应信号后切换到接收数据状态,接收完40位数据后校验,校验通过则更新温湿度值。

ADC采样声音信号的时候,我用了滑动平均滤波。每次采16个点,去掉最大值和最小值,剩下的求平均。这样做的目的是抑制突发噪声,比如电机启动时的电压波动。实测下来,滤波之后的声音包络很平滑,阈值判断也很稳定。

尿湿检测我用的是中断方式,比较器输出接EXTI,上升沿触发。中断里置一个标志位,主循环检测到标志位后启动一个计时器,如果持续高电平超过5秒,就判定为尿湿。为什么要延时5秒?因为婴儿动一下也可能导致电极短暂导通,延时可以避免误报。

3.3 蓝牙通信协议设计

蓝牙通信我用的是自定义的简单协议,数据帧格式是:帧头(0xAA 0x55)+ 命令字(1字节)+ 数据长度(1字节)+ 数据(N字节)+ 校验和(1字节)。命令字包括:0x01查询状态、0x02控制摇床、0x03设置阈值、0x04报警通知。

校验和用累加和取低8位,简单但够用。这里要注意,蓝牙模块的接收缓冲区有限,如果数据帧太长,可能会被截断。我把数据长度限制在32字节以内,实测下来很稳定。

手机APP我用的是MIT App Inventor,拖拽式开发,不需要写Android代码。APP界面包括:温度显示、湿度显示、状态显示、摇床开关、阈值设置。蓝牙连接用列表选择器,配对之后自动连接。这里有个坑:MIT App Inventor的蓝牙组件在Android 12以上版本需要动态申请权限,否则扫描不到设备。解决办法是在APP启动时申请BLUETOOTH_SCAN和BLUETOOTH_CONNECT权限。

3.4 摇床电机控制算法

步进电机的控制我用的是定时器PWM加梯形加减速。具体实现是:用TIM3产生PWM波,频率决定步进电机的速度;用TIM4做定时中断,每1ms更新一次速度值。加速阶段,速度从200Hz线性增加到800Hz,用时500ms;匀速阶段,保持800Hz;减速阶段,从800Hz线性降到200Hz,用时500ms。

这里要注意,步进电机的步距角是5.625度,减速比是1:64,所以转一圈需要4096步。摇床的摆动角度大概是30度,对应341步。如果速度是800Hz,走完341步需要0.43秒,加上加减速时间,一个摆动周期大概1.5秒。这个频率对婴儿来说比较舒适,太快会晕,太慢没效果。

代码实现上,我用了一个状态机:空闲、加速、匀速、减速。每次启动摇床,状态机从空闲切换到加速,加速完成后切换到匀速,匀速完成后切换到减速,减速完成后回到空闲。状态切换在定时中断里完成,主循环只需要设置目标状态就行。

4. 调试过程与常见问题排查

4.1 程序烧录与调试环境搭建

Keil5的安装是个老生常谈的问题,但每年都有同学卡在这一步。Keil5默认只装了ARM的编译器,如果要同时开发51和STM32,需要安装C51和MDK两个包,然后手动合并。具体操作是:先装C51,再装MDK,装的时候选择同一个安装目录,这样Keil5就能同时识别51和STM32的工程。

STM32的芯片包用Pack Installer安装,打开Keil5,点Pack Installer图标,搜索STM32F1,找到Keil::STM32F1xx_DFP,点Install。如果下载速度慢,可以去官网手动下载.pack文件,双击安装。这里要注意,芯片包的版本要和Keil5的版本匹配,太新的芯片包可能不支持老版本的Keil5。

ST-Link的驱动安装也很关键。我遇到过好几次“STM32无法识别USB设备”的问题,最后发现是ST-Link的驱动没装好。解决办法是:去ST官网下载ST-Link Utility,安装的时候会自动装驱动;如果还不行,去设备管理器里手动更新驱动,选择ST-Link的安装目录。

4.2 常见硬件问题与排查方法

调试阶段遇到的问题,我整理了一个速查表,方便大家快速定位。

现象可能原因排查方法解决方案
程序下载失败ST-Link连接不良检查SWDIO、SWCLK、GND、3.3V四根线重新插拔,换根USB线
程序下载失败芯片被写保护用ST-Link Utility连接,看能否读到芯片ID解除写保护,全片擦除
OLED不亮I2C地址错误用逻辑分析仪抓I2C波形修改地址,0x78或0x7A
DHT11读数失败时序不对示波器看数据线波形调整延时,关中断
电机不转驱动板供电不足万用表测驱动板电压单独给驱动板供电
蓝牙连不上波特率不匹配串口助手看收到的数据统一波特率为9600
ADC采样跳动电源纹波大示波器看3.3V电源加滤波电容,远离电机
蜂鸣器不响三极管烧了万用表测三极管be结换三极管,加续流二极管

这个表里的问题我都实际遇到过,尤其是DHT11时序和ADC采样跳动,折腾了我好几天。DHT11的问题最后发现是中断干扰,关中断之后一次都没失败过。ADC的问题加了100uF电解电容之后,波动从±20LSB降到了±2LSB。

4.3 软件调试技巧与经验分享

软件调试我主要用三种手段:串口打印、LED指示、逻辑分析仪。串口打印最常用,但要注意,printf函数默认用的是半主机模式,需要重定向fputc才能输出到串口。重定向的代码很简单:

int fputc(int ch, FILE *f) { while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); USART_SendData(USART1, (uint8_t)ch); return ch; }

LED指示用于快速判断程序跑到哪一步。我在主循环的每个任务前后都加了LED翻转,用示波器看LED的波形,就能知道每个任务的执行时间。如果某个任务执行时间过长,就需要优化。

逻辑分析仪是排查通信问题的利器。I2C、SPI、USART的波形都能抓,配合协议解码,一眼就能看出问题。我用的是一款几十块钱的8通道逻辑分析仪,配合开源软件PulseView,够用了。

这里分享一个我踩过的坑:STM32的USART在初始化的时候,如果GPIO没有配置成复用推挽输出,TX引脚是不会有波形的。我一开始只配置了USART的寄存器,忘了配GPIO,结果串口助手什么都收不到。后来查了参考手册才发现,USART的TX引脚需要配置成复用推挽输出,RX引脚配置成浮空输入或上拉输入。

4.4 答辩演示的注意事项

答辩演示是毕设的最后一关,也是最容易翻车的一关。我总结了几条经验:

第一,提前一天去答辩教室测试设备。教室的电源、桌子高度、光线条件都跟实验室不一样,提前测试可以避免现场手忙脚乱。

第二,准备两套演示方案。一套是完整功能演示,一套是简化版演示。如果现场设备出问题,立刻切换到简化版,保证答辩能继续进行。

第三,演示的时候不要只盯着屏幕,要一边操作一边讲解。比如摇床启动的时候,可以说“现在步进电机开始加速,大家可以听到噪音很小,这是因为我们用了梯形加减速算法”。

第四,提前准备好常见问题的答案。老师可能会问“为什么选STM32不选51”、“蓝牙和WiFi有什么区别”、“系统功耗是多少”,这些问题都要提前想好怎么回答。

第五,带一个插线板和一根长USB线。答辩教室的插座可能离桌子很远,没有插线板的话设备没法供电。

5. 功能扩展与进阶方向

5.1 从蓝牙升级到WiFi远程监控

蓝牙的局限是传输距离短,一般10米左右,隔一堵墙就断了。如果想做远程监控,可以换成ESP8266或者ESP32。ESP8266支持WiFi,可以连接路由器,通过MQTT协议把数据上传到云平台,手机在任何地方都能查看。

硬件上,ESP8266和STM32通过USART通信,STM32把数据打包发给ESP8266,ESP8266负责联网和上传。软件上,ESP8266跑AT指令固件,STM32发AT指令控制它。这里要注意,AT指令的响应时间不确定,不能阻塞等待,要用状态机的方式处理。

云平台我用的是EMQX,开源的MQTT服务器,可以自己搭建,也可以用公共的。手机端用MQTT客户端APP,订阅主题就能收到数据。这套方案的成本比蓝牙高不了多少,但功能强很多,答辩的时候也是个加分项。

5.2 加入OTA升级功能

OTA升级是嵌入式系统的进阶功能,可以让设备在不拆机的情况下更新固件。STM32的OTA一般有两种方案:一种是双区备份,Bootloader和APP分开,Bootloader负责接收新固件并写入APP区;另一种是单区升级,Bootloader直接覆盖APP区。

双区备份更安全,但需要两倍的Flash空间。STM32F103RCT6有256KB Flash,分128KB给Bootloader,128KB给APP,够用了。Bootloader的代码不复杂,主要是接收数据、擦除Flash、写入Flash、跳转到APP。这里要注意,跳转之前要关中断、设置堆栈指针、设置向量表偏移。

OTA的通信协议我用的是YModem,支持断点续传和CRC校验,比自定义协议可靠。上位机用SecureCRT或者Xshell,通过串口发送固件文件。实测下来,128KB的固件大概30秒传完,速度可以接受。

5.3 数据存储与历史曲线

如果想记录婴儿的睡眠数据,可以加一个TF卡模块,把温湿度、声音、尿湿状态按时间戳存成CSV文件。TF卡用SPI接口,FatFS文件系统,STM32有现成的移植教程。

存储格式我建议用CSV,方便用Excel打开分析。每行一条记录,格式是:时间戳,温度,湿度,声音,尿湿状态。时间戳用RTC提供,STM32F103有内置RTC,加一个32.768kHz晶振就能走时。

这里有个坑:TF卡的写入速度有限,如果写入频率太高,会丢数据。我实测下来,SPI模式下的TF卡,写入速度大概100KB/s,每秒写一条记录完全够用。但如果要存音频数据,就需要用SDIO模式,速度能到几MB/s。

5.4 低功耗设计与电池供电

如果想让婴儿床脱离电源线,就需要做低功耗设计。STM32F103的低功耗模式有Sleep、Stop、Standby三种。Sleep模式功耗大概10mA,Stop模式大概20uA,Standby模式大概2uA。

传感器和显示屏是耗电大户。DHT11工作电流1mA,OLED工作电流20mA,蓝牙模块工作电流40mA。如果一直开着,电池撑不了多久。解决办法是间歇工作:传感器每10秒采一次,采完就关;OLED平时熄屏,按键唤醒;蓝牙平时休眠,手机连接时唤醒。

电池我用的是18650锂电池,容量2600mAh,3.7V。加一个升压模块到5V,再降压到3.3V。实测下来,间歇工作模式下,续航大概3天。如果每天只用几个小时,续航能到一周。

6. 个人实操心得与避坑建议

做完毕设之后,我最大的感受是:硬件项目跟纯软件项目完全不一样,软件出bug可以改,硬件出问题可能要重新打板。所以我在设计阶段就留了很多余量,比如电源芯片选大一号的,接口多留几个,调试焊盘多放几个。这些余量在调试阶段救了我好几次。

另一个感受是,不要迷信网上的代码。DHT11的驱动代码我换了三个版本才找到稳定的,步进电机的加减速算法也是自己重新写的。网上的代码可以参考,但一定要自己理解、自己调试。答辩的时候老师问“这段代码为什么这么写”,如果你答不上来,那就很尴尬了。

还有一点,文档和代码要同步整理。我见过很多同学,代码写完了,文档拖到最后一周才写,结果发现很多细节记不清了,只能瞎编。我的做法是每天写调试日志,记录遇到的问题和解决方法,最后整理文档的时候直接复制粘贴,效率高很多。

最后分享一个答辩小技巧:PPT上不要放太多文字,多用框图、流程图、实物照片。老师看PPT的时间很短,文字多了反而抓不住重点。把系统框图、电路原理图、实物照片放上去,配合你的讲解,效果比大段文字好得多。实物演示的时候,提前把设备调到最佳状态,比如OLED亮度调高、蜂鸣器音量调大、摇床速度调慢,让老师看得清楚、听得明白。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/24 23:45:23

免费API接口实用清单:从数据查询到AI大模型的调用与避坑指南

做开发这些年,我手机备忘录里一直躺着一个分组,名字就叫“API接口收藏”。里面塞满了各种免费接口的地址、文档链接和备用 Key,写脚本缺数据了翻一翻,做 demo 少功能了找一找,可以说是我的隐形工具箱。今天这篇就把我筛…

作者头像 李华
网站建设 2026/9/24 23:43:56

Win11彻底卸载McAfee:禁用、清理与残留删除全攻略

相信不少朋友升到 Windows 11 之后,都碰上过同一个问题——刚到手的新电脑或重装完系统,桌面上莫名其妙就住着个 McAfee。平时不弹窗的时候你几乎忘了它存在,可一旦系统里装了别的软件,或者你下载了个破解补丁、注册机之类的东西&…

作者头像 李华
网站建设 2026/9/24 23:42:28

Python3 + OpenCV 眼球追踪实战:从 Haar 级联到瞳孔定位

简介:基于Python3与OpenCV实现的实时眼球追踪项目源码包,面向计算机视觉入门者、人机交互及生物识别方向的开发者,可用于快速构建通过眼部运动控制界面的原型应用。资源共62个文件,以9个py源码文件为核心,完整覆盖摄像…

作者头像 李华
网站建设 2026/9/24 23:42:22

模型预测算法在混合储能微电网双层能量管理系统中的Matlab实现

微电网仿真做到一定程度,大家都会碰到同一个尴尬:蓄电池容量明明够,但功率波动一上来,母线电压还是被拉得很难看;超级电容响应快,但容量小、成本高,不可能单独扛。把两者组合成混合储能&#xf…

作者头像 李华
网站建设 2026/9/24 23:41:12

Windows图标转换:从PNG到专业.ico的完整指南

1. 项目概述:一张图到.ico文件,到底在解决什么问题?“怎么把图片转换成ico图标文件?”——这句提问背后藏着的,不是单纯的技术操作,而是一整套Windows生态下的视觉一致性需求。我做桌面应用开发、系统工具打…

作者头像 李华
网站建设 2026/9/24 23:40:54

Java后端用LangChain4j与LangGraph4j搭建RAG知识库实战

先说结论:Java后端团队想把大模型能力接进自己的业务系统,想做企业知识库问答,没必要全部押注在Python生态上。LangChain4j到目前为止已经能覆盖文档解析、切块、向量化存储、检索增强生成这条完整链路,再配合LangGraph4j做流程编…

作者头像 李华