一、为什么“农田”成了单片机毕设的修罗场
农场看似岁月静好,对电子系统却处处埋雷:
- 220V 交流想都别想,只能靠 12V 铅酸或 18650,电量得按“毫安·时”抠着花。
- 基站离得远,手机信号一格都算奢侈,更别说 4G 满格。
- 传感器往泥里一插,三天后读数飘出 10%,你还以为是算法 bug。
把这三个痛点翻译成毕设语言,就是“功耗”“通信”“精度”三座大山。下文所有决策,都围绕这三点展开。
二、传感器怎么选:精度、价格、功耗“不可能三角”
1. 温湿度——DHT22 vs SHT30
- DHT22 单价 18 元,±2%RH 精度,工作电流 1 mA,胜在例程遍地。
- SHT30 13 元,±1.5%RH,3 µA 待机,I²C 接口漂移更小,预算够直接上。
2. 土壤湿度——YL-69 与电容式对比
- YL-69 电阻式 3 元,ADC 就能读,但电解腐蚀 2 个月报废,适合“交作业”场景。
- 电容式 20 元,4-20 mA 电流环,几乎不腐蚀,长期误差 <3%,要做“真·农场”就选它。
3. 光照——BH1750 与简易光敏
- BH1750 6 µA 休眠,16 位分辨率,直接 I²C 级占口。
- 光敏电阻 0.5 元,只能分档,需要校准,适合“有光/无光”这种粗糙需求。
一句话总结:毕设验收用 DHT22+YL-69 最省钱;真想跑一个季度,SHT30+电容式+BH1750 更稳。
三、通信模块:LoRa 与 NB-IoT 的田间对决
ESP8266 Wi-Fi:
功耗 80 mA,农田没路由,直接 pass。NB-IoT(BC26):
深度休眠 5 µA,市区覆盖无敌,但进村信号 −110 dBm 家常便饭,重发包你 200 mA 瞬间吃掉电池。LoRa SX1278:
发射 120 mA,休眠 1 µA,2 km 视距无压力,网关协议自己写,适合“小范围自组网”。
实测结论:
- 若学校就在郊区,NB 信号 ≥ −95 dBm,可上 NB-IoT,直接连云平台最省事。
- 否则 LoRa 点对点,再让汇聚节点用 4G 回传,功耗和覆盖率能兼得。
四、STM32 低功耗框架:代码怎么写得既稳又省
下面给出一个“Clean Code”最小可运行框架,基于 STM32L051 + HAL,实现“定时唤醒→采样→打包→发送→休眠”循环。
所有外设句柄放main.h,全局宏开关放config.h,中断回调统一放it.c,方便后续移植。
低功耗状态机
用 RTC 唤醒 +STOP模式,1.8 µA,比待机模式省心。config.h里#define SLEEP_INTERVAL_S 600十分钟一次,电量可撑 3 个月(1500 mAh 算)。传感器读数封装
每个传感器一个.c/.h,内部做中位值滤波,返回结构体,调用者无需知道底层是 DHT 还是 SHT。
例:typedef struct { float temp; float humi; uint8_t ok; // 1 成功 0 超时 } DHT22_Result_t; DHT22_Result_t DHT22_Read(void);ADC 采样与校准
土壤湿度用内部 12 位 ADC,先测参考电压VREFINT,再做ratiometric计算,供电掉到 3.0 V 也不飘。数据打包
用 16 字节定长帧:帧头(0xAA) + 节点 ID(2B) + 温度(2B) + 湿度(2B) + 土湿(2B) + 电池电压(2B) + CRC16(2B)。
定长帧方便 LoRa 接收端做“滑窗对齐”,减少粘包。异常重传
发送后 500 ms 内没收到 ACK,计数器 +1,最多 3 次;连续失败 3 个周期,模块断电重启,防止 SX1278 死锁。看门狗 & 断言
独立看门狗 32 s 喂狗,断言失败写入备份寄存器,重启后通过串口打印“死亡记录”,调试用完再关掉。
核心主循环只有 30 行,逻辑却足够毕业答辩老师看懂,也足够现场工程师维护。
五、实测数据:功耗与通信成功率
整机平均电流
休眠 1.8 µA + 唤醒 12 mA×120 ms + LoRa 发射 120 mA×80 ms ≈ 28 µA 均值。
1500 mAh 18650 理论寿命 = 1500/0.028 ≈ 53571 h ≈ 2 年,考虑自放电 20%,也能跑 18 个月。LoRa 通信成功率
500 m 视距,SF9/带宽 500 k,100包成功率 98%;
进田垄后 SF12/带宽 125 k,1000 包成功率 92%,掉包集中在雨后湿度最大时,天线被叶子遮挡。NB-IoT 对比
同位置 RSRP −105 dBm,100 包成功率 89%,单次重发包电流 200 mA,把平均电流抬到 56 µA,寿命腰斩。
数据摆在这,选哪种通信,一目了然。
六、生产级避坑指南:毕设做完还想跑,就得这么干
防雷击
立杆 2 m 铜包钢接地,传感器屏蔽线单点接地,LoRa 天线加气体放电管,雨季 0 损坏。电源滤波
太阳能 + 铅酸组合,面板脉动 1 Hz 会耦合到 ADC,LC π 型滤波 + 100 µF 钽电容,电压纹波 <10 mV。防潮
所有接插件涂 703 硅胶,外壳选 IP67 盒,出线用 PG7 防水头,YL-69 即使电阻膜脱落也不腐蚀主板。版本升级
STM32L051 自带 bootloader,预留 USART1 接口 + 双镜像区,后期可 OTA,但农田没 GPRS,只能人工串口,建议把升级口留到外壳侧面,拧开即可插,维护小哥会感谢你。数据漂移
每 30 天让节点采一次“标准值”——把传感器放进恒温箱,记录偏差,后台线性修正,漂移从 5% 降到 1%。
七、下一步往哪走:多节点组网 & 上云
单点跑通后,自然想“一田一网”。
- LoRa 这边可以上 LoRaWAN,搞 Class A,TTN 免费 10 条/分钟,足够农业。
- 如果学校有 4G 汇聚节点,直接 MQTT 到阿里云,规则引擎写几行 SQL 就能发钉钉报警。
- 节点超过 50 个,考虑分时随机退避,或者 listen-before-talk,自己写简单 CSMA 也能跑。
再往后玩,可以上摄像头做图像识别,把“土壤湿度”和“叶片缺水”两个维度融合,训练个随机森林,灌溉省水 15% 不是问题。毕设只是起点,农田里的代码,大有可为。
把上面的框架抄过去,改改引脚、换换传感器,就能交差;再把功耗和成功率数据往报告里一贴,老师基本不挑刺。等你真把节点插到地里,熬过一场雷雨、一次三伏,就会发现:单片机毕设最酷的地方,不是实验室的 LED 闪烁,而是千里之外,一片叶子因你的代码而更早得到灌溉。