随着农业自动化和精准农业的发展,温室环境控制系统在现代农业中扮演着越来越重要的角色。温室自动控制系统通过监控温度、湿度、土壤湿度等关键参数,实现自动化控制,调节环境以最优化作物生长条件。本文设计了一个基于STM32微控制器的智能温室自动控制系统,通过传感器实时监测环境参数,并通过自动控制系统(如自动灌溉和空调控制)来调整温室的环境条件。
首先,读取温湿度传感器(DHT11)的数据,并进行显示。
#include "dht11.h"
#include "stm32f1xx_hal.h"
#define DHT11_PIN GPIO_PIN_5
#define DHT11_PORT GPIOB
void DHT11_Init(void) {
// 初始化DHT11传感器
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = DHT11_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(DHT11_PORT, &GPIO_InitStruct);
}
void DHT11_Read(void) {
uint8_t temperature, humidity;
if (DHT11_Get_Data(&temperature, &humidity) == DHT11_OK) {
printf("Temperature: %d C, Humidity: %d %%\n", temperature, humidity);
}
}
通过模拟引脚读取土壤湿度传感器的电压值,并转换为湿度值。
#include "stm32f1xx_hal.h"
#define SOIL_MOISTURE_PIN GPIO_PIN_0
#define SOIL_MOISTURE_PORT GPIOA
void Soil_Moisture_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = SOIL_MOISTURE_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(SOIL_MOISTURE_PORT, &GPIO_InitStruct);
}
uint32_t Soil_Moisture_Read(void) {
uint32_t raw_value = HAL_ADC_GetValue(&hadc1); // 读取ADC值
return raw_value;
}
根据土壤湿度值来判断是否需要启动灌溉系统。
#include "stm32f1xx_hal.h"
#define WATER_PUMP_PIN GPIO_PIN_9
#define WATER_PUMP_PORT GPIOB
void Water_Pump_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = WATER_PUMP_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(WATER_PUMP_PORT, &GPIO_InitStruct);
}
void Water_Pump_Control(uint8_t state) {
if (state) {
HAL_GPIO_WritePin(WATER_PUMP_PORT, WATER_PUMP_PIN, GPIO_PIN_SET);
} else {
HAL_GPIO_WritePin(WATER_PUMP_PORT, WATER_PUMP_PIN, GPIO_PIN_RESET);
}
}
void Irrigate(void) {
uint32_t soil_moisture = Soil_Moisture_Read();
if (soil_moisture < 1000) { // 如果土壤湿度低于设定值
Water_Pump_Control(1); // 启动灌溉
} else {
Water_Pump_Control(0); // 停止灌溉
}
}
OLED显示屏实时显示数据,并在温湿度或土壤湿度异常时触发报警。
#include "oled.h"
void Display_Environment(void) {
char buffer[64];
uint8_t temperature, humidity;
DHT11_Read(&temperature, &humidity);
sprintf(buffer, "Temp: %d C", temperature);
OLED_ShowString(0, 0, buffer);
sprintf(buffer, "Hum: %d %%", humidity);
OLED_ShowString(0, 16, buffer);
uint32_t soil_moisture = Soil_Moisture_Read();
sprintf(buffer, "Soil: %d", soil_moisture);
OLED_ShowString(0, 32, buffer);
}
void Alarm_Trigger(uint8_t condition) {
if (condition) {
OLED_ShowString(0, 48, "ALARM: Abnormal");
// 此处可加入外部报警设备,如蜂鸣器等
}
}
⬇帮大家整理了单片机的资料
包括stm32的项目合集【源码+开发文档】
点击下方蓝字即可领取,感谢支持!⬇
点击领取更多嵌入式详细资料
本文设计并实现了基于STM32的智能温室自动控制系统,系统能够通过传感器实时监控环境数据,并根据数据自动调整温室内的环境。未来的工作可以进一步优化系统算法,加入更多智能决策功能,如智能预测灌溉需求、温室大棚内气候的自动调整等,提升系统的智能化和自动化程度。同时,可以通过无线通信模块将数据上传至云平台,支持远程监控和控制。