news 2026/4/15 18:16:26

基于单片机的农田监测系统毕业设计:效率提升与低功耗优化实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于单片机的农田监测系统毕业设计:效率提升与低功耗优化实战


基于单片机的农田监测系统毕业设计:效率提升与低功耗优化实战


1. 背景痛点:轮询式设计的“三高”困境

做毕设时,我最初也走了“经典”老路:主循环里挨个read_sensor(),每隔 5 s 把 5 路传感器全部跑一遍,再用delay_ms()等 LoRa 回包。结果现场跑 3 天,两节 18650 就见底;更尴尬的是,当土壤湿度瞬间跌到 15 % 以下,系统还在delay里睡大觉,错过最佳灌溉窗口。总结下来,传统轮询带来三大硬伤:

  • 功耗高:MCU 与传感器全程“在线”,平均电流 28 mA,电池寿命按周计算
  • 实时性差:最坏情况下 5 s 才采样一次,异常事件响应延迟可高达 5 s+
  • 资源浪费:80 % 的采样值在阈值范围内,却仍旧占用 CPU、Flash 与空口带宽

毕设答辩时,评委一句“你们这套系统,农民伯伯敢用吗?”让我彻底下决心改架构。


2. 技术选型:STM32F103 还是 ESP32?

农田场景没有 220 V,只有 3.7 V 锂电;没有 Wi-Fi,只有 2 km 外的 LoRa 网关。我把两款常用芯片放到同一套功耗测试工装里跑 24 h,数据如下:

指标STM32F103C8T6ESP32-WROOM-32
运行功耗(MCU 主频)4.2 mA@72 MHz68 mA@240 MHz
Deep-sleep 电流1.8 µA(RTC 开)8 µA(ULP 协处理器)
外设资源3×ADC+DMA、低功耗串口8×ADC、Wi-Fi/BT 双模
开发成本核心板 12 元模组 22 元
射频扩展需外挂 SX1278自带 Wi-Fi,LoRa 仍需外挂

结论:农田节点“睡得多、醒得少”,ESP32 的 Wi-Fi 在野外形同虚设,反而拉高底电流;STM32F103 凭借 1.8 µA 的 RTC 休眠,胜出。


3. 核心实现:事件驱动 + 批量上报

3.1 系统框图

3.2 事件驱动架构

  1. 传感器只在“阈值窗口外”才触发中断,唤醒 MCU
  2. RTC 每 30 min 强制唤醒一次,做“心跳包”与电池电压巡检
  3. 唤醒后 DMA 批量采样 16 次,求平均后写入缓存
  4. 缓存满 8 条或异常事件到达,一次性 LoRa 发送 64 B 数据块

3.3 低功耗状态机

  • Sleep:所有外设时钟关,仅保留 RTC 与 GPIO 中断
  • Sample:打开 ADC→DMA→关闭 ADC,全程 < 6 ms
  • Tx:打开 SPI→LoRa→发送→关闭,全程 < 45 ms
  • Return:事件计数器清零,立即回 Sleep

3.4 传感器端防抖

土壤湿度传感器最容易“极化”——长期直流激励,金属探针电解锈蚀。我的做法:

  1. 交流激励:GPIO 推挽输出 1 kHz 方波,隔直电容耦合到探针
  2. ADC 采样在方波上升沿后 50 µs 进行,避开瞬态
  3. 采样完毕立即把 GPIO 置高阻,探针零电位,延长寿命 3×

4. 关键代码片段(基于 HAL 库,Keil5 编译)

以下代码可直接复制到main.c,已去掉头文件与冗余初始化,保留核心逻辑与注释。

/* 低功耗进入函数,调用前需确保所有外设 DeInit */ void Enter_Stop_Mode(void) { /* 清除 RTC 唤醒标志,防止误中断 */ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&hrtc); /* 设置 RTC 30 min 后唤醒 */ HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 30*60-1, RTC_WAKEUPCLOCK_RTCCLK_DIV16); /* 挂起 SysTick,防止滴答干扰电流测试 */ SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; /* 进入 STOP 模式,RTC 仍跑 */ HAL_PWR_EnterSTOPMode(PWR_REGULATOR_LOWPOWER, PWR_STOPENTRY_WFI); /* 醒来后重新配置系统时钟 */ SystemClock_Config(); SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; } /* GPIO 中断回调,土壤湿度低于阈值 */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == GPIO_PIN_0) { BaseType_t xHigherPriorityTaskWoken = pdFALSE; /* 给采样任务发信号 */ xSemaphoreGiveFromISR(xSemaphore, &xHigherPriorityTaskWoken); portYIELD_FROM_ISR(xHigherPriorityTaskWoken); } } /* ADC 采样 + 平均 */ uint16_t ADC_Average(uint32_t Channel) { uint32_t sum = 0; ADC_ChannelConfTypeDef sConfig = {0}; sConfig.Channel = Channel; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; HAL_ADC_ConfigChannel(&hadc1, &sConfig); for(uint8_t i=0; i<16; i++) { HAL_ADC_Start(&hadc1); HAL_ADC_PollForConversion(&hadc1, 1); sum += HAL_ADC_GetValue(&hadc1); HAL_ADC_Stop(&hadc1); } return sum >> 4; } /* LoRa 发送,带幂等序号 */ void LoRa_Send_Packet(uint8_t* buf, uint8_t len) { static uint16_t seq_id = 0; buf[len++] = seq_id >> 8; buf[len++] = seq_id & 0xFF; seq_id++; SX1278_Send(buf, len); /* 等待发送完成中断,超时 300 ms */ if(xSemaphoreTake(xLoRaIq, pdMS_TO_TICKS(300)) != pdTRUE) { /* 超时处理:重新初始化射频,防止死锁 */ SX1278_Reset(); } }

5. 性能测试:数据说话

把整机(含传感器、LoRa 模块)放进恒温箱,串 10 Ω 电阻测电流,结果如下:

  • 休眠平均电流:1.9 µA(温度 25 ℃)
  • 唤醒到 ADC 完成:3.2 ms
  • 唤醒到 LoRa 发送完成:42 ms
  • 连续 30 天运行,无重启、无丢包(心跳包 864 条,接收 864 条)

EMC 方面,电机灌溉泵启动时产生 1 kV 群脉冲,系统曾复位两次。解决措施:

  1. 在电源入口加 600 W TVS(SMBJ6.0A)
  2. 复位脚 1 kΩ 串 100 pF 下地,滤除 50 ns 毛刺
  3. 看门狗改为窗口型,喂狗窗口 50~100 ms,防止极端干扰下“死喂狗”

6. 生产环境避坑指南

  • 电源噪声:便宜 DC-DC 升压模块 3.3 V 输出纹波 120 mV,导致 ADC 跳动 5 LSB。换成 TI TPS63020,纹波 < 10 mV,采样误差回到 ±1 LSB
  • 土壤传感器极化:上文已提,务必交流激励,否则两周后数据漂移 30 %
  • 看门狗误区:STM32 独立看门狗一旦启用,STOP 模式下仍计数,唤醒不及时会误复位。解决:进入休眠前HAL_IWDG_Refresh,或改用 RTC 唤醒代替“死等”
  • LoRa 天线朝向:胶棒天线贴地,通信距离从 2 km 掉到 300 m。抬高 1 m 后,RSSI 提升 18 dB,丢包率 < 1 %
  • 灌封胶选型:某环氧灌封胶 24 h 吸水率 0.3 %,雨季进水短路。改用水性聚氨酯,吸水率 < 0.05 %,成本贵 5 元,但节点寿命翻倍

7. 结语与思考

一套小小的农田节点,把“事件驱动”与“低功耗”做到极致,电池也能跑 180 天。毕设答辩那天,评委老师问:“如果 2 km 外没有 LoRa 网关,怎么让多节点自组网?”——这个问题我至今还在迭代。无网络覆盖区域,能否用 STM32 做时隙中继?或者把节点当简易 MESH 路由器,靠前向纠错+跳频实现多跳?留给你我一起动手复现、验证。把代码拉下来,先让电流表降到 2 µA,再谈网络拓扑,也许下一个更优雅的答案就诞生在你的桌面。


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

探索LangGraph:如何创建一个既智能又可控的航空客服AI

探索LangGraph&#xff1a;如何创建一个既智能又可控的航空客服AI 这种设计既保持了用户控制权&#xff0c;又确保了对话流程的顺畅。但随着工具数量的增加&#xff0c;单一的图结构可能会变得过于复杂。我们将在下一节中解决这个问题。 第三部分的图将类似于下面的示意图&am…

作者头像 李华
网站建设 2026/4/15 8:52:01

必收藏!大模型5大核心概念详解(小白/程序员入门必备)

如今&#xff0c;大模型早已走出科研圈的“象牙塔”&#xff0c;不再是晦涩难懂的专业术语&#xff0c;而是深度融入办公自动化、内容创作、程序开发等多个领域的实用工具&#xff0c;成为程序员提升效率、小白拓展技能的“加分项”。但想要真正用好大模型&#xff0c;甚至入门…

作者头像 李华
网站建设 2026/4/10 17:16:59

74HC138三八译码器在单片机IO扩展中的实战应用

1. 74HC138三八译码器基础入门 第一次接触74HC138时&#xff0c;我完全被这个小小的芯片震撼到了——只用3个IO口就能控制8个设备&#xff0c;这简直是单片机开发者的"作弊器"。记得当时用STC89C52做LED矩阵项目&#xff0c;GPIO口严重不足&#xff0c;正是74HC138帮…

作者头像 李华
网站建设 2026/4/8 18:54:13

仅限头部IoT厂商内部流出的Docker边缘配置模板库(含ARM64/AArch64双架构适配、断网续传、热重启保活)

第一章&#xff1a;Docker边缘配置的核心挑战与架构演进在资源受限、网络不稳、设备异构的边缘环境中&#xff0c;Docker 容器化部署面临远超中心云场景的系统性挑战。传统基于 Docker Daemon 的集中式模型在边缘节点上暴露出显著瓶颈&#xff1a;守护进程内存开销高&#xff0…

作者头像 李华
网站建设 2026/4/10 17:16:58

Chatbot用不了了?从故障诊断到高可用架构实战指南

Chatbot用不了了&#xff1f;从故障诊断到高可用架构实战指南 线上 Chatbot 突然“沉默”时&#xff0c;用户投诉往往先于监控告警到达。本文基于过去两年在电商、金融与 SaaS 场景下的真实故障记录&#xff0c;梳理高频失效模式&#xff0c;给出可落地的诊断与加固方案&#…

作者头像 李华