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

基于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(); // 初始化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.kler.cn/a/380112.html

相关文章:

  • 高德地图美食
  • MySQL45讲 第十四讲 count(*)这么慢,我该怎么办?
  • 物联网赋能的人工智能图像检测系统
  • 操作系统(10) (并发(2)------基于软件/硬件/操作系统层面解决两个进程之间的临界区问题/抢占式/非抢占式内核)
  • GitHub上传自己的项目
  • 计算机毕业设计——ssm基于JAVA的求职招聘网站的设计与实现演示录像 2021
  • Vue前端开发:元素动画效果之过渡动画
  • selinux和防火墙
  • 音频中sample rate是什么意思?
  • 为什么 5g 物理信道 采用不同的调制方式
  • ubuntu20.04 加固方案-检查是否设置登录超时
  • 【解决办法】无法使用右键“通过VSCode打开文件夹”
  • Linux云计算个人学习总结(二)
  • 宝顶白芽,慢生活的味觉盛宴
  • elastic search查找字段的方法
  • 考研要求掌握的C语言程度(插入排序)
  • 15分钟学 Go 第 36 天:Go的反射基础
  • 【K8S系列】Kubernetes 中 Service 的流量不均匀问题【已解决】
  • 江协科技STM32学习- P34 I2C通信外设
  • 统信UOS适配C#
  • 华为配置WLAN跨VLAN的三层漫游示例
  • LeetCode 热题100(七)【链表】(1)
  • 友思特应用 | FantoVision边缘计算:多模态传感+AI算法=新型非接触式医疗设备
  • Kafka日志记录
  • centos7之LVS-TUNNEL模式
  • 【Linux】安装 SQL Server 命令行工具 mssql-tools18(Ubuntu 22.04)