基于STM32的智能温室环境监测与控制系统设计(代码示例)

news2024/11/25 10:58:26

在这里插入图片描述


一、项目概述

在现代农业中,智能大棚能够通过环境监测、数据分析和自动控制等技术手段,实现对作物生长环境的精细化管理。本项目旨在设计一个基于STM32单片机的智能大棚系统,能够实时监测光照强度、空气温湿度及土壤湿度,并根据设定的阈值自动控制加热片、风扇、灯光和水泵,以优化植物生长环境。系统将实时数据通过OLED屏幕展示,并通过Wi-Fi模块将数据上传至手机APP,方便用户随时监控和调整大棚环境。

技术栈关键词

  • 单片机: STM32F103C8T6

  • 传感器:

  • 温湿度传感器: DHT22

  • 土壤湿度传感器: YL-69

  • 光照传感器: 光敏电阻

  • 显示模块: OLED屏幕(SSD1306)

  • 无线通信: ESP8266

  • 开发环境: STM32CubeIDE

  • 手机应用: Blynk或自定义移动端应用

二、系统架构

设计系统架构

系统整体架构由数据采集模块、控制模块、显示模块和通信模块组成。各模块通过STM32单片机进行数据传输与控制。

选择合适的单片机和通信协议

  • 单片机: 选择STM32F103C8T6,具备高性能和低功耗的特点,适合于实时数据处理和控制。

  • 传感器:

  • DHT22: 提供高精度的温湿度数据。

  • YL-69: 测量土壤湿度,适合农业应用。

  • 光敏电阻: 监测光照强度,以便于植物的光照需求。

  • 无线通信: 使用ESP8266实现Wi-Fi通信,支持数据上传至互联网。

  • 显示模块: OLED屏幕用于实时监控和数据展示,提高用户体验。

系统架构图

读取
读取
读取
控制
控制
控制
控制
显示
上传数据
数据传输
STM32单片机
温湿度传感器
土壤湿度传感器
光照强度传感器
加热片
风扇
水泵
OLED显示屏
ESP8266
手机APP

三、环境搭建和注意事项

硬件环境搭建

  1. 准备材料:
  • STM32开发板(如STM32F103C8T6)

  • DHT22温湿度传感器

  • YL-69土壤湿度传感器

  • 光敏电阻

  • ESP8266 Wi-Fi模块

  • OLED显示屏(SSD1306)

  • 加热片、风扇、灯和水泵

  1. 连接方式:
  • DHT22: 数据引脚连接至STM32的数字输入引脚,VCC和GND分别连接至电源。

  • YL-69: 直接连接至STM32的模拟输入引脚。

  • 光敏电阻: 通过分压电路连接至STM32的模拟输入引脚。

  • ESP8266: 通过UART接口连接至STM32。

  • OLED: 通过I2C接口连接至STM32。

软件环境搭建

  1. IDE选择: 使用STM32CubeIDE进行代码编写和调试。

  2. 库文件: 导入所需的库文件,包括DHT库、Adafruit SSD1306库和ESP8266库。

注意事项

  • 确保传感器和模块的供电电压与STM32相匹配。

  • 在代码中进行适当的错误处理,以避免因传感器故障导致系统崩溃。

  • 定期进行系统测试,确保各传感器和控制模块的正常工作。

四、代码实现过程

在本部分,我们将详细介绍基于STM32单片机的智能大棚系统的代码实现过程。整个系统的实现可以分为四个主要模块:传感器数据读取、设备控制、OLED显示和Wi-Fi数据上传。我们会逐步介绍每个模块的设计和实现。

1. 系统架构回顾

在设计本项目时,我们搭建了系统架构,主要包括以下几个模块:

  • 传感器模块: 负责采集环境数据,如温湿度、土壤湿度及光照强度。

  • 控制模块: 根据传感器数据控制加热片、风扇、灯和水泵。

  • 显示模块: 通过OLED屏幕展示当前环境参数。

  • 通信模块: 利用ESP8266模块将数据上传至手机APP,实现远程监控。

2. 读取传感器数据

我们使用DHT22传感器读取环境的温湿度数据,YL-69传感器读取土壤湿度,光敏电阻用于监测光照强度。

代码实现

以下是STM32的代码示例,使用HAL库读取传感器数据并处理。

1. 初始化代码

main.c中初始化各个模块:

#include "main.h"
#include "dht.h"
#include "ssd1306.h"

// 定义引脚
#define SOIL_MOISTURE_PIN GPIO_PIN_1
#define LIGHT_SENSOR_PIN GPIO_PIN_2
#define HEATER_PIN GPIO_PIN_3
#define FAN_PIN GPIO_PIN_4
#define LIGHT_PIN GPIO_PIN_5
#define PUMP_PIN GPIO_PIN_6

// 设定阈值
float TEMP_THRESHOLD = 20.0;    // 温度阈值
float HUMIDITY_THRESHOLD = 60.0; // 湿度阈值
int LIGHT_THRESHOLD = 300;       // 光照强度阈值
int SOIL_MOISTURE_THRESHOLD = 300; // 土壤湿度阈值

DHT_HandleTypeDef hDHT; // DHT传感器句柄

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_I2C1_Init(void);
static void MX_DHT_Init(void);

int main(void) {
    HAL_Init(); // 初始化HAL库
    SystemClock_Config(); // 配置系统时钟
    MX_GPIO_Init(); // 初始化GPIO
    MX_I2C1_Init(); // 初始化I2C
    MX_DHT_Init(); // 初始化DHT传感器

    SSD1306_Init(); // 初始化OLED显示屏

    while (1) {
        float humidity = DHT_ReadHumidity(&hDHT);
        float temperature = DHT_ReadTemperature(&hDHT);
        int soilMoisture = HAL_ADC_GetValue(&hadc1); // 读取土壤湿度
        int lightIntensity = HAL_ADC_GetValue(&hadc2); // 读取光照强度

        // 在OLED上显示数据
        SSD1306_Clear();
        SSD1306_SetCursor(0,0);
        SSD1306_WriteString("Humidity: ", Font_11x18, White);
        SSD1306_WriteFloat(humidity, Font_11x18, White);
        SSD1306_WriteString("%", Font_11x18, White);
        SSD1306_SetCursor(0,20);
        SSD1306_WriteString("Temp: ", Font_11x18, White);
        SSD1306_WriteFloat(temperature, Font_11x18, White);
        SSD1306_WriteString("C", Font_11x18, White);
        SSD1306_SetCursor(0,40);
        SSD1306_WriteString("Soil: ", Font_11x18, White);
        SSD1306_WriteInt(soilMoisture, Font_11x18, White);
        SSD1306_SetCursor(0,60);
        SSD1306_WriteString("Light: ", Font_11x18, White);
        SSD1306_WriteInt(lightIntensity, Font_11x18, White);
        SSD1306_UpdateScreen(); // 更新显示

        // 控制设备
        controlDevices(temperature, humidity, soilMoisture, lightIntensity);

        HAL_Delay(2000); // 每2秒更新一次
    }
}

2. 设备控制逻辑

在智能大棚系统中,设备控制逻辑的实现至关重要。以下是具体实现的代码示例以及解析。

设备控制函数实现
void controlDevices(float temperature, float humidity, int soilMoisture, int lightIntensity) {
    // 控制加热片
    if (temperature < TEMP_THRESHOLD) {
        HAL_GPIO_WritePin(GPIOA, HEATER_PIN, GPIO_PIN_SET); // 开启加热片
    } else {
        HAL_GPIO_WritePin(GPIOA, HEATER_PIN, GPIO_PIN_RESET); // 关闭加热片
    }

    // 控制风扇
    if (humidity > HUMIDITY_THRESHOLD) {
        HAL_GPIO_WritePin(GPIOA, FAN_PIN, GPIO_PIN_SET); // 开启风扇
    } else {
        HAL_GPIO_WritePin(GPIOA, FAN_PIN, GPIO_PIN_RESET); // 关闭风扇
    }

    // 控制灯光
    if (lightIntensity < LIGHT_THRESHOLD) {
        HAL_GPIO_WritePin(GPIOA, LIGHT_PIN, GPIO_PIN_SET); // 开启灯光
    } else {
        HAL_GPIO_WritePin(GPIOA, LIGHT_PIN, GPIO_PIN_RESET); // 关闭灯光
    }

    // 控制水泵
    if (soilMoisture < SOIL_MOISTURE_THRESHOLD) {
        HAL_GPIO_WritePin(GPIOA, PUMP_PIN, GPIO_PIN_SET); // 开启水泵
    } else {
        HAL_GPIO_WritePin(GPIOA, PUMP_PIN, GPIO_PIN_RESET); // 关闭水泵
    }
}
代码解析
  • 加热片控制: 当环境温度低于设定的阈值(TEMP_THRESHOLD)时,系统会自动开启加热片以提供热量;当温度高于设定值时,系统会关闭加热片。

  • 风扇控制: 如果环境湿度超过设定阈值(HUMIDITY_THRESHOLD),风扇会被开启,以帮助降低湿度;反之,风扇会停止工作。

  • 灯光控制: 通过检测光照强度(lightIntensity),如果光照强度低于设定值(LIGHT_THRESHOLD),则系统会开启灯光,以确保植物获得足够的光照。

  • 水泵控制: 当土壤湿度(soilMoisture)低于设定阈值(SOIL_MOISTURE_THRESHOLD)时,水泵将被启动进行灌溉;如果土壤湿度足够,则水泵会关闭。

3. OLED显示模块

OLED显示模块用于实时展示当前环境参数,这部分代码已经在之前的传感器数据读取部分中提到过。为了更清晰地展示数据,我们将创建一个专门的显示函数。

OLED显示函数
void displayData(float humidity, float temperature, int soilMoisture, int lightIntensity) {
    SSD1306_Clear(); // 清空显示内容
    SSD1306_SetCursor(0, 0);
    SSD1306_WriteString("Humidity: ", Font_11x18, White);
    SSD1306_WriteFloat(humidity, Font_11x18, White);
    SSD1306_WriteString("%", Font_11x18, White);
    
    SSD1306_SetCursor(0, 20);
    SSD1306_WriteString("Temp: ", Font_11x18, White);
    SSD1306_WriteFloat(temperature, Font_11x18, White);
    SSD1306_WriteString("C", Font_11x18, White);
    
    SSD1306_SetCursor(0, 40);
    SSD1306_WriteString("Soil: ", Font_11x18, White);
    SSD1306_WriteInt(soilMoisture, Font_11x18, White);
    
    SSD1306_SetCursor(0, 60);
    SSD1306_WriteString("Light: ", Font_11x18, White);
    SSD1306_WriteInt(lightIntensity, Font_11x18, White);
    
    SSD1306_UpdateScreen(); // 更新OLED显示
}

4. Wi-Fi数据上传

为了实现远程监控和数据上传功能,我们需要设置ESP8266 Wi-Fi模块,并通过UART与STM32进行通信。以下是具体的实现步骤。

4.1 Wi-Fi模块初始化

main.c文件中,我们需要配置UART并初始化ESP8266模块。下面是UART初始化的代码示例:

UART_HandleTypeDef huart2; // 定义UART句柄

void MX_USART2_UART_Init(void) {
    huart2.Instance = USART2;
    huart2.Init.BaudRate = 115200; // ESP8266的默认波特率
    huart2.Init.WordLength = UART_WORDLENGTH_8B;
    huart2.Init.StopBits = UART_STOPBITS_1;
    huart2.Init.Parity = UART_PARITY_NONE;
    huart2.Init.Mode = UART_MODE_TX_RX;
    huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart2.Init.OverSampling = UART_OVERSAMPLING_16;
    HAL_UART_Init(&huart2);
}
4.2 发送数据到ESP8266

为了将传感器数据上传至手机APP,我们将创建一个函数,该函数将通过ESP8266发送传感器数据。以下是发送数据的代码示例:

void sendDataToESP8266(float temperature, float humidity, int soilMoisture, int lightIntensity) {
    char buffer[100];
    snprintf(buffer, sizeof(buffer), "GET /update?temp=%.2f&hum=%.2f&soil=%d&light=%d HTTP/1.1\r\nHost: your_server_ip\r\n\r\n",
             temperature, humidity, soilMoisture, lightIntensity);
    
    HAL_UART_Transmit(&huart2, (uint8_t *)buffer, strlen(buffer), HAL_MAX_DELAY); // 发送数据
}
4.3 发送数据的调用

在主循环中,我们需要在每次更新环境数据后调用sendDataToESP8266函数,以确保最新的数据被上传。以下是如何调用该函数的示例:

while (1) {
    float humidity = DHT_ReadHumidity(&hDHT);
    float temperature = DHT_ReadTemperature(&hDHT);
    int soilMoisture = HAL_ADC_GetValue(&hadc1);
    int lightIntensity = HAL_ADC_GetValue(&hadc2);

    // 更新显示
    displayData(humidity, temperature, soilMoisture, lightIntensity);

    // 控制设备
    controlDevices(temperature, humidity, soilMoisture, lightIntensity);

    // 发送数据到ESP8266
    sendDataToESP8266(temperature, humidity, soilMoisture, lightIntensity);

    HAL_Delay(2000); // 每2秒更新一次
}

时序图

User App ESP8266 STM32 Sensors OLED Devices 访问应用 发送请求数据 连接请求 读取传感器数据 返回温湿度、土壤湿度、光照强度 控制设备 状态反馈 更新显示内容 显示确认 发送实时数据 上传数据 更新显示数据 User App ESP8266 STM32 Sensors OLED Devices

5. 项目总结

本项目针对现代农业的需求,设计并实现了一个基于STM32的智能大棚系统。该系统通过实时监测和自动控制环境参数,如温度、湿度、土壤湿度和光照强度,极大地提高了作物生长的环境适应性和农业生产效率。通过结合传感器、控制器、显示模块及Wi-Fi通信技术,项目不仅展示了现代农业智能化的实现路径,也为相关领域的研究和应用提供了参考。

项目的主要功能包括:
  • 环境监测: 系统集成了DHT22温湿度传感器、YL-69土壤湿度传感器及光敏电阻,能够实时获取环境的关键参数,为后续的环境调节提供数据支持。

  • 智能控制: 根据设定的阈值,系统能够自动控制加热片、风扇、灯光和水泵,从而在不同的环境条件下自动调节大棚内的微气候,为植物提供最佳的生长环境。

  • 数据展示: 通过OLED显示屏,实时展示温湿度、土壤湿度和光照强度等重要数据,便于用户直观地监控环境变化。

  • 远程监控: 利用ESP8266模块,系统能够将实时数据上传至手机APP,用户可以随时随地进行远程监控和管理,提高了对大棚环境的响应速度和管理效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2234039.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(五)Web前端开发进阶2——AJAX

目录 1.Ajax概述 2.Axios库 3.认识URL 4.Axios常用请求方法 5.HTTP协议——请求报文/响应报文 6.HMLHttpRequest对象 7.前后端分离开发&#xff08;接口文档&#xff09; 8.Element组件库 1.Ajax概述 AJAX 是异步的 JavaScript和XML(Asynchronous JavaScript And XML)。…

进程信号——信号的保存

信号的概念 实际执行信号的处理动作称为信号递达(Delivery) 信号从产生到递达之间的状态,称为信号未决(Pending)。 进程可以选择阻塞 (Block )某个信号。 被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作. 注意,阻塞和忽略是不同的,只要信号…

基于SSM的“房屋租赁系统”的设计与实现(源码+数据库+文档+PPT)

基于SSM的“房屋租赁系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM&#xff0c;JSP 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 房屋租赁系统首页 管理员后台管理页面 报告故障管…

无需懂代码!用AI工具Bolt一键生成网站的入门指南!

​ ​ 随着AI技术的不断发展&#xff0c;许多原本需要技术门槛的操作正在被大大简化&#xff0c;甚至零基础的用户也可以轻松实现。 例如&#xff0c;AI生成网站工具Bolt就是这样一个可以帮助我们快速创建、实时预览并自动部署网站的平台。接下来&#xff0c;本文将带你深入了…

Elasticsearch中时间字段格式用法详解

Elasticsearch中时间字段格式用法详解 攻城狮Jozz关注IP属地: 北京 2024.03.18 16:27:51字数 758阅读 2,571 Elasticsearch&#xff08;简称ES&#xff09;是一个基于Lucene构建的开源、分布式、RESTful搜索引擎。它提供了全文搜索、结构化搜索以及分析等功能&#xff0c;广泛…

vue中el-table显示文本过长提示

1.el-table设置轻提示:show-overflow-tooltip“true“&#xff0c;改变轻提示宽度

关于我的编程语言——C/C++——第四篇(深入1)

&#xff08;叠甲&#xff1a;如有侵权请联系&#xff0c;内容都是自己学习的总结&#xff0c;一定不全面&#xff0c;仅当互相交流&#xff08;轻点骂&#xff09;我也只是站在巨人肩膀上的一个小卡拉米&#xff0c;已老实&#xff0c;求放过&#xff09; 字符类型介绍 char…

【春秋云镜】CVE-2023-23752

目录 CVE-2023-23752漏洞细节漏洞利用示例修复建议 春秋云镜&#xff1a;解法一&#xff1a;解法二&#xff1a; CVE-2023-23752 是一个影响 Joomla CMS 的未授权路径遍历漏洞。该漏洞出现在 Joomla 4.0.0 至 4.2.7 版本中&#xff0c;允许未经认证的远程攻击者通过特定 API 端…

AI 写作(一):开启创作新纪元(1/10)

一、AI 写作&#xff1a;重塑创作格局 在当今数字化高速发展的时代&#xff0c;AI 写作正以惊人的速度重塑着创作格局。AI 写作在现代社会中占据着举足轻重的地位&#xff0c;发挥着不可替代的作用。 随着信息的爆炸式增长&#xff0c;人们对于内容的需求日益旺盛。AI 写作能够…

快速构建数据产品原型 —— 我用 VChart Figma 插件

快速构建数据产品原型 —— 我用 VChart Figma 插件 10 种图表类型、24 种内置模板类型、丰富的图表样式配置、自动生成图表实现代码。VChart Figma 插件的目标是提供 便捷好用 & 功能丰富 & 开发友好 的 figma 图表创建能力。目前 VChart 插件功能仍在持续更新中&…

源鲁杯 2024 web(部分)

[Round 1] Disal F12查看: f1ag_is_here.php 又F12可以发现图片提到了robots 访问robots.txt 得到flag.php<?php show_source(__FILE__); include("flag_is_so_beautiful.php"); $a$_POST[a]; $keypreg_match(/[a-zA-Z]{6}/,$a); $b$_REQUEST[b];if($a>99999…

【ArcGIS】绘制各省碳排放分布的中国地图

首先&#xff0c;准备好各省、自治区、直辖市及特别行政区&#xff08;包括九段线&#xff09;的shp文件&#xff1a; 通过百度网盘分享的文件&#xff1a;GS&#xff08;2022&#xff09;1873 链接&#xff1a;https://pan.baidu.com/s/1wq8-XM99LXG_P8q-jNgPJA 提取码&#…

C++《list的模拟实现》

在上一篇C《list》专题当中我们了解了STL当中list类当中的各个成员函数该如何使用&#xff0c;接下来在本篇当中我们将试着模拟实现list&#xff0c;在本篇当中我们将通过模拟实现list过程中深入理解list迭代器和之前学习的vector和string迭代器的不同&#xff0c;接下来就开始…

讲讲⾼可用的原则?

大家好&#xff0c;我是锋哥。今天分享关于【讲讲⾼可用的原则&#xff1f;】面试题。希望对大家有帮助&#xff1b; 讲讲⾼可用的原则&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在当今信息化时代&#xff0c;随着互联网技术的快速发展&#xff0…

003-Kotlin界面开发之声明式编程范式

概念本源 在界面程序开发中&#xff0c;有两个非常典型的编程范式&#xff1a;命令式编程和声明式编程。命令式编程是指通过编写一系列命令来描述程序的运行逻辑&#xff0c;而声明式编程则是通过编写一系列声明来描述程序的状态。在命令式编程中&#xff0c;程序员需要关心程…

Ubuntu 20.04 部署向量数据库 Milvus + Attu

前言 最开始在自己的办公电脑&#xff08;无显卡的 windows 10 系统&#xff09; 上使用 Docker Desktop 部署了 Milvus 容器&#xff0c;方便的很&#xff0c; 下载 Attu 也很方便&#xff0c;直接就把这个向量数据库通过 Attu 这个图形化界面跑了起来&#xff0c;使用起来感…

Linux(inode + 软硬链接 图片+大白话)

后面也会持续更新&#xff0c;学到新东西会在其中补充。 建议按顺序食用&#xff0c;欢迎批评或者交流&#xff01; 缺什么东西欢迎评论&#xff01;我都会及时修改的&#xff01; 在这里真的很感谢这位老师的教学视频让迷茫的我找到了很好的学习视频 王晓春老师的个人空间…

CM API方式设置YARN队列资源

简述 对于CDH版本我们可以参考Fayson的文章,本次是CDP7.1.7 CM7.4.4 ,下面只演示一个设置队列容量百分比的示例,其他请参考cloudera官网。 获取cookies文件 生成cookies.txt文件 curl -i -k -v -c cookies.txt -u admin:admin http://192.168.242.100:7180/api/v44/clusters …

【Linux】简易版shell

文章目录 shell的基本框架PrintCommandLineGetCommandLineParseCommandLineExecuteCommandInitEnvCheckAndExecBuildCommand代码总览运行效果总结 shell的基本框架 要写一个命令行我们首先要写出基本框架。 打印命令行获取用户输入的命令分析命令执行命令 基本框架的代码&am…

基于MySQL的企业专利数据高效查询与统计实现

背景 在进行产业链/产业评估工作时&#xff0c;我们需要对企业的专利进行评估&#xff0c;其中一个重要指标是统计企业每一年的专利数量。本文基于MySQL数据库&#xff0c;通过公司名称查询该公司每年的专利数&#xff0c;实现了高效的专利数据统计。 流程 项目流程概述如下&…