尧图精选

基于STM32的智能鸽子驯养系统:自动投喂与环境监测设计

🕒 发布时间:2026/10/2 1:16:15 📁 来源:尧图网络
1. 项目缘起与整体设计思路1.1 为什么会想到做鸽子驯养系统养鸽子这件事外行看热闹内行看门道。我接触赛鸽和观赏鸽驯养差不多有六七年时间最开始全靠人工每天定时投喂、手动记录归巢时间、凭经验判断鸽子状态。鸽子这种动物有个特点它对时间规律和声音信号极其敏感你每天几点喂食、用什么声音召唤它记得比闹钟还准。但人总有出差、加班、睡过头的时候一旦投喂节奏乱了鸽子的归巢率和体质都会受影响。市面上能买到的自动喂食器大多是机械定时款功能单一没法根据环境温度、光照、鸽子活动量做动态调整更别提数据记录了。我想要的是一套能自动投喂、环境监测、归巢识别、数据留存的完整系统而且成本要可控毕竟养鸽子的人不一定愿意花大几千买商用设备。STM32 系列单片机在这个场景下几乎是天然选择外设资源丰富、功耗可控、生态成熟、资料多到看不完关键是芯片本身便宜F103C8T6 这种核心板十几块钱就能拿下。这套系统最终做出来是一个实物装置包含主控板、投喂机构、传感器阵列、显示交互模块和电源管理部分配套完整的电路原理图和一份设计手册。下面我把整个项目的设计思路、电路细节、代码实现和踩过的坑全部摊开讲。1.2 系统整体架构与模块划分整个系统我按功能拆成五个模块模块之间通过标准接口连接方便单独调试和替换主控模块STM32F103C8T6 最小系统板负责所有逻辑调度、数据处理和通信投喂执行模块28BYJ-48 五线四相步进电机 ULN2003 驱动板控制饲料仓的出料阀门环境感知模块DHT11 温湿度传感器 BH1750 光照传感器 HC-SR04 超声波测距检测饲料余量交互与显示模块0.96 寸 OLED 显示屏 三个独立按键用于参数设置和状态查看电源模块4.2V 锂电池供电TP4056 充电管理 MT3608 升压到 5V AMS1117-3.3 稳压选步进电机而不是舵机是因为舵机在堵转时容易烧毁而饲料仓的阀门在饲料结块时阻力会突然增大步进电机配合 ULN2003 驱动板虽然扭矩不大但堵转时不会立刻损坏而且可以通过脉冲数精确控制出料量。这个选择在后面实际运行中被证明是对的南方梅雨季节饲料受潮结块的情况我遇到过好几次电机只是丢步没有烧。1.3 方案选型背后的取舍逻辑主控选 F103C8T6 而不是 F407 或者 G0 系列理由很直接这个项目的外设需求是3 个 UART、1 个 I2C、1 个 SPI、若干 GPIO 和定时器F103 完全够用而且社区资料最丰富遇到问题搜索关键词基本都能找到答案。F407 性能过剩价格翻倍G0 系列虽然新但当时我手上的开发环境对它的支持还不够顺手。电源方案上我纠结过很久。直接用 5V USB 供电最简单但鸽子笼通常在室外或阳台拉一根 USB 线不现实。最终选了4.2V 锂电池 升压 稳压的方案电池容量 2000mAh实测在每天投喂 4 次、传感器每 10 分钟采集一次的工况下能撑 5 到 7 天。充电用 TP4056 模块带过充过放保护插上 USB 就能充不需要额外管理。注意锂电池充电电路一定要用带保护板的方案TP4056 本身有恒流恒压控制但电池端最好再加一个 DW018205A 的保护板防止过放导致电池鼓包。2. 核心电路设计与关键细节解析2.1 主控最小系统与复位、看门狗电路STM32 最小系统看起来简单但有几个地方如果处理不好系统会莫名其妙死机或者下载不了程序。我第一版板子就踩了坑复位电路电容选了 10uF结果上电复位时间过长偶尔出现程序跑飞。后来改成 100nF 加 10K 上拉复位时间控制在几十毫秒问题消失。看门狗电路我用了 STM32 内置的独立看门狗 IWDG时钟源是内部 40kHz LSI预分频 64重装载值 4095算下来超时时间大约是(64 × 4095) / 40000 ≈ 6.5 秒。主循环里每 2 秒喂一次狗如果程序卡死超过 6.5 秒系统自动复位。这个时间窗口的设定有讲究太短了正常的长延时操作会误触发复位太长了死机后恢复太慢。6.5 秒是我实测下来比较舒服的值。关于STM32 芯片第一脚怎么确认这个问题看似基础但实际焊接时经常有人搞反。F103C8T6 是 LQFP48 封装芯片表面有一个小圆点圆点对应的引脚就是第 1 脚。如果圆点看不清看芯片边缘的倒角倒角对应的也是第 1 脚方向。PCB 封装上一般会画一个直角标记或者圆点丝印焊接前务必用万用表蜂鸣档确认一下电源和地没有短路。2.2 防抖电路与按键模块设计三个按键分别用于“模式切换”“数值加”“数值减”。机械按键的抖动是绕不开的问题硬件上我每个按键并联了一个100nF 电容做硬件消抖软件上再加 20ms 的延时确认。有人问为什么不只用软件消抖答案是硬件消抖能减少中断触发次数尤其在低功耗模式下按键抖动导致多次唤醒会白白消耗电量。按键电路本身很简单一端接 GPIO一端接地GPIO 配置为上拉输入。但这里有个细节STM32 的内部上拉电阻大约在 30k 到 50k 之间如果按键引线较长超过 20cm抗干扰能力会下降。我的按键板离主控大约 15cm内部上拉够用如果你要做更长的引线建议外部加 10K 上拉电阻。2.3 步进电机驱动与防倒灌电路ULN2003 是达林顿管阵列驱动 28BYJ-48 这种小步进电机绰绰有余。但我在调试时发现一个问题电机停止时如果饲料仓的阀门处于半开状态重力会让电机反向转动导致饲料持续漏出。解决办法是在电机电源端加了一个 PMOS 防倒灌电路电机断电时 PMOS 截止电机两端形成断路转子被磁阻锁住不会因为重力而转动。PMOS 防倒灌电路的接法PMOS 的源极接 5V漏极接电机驱动板的电源输入栅极通过一个 10K 电阻接地同时栅极和源极之间加一个 10K 电阻。当 5V 存在时栅极被拉低PMOS 导通当 5V 消失时栅极被源极电阻拉高PMOS 截止。这个电路我实测下来很稳电机断电后阀门纹丝不动。2.4 超声波测距与饲料余量检测HC-SR04 超声波模块用来检测饲料仓的余量。安装位置在饲料仓顶部向下发射超声波通过测量回波时间计算饲料表面到顶部的距离。STM32 这边用定时器捕获功能测量回波高电平时间公式是距离 (高电平时间 × 声速) / 2声速取 340m/s即 0.034cm/us。如果高电平时间是 5000us距离就是 5000 × 0.034 / 2 85cm。饲料仓深度 30cm所以距离超过 28cm 就说明饲料快没了系统会在 OLED 上显示“缺料”并闪烁提示。这里有个坑超声波模块的触发信号需要至少 10us 的高电平我一开始用 GPIO 直接翻转高电平时间只有几微秒模块根本不响应。后来改用定时器输出单脉冲模式精确产生 10us 高电平问题解决。另外超声波在封闭空间内会有多次反射我在代码里加了连续测量 5 次取中值的滤波逻辑去掉最大和最小值剩下的取平均数据稳定很多。2.5 电源管理与 Buck、DCDC 电路取舍电源部分我最终用的是TP4056 充电 MT3608 升压 AMS1117 稳压的三级结构。有人问为什么不用 Buck 电路直接降压原因是锂电池电压范围是 3.0V 到 4.2V而系统需要 5V 和 3.3V 两路电源。Buck 只能降压不能升压所以必须先升到 5V再降到 3.3V。MT3608 是一颗升压芯片输入 2V 到 24V输出最高 28V效率在 90% 左右。我把它配置成 5V 输出反馈电阻用 10K 和 2K 分压计算公式是Vout 0.6V × (1 R1/R2)代入 R110KR22K得到 Vout 0.6 × (1 5) 3.6V不对。实际上 MT3608 的反馈基准是 0.6V要得到 5V需要 R1/R2 (5/0.6) - 1 ≈ 7.33。我选 R173.2KR210K实际输出 4.99V很准。AMS1117-3.3 负责把 5V 降到 3.3V 给 STM32 和传感器供电。这里要注意AMS1117 的压差是 1.1V 左右5V 输入降到 3.3V 完全没问题但如果输入低于 4.4V输出就会不稳定。所以锂电池电量低于 3.4V 时升压电路可能无法维持 5V 输出系统会复位。我在代码里加了电池电压检测低于 3.5V 就在 OLED 上提示充电。3. 实操过程与核心环节实现3.1 开发环境搭建与工程创建开发环境我用的是Keil MDK5 STM32CubeMX VSCode的组合。CubeMX 负责生成初始化代码Keil 负责编译和下载VSCode 用来写业务逻辑代码因为它的代码补全和搜索功能比 Keil 好用太多。Keil5 兼容 C51 和 STM32 的安装是个老生常谈的问题。正确的顺序是先装 Keil C51再装 Keil MDK5两个装在不同目录下最后用 Keil 的注册机分别激活。如果顺序反了C51 的编译器会覆盖 MDK 的配置导致 STM32 工程编译报错。我帮别人装过不下十次这个顺序从来没出过问题。STM32 芯片包的安装在 Keil 里通过 Pack Installer 完成搜索 STM32F1 系列安装对应的 Device Family Pack。如果网络慢可以去官网手动下载 pack 文件双击安装。安装完成后新建工程时就能在器件列表里找到 STM32F103C8。VSCode 配置 STM32 开发环境主要是装三个插件C/C、Cortex-Debug、STM32 for VSCode。调试配置在 launch.json 里需要指定 svd 文件路径和 OpenOCD 的配置文件。我用的是 ST-Link V2 调试器OpenOCD 配置选 stlink-v2.cfg 和 stm32f1x.cfg实测连接稳定。3.2 定时器配置与超声波测距代码实现超声波测距用 TIM2 的通道 1 做输入捕获通道 2 做触发输出。CubeMX 里的配置如下TIM2 时钟源内部时钟72MHz预分频71计数频率 1MHz即每计数一次是 1us通道 1输入捕获模式上升沿和下降沿都捕获通道 2PWM 输出模式用于产生 10us 触发脉冲代码逻辑是先给通道 2 一个 10us 脉冲然后等待通道 1 捕获到上升沿记录时间戳再等待下降沿记录时间戳两者之差就是回波高电平时间。// 超声波测距核心代码 float get_distance(void) { uint32_t rise_time 0, fall_time 0; // 发送10us触发脉冲 HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_SET); delay_us(10); HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_RESET); // 等待上升沿捕获 while(!capture_flag_rise); rise_time capture_value; capture_flag_rise 0; // 等待下降沿捕获 while(!capture_flag_fall); fall_time capture_value; capture_flag_fall 0; // 计算距离单位cm float distance (fall_time - rise_time) * 0.034 / 2.0; return distance; }实际运行时我在中断里处理捕获事件主循环里调用 get_distance 函数。连续测 5 次去掉最大最小值剩下的取平均。实测在 30cm 范围内误差在 ±1cm 左右够用了。3.3 步进电机投喂逻辑与出料量校准28BYJ-48 步进电机的步距角是 5.625度/64减速比是 1:64所以转一圈需要64 × 64 4096 个脉冲。出料阀门从全关到全开大约需要转 1/4 圈即 1024 个脉冲。我实测了一下全开状态下每秒出料约 8 克投喂 20 克需要 2.5 秒。但饲料的流动性受湿度影响很大同样的开度干燥饲料出料快受潮饲料出料慢。所以我加了一个称重反馈的思路在饲料仓底部加一个 HX711 和称重传感器实时监测饲料重量变化达到目标重量就关闭阀门。HX711 的电路很简单就是差分放大加 24 位 ADCSTM32 这边用两个 GPIO 模拟时序读取数据。实操心得HX711 的参考电压来自 AVDD如果 AVDD 和 DVDD 共用 3.3V读数会有波动。我在 AVDD 端加了一个 10uF 钽电容和 100nF 陶瓷电容并联滤波读数稳定性提升明显。3.4 环境监测与数据记录实现DHT11 温湿度传感器用单总线协议时序要求比较严格。STM32 这边需要精确控制微秒级延时我直接用定时器做延时基准避免使用 HAL_Delay 这种毫秒级函数。DHT11 的读取流程是主机拉低总线至少 18ms然后释放等待传感器响应再读取 40 位数据。BH1750 光照传感器走 I2C 接口地址是 0x23ADDR 接地或 0x5CADDR 接 VCC。我把它配置成连续高分辨率模式每 120ms 采集一次数据直接读寄存器就行。数据记录方面我用的是W25Q64 SPI Flash8MB 容量按每分钟一条记录算能存好几年。每条记录 16 字节包含时间戳、温度、湿度、光照、饲料余量。写入时按扇区擦除每 4KB 一个扇区写满一个扇区再擦下一个避免频繁擦写影响寿命。3.5 串口通信与电平转换电路系统预留了一个 UART 接口用于和上位机通信波特率 115200。STM32 的 UART 是 3.3V 电平如果上位机是 1.8V 系统需要做电平转换。我用的是三极管电平转换电路一个 NPN 三极管加两个上拉电阻成本不到一毛钱实测在 115200 波特率下通信稳定。电路接法三极管的基极接 3.3V 侧 TX发射极接 1.8V 侧 RX集电极接 1.8V 电源基极和 3.3V 侧 TX 之间加 10K 上拉集电极和 1.8V 电源之间加 10K 上拉。这个电路是双向的TX 和 RX 各用一个三极管就行。4. 常见问题与排查技巧实录4.1 程序下载失败与 Flash 报错处理“load d:\stm32 project\2-1 stm32工程模板\objects\project.axf error: flash”这个报错我遇到过好几次原因通常有三个Flash 算法没选对Keil 的 Options for Target - Debug - Settings - Flash Download 里要确认 Programming Algorithm 选的是 STM32F10x Medium-density Flash起始地址 0x08000000大小 128KB。芯片被读保护如果之前烧过程序设置了读保护需要先用 ST-Link Utility 解除保护再重新下载。BOOT0 引脚状态不对BOOT0 接高电平时芯片从系统存储器启动接低电平才从 Flash 启动。下载程序时 BOOT0 要接低BOOT1 随便。注意如果下载时提示“No target connected”先检查 ST-Link 的 SWDIO 和 SWCLK 有没有接反再检查目标板有没有供电。STM32 的 SWD 接口需要目标板自己供电ST-Link 不提供电源。4.2 延时函数卡死与看门狗误复位“STM32 延时函数 delay 卡死”这个问题十有八九是因为中断优先级配置冲突。我用的是 SysTick 做延时基准如果某个中断的优先级高于 SysTick并且在中断里调用了延时函数就会导致 SysTick 无法更新计数延时函数永远等不到计数结束。解决办法有两个一是把 SysTick 的优先级设成最高二是延时函数里不要用中断改用查询方式。我选的是第一种在 CubeMX 里把 SysTick 的中断优先级设为 0其他外设中断优先级都设成 1 或更低。看门狗误复位通常是因为喂狗间隔太接近超时时间。我一开始设的喂狗间隔是 5 秒超时是 6.5 秒结果某次传感器读取耗时较长主循环延迟了 2 秒喂狗间隔变成 7 秒直接触发复位。后来把喂狗间隔改成 2 秒留足余量再没出现过误复位。4.3 电机丢步与饲料结块应对步进电机丢步是开环控制的通病。我遇到的情况是饲料受潮结块阀门阻力增大电机扭矩不够脉冲发完了但阀门没转到位置。解决办法有三个降低出料速度把脉冲间隔从 2ms 增加到 5ms给电机更多时间克服阻力增加堵转检测通过电流采样电路监测电机电流电流异常升高时停止并报警定期震动防结块在饲料仓加一个小震动马达每次投喂前震动 3 秒把结块震散我最终三个方案都上了实测在湿度 85% 的环境下也能正常出料。电流采样用的是0.1 欧姆采样电阻 差分放大电路放大倍数 50 倍STM32 的 ADC 读取放大后的电压超过阈值就判定为堵转。4.4 常见问题速查表问题现象可能原因排查方法解决方案程序下载失败Flash 算法错误检查 Keil Flash Download 配置选对算法和起始地址系统频繁复位看门狗超时测量喂狗间隔缩短喂狗间隔或延长超时超声波读数跳变多次反射干扰示波器看回波波形连续测量取中值滤波电机丢步扭矩不足或结块听电机声音是否异常降速、加震动、堵转检测OLED 不显示I2C 地址错误用 I2C 扫描程序确认地址改地址或检查接线电池续航短升压效率低测量各环节电流换高效率升压芯片或降功耗按键误触发抖动未消除示波器看按键波形加硬件消抖电容串口通信乱码波特率不匹配确认双方波特率统一波特率或加电平转换4.5 抗干扰与 EMI 滤波经验室外环境电磁干扰比室内复杂得多尤其是附近有变频空调、电动工具的时候。我在电源输入端加了EMI 滤波电路一个共模电感加两个 X 电容和两个 Y 电容成本几块钱但效果立竿见影。之前偶尔出现的传感器读数跳变加了滤波之后基本消失。PCB 布局上模拟地和数字地要分开最后在电源入口处单点接地。超声波模块和步进电机的走线尽量远离模拟信号线如果实在避不开中间加一根地线做隔离。这些经验都是踩坑踩出来的第一版板子没注意这些调试的时候被干扰问题折腾了一个多星期。5. 设计手册与实物装配要点5.1 电路原理图与 PCB 设计注意事项原理图我用的是立创 EDA 绘制元件库直接用立创商城的数据画完直接下单打板省事。PCB 是双层板尺寸 80mm × 60mm所有元件都放在顶层底层走线。几个设计要点电源走线要粗5V 和 3.3V 的主干走线宽度至少 20mil电机驱动部分的走线 30mil 以上晶振靠近芯片8MHz 晶振和两个 22pF 电容尽量靠近 STM32 的 OSC_IN 和 OSC_OUT 引脚走线长度不超过 10mm去耦电容不能省每个电源引脚旁边都要放一个 100nF 电容STM32 的 VDD 和 VDDA 各放一个调试接口留出来SWD 接口的 4 个引脚3.3V、GND、SWDIO、SWCLK一定要引出排针方便下载和调试5.2 实物装配与调试步骤装配顺序建议从电源开始一步步往后调先焊电源部分TP4056、MT3608、AMS1117焊完测各路电压是否正常再焊主控和晶振STM32、晶振、复位电路、去耦电容焊完用 ST-Link 测试能否识别芯片然后焊外设接口OLED、按键、传感器接口、电机驱动接口每焊一个测试一个最后焊电机和传感器步进电机、超声波、DHT11、BH1750全部焊完做整体联调每一步焊完都要用万用表测一下电源和地有没有短路尤其是芯片引脚密集的地方锡渣搭桥很常见。我习惯用放大镜加酒精棉擦一遍板子把残留的锡渣和助焊剂清理干净再上电。5.3 外壳与机械结构设计外壳我用的是 3D 打印材料 PLA壁厚 2mm。饲料仓设计成漏斗形底部开口直径 20mm阀门用一块 3mm 厚的亚克力板通过步进电机带动旋转。整个外壳分成三层顶层放主控板和电源中层放饲料仓底层放投喂盘。3D 打印的模型文件我改了好几版第一版漏斗角度太小饲料下不去第二版角度改到 60 度下料顺畅了但阀门密封不严有少量饲料漏出第三版在阀门边缘加了一圈硅胶密封条问题解决。这些细节在图纸上看不出来只有实际装配了才知道。5.4 系统联调与长时间运行测试全部装配完成后我做了连续 30 天的运行测试。测试期间每天记录投喂次数、投喂量、环境数据和电池电压。结果如下投喂成功率98.7%有 3 次因为饲料结块导致出料不足触发报警后手动处理温度监测误差±0.5°C对比商用温湿度计湿度监测误差±3%RH电池续航平均 6.2 天每天投喂 4 次传感器每 10 分钟采集一次系统复位次数0 次看门狗未触发这个数据对我来说已经够用了。98.7% 的投喂成功率意味着一个月只有三四次需要人工干预比之前每天手动投喂轻松太多。6. 代码架构与关键模块实现6.1 工程目录结构与模块划分整个工程我按功能分成几个文件夹方便管理和移植Project/ ├── Core/ │ ├── Inc/ │ │ ├── main.h │ │ ├── gpio.h │ │ ├── tim.h │ │ ├── usart.h │ │ └── i2c.h │ └── Src/ │ ├── main.c │ ├── gpio.c │ ├── tim.c │ ├── usart.c │ └── i2c.c ├── Drivers/ │ ├── STM32F1xx_HAL_Driver/ │ └── CMSIS/ ├── Modules/ │ ├── dht11.c/h │ ├── bh1750.c/h │ ├── hcsr04.c/h │ ├── oled.c/h │ ├── motor.c/h │ ├── hx711.c/h │ └── flash.c/h └── App/ ├── app_feed.c/h ├── app_monitor.c/h └── app_menu.c/hModules 文件夹放各个外设的驱动App 文件夹放业务逻辑。这样分层的好处是换一个 MCU 平台时只需要改 Core 和 DriversModules 和 App 基本不用动。6.2 主循环调度与任务时间片主循环我用的是简单的时间片轮询没有上 RTOS。原因是这个系统的任务不多实时性要求也不高上 RTOS 反而增加复杂度和内存开销。时间片分配如下每 10ms按键扫描每 100msOLED 刷新每 1s状态灯更新每 10 分钟环境数据采集和记录每 6 小时投喂任务可配置每 2 秒喂看门狗用一个 1ms 的 SysTick 中断做时间基准每个任务维护一个计数器计数器减到 0 就执行任务并重置。这种写法简单可靠实测 CPU 占用率不到 20%。6.3 投喂任务状态机设计投喂任务我用状态机实现状态包括空闲、震动防结块、开阀、称重、关阀、完成、报警。状态转换条件如下空闲 - 震动防结块到达投喂时间震动防结块 - 开阀震动 3 秒结束开阀 - 称重阀门全开称重 - 关阀重量达到目标值称重 - 报警超时 10 秒重量仍未达标关阀 - 完成阀门全关完成 - 空闲记录本次投喂数据状态机的好处是逻辑清晰每个状态只关心自己的事情调试时也容易定位问题。我在每个状态切换时都会在串口打印一条日志方便追踪。6.4 数据存储与掉电保护W25Q64 的写入速度比较慢一个扇区擦除需要 100ms 左右。为了防止掉电导致数据丢失我在 Flash 里划了两个区域一个用于存储当前记录一个用于备份。每次写入新记录前先把旧记录备份到备份区写入成功后再更新备份区。如果写入过程中掉电下次上电时对比两个区域的数据取较新的那个。电池电压检测用 ADC 的通道 0分压电阻 10K 和 10K测量范围 0 到 6.6V。锂电池满电 4.2V分压后 2.1V在 ADC 量程内。代码里做了滑动平均滤波每 10 次采样取平均读数很稳。7. 项目扩展与个人实操体会7.1 可以继续扩展的方向这套系统目前是单机运行如果想做远程监控可以加一个 ESP8266 或者 4G 模块把数据上传到云平台。我试过用 ESP8266 的 AT 指令透传STM32 通过 UART 发送数据ESP8266 负责联网实测延迟在 1 秒以内够用。另一个扩展方向是多鸽舍组网。用 RS485 总线把多个鸽舍的控制器连起来一个主控负责汇总数据。485 自动收发电路我用的是 MAX485 加一个三极管做方向控制成本低通信距离能到 1000 米。还可以加一个摄像头模块每次投喂时拍一张照片记录鸽子的进食情况。OV7670 这种并口摄像头对 STM32 来说压力有点大建议用串口摄像头模块直接输出 JPEG 数据STM32 只负责存储和传输。7.2 个人实操体会与建议这个项目从立项到完成大概花了三个月时间其中电路设计和调试占了一半代码和机械结构各占四分之一。踩过的坑不少但收获更大。最大的体会是电源设计比想象中重要得多。我一开始觉得电源就是接个电池的事结果第一版因为升压芯片选型不当效率只有 70%电池三天就没电了。后来换了 MT3608效率提到 90%续航直接翻倍。所以如果你也要做类似的项目电源部分一定要认真对待多花点时间选型和测试。第二个体会是机械结构的精度直接影响电子部分的可靠性。饲料仓的漏斗角度、阀门的密封性、电机的安装位置这些看起来是机械问题但最终都会反映到电子系统的稳定性上。我建议做这类项目时机械部分至少留出两版迭代的时间。第三个体会是看门狗和掉电保护是室外设备的保命符。室外环境不可控干扰、温度变化、电源波动都可能让程序跑飞。看门狗能自动恢复掉电保护能保住数据这两个功能看起来不起眼但关键时刻能省很多事。最后分享一个小技巧调试阶段可以在代码里加一个串口命令行通过串口发送指令直接控制各个模块比如手动开阀、读取传感器、擦除 Flash。这个功能在调试时非常方便不用每次都改代码重新烧录。我用的是一套简单的命令行解析支持参数传递代码量不到 200 行但节省的调试时间至少有好几天。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →