基于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开发板(如STM32F103C8T6)
-
DHT22温湿度传感器
-
YL-69土壤湿度传感器
-
光敏电阻
-
ESP8266 Wi-Fi模块
-
OLED显示屏(SSD1306)
-
加热片、风扇、灯和水泵
- 连接方式:
-
DHT22: 数据引脚连接至STM32的数字输入引脚,VCC和GND分别连接至电源。
-
YL-69: 直接连接至STM32的模拟输入引脚。
-
光敏电阻: 通过分压电路连接至STM32的模拟输入引脚。
-
ESP8266: 通过UART接口连接至STM32。
-
OLED: 通过I2C接口连接至STM32。
软件环境搭建
-
IDE选择: 使用STM32CubeIDE进行代码编写和调试。
-
库文件: 导入所需的库文件,包括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秒更新一次
}
时序图
5. 项目总结
本项目针对现代农业的需求,设计并实现了一个基于STM32的智能大棚系统。该系统通过实时监测和自动控制环境参数,如温度、湿度、土壤湿度和光照强度,极大地提高了作物生长的环境适应性和农业生产效率。通过结合传感器、控制器、显示模块及Wi-Fi通信技术,项目不仅展示了现代农业智能化的实现路径,也为相关领域的研究和应用提供了参考。
项目的主要功能包括:
-
环境监测: 系统集成了DHT22温湿度传感器、YL-69土壤湿度传感器及光敏电阻,能够实时获取环境的关键参数,为后续的环境调节提供数据支持。
-
智能控制: 根据设定的阈值,系统能够自动控制加热片、风扇、灯光和水泵,从而在不同的环境条件下自动调节大棚内的微气候,为植物提供最佳的生长环境。
-
数据展示: 通过OLED显示屏,实时展示温湿度、土壤湿度和光照强度等重要数据,便于用户直观地监控环境变化。
-
远程监控: 利用ESP8266模块,系统能够将实时数据上传至手机APP,用户可以随时随地进行远程监控和管理,提高了对大棚环境的响应速度和管理效率。