1. 系统整体设计与硬件选型

大家好,今天我来分享一个完整的STM32智慧农业灌溉系统的实战经验。这个项目是我去年带学生做毕业设计时实际完成的,从硬件选型到云端可视化全部走通,中间踩过不少坑,也积累了很多实用技巧。

先说说为什么要做这样一个系统。传统的农业灌溉往往依赖人工经验,不仅费时费力,还容易造成水资源浪费。现在通过STM32主控芯片加上WiFi模块,我们可以轻松实现土壤湿度的自动监测和远程控制,农民朋友在手机上就能查看田间数据,一键浇水,特别适合大棚种植、花园灌溉等场景。

整个系统的核心架构分为三层:底层是STM32主控板加上各种传感器,中间通过WiFi模块连接网络,上层是云端可视化界面。我选择STM32F103RCT6作为主控芯片,因为它性能稳定,外设丰富,价格也很亲民,特别适合学生项目和中小型物联网应用。

传感器部分我用了这些模块:

  • 土壤湿度传感器:检测土壤含水量
  • DHT11温湿度传感器:监测环境温湿度
  • 光照传感器:测量光照强度
  • 继电器模块:控制水泵开关

这些传感器都是市面上常见的模块,价格不贵而且容易买到。整个硬件成本控制在200元以内,非常适合毕业设计或者个人DIY项目。

WiFi模块我选用ESP8266,这款模块性价比极高,支持AT指令控制,只需要四根线就能和STM32连接,串口通信特别简单。最重要的是它自带TCP/IP协议栈,处理网络通信非常方便,不需要在STM32上实现复杂的网络协议。

2. 硬件电路设计与连接

硬件连接是整个项目的基础,如果这里没做好,后面的软件调试会很痛苦。我建议先在面包板上搭建整个系统,测试通过后再制作PCB板。

先来看STM32最小系统的搭建。除了基本的电源电路、复位电路和时钟电路外,特别注意要在VDD和GND之间加上0.1uF的去耦电容,每个电源引脚最好都加一个,这样可以有效减少电源噪声。我在第一次调试时就因为没加足够的去耦电容,ADC采集的数据总是跳变,折腾了好久才发现问题。

传感器连接方面,土壤湿度传感器使用ADC接口,我选择PA1引脚,因为这是STM32的ADC1通道1,采集精度足够。DHT11是单总线协议,连接在PA2引脚。光照传感器同样使用ADC,接在PA3引脚。这些模拟传感器都要注意走线尽量短,远离数字信号线,避免相互干扰。

ESP8266 WiFi模块的连接很简单,只需要四根线:

  • VCC接3.3V
  • GND接GND
  • TX接STM32的PA3(USART2_RX)
  • RX接STM32的PA2(USART2_TX)

注意一定要接3.3V电平,ESP8266不兼容5V,如果接错会烧毁模块,这个坑我踩过,损失了一个模块。最好在TX和RX线上加100欧姆的限流电阻,起到保护作用。

继电器模块用来控制水泵,我选用5V继电器,通过一个NPN三极管驱动。STM32的IO口输出电流有限,直接驱动继电器可能不够,加上三极管放大电流就很稳定了。继电器的控制引脚接在PA4,注意要在继电器线圈两端反并联一个续流二极管,防止关断时产生的反向电动势损坏电路。

电源部分很重要,整个系统需要5V和3.3V两种电压。我建议使用AMS1117-3.3稳压芯片,输入5V输出3.3V,最大输出电流可达1A,足够带动所有模块。如果使用电池供电,最好加上低压报警功能,当电压低于3.6V时发出警告,防止系统突然断电。

3. STM32软件设计与实现

软件部分我使用Keil MDK开发环境,用标准库函数进行开发。先来搭建工程框架,包括系统时钟配置、外设初始化和中断设置。

首先配置系统时钟,我使用外部8MHz晶振,通过PLL倍频到72MHz,这是STM32F103的最高工作频率,性能足够应对数据采集和处理需求。注意要先使能时钟再配置外设,这个顺序很重要,很多初学者会忘记。

ADC配置是关键,因为要采集多个传感器的模拟量。我使用DMA方式采集ADC数据,这样不占用CPU时间。配置ADC为连续转换模式,采样周期设置为239.5个周期,这样转换精度更高。为了减少电源噪声的影响,我软件上做了移动平均滤波,采集10次数据取平均值,效果很好。

DHT11温湿度传感器的驱动需要特别注意时序。这个传感器对时序要求很严格,每次读取数据前要先发送开始信号,拉低总线18ms后再拉高20-40us,然后等待传感器响应。我在调试时发现,如果时序偏差太大,读取的数据全是0。最好用示波器查看波形,确保时序准确。

ESP8266的AT指令控制是整个项目的难点。我专门写了一个AT指令解析模块,包含发送和接收缓冲区。每次发送指令后等待模块回复"OK"或"ERROR",如果超时没有回复就重发。特别要注意的是,AT指令需要以"\r\n"结尾,很多初学者忘记加回车换行,导致指令无法识别。

网络通信我采用TCP长连接方式,STM32作为TCP客户端连接云服务器。为了保持连接稳定,我设置了心跳包机制,每30秒发送一个心跳包,如果连续3次没有收到回复就重新连接。这样即使网络波动断开,也能自动重连,保证系统稳定性。

数据采集和控制的主循环这样设计:每秒钟采集一次传感器数据,每分钟上传一次数据到云端,土壤湿度每5秒检测一次,如果低于阈值就启动灌溉。为了防止水泵频繁启停,我设置了最小间隔时间,每次灌溉至少持续10秒,停止后至少等待30秒再次检测。

4. 云端可视化界面开发

云端界面我选择用B/S架构开发,使用HTML5 + CSS3 + JavaScript前端技术,后端用Node.js,数据库用MySQL。这样开发的优点是跨平台,在电脑和手机上都能访问,不需要安装额外软件。

先设计数据库表结构,主要包含三张表:

  • 设备表:存储STM32设备信息
  • 传感器数据表:存储温湿度、土壤湿度等历史数据
  • 控制指令表:存储用户下发的控制命令

每张表都包含时间戳字段,方便按时间查询数据。为了优化查询速度,我在时间字段上加了索引,这样即使存储大量数据,查询速度也很快。

前端界面采用响应式设计,自动适应不同屏幕尺寸。主界面分为三个区域:左侧是设备列表和控制面板,中间是实时数据展示,右侧是历史数据曲线图。我用ECharts库绘制曲线图,这个库功能强大而且免费,支持实时更新和数据缩放。

实时数据更新采用WebSocket协议,相比HTTP轮询更节省带宽。当STM32上传新数据时,服务器通过WebSocket推送到网页,界面自动更新显示。为了优化用户体验,我设置了数据缓存,即使网络短暂中断,重新连接后也能显示最新数据。

控制功能包括手动模式和自动模式。在手动模式下,用户可以直接点击浇水按钮控制水泵;自动模式下,系统根据设定的湿度阈值自动控制。所有控制指令都通过WebSocket实时下发到STM32,同时记录到数据库供后续查询。

数据可视化部分我花了最多心思。除了基本的折线图显示历史数据外,还增加了数据统计分析功能,可以计算每日用水量、平均温湿度等指标。我用不同颜色表示不同数据范围,比如土壤湿度低于30%显示红色警告,高于70%显示绿色正常,这样一眼就能看出系统状态。

为了提高系统安全性,我增加了用户登录功能,不同用户只能看到自己的设备数据。密码采用bcrypt加密存储,即使数据库泄露也不会暴露明文密码。同时限制API调用频率,防止恶意攻击。

5. 系统集成与调试技巧

系统集成是最考验耐心的时候,各个模块单独测试都正常,但组合起来就可能出现各种问题。我总结了一些调试技巧,希望能帮大家少走弯路。

首先推荐使用调试器,我习惯用ST-Link V2,价格便宜又好用。通过调试器可以单步执行代码,查看变量值,设置断点,比串口打印调试效率高很多。特别是调试硬件中断时,调试器是必不可少的工具。

多线程调试要注意优先级设置。我遇到过一个奇怪的问题:WiFi通信时偶尔会丢失数据。后来发现是ADC采集中断优先级太高,打断了串口通信。调整中断优先级后问题就解决了。STM32的NVIC中断控制器可以设置抢占优先级和子优先级,要合理分配。

电源噪声是常见问题。有一次我的土壤湿度数据总是周期性波动,最后发现是水泵启停时电源电压波动导致的。后来我在水泵电源线上加了大电容滤波,问题就解决了。建议用示波器查看电源波形,确保干净稳定。

WiFi连接稳定性需要特别注意。ESP8266模块对电源质量很敏感,如果电源纹波太大,容易导致WiFi断连。我在模块的电源引脚上加了100uF电解电容和0.1uF陶瓷电容并联,效果很好。另外,AT指令要加入重试机制,网络异常时自动重连。

数据校准很重要。每个传感器的特性都不完全一样,需要单独校准。我用标准温湿度计对比校准DHT11,用土壤湿度标定盒校准土壤传感器。校准数据保存在STM32的Flash中,即使断电也不会丢失。

现场调试时遇到一个实际问题:阳光直射导致温度传感器读数偏高。后来我给传感器加了防晒罩,读数就准确了。户外部署还要考虑防水防尘,我用防水盒封装整个控制板,传感器接口用热熔胶密封。

最后给大家分享一个性能优化技巧:STM32的Flash读写次数有限,不要频繁保存数据。我原来每秒保存一次数据,后来改为每分钟保存一次,大大延长了Flash寿命。重要数据最好加上校验码,防止数据损坏。

整个系统调试通过后,实际运行效果很稳定,能够根据土壤湿度自动灌溉,也可以通过手机远程控制。数据实时上传到云端,生成美观的可视化图表。这个项目不仅适合毕业设计,也可以实际应用于小型农田或花园灌溉。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐