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

在这里插入图片描述


一、项目概述

在现代农业中,智能大棚能够通过环境监测、数据分析和自动控制等技术手段,实现对作物生长环境的精细化管理。本项目旨在设计一个基于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(); // 初始化GPIOMX_I2C1_Init(); // 初始化I2CMX_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);// 发送数据到ESP8266sendDataToESP8266(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.mzph.cn/news/884780.shtml

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

相关文章

详解CRC校验原理以及FPGA实现

文章目录 一、什么是CRC校验&#xff1f;二、实现CRC校验原理以及步骤2.1 用多项式表示二元码数据2.2 选择一个生成多项式作为校验2.3 计算CRC校验码 三、CRC判断数据是否错误的原理以及步骤3.1 将收到的数据与生成多项式求余3.2 数据发生错误再进行CRC校验判断 四、FPGA实现CR…

大模型学习笔记------CLIP模型解读与思考

大模型学习笔记------CLIP模型解读与思考 1、为什么提出CLIP模型2、CLIP模型详解3、CLIP模型的重要意义 上文已经讲到&#xff0c;我认为多模态的大模型是最有前途的大模型&#xff0c;首先学习的就是CLIP这个模型。 CLIP&#xff08;Contrastive Language-Image Pretraining&…

《IMM交互式多模型滤波MATLAB实践》专栏目录,持续更新……

专栏链接&#xff1a;https://blog.csdn.net/callmeup/category_12816762.html 专栏介绍 关于IMM的例程 双模型EKF&#xff1a; 【逐行注释】基于CV/CT模型的IMM|MATLAB程序|源代码复制后即可运行&#xff0c;无需下载三模型EKF&#xff1a; 【matlab代码】3个模型的IMM例程&…

【UART异步串口协议及verilog实现】

UART异步串口协议 1 UART1.1 数据格式1.2 波特率 2 UART的发送和接收模块2.1 uart发送模块2.2 uart的接收模块 【博客首发于微信公众号《 漫谈芯片与编程》】 本篇文章介绍常用的芯片外围低速协议&#xff1a;UART&#xff1b; 1 UART UART是异步串行传输协议&#xff0c;即…

TS-AWG控制电光调制器:推动科技应用新发展的利器

一、电光调制有什么用&#xff1f; 如今&#xff0c;基于光学、光子学和脉冲激光以及电光调制器的应用正变得极为流行&#xff0c;最新一代科学家正在为其实际应用开辟新领域&#xff0c;如汽车激光雷达、医疗解决方案、航空航天和国防、量子和激光传感器。 测试挑战、上市时…

ros与mqtt相互转换

vda5050 VDA5050协议介绍 和 详细翻译-CSDN博客 ros与mqtt相互转换 如何转换的&#xff0c;通过某个中转包&#xff0c;获取ros的消息然后以需要的格式转换为mqtt 需要的参数 ros相关 parameters[ (ros_subscriber_type, vda5050_msgs/NodeState), (ros_subscriber_queue…

探讨 | 大模型在传统NLP任务的使用姿势

以chatgpt为起始节点的大模型技术经过了两年左右的发展&#xff0c;大致沉淀了一些较为确定的研究领域。首先是基座大模型的研究&#xff0c;主要是国内外大厂集中大量财力、人力、算力进行大模型军备竞赛&#xff0c;企图将大模型的基础能力&#xff08;包括推理能力&#xff…

C语言 — 指针的进阶

文章目录 前言一、字符指针二、指针数组三、数组指针数组名 与 &数组名 四、指针传参二维数组传参 五、函数指针结语 前言 通过前面的关于指针的学习&#xff0c;我们了解了指针的一些个特性。本篇文章我们将深入指针&#xff0c;挖掘指针更深处的知识。 在开始之前&#…

Ceisum无人机巡检视频投放

公司投标内容有个视频投放的功能动画&#xff0c;原本想实现这么一个效果&#xff1a; 案例效果来自别人的展示作品&#xff0c;Leader一眼就相中了这个效果&#xff0c;可惜别人的终究是别人的&#xff0c;又不会白白给你&#xff0c;终究是要自己动手尝试。 动画方面的展示…

Redis为什么用跳表实现有序集合

Redis为什么用跳表实现有序集合 手写一个跳表 为了更好的回答上述问题以及更好的理解和掌握跳表&#xff0c;这里可以通过手写一个简单的跳表的形式来帮助读者理解跳表这个数据结构。 我们都知道有序链表在添加、查询、删除的平均时间复杂都都是 O(n) 即线性增长&#xff0c…

ubuntu双屏只显示一个屏幕另一个黑屏

简洁的结论&#xff1a; 系统环境 ubuntu22.04 nvidia-535解决方案 删除/etc/X11/xorg.conf 文件 记录一下折腾大半天的问题。 ubuntu系统是22.04,之前使用的时候更新驱动导致桌面崩溃&#xff0c;重新安装桌面安装不上&#xff0c;请IT帮忙&#xff0c;IT一番操作过后也表示…

Docker可视化管理面板DPanel的安装

本文软件由网友 rui 推荐&#xff1b; 什么是 DPanel &#xff1f; DPanel 是一款 Docker 可视化管理面板&#xff0c;旨在简化 Docker 容器、镜像和文件的管理。它提供了一系列功能&#xff0c;使用户能够更轻松地管理和部署 Docker 环境。 软件特点&#xff1a; 可视化管理&…

学习threejs,使用对象组合

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.Object3D 三维物体 二…

企业必备:一合通电子合同

一合通&#xff0c;让合同签署更简单。加密技术保障安全&#xff0c;随时随地可签。助力企业加速业务流程&#xff0c;提高办公效率。 在数字化转型的浪潮中&#xff0c;企业面临着前所未有的机遇与挑战。特别是在人力资源管理和合同签署方面&#xff0c;传统的纸质合同已经难以…

二十二、MySQL 8.0 主从复制原理分析与实战

文章目录 一、复制&#xff08;Replication&#xff09;1、什么是复制2、复制的方式3、复制的数据同步类型3.1、异步复制3.2、半同步复制3.3、设计理念&#xff1a;复制状态机——几乎所有的分布式存储都是这么复制数据的 4、基于binlog位点同步的主从复制原理4.1、异步复制示例…

AAA 数据库事务隔离级别及死锁

目录 一、事务的四大特性&#xff08;ACID&#xff09; 1. 原子性(atomicity)&#xff1a; 2. 一致性(consistency)&#xff1a; 3. 隔离性(isolation)&#xff1a; 4. 持久性(durability)&#xff1a; 二、死锁的产生及解决方法 三、事务的四种隔离级别 0 .封锁协议 …

w~自动驾驶~合集4

我自己的原文哦~ https://blog.51cto.com/whaosoft/12451789 #基于深度学习的端到端自动驾驶 最新的端到端自动驾驶综述刚刚出炉&#xff0c;话说论文一作卡内基梅隆大学的Apoorv Singh今年产出了七篇综述&#xff0c;都和自动驾驶相关&#xff0c;推荐给大家。就一个字&…

【6G 需求与定义】ITU(国际电联)对全球6G标准的愿景

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G技术研究。 博客内容主要围绕…

JVM 类加载器

字节码的结构 魔数u4 cafe babe 版本u4 52 java8 常量池计数器u2 从1开始&#xff0c;0索引留给不需要的情况 常量池 表 #1 -> #计数器-1 类标识符 u2 public final abstrat class annotion interface 之类 类索引u2 名字 父类索引u2 父类名字 接口计数器 u2 接口数…

Sentieon软件快速入门指南

Sentieon软件为完整的纯软件基因变异检测二级分析方案&#xff0c;其分析流程完全忠于BWA、GATK、MuTect2、STAR、Minimap2、Fgbio、picard等金标准的数学模型。在匹配开源流程分析结果的前提下&#xff0c;大幅提升WGS、WES、Panel、UMI、ctDNA、RNA等测序数据的分析效率和检出…