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/16 14:02:24

java+vue基于springboot框架的自习室预约选座管理系统的设计与实现

目录摘要系统架构核心功能模块技术创新点应用价值开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 基于SpringBoot框架的自习室预约选座管理系统结合了Java后端与Vue前端技术&#xff0c;旨在解决高校或公共自习室座位资源…

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

计算机毕设Java基于移动互联网(android)的流浪动物领养系统的设计与实现 基于移动互联网的流浪宠物收容与领养服务平台构建 Android环境下流浪动物信息管理与爱心领养系统开发

计算机毕设Java基于移动互联网&#xff08;android&#xff09;的流浪动物领养系统的设计与实现3ypbq9 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。自2019年疫情以来&#xf…

作者头像 李华
网站建设 2026/4/16 14:06:19

银行AI智能客服系统如何实现:从架构设计到性能优化的全流程实战

银行AI智能客服系统如何实现&#xff1a;从架构设计到性能优化的全流程实战 面向日均百万级会话的银行场景&#xff0c;本文给出一条“可落地、可扩展、可度量”的 AI 客服实现路径&#xff0c;全部代码与压测数据均来自某股份行生产验证&#xff0c;脱敏后开源。 1. 背景与痛点…

作者头像 李华
网站建设 2026/4/16 12:23:05

基于大模型的智能客服对话系统:效率提升实战与架构优化

背景痛点&#xff1a;规则引擎的“天花板” 做智能客服的同学都懂&#xff0c;早期用正则关键词的“小水管”方案&#xff0c;遇到“超长尾”问题就堵死。 用户一句“我昨天买的那台白色带烘干功能的洗衣机&#xff0c;门封圈发霉了能换货吗&#xff1f;”——实体多、属性多…

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

基于OpenAI API的Chatbot UI搭建实战:从零到生产环境部署

基于OpenAI API的Chatbot UI搭建实战&#xff1a;从零到生产环境部署 1. 传统对话系统到底卡在哪 去年我帮客户做客服机器人&#xff0c;最早用轮询&#xff1a;前端每 3 秒拉一次&#xff0c;结果高峰期 800 并发直接拖垮后端&#xff0c;平均响应 4.7 秒&#xff0c;老板当场…

作者头像 李华
网站建设 2026/4/16 15:25:54

【Dify企业级文档解析配置白皮书】:基于172家客户部署数据验证的4层校验链路设计

第一章&#xff1a;Dify企业级文档解析配置白皮书导论Dify 作为开源低代码 LLM 应用开发平台&#xff0c;其内置的文档解析能力是构建企业级知识库、智能客服与合规审查系统的核心基础设施。本白皮书聚焦于文档解析模块的深度配置策略&#xff0c;面向运维工程师、AI 平台架构师…

作者头像 李华