Поскольку внимание людей к здоровому и устойчивому образу жизни продолжает расти, овощные теплицы стали важной частью современного сельского хозяйства. Овощные теплицы обеспечивают контролируемую среду, которая позволяет фермерам выращивать овощи в любое время года и корректировать их по мере необходимости. Для оптимального роста овощей и получения урожая решающее значение имеет точный контроль условий окружающей среды, таких как температура и влажность.
Традиционное управление овощными теплицами обычно основано на ручном мониторинге и регулировании. У этого метода есть некоторые проблемы. Например, ручной мониторинг подвержен ошибкам и задержкам, а для крупных овощных теплиц объем ручной настройки огромен. Поэтому стало очень важным разработать решение по управлению температурой и влажностью для овощных теплиц на основе интеллектуальной системы управления.
Интеллектуальная система управления температурой и влажностью в овощной теплице на базе микроконтроллера STM32 используется для решения проблем традиционных методов управления и обеспечения автоматизированного решения. Система использует мощные вычислительные и управляющие возможности микроконтроллера STM32 в сочетании с датчиками и исполнительными механизмами температуры и влажности для достижения точного мониторинга и контроля окружающей среды в теплице.
С помощью этой системы фермеры могут контролировать температуру и влажность в овощных теплицах в режиме реального времени и автоматически регулировать ее в соответствии с заданным целевым диапазоном. Система может автоматически управлять таким оборудованием, как обогреватели, вентиляционное оборудование и увлажнители воздуха в теплице, для поддержания оптимальных условий выращивания. Цель проекта — повысить эффективность производства и качество овощных теплиц, снизить энергопотребление и снизить трудозатраты. Благодаря применению интеллектуальных систем управления фермеры могут добиться более устойчивого и эффективного сельскохозяйственного производства и обеспечить общество более здоровой овощной продукцией.
Выбор оборудования является важной частью проектирования интеллектуальной системы контроля температуры и влажности для овощных теплиц.
[1] Основной чип управления: STM32F103ZET6 В основном чипе управления используется STM32F103ZET6, который представляет собой высокопроизводительный микроконтроллер с ядром ARM Cortex-M3 с богатыми периферийными ресурсами и мощными вычислительными возможностями. Этот чип может удовлетворить требования этого проекта к управлению и обработке данных.
[2] Датчик температуры и влажности: DHT11 Датчик DHT11 используется для измерения температуры и влажности воздуха. Он использует цифровой выходной сигнал, отличается простотой, низкой стоимостью и хорошей точностью и подходит для мониторинга температуры и влажности в теплицах.
【3】Датчик влажности почвы: Датчик влажности почвы Датчик влажности почвы используется для сбора данных о влажности почвы, а данные о влажности почвы собираются через интерфейс аналого-цифрового преобразователя (АЦП). Датчик может точно измерять влажность почвы и обеспечивать необходимую поливную воду для сельскохозяйственных культур.
[4] Вентилятор: небольшой вентилятор 5 В + реле. Для обеспечения управления вентиляцией в качестве вентиляционного устройства выбирается небольшой вентилятор 5 В, а его состояние включения/выключения контролируется с помощью реле. В соответствии с данными о температуре и установленным пороговым значением верхний и нижний уровни реле контролируются через порт GPIO STM32 для реализации управления запуском и остановкой вентиляционного вентилятора.
【5】Освещение: светодиодный модуль белого света. Чтобы обеспечить соответствующие условия освещения, в качестве осветительного устройства выбирается светодиодный модуль белого света. Этот модуль использует порт GPIO STM32 для управления состоянием своего переключателя, включая и выключая свет.
【6】Оросительная система: насосный двигатель + реле. Оросительная система использует насосный двигатель в качестве источника воды и контролирует его открытие и закрытие через реле. Рабочее состояние насосного двигателя контролируется микроконтроллером, контролирующим высокий и низкий уровни реле для реализации автоматизированной работы ирригационной системы.
【7】Модуль дисплея: ЖК-дисплей. Чтобы облегчить пользователю наблюдение за текущей температурой, влажностью и другими данными, для отображения данных выбирается ЖК-дисплей. Общайтесь с ЖК-дисплеем через цифровой интерфейс STM32 и отображайте собранные данные на экране в режиме реального времени.
Идеи дизайна кода для этого проекта можно разделить на следующие ключевые части:
【1】Настройки инициализации: сначала необходимо выполнить настройки инициализации основного чипа управления, включая конфигурацию контактов, настройки часов и т. д. При этом ЖК-дисплей также необходимо инициализировать и настроить для последующего отображения данных.
【2】Сбор данных датчиков: используйте соответствующие библиотечные функции или коды для считывания данных с датчика DHT11 и датчика влажности почвы. Общайтесь с основным чипом управления через соответствующие интерфейсы для получения значений температуры, влажности и влажности почвы.
【3】Обработка и оценка данных: Выполните соответствующую обработку данных и оценку на основе собранных значений температуры, влажности и влажности почвы. Определить, превышает ли текущая температура заданный диапазон, и находится ли влажность почвы ниже установленного порога и т. д.
【4】Управление исполнительными механизмами: на основе результатов обработки и оценки данных управляйте соответствующими исполнительными механизмами, такими как вентиляторы, освещение и ирригационные системы. При установке соответствующего уровня контакта или срабатывании реле привод включается или выключается.
【5】ЖК-дисплей: собранные значения температуры, влажности и влажности почвы отображаются на ЖК-дисплее, чтобы пользователи могли контролировать их в режиме реального времени.
【6】Взаимодействие с пользователем: пользователь взаимодействует с системой посредством ввода с клавиатуры или другими методами. Установите пороговые значения влажности почвы, отрегулируйте диапазоны температур и многое другое.
[7] Работа в контуре: Организуйте вышеуказанные шаги в программу работы в контуре, чтобы обеспечить возможность системы непрерывно собирать данные, обрабатывать решения и контролировать работу привода.
Считайте температуру и влажность окружающей среды с датчика DHT11 и распечатайте их через последовательный порт.
#include "stm32f10x.h"
#include "stdio.h"
// Определить DHT11данные пины
#define DHT11_PIN GPIO_Pin_0
#define DHT11_PORT GPIOA
// Функция инициализации DHT11
void DHT11_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// Включить часы GPIOA
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// Конфигурация Вывод DHT11 — двухтактный выход.
GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DHT11_PORT, &GPIO_InitStructure);
}
// Функция задержки, единица измерения — микросекунды.
void Delay_us(uint32_t nCount)
{
uint32_t i;
for(i=0; i<nCount; i++);
}
// Функция программной задержки, единица измерения — миллисекунды.
void Delay_ms(uint32_t nCount)
{
uint32_t i;
for(i=0; i<nCount*1000; i++);
}
// Чтение одного бита из DHT11
uint8_t DHT11_ReadBit(void)
{
uint8_t retries = 0;
while(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == Bit_RESET)
{
if (retries++ > 100) return 0;
Delay_us(1);
}
Delay_us(40); // Задержка 40 мкс
if (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == Bit_SET)
retries = 100; // флаг тайм-аута
else
retries = 0;
while(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == Bit_SET)
{
if (retries++ > 100) return 0;
Delay_us(1);
}
return 1;
}
// Прочитайте байт из данных DHT11.
uint8_t DHT11_ReadByte(void)
{
uint8_t i, temp = 0;
for(i=0; i<8; i++)
{
temp <<= 1;
temp |= DHT11_ReadBit();
}
return temp;
}
// Прочтите значение температуры и влажности DHT11.
uint8_t DHT11_ReadData(uint8_t* temperature, uint8_t* humidity)
{
uint8_t data[5], checksum;
// Хост переводит шину в низкий уровень минимум на 18 мс.
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DHT11_PORT, &GPIO_InitStructure);
GPIO_ResetBits(DHT11_PORT, DHT11_PIN);
Delay_ms(20);
GPIO_SetBits(DHT11_PORT, DHT11_PIN);
Delay_us(30);
// Установить в режим ввода
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(DHT11_PORT, &GPIO_InitStructure);
// ждать DHT11 ответ
if (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == Bit_RESET)
{
while(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == Bit_RESET);
while(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == Bit_SET);
// Чтение 5 байт данных
for(uint8_t i=0; i<5; i++)
data[i] = DHT11_ReadByte();
// Чтение контрольной суммы
checksum = DHT11_ReadByte();
// 校验данные if((data[0] + data[1] + data[2] + data[3]) != checksum)
return 0;
*humidity = data[0];
*temperature = data[2];
return 1;
}
else
{
return 0;
}
}
// Инициализировать USART1
void USART1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
// Включите часы USART1 и GPIOA.
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
// КонфигурацияUSART1 контакт
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // TX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // RX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// КонфигурацияUSART1
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
// Включить USART1
USART_Cmd(USART1, ENABLE);
}
// Отправка символов в USART1
void USART1_SendChar(char ch)
{
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
USART_SendData(USART1, (uint8_t)ch);
}
// Отправить строку в USART1
void USART1_SendString(const char* str)
{
while(*str)
{
USART1_SendChar(*str++);
}
}
int main(void)
{
uint8_t temperature, humidity;
// Инициализируйте DHT11 и USART1
DHT11_Init();
USART1_Init();
while(1)
{
if (DHT11_ReadData(&temperature, &humidity))
{
// Отправка данных о температуре и влажности на последовательный порт
char buffer[50];
sprintf(buffer, "Temperature: %d°C, Humidity: %d%%\r\n", temperature, humidity);
USART1_SendString(buffer);
}
Delay_ms(2000); // Чтение данных раз в 2 секунды
}
}
Загрузите код на плату разработки STM32F103ZET6 и подключите ее к DHT11. При успешной работе данные о температуре и влажности окружающей среды будут распечатаны через последовательный порт USART1.
Соберите значение влажности датчика почвы через канал 1 АЦП1 и распечатайте его в последовательный порт.
#include "stm32f10x.h"
#include "stdio.h"
// функция声明
void ADC_Configuration(void);
void UART_Configuration(void);
void USART1_SendChar(char ch);
int main(void)
{
// Инициализируйте АЦП и последовательный порт
ADC_Configuration();
UART_Configuration();
while (1)
{
// Начать преобразование АЦП
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
// преобразование ожидания завершено
while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
// Чтение значения АЦП
uint16_t adcValue = ADC_GetConversionValue(ADC1);
// Преобразование значения АЦП в процент влажности
float humidity = (float)adcValue / 4095 * 100;
// Распечатать значение влажности в последовательный порт
char buffer[20];
sprintf(buffer, "Humidity: %.2f%%\r\n", humidity);
for (int i = 0; buffer[i] != '\0'; i++)
{
USART1_SendChar(buffer[i]);
}
// задержаться на некоторое время
for (int i = 0; i < 1000000; i++);
}
}
// ADCКонфигурация
void ADC_Configuration(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
// Включите тактовую частоту ADC1 и GPIOA.
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);
// КонфигурацияGPIOA.1 — аналоговый вход.
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// ADCКонфигурация
ADC_DeInit(ADC1);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
// Канал 1 конфигурацииADC1 является каналом выборки.
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);
// Включить АЦП1
ADC_Cmd(ADC1, ENABLE);
// Калибровка АЦП
ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while (ADC_GetCalibrationStatus(ADC1));
}
// последовательный порт Конфигурация
void UART_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
// Включите часы USART1 и GPIOA.
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA,ДАВАТЬ ВОЗМОЖНОСТЬ);
// КонфигурацияUSART1приколоть GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50 МГц;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// USARTКонфигурация
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
// Включить USART1
USART_Cmd(USART1, ENABLE);
}
// Отправка символов в USART1
void USART1_SendChar(char ch)
{
USART_SendData(USART1, (uint8_t)ch);
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}
В приведенном выше коде используетсяSTM32Стандартная библиотекафункцияруководить Конфигурацияи операции。существоватьADC_Configuration
функция中руководитьADCИнициализация Конфигурация,включатьGPIOприколоть Конфигурация、Включение часов АЦП, конфигурация каналов и т. д.
существоватьUART_Configuration
функция中руководитьпоследовательный портUSART1Инициализация Конфигурация,Включая контакты GPIO. Конфигурация, настройки скорости передачи данных и т. д.
В основной функции введите бесконечный цикл. В цикле запустите преобразование АЦП и дождитесь завершения преобразования.
проходитьADC_GetConversionValue
функциячитатьADCРезультат конвертации,Переведите его в процент влажности.。
использоватьsprintf
функция Форматировать значение влажности в виде строки,并использоватьUSART1_SendChar
функция Отправьте строку посимвольно вUSART1последовательный порт。
Используйте функцию задержки для задержки на определенный период времени, чтобы контролировать скорость печати.
Ниже приведен код для использования STM32F103ZET6 для считывания выходной интенсивности света датчиком освещенности BH1750 и управления переключателем заполняющего светодиодного освещения в соответствии с пороговым значением:
#include "stm32f10x.h"
#include "i2c.h"
#include "delay.h"
#define BH1750_ADDRESS 0x23
void BH1750_Init()
{
// Инициализируйте шину I2C
I2C_Init();
}
void BH1750_Start()
{
// Запуск измерения BH1750
uint8_t cmd = 0x01; // Режим одиночного кадра с высоким разрешением
I2C_Start();
I2C_SendByte(BH1750_ADDRESS);
I2C_WaitAck();
I2C_SendByte(cmd);
I2C_WaitAck();
I2C_Stop();
}
uint16_t BH1750_Read()
{
// Прочитайте результаты измерений BH1750
uint16_t lux;
I2C_Start();
I2C_SendByte(BH1750_ADDRESS + 1); // Отправить команду чтения
I2C_WaitAck();
lux = I2C_ReceiveByte() << 8; // Прочитать старший байт
I2C_Ack();
lux |= I2C_ReceiveByte(); // Прочитать младший байт
I2C_NAck();
I2C_Stop();
return lux;
}
void LED_Control(uint8_t state)
{
// Управляющий светодиодный выключатель освещения
if (state)
GPIO_SetBits(GPIOA, GPIO_Pin_8); // Включите светодиод
else
GPIO_ResetBits(GPIOA, GPIO_Pin_8); // Выключить светодиод
}
int main(void)
{
// Инициализируйте порт GPIO
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// Инициализируйте датчик BH1750
BH1750_Init();
while (1)
{
// Начать измерение
BH1750_Start();
// Измерение задержки завершено
DelayMs(200);
// Прочтите интенсивность света
uint16_t lux = BH1750_Read();
// Определить порог и управлять светодиодом
if (lux > 1000)
LED_Control(1); // Интенсивность света выше порога,Включите светодиод
else
LED_Control(0); // Интенсивность света ниже порога,Выключить светодиод
}
}
в коде Инициализируйте шину I2CиBH1750датчик,проходитьBH1750_Init()
функциявыполнить。существовать主循环中,Начать измерение Измерение задержки завершено。использоватьBH1750_Read()
функциячитать测量结果,Это интенсивность света. Определите, превышает ли интенсивность света установленное значение на основе порогового значения.,проходитьLED_Control()
функцияконтрольLEDстатус переключения。
В данном проекте реализована интеллектуальная система контроля температуры и влажности овощных теплиц на базе микроконтроллера STM32. В качестве основного управляющего чипа системы используется STM32F103ZET6, который используется для контроля и координации работы каждого аппаратного модуля. Система включает в себя модуль измерения температуры и влажности воздуха (DHT11), модуль измерения влажности почвы (интерфейс ADC), вентиляционный вентилятор (маленький вентилятор 5 В + релейное управление), освещение (модуль светодиодного белого света), систему орошения (двигатель насоса + релейное управление). и ЖК-дисплей.
В функции системы входит мониторинг температуры и влажности в режиме реального времени, определение влажности почвы, автоматическое управление вентиляторами, автоматическое управление системами орошения и отображение данных. Установите порог влажности почвы, нажав кнопку, чтобы реализовать функцию автоматического полива. Когда влажность почвы ниже порогового значения, система автоматически включает систему орошения для полива. При этом, в соответствии с установленным температурным порогом, система автоматически управляет вентилятором вентиляции для охлаждения.
Интеллектуальная система управления температурой и влажностью в овощной теплице использует микроконтроллеры STM32 и различные датчики для мониторинга и контроля параметров окружающей среды, что повышает автоматизацию и эффективность производства овощной теплицы. В то же время, благодаря автоматическому управлению системами орошения и вентиляции, оно может лучше удовлетворять потребности выращивания овощей и повышать урожайность и качество сельскохозяйственных культур.