ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

STM32嵌入式实战:鸽舍智能控制系统设计全流程解析

STM32嵌入式实战:鸽舍智能控制系统设计全流程解析 我去年给一位养信鸽的朋友做了套驯养系统核心板子用的就是STM32前后折腾了将近两个月从需求对接到画板、写代码、现场调试最终交付的是一套能定时开关鸽舍门、自动定量喂食、统计鸽子进出数量、记录棚内温湿度的实物外加一整套完整的设计手册。这篇文章就是把整个项目的来龙去脉、选型逻辑、电路设计、代码状态机、实测踩坑和手册整理思路全部拆开来讲文章按一名嵌入式开发者的实操视角来写适合正在做STM32方向课程设计、毕业设计或者单纯想用单片机做一套小型物联网系统的读者参考。1. 养鸽子的人需要什么先把需求账算清楚再立项很多做嵌入式项目的同学一上来就画原理图、写代码做到一半才发现“这个功能其实根本用不上”或者“核心需求被做成了配角”。我在做这套系统之前先跟朋友蹲了一个星期的鸽棚把驯养流程完整看了一遍才敢动手。1.1 驯养场景里的三个核心痛点信鸽驯养不是简单的“把鸽子关笼子里”它有一套固定节奏每天早上开笼放飞、傍晚吹哨唤回、归巢后要记录哪些鸽子回来了、回来多少只、有没有迟迟不回的情况然后还要定量补食、换水。这些事靠人工做一是时间卡得死人必须守在鸽棚二是记录全靠脑子或本子长期下来数据难追溯三是一旦出差或者临时有事整个驯养节奏就乱了。所以系统应该优先解决三件事定时控制鸽舍门开合来配合放飞和归巢按预设时间定量喂食喂水来保证营养节律自动统计进出鸽子的数量并连温度湿度一起上报让人不用天天守在棚里也能掌握情况。1.2 功能表与硬性指标我把系统功能拆成了下面这张表每一条都对应明确的量化指标这些指标后期直接写进设计手册的“性能要求”章节。功能模块实现方式关键指标鸽舍门控制五线四相步进电机驱动卷帘门机构单次开关门时间不超过12秒支持手动/自动切换定时喂食步进电机带动螺旋给料器投料误差控制在±5克支持每天多时段设定进出计数入口红外对射传感器计数误差不大于5%能区分进/出方向环境监测DHT11温湿度传感器、光敏电阻/照度模块温度采集范围0-50℃湿度20%-90%RH数据展示0.96寸OLED屏幕、串口/ESP8266上报本地实时显示云端可查历史趋势应急操作实体按键、遥控切换断电或异常时可按手动开关代替1.3 明确“不做”的部分做项目很容易陷入“什么功能都想加”的怪圈。这套系统里我也明确砍掉了两个方向一是视频识别鸽子个体二是语音控制。原因很直接鸽舍环境复杂光线变化大灰尘多视频识别对主控算力要求高STM32F103C8T6跑起来会很吃力单独上K210或树莓派又会把成本和功耗拉高语音控制在鸽舍嘈杂环境下实用性很低。最终方案只保留一个“以后可以扩展”的口子给主控留了一组USART和一组空闲GPIO后面想接K210做更聪明的个体识别直接串口对接就能跑不需要改动现有电路板。这种“留扩展但不做进去”的思路在实际项目中比堆功能更实用。2. 器件选型主控、传感器、执行机构逐个定下来的过程选型这件事没有绝对的最优只有最合适。我做这套系统时定了几个硬约束满足功能、成本可控、采购容易、资料多好调试。在这个前提下每一项选型都经过了比较。2.1 主控为什么定在STM32F103C8T6如果只是做个能跑的小玩具用51单片机也能勉强应付但一旦涉及步进电机控制、多路传感器采集、定时器输入捕获、定时器产生PWM51的处理能力和外设数量都会很紧张。我最后选的是STM32F103C8T6原因可以列得很直白内核是Cortex-M372MHz主频跑这套逻辑绰绰有余片上带USART、I2C、SPI、ADC、多个定时器几乎不需要外扩芯片生态成熟从标准库到HAL库再到各种开源例程遇到问题搜得到答案价格便宜蓝板子十块钱上下烧了也不心疼3.3V供电整板功耗低适合长期通电运行。有人会问为什么不上ESP32自带WiFi还便宜。我承认ESP32确实方便但项目要求的是“稳定控制”和“现场可维护”ESP32在WiFi协议栈占资源、以及长期在金属鸽棚环境下射频稳定性方面都不如STM32加独立WiFi模块来得清晰可控。最终分工是STM32负责实时控制和本地逻辑通信交给ESP8266两者通过串口通信。如果电源和信号都正常这组方案能长期稳定跑。开发环境我用的STM32CubeMX生成初始化代码加HAL库配合Keil MDK编译下载。网上下载芯片支持包的时候注意跟Keil版本匹配不然安装不上。如果不想用Keil也可以考虑VSCode加PlatformIO或EIDE插件配合J-Link或ST-Link下载这套组合现在也很成熟不过调试习惯不同的人上手成本会略高。2.2 传感器的“够用”与“好用”之争这是最容易纠结的地方。比如温湿度DHT11精度一般DHT22AM2302精度更高但价格贵好几倍。对鸽子驯养这个场景棚内温湿度只要趋势准确、误差不超过2℃和5%RH就够用了所以选DHT11是完全合理的。反过来如果你做的是实验室级别的恒温控制那DHT11肯定不行得换SHT30这类数字传感器。距离检测我用的HC-SR04超声波模块。这套模块在鸽舍里有个天然优势——它对静止的鸽子羽毛、木屑、灰尘没那么敏感比红外更不容易误触。但超声波在狭小空间里容易收到多径反射后面实测阶段我专门做了对策这点放到第5章详细说。进出门计数用的是红外对射传感器E3F-DS30C4这类NPN常开输出穿过门口时红外束被挡一次就产生一个下降沿。它比超声波更适合做计数因为边界非常干净而且响应速度快。光照检测我直接用光敏电阻分压电路接ADC不单独用BH1750数字光照模块。原因只有一个鸽舍只需要区分“天亮/天黑”来辅助判断放飞时间光敏电阻的分辨率已经足够省一个I2C外设就少一条I2C总线上的干扰风险。OLED屏选的是0.96寸、I2C接口的SSD1306显示温湿度、计数、门状态和系统时间。选I2C版本而不是SPI版本是为了省引脚四根线就能搞定显示。传感器/模块接口方式选型理由替代方案DHT11单总线GPIO成本低、够用DHT22/SHT30精度更高HC-SR04GPIO触发输入捕获非接触、抗羽毛干扰红外测距精度更高但怕光干扰红外对射E3F-DS30C4GPIO外部中断边界干净、响应快激光对射成本高光敏电阻电路ADC只需判断明暗BH1750数字量、更精确OLED SSD1306I2C引脚少、显示直观SPI版刷新更快但多占引脚2.3 鸽舍门控制五线四相步进电机 vs 舵机鸽舍门是个既需要力矩又需要位置可控的东西。一开始我朋友提议用大扭矩舵机但我算了一下舵机角度范围一般在180度左右要驱动卷帘门结构得加连杆机构安装精度要求高而且堵转时容易烧舵机。五线四相步进电机配合ULN2003驱动板就简单得多——它转的是圈不是角度通过控制脉冲数量可以精确控制门帘升降高度断电时线圈有一定自锁力不会让门帘自己滑下来。步进电机型号我选了常见的28BYJ-4812V或5V供电都能跑驱动板就是ULN2003。它单步转角大约5.625度四相八拍方式下步距角可以到0.0875度左右配合减速齿轮能做到比较平稳的启停。缺陷是转速不能太高否则会丢步所以开门动作不要图快控制在10到12秒跑完全行程比较稳。2.4 通信和云端ESP8266与巴法云本地显示用OLED就够了但朋友希望在外出时也能看数据所以加了ESP8266模块做串口透传把温湿度和计数数据通过WiFi上报到巴法云手机上看一眼就行。这套方案没有用STM32直接跑TCP协议栈而是让ESP8266用AT指令完成网络连接STM32只负责通过串口发JSON格式的字符串职责分离出问题也好排查。需要提一下的是巴法云这类物联网平台的接入原理都差不多设备通过MQTT或HTTP上报主题数据手机端订阅同一个主题就能收到。ESP8266部分配置好WiFi账号、设备和密钥之后稳定性取决于网络环境鸽舍如果是铁皮棚信号衰减会很严重最好把天线引到棚外或者加一个信号中继。2.5 电源分配容易被低估的坑整个系统里最容易被初学者忽视的就是电源。STM32需要3.3V传感器和步进电机驱动需要5V某些型号的超声波模块还要求5V供电但IO电平可以兼容3.3V我用的HC-SR04是5V供电、回波引脚输出5V高电平直接接STM32是有风险的最好在回波引脚上加一颗10K电阻分压或者用电阻串联限幅。电源树我设计成12V适配器输入一路经DC-DC降压到5V给传感器、OLED、ESP8266、电机驱动板和STM32的5V脚供电另一路经AMS1117-3.3稳压给STM32核心供电。步进电机启动瞬间电流在200mA以上四个相同时通电时峰值可能更高所以要单独用一个大容量电解电容在电机供电处滤波避免瞬间压降导致STM32复位。这个“复位-重启”问题是我实测中遇到的最典型的电源坑后面会专门讲。3. 电路设计从最小系统到实物焊接的关键决策点电路设计这部分我按模块来讲每一块都是画板时真正纠结过的点。3.1 STM32最小系统与启动配置STM32F103C8T6最小系统看起来简单但有几个新手特别容易踩的细节。第一BOOT0引脚必须通过10K电阻下拉到地不然上电可能进入ISP模式程序跑不起来。如果板子预留了BOOT0跳线设计手册里一定要写清楚“跳线短接是烧录模式断开是正常启动模式”。第二8MHz晶振的两个负载电容通常用20pF但实际影响不大我一般都在18pF到22pF之间选取关键是匹配而不是绝对精确。如果不用外部晶振用内部HSI也可以跑但USART波特率会偏移通讯容易乱码所以有串口的项目还是老老实实焊外部晶振。第三复位引脚NRST接10K上拉电阻和100nF电容到地这属于标准套路抄官方最小系统即可不需要发挥。第四关于STM32芯片第一脚怎么确认这个我在实际焊接时反复提醒自己看芯片丝印圆点或凹槽标记一侧是第1脚然后按逆时针方向数不是按顺时针。用贴片封装时如果方向焊反了上电后芯片会发烫基本就废了。焊接完用万用表蜂鸣档量相邻两个电源脚有没有短路这个检查动作必须做不能省。3.2 电源树与去耦电容布局整体电源路径是12V适配器 - DC-DC降压模块LM2596或MP1584输出5V - AMS1117-3.3输出3.3V。画板时要特别注意三点STM32每个电源脚旁边放一个100nF去耦电容尽量贴着芯片引脚放否则高频噪声滤不掉主电源入口放一个470uF的大电解电容稳住电机启动时的瞬时电流模拟地和数字地在STM32的底部单点连接避免传感器信号被电机开关噪声干扰。如果你是在洞洞板上飞线搭电路做不到铺地那就尽量用粗线走电源信号线短、绕开电机线这个经验对稳定运行非常关键。3.3 步进电机驱动电路与隔离步进电机用的ULN2003驱动板是现成的内部是达林顿管阵列输入接STM32的四个GPIO这里我用的PA0、PA1、PA2、PA3输出接电机的四相线。ULN2003输入端最好串一个1K电阻虽然它本身耐压够但串电阻能减少GPIO口电流负载。电机电源不要和STM32共用同一路5V应该由主5V分支供电并且电机地线单独回到电源负端不要跟STM32地线走成一个大环。加光耦隔离不是必须的但我在实际系统里做了。原因是鸽舍环境潮湿电机与门体之间的开关偶合会把一些尖峰脉冲串进主控板。用PC817光耦在STM32 GPIO和ULN2003之间做一次隔离虽然多花几个元件钱但稳定性的提升非常明显。光耦输入侧用STM32的3.3V驱动输出侧用电机电源的5V两边电源不共地这可能是整套系统最值得的投资。3.4 红外对射计数电路和I2C上拉红外对射传感器是NPN常开输出检测到遮挡时输出低电平我把它接到STM32的外部中断引脚PA4上升沿和下降沿都可以作为触发信号再配合第二个对射传感器安装位置一前一后就能判断鸽子是进还是出。这里有个电路细节传感器输出是开漏需要接一个上拉电阻到3.3V否则输出电平不确定。通常我用10K上拉如果线上干扰明显可以降到4.7K。OLED的I2C总线SDA和SCL需要接上拉电阻STM32的I2C外设本身有弱上拉但不够稳定我在板上放了两颗4.7K电阻到3.3V实测波形干净很多。3.5 画板、打样和实物焊接记录PCB我是在Altium Designer里画的画完导出Gerber发给嘉立创打样。板子是双面尺寸大概8cm x 10cm尽量把接口全部引出SWD下载口、串口调试口、传感器接口、电机驱动接口、电源输入口。焊接顺序有讲究先焊电源部分再焊STM32最小系统然后焊传感器接口和OLED接口最后焊电机驱动和光耦。焊完最小系统先别急着焊其他模块先把ST-Link插上试试能不能识别芯片确认芯片活着再继续。这个“分段上电测试”的习惯能帮你把问题隔离在最小范围内避免满板子找故障。焊接时最好用排针加端子座连接传感器模块不要直接焊死因为现场调试时经常要换模块、改方向焊死了就是灾难。4. 软件状态机驯养流程到底是怎么在代码里跑起来的硬件只是骨骼驯养逻辑才是灵魂。我把软件设计成了一套状态机状态之间可以自动切换也可以在必要时被手动按键打断。4.1 基于HAL库的工程搭建工程用STM32CubeMX生成选好芯片后配置时钟树外部8MHz晶振PLL倍频到72MHz。外设初始化涉及GPIO、USART1调试、USART2ESP8266、I2C1OLED、ADC1光照、TIM2PWM/延时、TIM3输入捕获或外部计数、以及若干外部中断。HAL库代码比较啰嗦但胜在逻辑清晰出了问题好查。如果你更习惯标准库也没问题这套项目的逻辑跟库没太大关系只要中断、延时、GPIO读写是同一套约定状态机照样跑。需要注意的只有一点不要混合使用HAL库和标准库的延时函数SysTick会被搞乱。4.2 DHT11和OLED最容易卡住的两段时序DHT11是单总线协议数据脚需要先在GPIO输出模式下拉18ms作为启动信号然后切换为输入模式读取40位数据。每一位的“0”或“1”是靠高电平持续时长区分的26到28微秒左右是070微秒左右是1这个时序对主频要求敏感务必使用微秒级延时函数。如果用HAL库的HAL_Delay它只支持毫秒级而且会占用SysTick中断写DHT11驱动时必须改成自己用定时器实现的delay_us。很多人的DHT11读出来永远是0或者固定值八成就是这里出了问题。正确的思路是// 用TIM2实现us延时以72MHz为例计数器每次递增1就是1us void delay_us(uint32_t us) { __HAL_TIM_SET_COUNTER(htim2, 0); while (__HAL_TIM_GET_COUNTER(htim2) us); }OLED那边我用的是I2CSSD1306芯片的初始化序列是固定的网上例程很多但要注意一点如果用了CubeMX自动生成的I2C初始化不要再手动去配置GPIO开漏否则总线时序会乱。常见的一个问题是用软件I2C读取设备ID得到0xA1A1之类的异常值这个现象我在第5章会详细讲。4.3 超声波测距与红外计数数据处理比传感器本身更重要HC-SR04的驱动逻辑其实不复杂给Trig引脚一个10us以上的高电平模块自动发出8个40kHz超声波脉冲然后Echo引脚输出一个宽度跟距离成正比的高电平。用定时器输入捕获或者直接用HAL_GetTick()测高电平时间距离 时间 × 声速 / 2。但实际用在鸽舍时单一测量数据根本不靠谱鸽子扇动翅膀、风吹动杂物都会产生瞬时跳变。我的处理方法是连续测5次去掉最大值和最小值取中间3次的平均值。同时对“距离突变”做了逻辑限制某次测量值跟前一次相差超过30cm且连续三次都这样才认为状态真的变了否则视为干扰。红外计数相对简单但同样存在抖动问题尤其是鸽子贴着传感器经过时会来回遮挡。我在中断服务函数里加了软件消抖记录触发时间距离上次有效触发小于80ms的脉冲直接忽略。这样计数逻辑就稳了。计数部分如果用定时器输入捕获做频率测量可以把红外脉冲当成外部时钟源的计数信号统计单位时间内脉冲数量来估算鸽子飞行经过的频率这是“STM32定时器捕获测频率”和“STM32定时器模式”这两个热搜点里涉及的核心思路完全可以复用到别的项目里。4.4 五线四相步进电机的八拍控制28BYJ-48步进电机是五线四相也有叫四相五线的ULN2003驱动板上标识为A、B、C、D四相。四相八拍的励磁顺序是A - AB - B - BC - C - CD - D - DA如此循环。我用的驱动代码如下const uint8_t StepTable[8] { 0x08, 0x0C, 0x04, 0x06, 0x02, 0x03, 0x01, 0x09 }; // 对应 OUT1A OUT2B OUT3C OUT4D // 0x081000 D相导通0x0C1100 CD导通依此类推 void Stepper_Run(uint16_t steps, uint8_t direction) { for (uint16_t i 0; i steps; i) { uint8_t idx (direction ? (i % 8) : (7 - (i % 8))); HAL_GPIO_WritePin(MOTOR_A_GPIO_Port, MOTOR_A_Pin, (StepTable[idx] 0x08) ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(MOTOR_B_GPIO_Port, MOTOR_B_Pin, (StepTable[idx] 0x04) ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(MOTOR_C_GPIO_Port, MOTOR_C_Pin, (StepTable[idx] 0x02) ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(MOTOR_D_GPIO_Port, MOTOR_D_Pin, (StepTable[idx] 0x01) ? GPIO_PIN_SET : GPIO_PIN_RESET); delay_us(2000); // 速度约200步/秒太快容易丢步 } }开门时程序先读限位开关如果门不在完全关闭状态就先执行“关门复位”动作再按设定脉冲数开门这样每次门的位置都绝对准确不会因为偶尔的丢步越跑越偏。4.5 驯养状态机把驯养流程翻译成程序逻辑整个系统我设计了6个核心状态STANDBY待机、FEEDING喂食、DOOR_OPEN开门、DOOR_CLOSE关门、COUNT_UPDATE计数更新、UPLOAD上报。状态切换由定时器和中断共同驱动。每天的时间表是预设的比如早晨6:30开门6:35开始喂食傍晚17:30关门17:40再喂一次。到了时间点RTC或定时器触发状态机从STANDBY进入DOOR_OPEN开完门后判断是否需要喂食。每次有鸽子经过红外对射中断服务函数里更新计数变量同时触发COUNT_UPDATE状态刷新OLED显示。异常处理也做了一套如果开门后超过30分钟没有任何鸽子进入说明鸽子可能没回来状态机会在OLED上显示提醒并通过ESP8266发一条消息到手机端。这套逻辑并不复杂但对朋友来说非常实用他说以前只顾着忙别的经常忘了鸽子回没回齐。5. 实测中的故障排查那些让我在鸽棚蹲了半天的坑这部分可能对多数读者最有价值。很多问题不是原理看不懂而是现象诡异。5.1 延时函数卡死SysTick冲突是万恶之源现象是程序运行到某个位置突然“死了”代码逻辑看着没问题最后定位到是延时函数卡死。原因是工程里既用了HAL_Delay()又用了自己基于SysTick或TIM写的delay_ms()两个函数都在操作同一个定时器结果就产生了“你的延时还没走完SysTick中断已经把计数器改了”的冲突。解决方法是统一延时源毫秒级延时统一用HAL_GetTick()做比较微秒级延时单独用一个定时器。这个经验在调试任何STM32项目时都适用先确认你的延时函数是不是唯一入口再检查是不是有中断服务函数里调用了耗时操作。5.2 超声波在鸽舍里疯狂误报HC-SR04在空旷环境测得很准一进鸽舍就乱跳。鸽子在栖架上活动翅膀扇动会产生大量杂波另外鸽舍地面和铁网会对超声波形成多径反射导致测出来忽远忽近。我蹲在现场观察波形发现只要鸽子从传感器前方飞过Echo脚的波形就乱成一团。对策分三层第一把传感器朝向从水平改为略微向下避开正对鸽子的飞行路径第二软件上做中值滤波和连续一致性判断前面代码里已经实现了第三给传感器加了一个半开放式的亚克力挡板让发射和接收的方向性更集中。三层下来误报率基本降到可忽略的程度。这就是“原理上能用”和“现场真正能用”的区别。5.3 OLED或I2C设备读ID读到0xA1A1先查电平再查接线网上关于ILI9341读ID读到0xA1A1的讨论很多实际意思是“总线上的设备没有正常响应主控读到的是漂移电平或空数据”。我的OLED在使用软件I2C时也出现过类似现象刚开始以为屏坏了换了一块还是老样子。最后用逻辑分析仪看波形发现问题出在I2C上拉电阻缺失上。STM32内部的上拉较弱加上杜邦线比较长总线电容偏大SDA和SCL的上升沿变得很缓OLED端的逻辑判断就出错了。解决方法是外加4.7K上拉电阻并且把杜邦线长度控制在20cm以内。如果你遇到任何I2C设备读ID异常不要急着怀疑设备本身先用万用表确认SDA和SCL上有没有稳定的3.3V上拉电平再看地址是否正确最后再用示波器或逻辑分析仪看波形时序。5.4 步进电机丢步和堵转门帘机构有时候会被卡住步进电机还在拼命输出时间长了就会丢步门的实际位置和程序记录的脉冲数对不上。堵转时我测到ULN2003输入端的电流明显偏大但电机不动这就是典型的驱动能力不足或者机构卡死。我的处理是每次开关门动作前先执行“复位找零”程序让门先关到限位开关触发的位置以这个位置为绝对零点再按固定脉冲数走。这样即便某次动作中丢了步下一次动作时也会自动清零误差不会越走越偏。同时给门体机构加装了一个微动限位开关作为程序上的物理保险。5.5 禁用JTAG之后程序烧不进去了调试过程中有段时间为了省引脚我把JTAG功能禁用只留SWD结果后来一次手滑把SWD也禁用或者配置错了芯片直接无法识别ST-Link都连不上。这个坑在聊STM32禁JTAG时是高频话题。解决办法是使用ST-Link的“connect under reset”模式让芯片在复位状态时被强制连接趁程序还没跑起来就把FLASH擦掉。如果手上没有支持这个功能的下载器应急办法是把BOOT0拉高让芯片上电进ISP模式再用串口把FLASH清空。从此之后我养成了一个习惯凡是有调试需求的板子必定保留SWD接口并且代码里绝不轻易禁用SWD引脚。5.6 巴法云上报偶尔断线WiFi模块偶尔会断线服务器连接会掉。STM32如果只发一次连接请求断线后就不会自动恢复。我在代码里加了一个“看门狗式”的重连机制每隔30秒检查一次ESP8266和云端服务器的连接状态发现未连接就自动重新AT握手重新订阅主题。这个思路是所有单片机做物联网上报的通用做法不要假设网络永远稳定要把断线重连当成必须实现的功能而不是可选项。6. 设计手册怎么组织从实物到完整交付的文档经验项目标题里写明了“实物电路设计手册”说明这套系统不是装完就完事的文档同样是交付物。尤其如果是毕业设计设计手册也就是说明书的分数占比往往比实物还高。6.1 手册的整体框架我整理手册时的章节结构是需求分析、总体方案设计、硬件设计、软件设计、系统测试与误差分析、成本估算、总结与展望。每一章都不要写空话比如“系统稳定可靠”这种话要换成“连续运行7天计数误差在3%以内”这种可验证的描述。在总体方案章节里画系统结构图时不要画那种每个模块只是简单连线的框图最好能把数据流向、控制流向、电源流向一并标出来让读者一眼看出系统是“感知-决策-执行-反馈”的闭环。6.2 测试记录与误差分析我实测的数据可以作为参考模板测试项测试条件结果温湿度采集鸽舍内放置对比水银温度计温度误差±1℃湿度误差±4%RH超声波测距距离10cm-200cm每20cm测一次最大误差2cm平均误差1cm以内进出计数人为赶鸽子通过连续10次识别9次漏计1次准确率90%开门时间全行程从关闭到完全打开平均11.6秒重复10次误差小于0.5秒云端上报手机端查看延迟平均延迟1-2秒偶尔丢包后自动重传这份测试表是设计手册最有力的部分因为它的每一行都对应真实实验环境不是从别人论文里抄的。6.3 物料成本与替代空间整套系统的物料成本大概如下物料数量参考单价STM32F103C8T6最小系统板1约10元0.96寸OLEDI2C1约12元DHT11模块1约5元HC-SR04模块1约6元红外对射传感器2约20元ESP8266模块1约10元28BYJ-48ULN20031约15元降压模块、AMS1117、阻容等若干约20元PCB打样5片约25元合计大约120元左右如果把PCB和结构件再压缩还能更低。毕业设计里写明成本构成和替代空间比简单列价格更能体现工程思维。6.4 给想复刻这套系统的人几条建议如果你打算复刻或者改造这个项目我给几条具体的建议先把“需求表”写清楚再动手宁可少做功能也别做出一堆没用的功能电路上电源是大头先把电源调稳再谈传感器10个项目里有6个问题都出在电源上步进电机一定要加限位开关和复位流程没有绝对值位置控制的机械结构都是不合格的超声波和红外这种易受环境干扰的传感器一定要在软件里做滤波不能直接裸读云端上报必须做断线重连这是嵌入式联网的基本素养文档和代码同步更新不要等做完了再补手册否则细节早就忘光了。这套系统的本质是一个“传感器执行器主控通信”的标准物联网架构把鸽舍门换成鱼缸加热棒把红外对射换成水位传感器就变成了智能鱼缸把喂食电机换成台灯调光电路就变成了智能台灯。当初设计时我对朋友说我帮你做的不是一套只能养鸽子的设备而是一个什么都能接的控制盒子。实际上也确实是这么用起来的——后来他又让我把同样的板子改成了鸽舍照明自动控制。个人体会是嵌入式项目里最有价值的部分不是某个器件多贵而是面对复杂环境时你作的那些判断和取舍。希望这篇文章能帮你在自己的项目上少走几个弯路。
返回列表