1 系统功能介绍
本设计为 基于STM32单片机的OneNet物联网云平台农业土壤湿度控制系统。系统以STM32F103C8T6单片机作为核心控制器,结合土壤湿度传感器、OLED液晶显示模块、WiFi模块、继电器驱动电路以及按键电路,实现了土壤湿度的实时采集、显示与远程控制。系统不仅能在本地自动或手动控制水泵,还能通过OneNet物联网平台实现远程监控与控制,具备较强的智能化和实用性。
系统主要功能如下:
-
实时数据采集与上传:利用土壤湿度传感器采集数据,并通过WiFi模块上传至中国移动OneNet云平台。
-
模式切换:系统支持自动模式和手动模式。
- 自动模式:根据用户设置的湿度上下阈值进行自动灌溉控制。
- 手动模式:可通过按键或云平台远程命令控制水泵开关。
-
远程控制:用户可通过云平台下发指令控制系统:
auto
:自动模式manual
:手动模式open
:开启水泵close
:关闭水泵
-
本地显示:OLED液晶显示实时土壤湿度、模式状态以及水泵运行情况。
-
安全可靠:通过继电器控制水泵,保证电气隔离和安全运行。
该系统结合了物联网与农业智能控制的应用,能够显著提升农业灌溉的智能化程度,减少人力投入并提高水资源利用率。
2 系统电路设计
本系统电路主要由 STM32最小系统电路、土壤湿度检测电路、OLED显示电路、WiFi通信电路、继电器控制电路、按键电路、电源电路 组成。
2.1 STM32单片机最小系统
- 核心芯片:STM32F103C8T6,基于ARM Cortex-M3内核,主频72MHz,资源丰富,适合实时控制与通信任务。
- 晶振电路:外部8MHz晶振提供系统时钟,确保系统运行稳定。
- 复位电路:上电复位与按键复位结合,保证系统在异常情况下能正常重启。
- 供电电路:系统供电为3.3V,通过稳压电路由5V电源转换而来。
2.2 土壤湿度检测电路
- 传感器:采用电容式土壤湿度传感器,输出模拟电压信号,避免了电极腐蚀问题。
- 接口:传感器信号通过ADC接口接入STM32,单片机对采样数据进行处理。
- 校准与转换:通过软件将采集到的电压值转换为百分比湿度值(0%~100%)。
2.3 OLED显示电路
- 屏幕规格:0.96英寸OLED,分辨率128×64,通信接口为I2C。
- 显示内容:土壤湿度数值、模式状态(水泵开关状态)、报警信息等。
- 电路接口:SCL、SDA分别连接到STM32的I2C引脚。
2.4 WiFi通信电路
-
模块选择:ESP8266 WiFi模块,串口通信方式与STM32连接。
-
功能实现:
- 建立与OneNet物联网平台的MQTT连接。
- 定时上传湿度数据。
- 接收平台下发的远程控制命令。
2.5 继电器控制电路
- 继电器模块:通过光耦隔离,输入信号由STM32的GPIO输出控制。
- 负载控制:继电器输出端可直接控制水泵的开关。
- 安全设计:继电器电路与单片机电路电气隔离,保证系统运行安全。
2.6 按键电路
-
按键功能:
- 模式切换键:在自动与手动模式间切换。
- 水泵开关键:手动模式下,直接控制水泵开关。
-
消抖处理:通过软件延时消抖,提高可靠性。
2.7 电源电路
- 电源模块:系统统一采用5V电源,STM32与传感器模块使用3.3V稳压供电,继电器与OLED使用5V供电。
- 电源滤波:在关键电源引脚加入电容滤波,防止电源波动影响系统运行。
3 程序设计
系统软件部分采用C语言编程,基于STM32标准外设库开发。程序结构主要包括 初始化模块、湿度检测模块、OLED显示模块、WiFi通信模块、模式控制模块、继电器驱动模块、按键处理模块、主控程序。
3.1 系统初始化
c
#include "stm32f10x.h"
#include "oled.h"
#include "usart.h"
#include "adc.h"
#include "relay.h"
#include "key.h"
#include "wifi.h"
uint16_t humidity = 0; // 湿度值
uint8_t mode = 0; // 0-手动模式 1-自动模式
uint8_t pumpState = 0; // 水泵状态 0-关闭 1-打开
void System_Init(void){
OLED_Init(); // 初始化OLED
USART1_Init(115200); // 串口初始化,连接WiFi模块
ADC_Init_Config(); // 初始化ADC,用于湿度采集
Relay_Init(); // 初始化继电器控制IO
Key_Init(); // 初始化按键
Wifi_Init(); // 初始化WiFi模块
OLED_ShowString(0,0,"Soil Humidity:");
}
3.2 湿度检测模块
c
uint16_t Get_Humidity(void){
uint16_t adc_value = ADC_GetValue(ADC_Channel_1);
uint16_t humidity = (adc_value * 100) / 4095; // 转换为百分比
return humidity;
}
3.3 OLED显示模块
c
void Display_Data(void){
OLED_ShowNum(0,2,humidity,3,16); // 显示湿度值
if(mode == 0){
OLED_ShowString(0,4,"Mode:Manual");
} else {
OLED_ShowString(0,4,"Mode:Auto ");
}
if(pumpState == 1){
OLED_ShowString(0,6,"Pump:ON ");
} else {
OLED_ShowString(0,6,"Pump:OFF");
}
}
3.4 WiFi通信模块
c
void Wifi_Process(void){
char recvCmd[20];
if(Wifi_ReceiveCmd(recvCmd)){
if(strcmp(recvCmd,"auto") == 0) mode = 1;
else if(strcmp(recvCmd,"manual") == 0) mode = 0;
else if(strcmp(recvCmd,"open") == 0) pumpState = 1;
else if(strcmp(recvCmd,"close") == 0) pumpState = 0;
}
Wifi_SendData(humidity); // 上传湿度数据
}
3.5 自动控制模块
c
#define HUMIDITY_MIN 40
#define HUMIDITY_MAX 70
void Auto_Control(void){
if(mode == 1){
if(humidity < HUMIDITY_MIN){
pumpState = 1; // 开启水泵
} else if(humidity > HUMIDITY_MAX){
pumpState = 0; // 关闭水泵
}
}
}
3.6 继电器驱动模块
c
void Pump_Control(void){
if(pumpState == 1) Relay_ON();
else Relay_OFF();
}
3.7 按键处理模块
c
void Key_Process(void){
if(Key_Scan() == KEY1_PRES){ // 模式切换
mode = !mode;
}
if(Key_Scan() == KEY2_PRES && mode == 0){ // 手动控制
pumpState = !pumpState;
}
}
3.8 主控程序
c
int main(void){
System_Init();
while(1){
humidity = Get_Humidity(); // 采集湿度
Key_Process(); // 按键处理
Wifi_Process(); // 处理云平台数据
Auto_Control(); // 自动模式控制
Pump_Control(); // 控制继电器
Display_Data(); // OLED显示
delay_ms(500); // 延时
}
}
4 总结
本设计基于STM32单片机,结合WiFi模块与OneNet物联网平台,成功实现了 土壤湿度监测与智能灌溉控制。系统不仅能在本地通过按键实现手动与自动控制,还能通过云平台实现远程操作与监控,极大地提高了农业灌溉的自动化和智能化水平。
通过本设计,可以更高效地利用水资源,减少人工劳动,同时为智能农业的发展提供了一种可行的方案,具有良好的推广和应用价值。