当前位置: 首页 > java >正文

基于STM32单片机的OneNet物联网云平台农业土壤湿度控制系统

1 系统功能介绍

本设计为 基于STM32单片机的OneNet物联网云平台农业土壤湿度控制系统。系统以STM32F103C8T6单片机作为核心控制器,结合土壤湿度传感器、OLED液晶显示模块、WiFi模块、继电器驱动电路以及按键电路,实现了土壤湿度的实时采集、显示与远程控制。系统不仅能在本地自动或手动控制水泵,还能通过OneNet物联网平台实现远程监控与控制,具备较强的智能化和实用性。

系统主要功能如下:

  1. 实时数据采集与上传:利用土壤湿度传感器采集数据,并通过WiFi模块上传至中国移动OneNet云平台。

  2. 模式切换:系统支持自动模式和手动模式。

    • 自动模式:根据用户设置的湿度上下阈值进行自动灌溉控制。
    • 手动模式:可通过按键或云平台远程命令控制水泵开关。
  3. 远程控制:用户可通过云平台下发指令控制系统:

    • auto:自动模式
    • manual:手动模式
    • open:开启水泵
    • close:关闭水泵
  4. 本地显示:OLED液晶显示实时土壤湿度、模式状态以及水泵运行情况。

  5. 安全可靠:通过继电器控制水泵,保证电气隔离和安全运行。

该系统结合了物联网与农业智能控制的应用,能够显著提升农业灌溉的智能化程度,减少人力投入并提高水资源利用率。


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连接。

  • 功能实现

    1. 建立与OneNet物联网平台的MQTT连接。
    2. 定时上传湿度数据。
    3. 接收平台下发的远程控制命令。

2.5 继电器控制电路

  • 继电器模块:通过光耦隔离,输入信号由STM32的GPIO输出控制。
  • 负载控制:继电器输出端可直接控制水泵的开关。
  • 安全设计:继电器电路与单片机电路电气隔离,保证系统运行安全。

2.6 按键电路

  • 按键功能

    1. 模式切换键:在自动与手动模式间切换。
    2. 水泵开关键:手动模式下,直接控制水泵开关。
  • 消抖处理:通过软件延时消抖,提高可靠性。

2.7 电源电路

  • 电源模块:系统统一采用5V电源,STM32与传感器模块使用3.3V稳压供电,继电器与OLED使用5V供电。
  • 电源滤波:在关键电源引脚加入电容滤波,防止电源波动影响系统运行。

3 程序设计

系统软件部分采用C语言编程,基于STM32标准外设库开发。程序结构主要包括 初始化模块、湿度检测模块、OLED显示模块、WiFi通信模块、模式控制模块、继电器驱动模块、按键处理模块、主控程序

3.1 系统初始化

#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();         // 初始化OLEDUSART1_Init(115200); // 串口初始化,连接WiFi模块ADC_Init_Config();   // 初始化ADC,用于湿度采集Relay_Init();        // 初始化继电器控制IOKey_Init();          // 初始化按键Wifi_Init();         // 初始化WiFi模块OLED_ShowString(0,0,"Soil Humidity:");
}

3.2 湿度检测模块

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显示模块

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通信模块

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 自动控制模块

#define HUMIDITY_MIN 40
#define HUMIDITY_MAX 70void Auto_Control(void){if(mode == 1){if(humidity < HUMIDITY_MIN){pumpState = 1;  // 开启水泵} else if(humidity > HUMIDITY_MAX){pumpState = 0;  // 关闭水泵}}
}

3.6 继电器驱动模块

void Pump_Control(void){if(pumpState == 1) Relay_ON();else Relay_OFF();
}

3.7 按键处理模块

void Key_Process(void){if(Key_Scan() == KEY1_PRES){   // 模式切换mode = !mode;}if(Key_Scan() == KEY2_PRES && mode == 0){ // 手动控制pumpState = !pumpState;}
}

3.8 主控程序

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物联网平台,成功实现了 土壤湿度监测与智能灌溉控制。系统不仅能在本地通过按键实现手动与自动控制,还能通过云平台实现远程操作与监控,极大地提高了农业灌溉的自动化和智能化水平。

通过本设计,可以更高效地利用水资源,减少人工劳动,同时为智能农业的发展提供了一种可行的方案,具有良好的推广和应用价值。

http://www.xdnf.cn/news/19327.html

相关文章:

  • 编程与数学 03-004 数据库系统概论 09_物理结构设计
  • 栈溢出问题
  • 498. 对角线遍历
  • 银河麒麟系统无法打开360浏览器的解决办法以及安装initramfs-tools报错解决方案
  • 10.2 工程学中的矩阵
  • AutoDriveRelated-WA
  • Qt中的锁(1)
  • 【lua】table基础操作
  • String str = new String(“abc“)
  • C语言---零碎语法知识补充(队列、函数指针、左移右移、任务标识符)
  • 第十六章 ESP32S3 WATCH_DOG 实验
  • C++优先级队列priority_queue的模拟实现
  • 论文介绍:《Small Language Models are the Future of Agentic AI》
  • Python(五)Python_C API详细
  • Linux三剑客grep-sed-awk
  • 为什么vue3会移除过滤器filter
  • 北斗导航 | RAIM算法改进方案及性能对比分析报告
  • 深度学习:洞察发展趋势,展望未来蓝图
  • 计算机网络面试集合
  • 【AI工具】在 VSCode中安装使用Excalidraw
  • Java全栈开发面试实战:从基础到微服务的深度解析
  • 小迪安全v2023学习笔记(七十四讲)—— 验证机制篇验证码绕过思路SRC挖掘演示
  • Coze源码分析-API授权-获取令牌列表-前端源码
  • LeetCode刷题记录----51.N皇后(Hard)
  • OpenCV安装及其开发环境配置(Windows系统Visual Studio 2022)
  • ros1ros2区别和相同之处
  • 软考 系统架构设计师系列知识点之杂项集萃(136)
  • 【LeetCode - 每日1题】有效的数独
  • Java基础知识(十)
  • plantsimulation知识点 多条RGV驮一台工件图标显示顺序问题