基于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,用户可以随时随地进行远程监控和管理,提高了对大棚环境的响应速度和管理效率。

### 基于STM32单片机环境监测管理系统的设计方案 #### 系统概述 基于STM32单片机环境监测管理系统是一种集成了多种传感器和通信技术的综合解决方案。该系统不仅能够实时监测环境参数(如温度、湿度、光照强度),还能根据预设条件采取自动化控制措施,并支持远程数据传输和可视化展示。 #### 功能模块分析 1. **环境监测功能** STM32单片机作为核心控制器,连接各类传感器用于采集环境数据。例如,DHT11温湿度传感器可测量空气中的温度和湿度;BH1750光强传感器可用于获取光照强度信息[^1]。通过ADC转换接口读取模拟信号并将其实时显示在LCD屏幕上或上传至上位机。 2. **自动控制机制** 当检测到某些环境指标超出安全范围时,系统会启动对应的响应策略。比如,在温室农业场景下,如果土壤水分不足,则激活水泵进行浇水作业;当室内光线较暗时打开补光灯等设备来改善作物生长条件[^2]。 3. **无线通讯能力** 利用NB-IoT BC26模组或者ESP8266 WiFi芯片建立网络链接,使得所收集的信息可以通过互联网传递给远端服务器存储起来供后续查询使用。此外还允许用户借助移动终端应用程序访问最新状态报告以及下达指令改变现场设置情况。 4. **软件架构设计** 针对硬件资源有限但又追求高效性能表现的需求特点,在编写程序过程中采用了面向对象编程思想——即把外设驱动抽象成一个个类定义出来后再实例化调用相应方法完成特定任务操作。对于GPIO口的操作则遵循HAL库规范,利用结构体指针形式简化复杂度的同时增强了移植性和维护便利性[^3]。 5. **异常处理告警通知** 如果发生紧急事件(如老人摔倒),除了记录相关日志之外还会立即向指定联系人发起语音通话请求同时附带短消息描述具体情况以便及时获得援助[^4]。 以下是部分关键代码片段: ```c // 初始化 GPIO 口函数示例 void GPIO_Init(void){ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); GPIOD->MODER &= ~(3 << 2*LED_PIN); GPIOD->MODER |= (1 << 2*LED_PIN); // 设置为输出模式 } // 定义延时函数 __inline void delay_ms(uint32_t ms){ while(ms--){ __asm volatile ("nop"); } } ``` 上述C语言代码展示了如何初始化一个简单的LED指示灯电路并通过循环实现基本的时间延迟效果。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客小张

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值