基于STM32的智能土壤质量监测系统
模块化设计:每个功能(传感器、显示、控制、通信)独立成块,便于编写、调试和维护。状态机应用:特别是在按键处理中,通过短按/长按正常模式/设置模式等状态区分,用有限的按键实现了复杂的功能。非阻塞式运行:利用定时器中断和标志位来触发任务,避免了使用delay()函数导致CPU空等,极大提高了CPU利用率和工作效率。前后台系统:主循环(后台)轮流处理任务,定时器中断(前台)及时设置标志位,构成了一个简单
若该文为原创文章,转载请注明原文出处。
一、 项目背景
随着智慧农业、精准农业概念的普及与发展,传统依赖于人工经验和粗放管理的农业生产方式正逐渐被数据驱动的智能化管理模式所取代。土壤作为农作物生长的根本,其质量参数如湿度、酸碱度(PH值)、温度以及环境光照度等,直接关系到作物的健康、产量与品质。
传统的人工检测方法不仅耗时费力,而且存在严重的数据滞后性和主观性,无法实现实时、连续的监测,更难以应对突发性的环境变化(如急剧干旱、肥害等)。因此,开发一套能够实时、精准、自动化监测土壤多项关键指标,并能进行远程监控和智能控制的系统,对于现代农业生产、科学研究乃至家庭园艺都具有极其重要的现实意义。
本项目旨在设计并实现一个基于STM32微控制器的低成本、低功耗、多功能的智能土壤质量监测系统。该系统集成了传感器技术、嵌入式技术和物联网技术,能够实现对土壤环境的全面感知、数据的本地显示与远程上报、异常情况的自动报警以及智能灌溉控制,从而为作物的科学培育提供强有力的数据支持和自动化保障。
二、 系统设计
1. 系统总体架构
该系统采用分层模块化设计,主要由感知层、控制层、执行层和云平台层构成。
-
感知层:由各类传感器组成,负责采集环境数据。
-
控制层:以STM32F103C8T6最小系统板为核心,作为系统的大脑,负责处理传感器数据、驱动显示、判断逻辑、控制外设及通信。
-
执行层:包括继电器模块和水泵,接收控制层的指令执行灌溉动作。
-
云平台层:通过4G Cat.1模块(AIR780E)将数据上传至云端,实现远程监控和数据存储。
系统工作流程为:传感器采集数据→STM32处理数据→OLED本地显示→判断是否超过阈值→若超过则声光报警并启动/停止灌溉→通过AIR780E将数据上传至云平台。用户也可通过按键设置报警阈值和手动模式。
2. 硬件设计
-
主控芯片:采用STM32F103C8T6(蓝色pill开发板),资源丰富(Cortex-M3内核,72MHz主频,足够处理多路传感器数据和外设控制),性价比极高。
-
传感器模块:
-
土壤湿度传感器:使用电阻式模拟传感器,通过STM32的ADC通道读取电压值,转换为湿度百分比。
-
土壤PH传感器:采用模拟输出的PH计模块,同样通过ADC读取,并经过校准公式计算出PH值。
-
温湿度传感器:采用DHT11数字传感器,通过单总线协议与STM32通信,获取环境温湿度。
-
光照强度传感器:采用BH1750数字光照传感器,通过I2C协议与STM32通信,获取精确的光照度值(lx)。
-
-
显示模块:采用0.96寸OLED显示屏(SSD1306驱动,I2C接口),用于本地实时显示所有传感器数据和系统状态(如阈值、报警信息、网络状态等)。
-
通信模块:采用AIR780E(4G Cat.1模块),通过串口AT指令与STM32通信。它支持TCP/IP协议栈,能够将传感器数据以MQTT或HTTP协议的形式可靠地传输到指定的云平台(如阿里云、腾讯云、OneNET等)。
-
执行与报警模块:
-
执行单元:采用一个5V继电器模块控制水泵的电源通断。STM32通过GPIO输出高低电平来驱动继电器,从而控制水泵的启停。
-
报警单元:采用一个有源蜂鸣器(或LED灯),当任何一项数据超出设定的安全阈值时,STM32驱动其发出声光报警。
-
-
输入模块:使用多个轻触按键,用于切换显示界面、手动开关水泵、进入阈值设置模式以及增减阈值数值。
-
电源模块:系统可采用USB供电或外部12V/5V电源适配器供电,为STM32、传感器和执行器提供稳定电压。
3. 软件设计
软件程序在Keil MDK环境中使用C语言开发,基于HAL库或标准库进行开发,提高了可移植性和开发效率。
-
主程序流程:系统初始化后,进入主循环,循环执行以下任务:
-
按键扫描:检测用户输入,处理设置功能。
-
数据采集:定时轮询读取所有传感器的数据。
-
数据处理与显示:将原始数据转换为有意义的物理量,并刷新OLED显示。
-
逻辑判断:将采集到的数据与用户设置的上下限阈值进行比较。
-
报警与控制:若数据异常,启动报警;若土壤湿度低于下限,自动启动水泵灌溉,直至湿度达到上限后停止。
-
数据上传:定时或触发式通过AIR780E模块将数据包发送到云平台。
-
-
关键驱动:编写了I2C(驱动OLED和BH1750)、ADC(读取土壤湿度和PH值)、UART(与AIR780E通信)、GPIO(控制继电器和蜂鸣器)等驱动程序。
-
云平台通信:在云平台端创建产品和设备,获取连接三元组。STM32端编写AT指令发送函数,依次完成SIM卡注册网络、连接到MQTT服务器、订阅主题、发布传感器消息等操作。
三、 系统框架图

硬件连接详细说明
1. 电源连接 (重中之重!)
-
5V供电:继电器、水泵、土壤湿度传感器、PH传感器等模块工作电压为5V。
-
3.3V供电:STM32、OLED屏、BH1750、DHT11、AIR780E、蜂鸣器等模块为3.3V逻辑电平,严禁接入5V,否则会烧毁芯片。
-
共地:所有模块的GND引脚必须连接到电源地的同一点,形成统一的参考零电位,否则读数会不准或不稳定。
2. STM32引脚分配明细表
| STM32引脚 | 功能 | 连接模块 | 备注 |
|---|---|---|---|
| PA0 | ADC1_IN0 | 土壤湿度传感器 AO | 模拟信号输入 |
| PA1 | ADC1_IN1 | 土壤PH传感器 AO | 模拟信号输入 |
| PA2 | USART2_TX | AIR780E RXD | 串口发送端 |
| PA3 | USART2_RX | AIR780E TXD | 串口接收端 |
| PA4 | GPIO_Output | DHT11 DATA | 单总线通信 |
| PA5 | GPIO_Input | 按键 K1 | 带上拉电阻的输入模式 |
| PA6 | GPIO_Input | 按键 K2 | 带上拉电阻的输入模式 |
| PA7 | GPIO_Input | 按键 K3 | 带上拉电阻的输入模式 |
| PB6 | I2C1_SCL | OLED SCL, BH1750 SCL | I2C时钟线,共享总线 |
| PB7 | I2C1_SDA | OLED SDA, BH1750 SDA | I2C数据线,共享总线 |
| PC13 | GPIO_Output | 继电器 IN | 控制继电器吸合与断开 |
| PC14 | GPIO_Output | 有源蜂鸣器 SIG | 输出高低电平控制鸣叫 |
| PA8 | GPIO_Output | AIR780E RESET | 控制4G模块复位(可选) |
| 3.3V | 电源 | 多个模块 VCC | 为3.3V设备供电 |
| GND | 地 | 所有模块 GND | 必须共地 |
3. 重要注意事项
-
电平匹配:确保所有连接到STM32 IO口的信号电压不超过3.3V。
-
I2C总线:BH1750和OLED屏可以挂载在同一个I2C总线上,因为它们有各自不同的I2C地址,不会冲突。
-
串口交叉:STM32的TX pin 要接AIR780E的RX pin,STM32的RX pin 要接AIR780E的TX pin。
-
驱动能力:水泵电机属于感性负载,工作时会产生反向电动势,建议在继电器线圈两端并联一个续流二极管,并在水泵电源输入端并联一个大电容,以保护电源和继电器。
四、 软件设计流程
关键模块软件流程详解
1. 系统初始化 (void System_Init(void))
这是程序的第一步,对所有硬件和外设进行配置。
void System_Init(void) {
HAL_Init(); // 初始化HAL库
SystemClock_Config(); // 配置系统时钟
MX_GPIO_Init(); // 初始化GPIO
MX_ADC1_Init(); // 初始化ADC(用于土壤湿度和PH)
MX_I2C1_Init(); // 初始化I2C(用于OLED和BH1750)
MX_USART2_UART_Init(); // 初始化串口2(用于AIR780E)
OLED_Init(); // 初始化OLED显示屏
OLED_Clear(); // 清屏
OLED_ShowString(0, 0, "Booting...");
DHT11_Init(); // 初始化DHT11
BH1750_Init(); // 初始化BH1750
AIR780E_Init(); // 初始化4G模块(发送AT指令、注册网络、连接MQTT)
Relay_OFF(); // 确保继电器和水泵初始为关闭状态
Buzzer_OFF(); // 关闭蜂鸣器
// 从Flash中读取用户设置的阈值(如果之前保存过)
Load_Threshold_From_Flash();
// 启动一个基础定时器,例如周期为100ms
HAL_TIM_Base_Start_IT(&htim2);
}
2. 数据采集任务 (void Sensor_Update_Task(void))
此任务由定时标志位触发,负责读取所有传感器数据并进行处理。

3. 逻辑判断与控制任务 (void Control_Task(void))
此任务将采集到的数据与预设阈值比较,决定是否报警或灌溉。
void Control_Task(void) {
// 1. 异常报警判断
if ( (SoilMoisture < Moisture_Low_Limit) ||
(SoilMoisture > Moisture_High_Limit) ||
(SoilPH < PH_Low_Limit) ||
(SoilPH > PH_High_Limit) ||
(Temp > Temp_High_Limit) ) {
Buzzer_ON(); // 触发报警
} else {
Buzzer_OFF(); // 解除报警
}
// 2. 自动灌溉逻辑 (如果处于自动模式)
if (System_Mode == MODE_AUTO) {
if (SoilMoisture < Moisture_Low_Limit) {
Relay_ON(); // 打开水泵
Pump_Status = 1;
}
if (SoilMoisture > Moisture_High_Limit) {
Relay_OFF(); // 关闭水泵
Pump_Status = 0;
}
}
// 手动模式由按键直接控制,不在此处理
}
4. 通信任务 (void Communication_Task(void))
此任务负责将数据打包并通过4G模块上传至云平台。
void Communication_Task(void) {
// 1. 构造JSON格式的数据包
// 例如: {"temp":25.6, "humi":60.2, "soil":45.8, "ph":6.5, "light":12000, "pump":0}
sprintf(txBuffer, "{\"temp\":%.1f, \"humi\":%.1f, \"soil\":%.1f, \"ph\":%.1f, \"light\":%.0f, \"pump\":%d}",
Temperature, Humidity, SoilMoisture, SoilPH, LightIntensity, Pump_Status);
// 2. 通过串口发送AT指令到AIR780E
// 示例: AT+MQTTPUB=0,"topic/test",1,0,0,%d\r\n
AIR780E_MQTT_Publish("topic/data", txBuffer);
// 3. 处理接收到的下行指令(如平台下发的控制命令)
if (收到新数据) {
Parse_Cloud_Command(); // 解析指令,例如手动开关水泵
}
}
5. 按键处理任务 (void Key_Scan_Task(void))
此任务扫描按键动作,执行模式切换、菜单设置等功能。

五、 项目总结
1.总结
该软件设计流程的核心特点:
-
模块化设计:每个功能(传感器、显示、控制、通信)独立成块,便于编写、调试和维护。
-
状态机应用:特别是在按键处理中,通过
短按/长按、正常模式/设置模式等状态区分,用有限的按键实现了复杂的功能。 -
非阻塞式运行:利用定时器中断和标志位来触发任务,避免了使用
delay()函数导致CPU空等,极大提高了CPU利用率和工作效率。 -
前后台系统:主循环(后台)轮流处理任务,定时器中断(前台)及时设置标志位,构成了一个简单高效的实时系统框架。
-
数据缓冲与滤波:在数据采集环节使用软件滤波算法,保证了数据的稳定性和可靠性。
2. 应用与展望
本系统不仅可应用于大田农业、温室大棚、果园苗圃等农业场景,也可用于园林绿化、科研实验和家庭花园的智能化管理。它是构建智慧农业物联网节点的一个典型实例。
未来可进一步优化的方向包括:
-
增加传感器:集成土壤EC(电导率)传感器以监测肥力,或添加CO2传感器。
-
太阳能供电:结合太阳能电池板和锂电池,实现能源自给的绿色系统,适用于无市电供应的野外环境。
-
算法优化:引入更先进的控制算法(如模糊PID),使灌溉控制更精准、节能。
-
平台功能扩展:在云平台开发更多功能,如自动生成数据分析报告、多种报警方式(短信、微信推送)、反向控制(远程手动开关水泵)等。
如有侵权,或需要完整代码,请及时联系博主。
更多推荐



所有评论(0)