基于STM32与ESP8266的低成本实验室巡检小车设计与实现

发布时间:2026/10/30 3:55:49
基于STM32与ESP8266的低成本实验室巡检小车设计与实现 1. 项目缘起与整体设计思路1.1 为什么选择巡检小车这个方向实验室巡检这件事做过的人都知道有多枯燥。每天晚上十点值班的人要挨个检查温湿度、看看气瓶阀门关没关、确认设备电源状态一圈走下来二十分钟起步遇到刮风下雨还得硬着头皮去。我在实验室待了几年见过太多因为忘记关设备导致第二天跳闸的情况也见过培养箱温度异常一整晚没人发现第二天整批样品报废。这些事逼着我去想能不能用一套低成本的嵌入式方案让小车替人跑这一圈这个项目的核心目标很明确——做一台能自主或半自主移动、能采集环境数据、能把数据回传到上位机的小车。它不需要多高级的SLAM建图也不需要激光雷达就是一台能走、能看、能报的巡检工具。适合谁参考电子类专业做课程设计的学生、刚入行想练手的嵌入式工程师、以及实验室里想搞点自动化改造的技术员。整套方案基于STM32F103C8T6主控加ESP8266无线模块成本控制在两百元以内全部代码和原理图都可以复现。1.2 方案选型的几个关键取舍主控选STM32F103C8T6不是因为它最强而是因为它最稳。这颗Cortex-M3内核的芯片主频72MHz64KB Flash、20KB SRAM对于小车这种需要同时跑电机控制、传感器采集、串口通信的场景绰绰有余。更关键的是它的生态——标准库、HAL库资料铺天盖地最小系统板十几块钱就能买到烧录器用ST-Link或者串口ISP都行。我试过用51单片机做类似项目定时器资源不够用PWM精度也差最后还是换回了STM32。无线通信这块ESP8266是绕不开的选择。它支持802.11 b/g/n可以工作在Station模式连路由器也可以开AP模式让手机直连。价格便宜到离谱十几块钱一个模块AT指令集成熟NonOS SDK开发环境也不算复杂。有人会问为什么不直接用蓝牙蓝牙传输距离太短实验室这种几十米跨度的场景WiFi才是正解。至于电机驱动我用的是L298N双H桥模块虽然效率一般、发热明显但胜在皮实、逻辑简单、支持PWM调速对于巡检小车这种低速场景完全够用。传感器方面DHT11负责温湿度采集虽然精度一般温度±2℃湿度±5%RH但胜在便宜、单总线协议简单、驱动代码网上一抓一大把。如果要更高精度可以换SHT30但成本会翻几倍。显示用LCD1602主要是为了调试方便能实时看到传感器数据和WiFi连接状态正式部署时其实可以省掉。1.3 系统整体架构拆解整个系统分成三层感知层、控制层、通信层。感知层包括DHT11温湿度传感器和红外避障模块负责采集环境和障碍物信息控制层是STM32F103C8T6负责电机PWM调速、传感器数据读取、状态机调度通信层是ESP8266通过UART与STM32通信把数据打包成TCP或MQTT协议发到上位机。供电部分需要特别注意。STM32和ESP8266都要3.3V而电机和L298N需要7-12V。我用的是两节18650锂电池串联7.4V一路直接给L298N供电另一路经过AMS1117-3.3降压给主控和WiFi模块。这里有个坑ESP8266在发射瞬间电流能冲到300mA以上如果降压芯片余量不够会导致STM32复位。我一开始用LM1117带不动后来换成AMS1117加470μF电容才稳住。提示电机电源和主控电源一定要分开走线共地但不共电源否则电机启动瞬间的电压跌落会把单片机拉复位。2. 核心硬件细节与实操要点2.1 STM32F103C8T6最小系统板的关键引脚分配拿到最小系统板第一件事是理清引脚。STM32F103C8T6有48个引脚其中可用GPIO有37个。我的分配方案是这样的PA0-PA3接四个红外避障模块输入PA8、PA9、PA10、PA11分别接L298N的IN1-IN4控制电机正反转PB6、PB7接DHT11的数据线其实只用一根另一根备用PA2、PA3复用为USART2的TX/RX接ESP8266PB0-PB5接LCD1602的数据口。这里要重点说VBAT引脚。很多新手不知道STM32F103C8T6的VBAT引脚引脚1如果不接内部RTC和备份寄存器会工作异常。虽然这个项目没用到RTC但建议还是把VBAT接到3.3V避免莫名其妙的复位问题。另外BOOT0和BOOT1的跳线帽要确认好正常运行时BOOT0接地用串口下载时BOOT0接高电平。PWM输出我用的是TIM3的通道1和通道2PA6、PA7配置成72MHz主频下72分频这样计数频率是1MHz自动重装载值设为1000PWM频率就是1kHz。为什么选1kHz因为L298N的开关频率上限大概在40kHz但低频下电机噪音大高频下开关损耗高1kHz是个折中点实测电机运行平稳且发热可控。2.2 ESP8266的AT指令配置与避坑ESP8266出厂固件默认是AT固件波特率通常是115200。接线很简单VCC接3.3VGND共地TX接STM32的RXRX接STM32的TXCH_PD接3.3V使能。但这里有个经典问题——ESP8266的TX是3.3V电平STM32的RX也是3.3V可以直接连但如果用5V单片机必须加电平转换。配置流程我整理成了一张表方便对照操作步骤AT指令预期返回说明1ATOK测试模块是否响应2ATCWMODE1OK设置为Station模式3ATCWJAPSSID,密码WIFI CONNECTED / OK连接路由器4ATCIPMUX0OK单连接模式5ATCIPSTARTTCP,IP,端口CONNECT / OK建立TCP连接6ATCIPSEND长度进入发送模式7数据内容SEND OK发送数据踩过的坑ATCIPSTART之后如果返回ERROR或者ALREADY CONNECTED说明之前连接没断开要先发ATCIPCLOSE。还有ATRESTORE恢复出厂设置时模块会重启这时候串口会输出一堆乱码然后才返回ready如果程序里死等OK就会卡死。我的做法是恢复出厂后延时3秒再发AT测试连续三次失败才报错。注意ESP8266的供电一定要足建议单独用一个3.3V稳压芯片给它不要和STM32共用一路LDO否则WiFi发射时的电流冲击会让单片机工作不稳定。2.3 DHT11与LCD1602的驱动细节DHT11是单总线协议时序要求比较严格。起始信号是主机拉低至少18ms然后拉高20-40μs接着释放总线。DHT11响应时会拉低80μs再拉高80μs然后开始传输40位数据。每一位数据以50μs低电平开始高电平持续26-28μs表示0持续70μs表示1。我用的是TIM4做微秒级延时因为HAL_Delay只能到毫秒级满足不了DHT11的时序。具体做法是配置TIM4预分频为71计数频率1MHz这样每个计数就是1μs。读取时先关中断避免时序被打断读完再开中断。实测下来如果中断没关WiFi模块的串口中断会插进来导致数据校验失败。LCD1602用4位数据模式只占用4个IO口DB4-DB7加上RS、RW、E三个控制脚一共7根线。初始化顺序不能乱先延时15ms写0x33延时5ms写0x32然后写0x284位模式、2行显示、5x7点阵写0x0C开显示、关光标写0x06光标右移最后写0x01清屏。这个顺序错一步屏幕就不亮或者显示乱码。3. 软件架构与完整实现流程3.1 基于标准库的工程模板搭建在Keil4下建工程我习惯用标准库而不是HAL库原因是标准库代码量小、执行效率高、寄存器操作直观。新建工程的步骤先建一个文件夹结构里面分Start、Library、User、Hardware四个子目录。Start放启动文件startup_stm32f10x_md.s和系统文件Library放STM32F10x_StdPeriph_DriverUser放main.c和stm32f10x_it.cHardware放自己写的电机、DHT11、LCD、ESP8266驱动。关键配置项在Options for Target里C/C选项卡的Define要加USE_STDPERIPH_DRIVER,STM32F10X_MDInclude Paths要把四个目录都加进去。Debug选项卡选ST-Link DebuggerSettings里Flash Download要勾选Reset and Run。如果下载失败检查BOOT0是不是接地了还有ST-Link的SWDIO和SWCLK有没有接反。主程序的状态机设计是这样的系统上电后先初始化时钟、GPIO、定时器、串口、LCD、DHT11然后进入主循环。主循环里每500ms读一次DHT11每100ms检查一次避障传感器每2秒通过ESP8266发一次数据。电机控制采用非阻塞方式用定时器中断产生PWM主循环只负责更新占空比目标值避免用delay卡死整个系统。3.2 电机PWM调速与避障逻辑实现电机调速的核心是TIM3的PWM输出。配置步骤使能TIM3和GPIOA时钟配置PA6、PA7为复用推挽输出TIM3预分频72-1自动重装载1000-1通道1和通道2设为PWM模式1使能输出。占空比通过TIM_SetCompare1和TIM_SetCompare2设置范围0-1000对应0-100%速度。避障逻辑我用的是最简单的触边转向策略四个红外模块分别检测左前、右前、左后、右后。如果左前和右前同时检测到障碍说明正前方有墙后退200ms然后右转300ms如果只有左前检测到说明左边有障碍右转150ms如果只有右前检测到左转150ms。这个策略虽然笨但在实验室走廊这种结构化环境里够用了。实操心得红外避障模块的检测距离受环境光影响很大黑色地面检测距离会缩短到2-3cm白色地面能到15cm。调试时要用实际地面校准电位器别在桌面上调好了直接拿到地上跑。3.3 ESP8266数据回传与上位机对接STM32通过USART2和ESP8266通信波特率115200。发送数据的格式我定义成JSON字符串{temp:25,humi:60,status:normal}。为什么用JSON因为上位机解析方便Python的json库一行代码就能转成字典而且可读性好调试时直接看串口输出就知道数据对不对。发送流程先发ATCIPSEND长度等模块返回然后把JSON字符串发出去等 SEND OK。如果10秒内没收到SEND OK就重发一次连续三次失败就重启ESP8266发ATRST。这里要注意ATCIPSEND的长度是字节数不是字符数中文字符要算3个字节不过我们的JSON里全是英文和数字一个字符一个字节不用纠结。上位机我用Python写了一个简单的TCP服务器监听8080端口收到数据后解析JSON并打印到控制台同时存到CSV文件里。如果要做得更完整可以加个Flask网页实时显示曲线或者接入MQTT服务器实现远程监控。ESP8266接OneNet这类物联网平台也是类似思路把TCP换成MQTT协议用ATMQTT指令集就行。4. 调试过程中的典型问题与排查实录4.1 单片机下载失败与复位异常下载失败是新手遇到最多的问题。现象是Keil里点Download进度条走到一半报Flash Download failed。排查顺序第一检查ST-Link驱动装没装设备管理器里有没有识别到第二检查SWDIO和SWCLK接线这两根线不能太长超过15cm就容易通信失败第三检查BOOT0跳线下载时必须接地第四如果之前程序里把SWD引脚复用成了普通GPIO需要按住复位键再点下载松开复位后程序才能进下载模式。复位异常更隐蔽。现象是电机一启动LCD就花屏或者单片机重启。原因基本是电源问题。我的解决方案是电机电源和主控电源完全分开用两路独立的稳压在STM32的VDD和VSS之间并一个100nF陶瓷电容加一个10μF钽电容ESP8266的VCC和GND之间并一个470μF电解电容。改完之后连续跑了两小时没再复位。4.2 ESP8266连接不稳定的排查思路WiFi连接不稳定表现为有时候能连上路由器有时候连不上连上之后隔几分钟就掉线。排查步骤先发ATCWJAP?查询当前连接状态如果返回No AP说明没连上检查SSID和密码有没有特殊字符如果返回IP地址但很快掉线检查路由器是不是开了AP隔离或者MAC过滤如果模块发热严重检查供电电压是不是低于3.0V。我遇到过一次特别诡异的情况模块能连上路由器但TCP连接总是失败。后来发现是路由器分配的IP和模块之前静态配置的IP冲突了。解决办法是发ATCIPSTA0.0.0.0清除静态IP改用DHCP自动获取。还有一次是ATCIPSTART返回DNS Fail原因是用了域名而不是IP而模块的DNS服务器没配置发ATCIPDNS_CUR114.114.114.114手动指定DNS就好了。4.3 传感器数据跳变与滤波处理DHT11的数据偶尔会跳变比如温度突然从25℃跳到80℃。这是单总线协议在干扰环境下误码导致的。硬件上可以在数据线加一个4.7kΩ上拉电阻线长控制在20cm以内。软件上加滤波连续读三次取中间值如果三次差值超过5℃直接丢弃本次数据沿用上一次的有效值。LCD1602显示乱码通常是初始化时序问题。如果屏幕亮但全是方块检查初始化顺序有没有写错如果屏幕亮但只显示一行检查0x28指令有没有发成功如果屏幕完全不亮调对比度电位器或者检查背光引脚有没有接限流电阻。我习惯在初始化后加一个1秒延时再显示内容给LCD内部电路稳定时间。问题现象可能原因解决方法下载失败BOOT0未接地 / SWD线太长接地BOOT0缩短SWD线电机启动复位电源共地不共电 / 滤波不足分开供电加滤波电容WiFi频繁掉线供电不足 / IP冲突独立3.3V供电改用DHCPDHT11数据跳变干扰 / 上拉不足加4.7k上拉软件滤波LCD显示乱码初始化时序错误严格按顺序写指令5. 项目扩展方向与个人实操体会5.1 从巡检小车到环境监控节点的升级路径这台小车目前只能跑固定路线如果要升级成真正的自主巡检系统有几个方向可以走。第一是加超声波模块做测距配合舵机扫描实现简单的避障建图第二是加MPU6050陀螺仪做航向角积分让小车能走直线而不是跑偏第三是把数据上传到云端用MQTT协议接入物联网平台实现手机远程查看和历史数据回溯。如果实验室面积大还可以考虑多台小车组网。每台小车负责一个区域通过WiFi把数据汇总到一台树莓派或者旧笔记本上做集中处理。这时候STM32的负担就轻了只负责底层运动控制和传感器采集复杂逻辑交给上位机。这种架构在工业巡检机器人里很常见叫边缘采集集中决策。5.2 我在这个项目里踩过的几个坑第一个坑是贪便宜买了劣质18650电池标称3000mAh实际只有800mAh小车跑十分钟就没电。后来换了正规品牌的动力电池续航直接翻倍。第二个坑是L298N的散热片没装连续跑二十分钟后芯片烫到手不能碰PWM输出开始不稳定。加了个小散热片和风扇之后问题解决。第三个坑是ESP8266的固件版本太老不支持ATCIPDNS_CUR指令升级到最新AT固件后才正常。还有一个经验调试阶段一定要把关键日志打到LCD上不要只依赖串口。因为小车跑起来之后串口线拖着很不方便LCD能实时显示当前状态、WiFi连接情况、传感器数值一眼就能看出问题在哪。等调试稳定了再把LCD去掉能省点电。5.3 给后来者的几点实用建议如果你准备动手做这个项目我的建议是分阶段验证。第一阶段只调通STM32最小系统点个灯、串口打印Hello第二阶段加上电机驱动让轮子转起来第三阶段加传感器把数据读到LCD上第四阶段加WiFi把数据发到电脑最后才把所有功能整合到一起。不要一上来就全部焊好写代码出了问题根本不知道是哪部分的锅。元器件采购方面STM32最小系统板建议买带ST-Link接口的版本省得自己接SWD线ESP8266买ESP-01S体积小、引脚少、够用L298N买带光耦隔离的版本能减少电机对主控的干扰。焊接的时候电机线用粗一点的信号线用细的电源线走短线减少压降。最后代码一定要用版本管理我用的Git每次改完能回退比复制粘贴文件夹靠谱多了。这个项目从画原理图到跑通全部功能我大概花了三个周末。第一个周末搭硬件第二个周末写驱动第三个周末调通信和整合。如果你有51单片机基础上手会更快如果只学过Arduino可能需要补一下寄存器操作和中断的概念。但总体来说这是一个非常适合练手的嵌入式项目涉及的知识点覆盖了GPIO、定时器、PWM、UART、单总线协议、状态机设计做完之后对单片机的理解会上一个台阶。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询