基于STM32的智慧农业大棚监测系统设计(代码+原理图+全部资料)
本文设计了一种基于STM32F103C8T6的智慧农业大棚监测系统。该系统能够采集大棚内的光照强度、二氧化碳浓度、空气温湿度和土壤湿度等环境参数,将数据显示在0.96寸OLED显示屏上,并通过ESP8266(WiFi模块)上传到手机APP(机智云)。系统具备自动控制和APP远程控制两种模式,可根据环境参数自动调节大棚内的设备,也可通过手机APP或PCB板上按键进行手动控制。通过实际测试,系统运行稳
基于STM32的智慧农业大棚监测系统设计
摘要:本文设计了一种基于STM32F103C8T6的智慧农业大棚监测系统。该系统能够采集大棚内的光照强度、二氧化碳浓度、空气温湿度和土壤湿度等环境参数,将数据显示在0.96寸OLED显示屏上,并通过ESP8266(WiFi模块)上传到手机APP(机智云)。系统具备自动控制和APP远程控制两种模式,可根据环境参数自动调节大棚内的设备,也可通过手机APP或PCB板上按键进行手动控制。通过实际测试,系统运行稳定,能够满足智慧农业大棚的监测和控制需求。
关键词:STM32;智慧农业大棚;环境监测;自动控制;远程控制
一、引言
随着农业现代化的推进,智慧农业成为农业发展的重要方向。智慧农业大棚作为智慧农业的重要组成部分,能够实现对大棚内环境参数的实时监测和自动控制,提高农作物的产量和质量。STM32微控制器具有高性能、低功耗、丰富的外设接口等优点,广泛应用于各种嵌入式系统中。本文设计了一种基于STM32F103C8T6的智慧农业大棚监测系统,旨在实现对大棚内环境的实时监测和智能化控制。
二、系统总体设计
2.1 系统架构
本系统主要由STM32F103C8T6微控制器、传感器模块、执行器模块、0.96寸OLED显示屏、ESP8266(WiFi模块)和手机APP(机智云)组成。系统架构如图1所示。
<img src="https://example.com/system_architecture_agriculture.png" />
2.2 功能需求
- 环境参数采集:采集大棚内的光照强度、二氧化碳浓度、空气温湿度和土壤湿度等环境参数。
- 数据显示:将采集到的环境参数显示在0.96寸OLED显示屏上。
- 数据上传:通过ESP8266(WiFi模块)将环境参数上传到手机APP(机智云)。
- 控制模式:具备自动控制和APP远程控制两种模式。
- 自动控制模式:根据环境参数自动调节大棚内的设备,如温度低于设置阈值开启加热片,湿度高于设置阈值开启风扇等。
- APP远程控制模式:通过手机APP界面上的控制按钮或PCB板上按键来控制LED灯、风扇、水泵、加热片等开关。
- 报警功能:当任意参数超出阈值时,蜂鸣器报警。
三、硬件设计
3.1 STM32F103C8T6微控制器
STM32F103C8T6是一款基于ARM Cortex-M3内核的32位微控制器,具有64KB的Flash存储器和20KB的SRAM,工作频率可达72MHz。它拥有丰富的外设接口,如GPIO、USART、ADC、PWM等,能够满足系统的需求。
3.2 传感器模块
- 光照强度传感器:选用BH1750传感器,通过I2C接口与STM32通信,能够精确测量光照强度。
- 二氧化碳传感器:选用MH-Z19传感器,通过UART接口与STM32通信,可实时检测二氧化碳浓度。
- 空气温湿度传感器:选用DHT11传感器,通过单总线接口与STM32通信,能够同时测量空气温度和湿度。
- 土壤湿度传感器:选用YL-69土壤湿度传感器,通过模拟输出接口与STM32的ADC引脚连接,可测量土壤湿度。
3.3 执行器模块
- LED灯:用于补充大棚内的光照,通过PWM信号控制其亮度。
- 风扇:用于调节大棚内的空气湿度和二氧化碳浓度,通过继电器控制其开关。
- 水泵:用于灌溉,通过继电器控制其开关。
- 加热片:用于提高大棚内的温度,通过继电器控制其开关。
- 蜂鸣器:用于报警,当环境参数超出阈值时发出警报。
3.4 0.96寸OLED显示屏
选用0.96寸OLED显示屏,通过I2C接口与STM32通信,用于显示当前的环境参数和系统状态。
3.5 ESP8266(WiFi模块)
ESP8266是一款低功耗的WiFi模块,通过UART接口与STM32通信,用于将环境参数上传到手机APP(机智云)。
3.6 PCB板设计
设计PCB板,将STM32F103C8T6微控制器、传感器模块、执行器模块、0.96寸OLED显示屏和ESP8266(WiFi模块)等集成在一起,实现系统的硬件连接。
四、软件设计
4.1 开发环境
本系统采用Keil uVision作为开发环境,使用C语言进行编程。
4.2 软件架构
软件架构主要包括初始化模块、传感器数据采集模块、数据显示模块、数据上传模块、控制算法模块、按键处理模块和报警模块等部分。
- 初始化模块:负责初始化STM32F103C8T6微控制器的各个外设,如GPIO、USART、ADC、PWM、I2C等,以及传感器模块、执行器模块、0.96寸OLED显示屏和ESP8266(WiFi模块)等。
- 传感器数据采集模块:负责实时采集光照强度、二氧化碳浓度、空气温湿度和土壤湿度等环境参数,并进行滤波和校准处理。
- 数据显示模块:负责将采集到的环境参数显示在0.96寸OLED显示屏上。
- 数据上传模块:负责通过ESP8266(WiFi模块)将环境参数上传到手机APP(机智云)。
- 控制算法模块:根据环境参数和设置的阈值,执行自动控制算法,如开启或关闭LED灯、风扇、水泵和加热片等。
- 按键处理模块:负责处理PCB板上按键的输入信号,实现手动控制功能。
- 报警模块:当任意参数超出阈值时,触发蜂鸣器报警。
4.3 关键程序实现
- 传感器数据采集
c复制代码
#include "sensor.h" |
|
void Sensor_Init(void) { |
|
BH1750_Init(); |
|
MH_Z19_Init(); |
|
DHT11_Init(); |
|
Soil_Moisture_Init(); |
|
} |
|
float Read_Light_Intensity(void) { |
|
return BH1750_Read(); |
|
} |
|
float Read_CO2_Concentration(void) { |
|
return MH_Z19_Read(); |
|
} |
|
void Read_Air_Temperature_Humidity(float *temperature, float *humidity) { |
|
DHT11_Read(temperature, humidity); |
|
} |
|
float Read_Soil_Moisture(void) { |
|
return Soil_Moisture_Read(); |
|
} |
- 自动控制算法
c复制代码
#include "control.h" |
|
void Auto_Control(float temperature, float humidity, float co2, float light_intensity, float soil_moisture) { |
|
if (temperature < TEMPERATURE_THRESHOLD) { |
|
Heater_On(); |
|
} else { |
|
Heater_Off(); |
|
} |
|
if (humidity > HUMIDITY_THRESHOLD) { |
|
Fan_On(); |
|
} else { |
|
Fan_Off(); |
|
} |
|
if (co2 > CO2_THRESHOLD) { |
|
Fan_On(); |
|
} else { |
|
Fan_Off(); |
|
} |
|
if (light_intensity < LIGHT_INTENSITY_THRESHOLD) { |
|
LED_On(); |
|
} else { |
|
LED_Off(); |
|
} |
|
if (soil_moisture < SOIL_MOISTURE_THRESHOLD) { |
|
Pump_On(); |
|
} else { |
|
Pump_Off(); |
|
} |
|
} |
- 数据上传
c复制代码
#include "esp8266.h" |
|
void ESP8266_Init(void) { |
|
// 初始化ESP8266模块 |
|
} |
|
void ESP8266_Send_Data(char *data) { |
|
// 通过ESP8266模块发送数据到机智云 |
|
} |
- 按键处理
c复制代码
#include "key.h" |
|
void Key_Init(void) { |
|
// 初始化按键 |
|
} |
|
void Key_Scan(void) { |
|
if (Key1_Pressed()) { |
|
// 按键1按下,切换LED灯状态 |
|
Toggle_LED_State(); |
|
} |
|
// 处理其他按键的输入信号 |
|
} |
五、系统测试与优化
5.1 系统测试
系统测试是验证智慧农业大棚监测系统设计是否满足预期功能需求和性能指标的重要环节。测试内容包括硬件测试和软件测试两个方面。
-
硬件测试
- 传感器测试:测试光照强度传感器、二氧化碳传感器、空气温湿度传感器和土壤湿度传感器的测量精度和响应速度,确保能够准确采集环境参数。
- 执行器测试:测试LED灯、风扇、水泵和加热片的工作性能,确保能够准确执行控制指令。
- 通信测试:测试ESP8266(WiFi模块)的通信稳定性和数据传输速度,确保能够可靠地将环境参数上传到手机APP(机智云)。
- 显示测试:测试0.96寸OLED显示屏的显示效果,确保能够清晰显示环境参数和系统状态。
-
软件测试
- 功能测试:测试系统的各项功能是否正常工作,如环境参数采集、数据显示、数据上传、自动控制和手动控制等。
- 性能测试:测试系统的响应时间、稳定性、可靠性等性能指标,确保系统能够在各种环境下稳定运行。
- 兼容性测试:测试系统与不同品牌和型号的手机、WiFi网络的兼容性,确保系统能够广泛应用于各种场景。
5.2 系统优化
在测试过程中,可能会发现系统的某些部分存在性能瓶颈或不足。针对这些问题,可以对系统进行优化和改进。例如:
- 优化控制算法:根据测试结果调整控制算法参数,提高控制精度和响应速度。
- 改进硬件设计:优化电路布局和布线,减少电磁干扰和信号衰减,提高系统的稳定性和可靠性。
- 增加故障检测与恢复机制:在系统中增加故障检测与恢复机制,当系统出现故障时能够自动检测并尝试恢复,提高系统的可用性。
- 优化通信协议:根据实际需求优化通信协议,减少数据传输量和传输时间,提高通信效率。
六、手机APP设计
6.1 APP功能
手机APP(机智云)主要用于实现与智慧农业大棚监测系统的远程通信和控制。APP功能包括:
- 实时数据查看:用户可以实时查看大棚内的光照强度、二氧化碳浓度、空气温湿度和土壤湿度等环境参数。
- 远程控制:用户可以通过APP界面上的控制按钮远程控制LED灯、风扇、水泵和加热片的开关。
- 阈值设置:用户可以在APP上设置环境参数的阈值,如温度阈值、湿度阈值、二氧化碳阈值等。
- 历史数据查询:用户可以查询大棚内环境参数的历史数据,了解大棚内环境的变化趋势。
6.2 APP开发
APP开发可以采用机智云提供的开发平台和工具,结合Android Studio或Xcode等开发工具进行开发。APP与智慧农业大棚监测系统通过WiFi进行通信,需要实现数据接收、发送和控制指令解析等功能。
七、结论
本文设计了一种基于STM32F103C8T6的智慧农业大棚监测系统,该系统能够实时采集大棚内的环境参数,将数据显示在0.96寸OLED显示屏上,并通过ESP8266(WiFi模块)上传到手机APP(机智云)。系统具备自动控制和APP远程控制两种模式,可根据环境参数自动调节大棚内的设备,也可通过手机APP或PCB板上按键进行手动控制。通过实际测试,系统运行稳定,能够满足智慧农业大棚的监测和控制需求。未来,可以进一步优化系统性能,增加更多的功能和传感器,提高智慧农业大棚的智能化水平。
#include "exti.h"
void GPIO_CONFIG(void)
{
RCC_APB2PeriphClockCmd(LED0_APB2Periph,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = LED0_GPIO_Pin;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED0_PORT,&GPIO_InitStruct);
GPIO_SetBits(LED0_PORT,LED0_GPIO_Pin);
// RCC_APB2PeriphClockCmd(LED1_APB2Periph,ENABLE);
// GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
// GPIO_InitStruct.GPIO_Pin = LED1_GPIO_Pin;
// GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_Init(LED1_PORT,&GPIO_InitStruct);
// RCC_APB2PeriphClockCmd(KEY1_APB2Periph,ENABLE);
// GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
// GPIO_InitStruct.GPIO_Pin = KEY1_GPIO_Pin;
// GPIO_Init(KEY1_PORT,&GPIO_InitStruct);
//
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
//
// GPIO_EXTILineConfig(KEY1_GPIO_PortSource,KEY1_GPIO_PinSource);
//
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
//
// NVIC_InitTypeDef NVIC_InitStruct;
// NVIC_InitStruct.NVIC_IRQChannel = KEY1_NVIC_IRQChannel;
// NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
// NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
// NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
// NVIC_Init(&NVIC_InitStruct);
//
// EXTI_InitTypeDef EXTI_InitStruct;
// EXTI_InitStruct.EXTI_Line = KEY1_EXTI_Line;
// EXTI_InitStruct.EXTI_LineCmd = ENABLE;
// EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
// EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
// EXTI_Init(&EXTI_InitStruct);
//
//
// RCC_APB2PeriphClockCmd(KEY0_APB2Periph,ENABLE);
// GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
// GPIO_InitStruct.GPIO_Pin = KEY0_GPIO_Pin;
// GPIO_Init(KEY0_PORT,&GPIO_InitStruct);
//
//
// GPIO_EXTILineConfig(KEY0_GPIO_PortSource,KEY0_GPIO_PinSource);
//
// NVIC_InitStruct.NVIC_IRQChannel = KEY0_NVIC_IRQChannel;
// NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
// NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
// NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
// NVIC_Init(&NVIC_InitStruct);
// EXTI_InitStruct.EXTI_Line = KEY0_EXTI_Line;
// EXTI_InitStruct.EXTI_LineCmd = ENABLE;
// EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
// EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;
// EXTI_Init(&EXTI_InitStruct);
}
更多推荐
所有评论(0)