基于STM32的空气质量检测系统设计(程序+原理图+APP)
基于STM32的空气质量检测系统设计


摘要
随着环境污染问题的日益严重,空气质量检测已成为人们关注的焦点。本文设计了一种基于STM32的空气质量检测系统,该系统能够实时采集当前环境下的温湿度、甲醛、PM2.5值,并在采集值超过预设阈值时通过蜂鸣器自动报警。采集到的数据会显示在LCD1602显示屏上,并自动上传至上位机(手机),方便用户随时查看。此外,系统还提供了三个按键,用户可以通过这些按键任意设置报警阈值。
关键词
STM32;空气质量检测;温湿度;甲醛;PM2.5;LCD1602;上位机;报警阈值
目录
一、引言
二、系统总体设计
(一)硬件设计
- 主控制器选型
- 传感器选型
- 显示模块选型
- 通信模块选型
- 报警模块选型
- 按键模块选型
(二)软件设计
- 开发环境选择
- 系统功能划分
- 数据采集与处理
- 报警功能实现
- 数据显示与上传
- 按键设置功能
三、系统硬件实现
(一)主控制器电路
(二)传感器电路
(三)显示模块电路
(四)通信模块电路
(五)报警模块电路
(六)按键模块电路
四、系统软件实现
(一)数据采集与处理程序设计
(二)报警功能程序设计
(三)数据显示与上传程序设计
(四)按键设置功能程序设计
五、系统测试与结果分析
(一)测试环境搭建
(二)功能测试
(三)性能测试
(四)结果分析
六、结论与展望
(一)结论
(二)展望
一、引言
随着工业化和城市化的快速发展,空气质量问题日益凸显,对人们的健康和生活质量产生了严重影响。因此,对空气质量的实时监测显得尤为重要。传统的空气质量检测设备通常体积庞大、价格昂贵,且操作复杂,不适合家庭或小型场所使用。本文设计了一种基于STM32的空气质量检测系统,该系统具有体积小、成本低、操作简便等优点,能够实时监测环境中的温湿度、甲醛、PM2.5等参数,并在参数异常时及时报警,同时支持数据上传至手机,方便用户随时查看。
二、系统总体设计
(一)硬件设计
- 主控制器选型
本系统选用STM32F103C8T6单片机作为主控制器。STM32F103C8T6是一款基于ARM Cortex-M3内核的32位微控制器,具有高性能、低功耗、丰富的外设资源等优点,能够满足本系统的设计要求。
- 传感器选型
- 温湿度传感器:选用DHT11传感器。DHT11是一款数字式温湿度传感器,具有低成本、宽供电电压范围(3V至5.5V)、通过单数据线进行数字信号传输等特点。其温度测量范围为0°C至50°C,湿度测量范围为20%RH至90%RH,适用于一般室内环境监测。
- 甲醛传感器:选用ZE08-CH2O甲醛传感器。该传感器能够实时检测室内甲醛浓度,并根据温度湿度对甲醛检测结果的影响进行校准,确保测量结果的准确性。
- PM2.5传感器:选用GP2Y1014AU粉尘传感器。该传感器利用光学散射原理测量空气中PM2.5颗粒物的浓度,具有测量范围广、精度高等特点。
- 显示模块选型
选用LCD1602液晶显示模块。LCD1602是一种字符型液晶显示模块,能够显示16个字符×2行,具有低成本、低功耗、简易接口等优点。在本系统中,LCD1602用于显示当前环境的温湿度、甲醛、PM2.5值等参数。
- 通信模块选型
选用ESP8266 Wi-Fi模块。ESP8266是一款低功耗、高性能的Wi-Fi模块,支持串口通信,能够将采集到的数据上传至云端服务器,实现远程监控和数据管理。
- 报警模块选型
选用有源蜂鸣器作为报警模块。有源蜂鸣器内部带震荡源,只要一通电就会发出声音,适合用于本系统的报警功能。
- 按键模块选型
选用三个独立按键作为按键模块。这三个按键分别用于设置温湿度、甲醛、PM2.5的报警阈值。
(二)软件设计
- 开发环境选择
本系统采用STM32CubeIDE作为开发环境。STM32CubeIDE是一款集成开发环境(IDE),专为STM32微控制器设计,提供了图形化的配置工具、代码生成器、调试器等功能,能够大大提高开发效率。
- 系统功能划分
本系统主要分为数据采集与处理、报警功能、数据显示与上传、按键设置等四个功能模块。
- 数据采集与处理:负责采集温湿度、甲醛、PM2.5传感器的数据,并进行处理和分析。
- 报警功能:当采集到的数据超过预设阈值时,触发蜂鸣器报警。
- 数据显示与上传:将采集到的数据显示在LCD1602显示屏上,并通过ESP8266模块上传至云端服务器。
- 按键设置:用户通过按键设置温湿度、甲醛、PM2.5的报警阈值。
- 数据采集与处理
通过STM32的ADC(模数转换器)采集温湿度、甲醛、PM2.5传感器的模拟电压信号,并将其转换为数字信号。然后,对采集到的数据进行滤波、校准等处理,确保数据的准确性。
- 报警功能实现
当采集到的数据超过预设阈值时,通过GPIO(通用目的输入/输出)引脚控制有源蜂鸣器发出报警声音。报警阈值可以通过按键进行设置。
- 数据显示与上传
将采集到的数据显示在LCD1602显示屏上,并通过ESP8266模块将数据上传至云端服务器。云端服务器可以将数据存储在数据库中,并提供API接口供手机APP调用,实现远程监控和数据管理。
- 按键设置功能
通过GPIO引脚检测按键的按下和释放状态,并根据按键的按下顺序和次数设置温湿度、甲醛、PM2.5的报警阈值。按键设置功能通过中断方式实现,确保按键响应的实时性。
三、系统硬件实现
(一)主控制器电路
STM32F103C8T6单片机的电路连接主要包括电源、时钟、复位、调试接口等。电源采用5V直流电源供电,通过稳压芯片将电压转换为3.3V供单片机使用。时钟电路采用外部晶振提供时钟信号,复位电路采用上电复位和手动复位相结合的方式。调试接口采用SWD接口,方便进行程序下载和调试。
(二)传感器电路
- DHT11传感器电路
DHT11传感器的数据引脚与STM32的GPIO引脚相连,通过单总线协议进行通信。在电路设计中,需要注意数据引脚的上拉电阻和电容的选择,以确保通信的稳定性和可靠性。
- ZE08-CH2O甲醛传感器电路
ZE08-CH2O甲醛传感器的输出信号为模拟电压信号,通过STM32的ADC引脚进行采集。在电路设计中,需要注意传感器的供电电压和输出信号的范围,以确保ADC能够正确采集到数据。
- GP2Y1014AU粉尘传感器电路
GP2Y1014AU粉尘传感器的输出信号同样为模拟电压信号,通过STM32的ADC引脚进行采集。在电路设计中,需要注意传感器的供电电压和输出信号的处理电路,以确保测量结果的准确性。
(三)显示模块电路
LCD1602液晶显示模块的电路连接主要包括数据线、控制线、电源线等。数据线(DB0-DB7)与STM32的GPIO引脚相连,用于传输数据和命令。控制线(RS、RW、E)也与STM32的GPIO引脚相连,用于控制LCD1602的工作模式。电源线(VDD、VSS)分别连接到电源的正负极。
(四)通信模块电路
ESP8266 Wi-Fi模块的电路连接主要包括串口通信引脚、电源引脚、复位引脚等。串口通信引脚(TX、RX)与STM32的USART引脚相连,用于实现串口通信。电源引脚(VCC、GND)分别连接到电源的正负极。复位引脚(RST)连接到STM32的GPIO引脚,用于控制ESP8266的复位操作。
(五)报警模块电路
有源蜂鸣器的电路连接比较简单,只需要将其正极连接到STM32的GPIO引脚,负极连接到电源的负极即可。通过控制GPIO引脚的高低电平来控制蜂鸣器的开关状态。
(六)按键模块电路
三个独立按键的电路连接也比较简单,每个按键的一端连接到STM32的GPIO引脚,另一端连接到电源的负极。通过检测GPIO引脚的电平变化来判断按键的按下和释放状态。
四、系统软件实现
(一)数据采集与处理程序设计
数据采集与处理程序主要包括传感器初始化、数据采集、数据处理等部分。
- 传感器初始化
在程序开始时,需要对DHT11、ZE08-CH2O、GP2Y1014AU等传感器进行初始化操作。初始化操作包括设置传感器的工作模式、校准参数等。
- 数据采集
通过STM32的ADC引脚采集DHT11、ZE08-CH2O、GP2Y1014AU等传感器的模拟电压信号,并将其转换为数字信号。在采集过程中,需要注意ADC的采样频率和分辨率的设置,以确保采集到的数据的准确性。
- 数据处理
对采集到的数据进行滤波、校准等处理。滤波操作可以采用均值滤波、中值滤波等方法来平滑数据,减少噪声干扰。校准操作可以根据传感器的特性曲线对采集到的数据进行修正,确保测量结果的准确性。
(二)报警功能程序设计
报警功能程序主要包括报警阈值设置、报警条件判断、报警操作等部分。
- 报警阈值设置
通过按键设置温湿度、甲醛、PM2.5的报警阈值。在程序开始时,可以设置一个默认的报警阈值。用户可以通过按键来调整报警阈值的大小。
- 报警条件判断
在数据采集与处理程序中,将采集到的数据与报警阈值进行比较。如果采集到的数据超过报警阈值,则触发报警条件。
- 报警操作
当触发报警条件时,通过GPIO引脚控制有源蜂鸣器发出报警声音。同时,可以在LCD1602显示屏上显示报警信息,提醒用户注意环境变化。
(三)数据显示与上传程序设计
数据显示与上传程序主要包括数据显示、数据上传等部分。
- 数据显示
将采集到的温湿度、甲醛、PM2.5值显示在LCD1602显示屏上。在显示过程中,需要注意数据的格式化和刷新频率的设置,以确保显示效果的清晰和流畅。
- 数据上传
通过ESP8266模块将采集到的数据上传至云端服务器。在上传过程中,需要注意串口通信的波特率、数据格式等参数的设置,以确保数据上传的稳定性和可靠性。同时,还需要处理网络连接的异常情况,如网络断开、重连等。
(四)按键设置功能程序设计
按键设置功能程序主要包括按键检测、按键处理等部分。
- 按键检测
通过GPIO引脚检测按键的按下和释放状态。在检测过程中,需要注意按键的去抖处理,以避免因按键抖动而产生的误判。
- 按键处理
根据按键的按下顺序和次数来设置温湿度、甲醛、PM2.5的报警阈值。在按键处理过程中,需要注意按键的优先级和互斥性,以确保按键设置的正确性和稳定性。
五、系统测试与结果分析
(一)测试环境搭建
在实验室环境下搭建测试平台,包括STM32开发板、DHT11温湿度传感器、ZE08-CH2O甲醛传感器、GP2Y1014AU粉尘传感器、LCD1602液晶显示模块、ESP8266 Wi-Fi模块、有源蜂鸣器、按键模块等硬件设备。同时,还需要准备一台电脑作为上位机,用于接收和显示采集到的数据。
(二)功能测试
- 数据采集功能测试
通过改变实验室环境的温湿度、甲醛浓度、PM2.5浓度等参数,测试系统是否能够正确采集到这些参数的值。测试结果表明,系统能够准确采集到温湿度、甲醛、PM2.5等参数的值,并显示在LCD1602显示屏上。
- 报警功能测试
通过设置不同的报警阈值,测试系统是否能够在采集到的数据超过报警阈值时正确触发报警。测试结果表明,当采集到的数据超过报警阈值时,系统能够正确触发有源蜂鸣器发出报警声音,并在LCD1602显示屏上显示报警信息。
- 数据显示与上传功能测试
测试系统是否能够将采集到的数据显示在LCD1602显示屏上,并通过ESP8266模块上传至云端服务器。测试结果表明,系统能够正确显示采集到的数据,并通过ESP8266模块将数据上传至云端服务器。上位机能够接收到数据并正确显示。
- 按键设置功能测试
通过按键设置不同的报警阈值,测试系统是否能够正确响应按键操作并设置报警阈值。测试结果表明,系统能够正确响应按键操作,并根据按键的按下顺序和次数设置温湿度、甲醛、PM2.5的报警阈值。
(三)性能测试
- 数据采集精度测试
通过与其他高精度测量设备进行对比测试,评估系统采集到的数据的精度。测试结果表明,系统采集到的温湿度、甲醛、PM2.5等参数的值与高精度测量设备的测量结果相差不大,满足一般室内环境监测的需求。
- 系统稳定性测试
通过长时间运行系统,测试系统的稳定性。测试结果表明,系统在长时间运行过程中未出现死机、数据丢失等异常情况,表现出良好的稳定性。
- 通信性能测试
测试ESP8266模块的通信性能,包括数据传输速度、网络连接的稳定性等。测试结果表明,ESP8266模块能够稳定地与云端服务器进行通信,数据传输速度较快,满足系统需求。
(四)结果分析
通过功能测试和性能测试,可以看出本系统基本实现了预期的设计目标。系统能够准确采集到温湿度、甲醛、PM2.5等参数的值,并在采集到的数据超过报警阈值时正确触发报警。同时,系统还能够将采集到的数据显示在LCD1602显示屏上,并通过ESP8266模块上传至云端服务器,实现远程监控和数据管理。此外,系统还提供了按键设置功能,方便用户根据实际需求设置报警阈值。
然而,在测试过程中也发现了一些不足之处。例如,在数据采集精度方面,虽然系统采集到的数据与高精度测量设备的测量结果相差不大,但仍存在一定的误差。这可能是由于传感器的精度限制、电路干扰等因素导致的。在未来的研究中,可以考虑采用更高精度的传感器、优化电路设计等方法来提高数据采集精度。
六、结论与展望
(一)结论
本文设计了一种基于STM32的空气质量检测系统,该系统能够实时采集当前环境下的温湿度、甲醛、PM2.5值,并在采集值超过预设阈值时通过蜂鸣器自动报警。采集到的数据会显示在LCD1602显示屏上,并自动上传至上位机(手机),方便用户随时查看。此外,系统还提供了三个按键,用户可以通过这些按键任意设置报警阈值。通过系统测试与结果分析,可以看出本系统基本实现了预期的设计目标,具有体积小、成本低、操作简便等优点,适用于家庭或小型场所的空气质量监测。
(二)展望
在未来的研究中,可以从以下几个方面对系统进行改进和优化:
-
提高数据采集精度:采用更高精度的传感器、优化电路设计等方法来提高数据采集精度,减少误差。
-
增加监测参数:除了温湿度、甲醛、PM2.5等参数外,还可以增加对其他空气质量参数的监测,如TVOC(总挥发性有机化合物)、CO(一氧化碳)等,以更全面地评估空气质量。
-
优化报警功能:可以设计更智能的报警算法,如根据空气质量的变化趋势进行预测性报警,提前提醒用户采取措施改善空气质量。
-
实现远程控制:除了数据上传功能外,还可以实现远程控制功能,如通过手机APP远程控制通风设备、空气净化器等设备的开关状态,以更便捷地改善室内空气质量。
-
集成智能家居系统:将本系统与智能家居系统集成,实现与其他智能家居设备的联动控制,如当空气质量较差时自动开启空气净化器、关闭窗户等操作,以提供更智能、更舒适的家居环境。
//C库
#include <string.h>
//单片机头文件
#include "sys.h"
//网络协议层
#include "onenet.h"
//网络设备
#include "esp8266.h"
//硬件驱动
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "LCD.h"
#include "dht11.h"
#include "adc_dma.h"
#include "mq2.h"
#include "mq7.h"
#include "timer.h"
#include "bh1750.h"
#include "gui.h"
#include "LCD.h"
#include "hc_sr501.h"
#include "hc_sr04.h"
#include "TFT_demo.h"
#include "pwm.h"
#include "key.h"
#include "beep.h"
uint32_t time = 0; // ms 计时变量
DHT11_Data_TypeDef DHT11_Data;
float value_light = 0.0; //光照度
float value_mq2 = 0.0; //烟雾浓度
float value_mq7 = 0.0; //一氧化碳浓度
float value_sr04 = 0.0; //超声波距离
u8 status_sr501 = 0; //人体红外检测到的值
int max_mq7 = 50; //烟雾浓度阈值
u8 LED_Light; //PWM灯光亮度
//硬件初始化
void Hardware_Init(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
delay_init(); //延时函数初始化
LCD_Init(); //液晶屏初始化
LCD_Clear(GRAY0);
Gui_DrawFont_GBK16(3,10,BLUE,GRAY0,(u8 *)"系统正在初始化");
Usart1_Init(115200); //串口1初始化为115200
Usart2_Init(115200); //串口2,驱动ESP8266用
LED_Init(); //LED初始化
SR501_Init(); //红外热释电
Hcsr04Init(); //超声波测距
ADCx_Init(); //ADC DMA初始化
DHT11_GPIO_Config(); //DHT11温湿度传感器初始化
BH1750_Init(); //光照
KEY_Init();
BEEP_Init();
PWM_TIM_Init(); //PWM频率=72000K/20*180=20Khz
TIM_SetCompare3(TIM3,0);
Gui_DrawFont_GBK16(4,30,RED,GRAY0,(u8*)"设备初始化完成");
Gui_DrawFont_GBK16(4,50,RED,GRAY0,(u8*)"正在连接网络。。。");
}
void Net_Init()
{
ESP8266_Init(); //初始化ESP8266
while(OneNet_DevLink()) //接入OneNET
delay_ms(500);
LED1 = 0; //入网成功
Gui_DrawFont_GBK16(4,70,RED,GRAY0,(u8*)"网络连接完成");
delay_ms(2000);
}
int main(void)
{
unsigned char *dataPtr = NULL;
unsigned short timeCount = 300; //发送间隔变量
char str[] = "";
Hardware_Init(); //初始化外围硬件
Net_Init(); //网络初始化
GENERAL_TIM_Init(); //1MS系统定时
LCD_Clear(BLACK);
Gui_DrawFont_GBK16(25,4,BLACK,GRAY0,(u8 *)" 系统监控 ");
GUI_DrawRectangle(1, 1, 128-2, 128-2, WHITE); //边框
while(1)
{
delay_ms(10);
timeCount ++;
//接收数据
dataPtr = ESP8266_GetIPD(0);
if(dataPtr != NULL)
{
OneNet_RevPro(dataPtr);
}
if(timeCount >= 300) //发送间隔5s
{
/* 温湿度传感器获取数据*/
/*调用Read_DHT11读取温湿度,若成功则输出该信息*/
if( Read_DHT11(&DHT11_Data)==SUCCESS)
{
sprintf(str, "温度:%d.%d ℃ ",DHT11_Data.temp_int,DHT11_Data.temp_deci);
Gui_DrawFont_GBK16(4,30,RED,BLACK,(u8 *)str);
sprintf(str, "湿度:%d.%d %c ",DHT11_Data.humi_int,DHT11_Data.humi_deci,'%');
Gui_DrawFont_GBK16(4,50,RED,BLACK,(u8 *)str);
}
else
{
printf("Read DHT11 ERROR!\r\n");//读取数据失败,串口打印:Read DHT11 ERROR.
Gui_DrawFont_GBK16(4,30,RED,BLACK,(u8 *)"ERROR!");
Gui_DrawFont_GBK16(4,50,RED,BLACK,(u8 *)"ERROR!");
}
/*光照度传感器获取数据*/
value_light = LIght_Intensity();
sprintf(str, "光照:%.1flx ",value_light);
Gui_DrawFont_GBK16(4,70,YELLOW,BLACK,(u8 *)str);
/*MQ2传感器获取烟雾数据*/
value_mq2 = MQ2_GetPPM();
sprintf(str, "烟雾:%.1f ppm ",value_mq2);
Gui_DrawFont_GBK16(4,90,BLUE,BLACK,(u8 *)str);
/*MQ7传感器获取一氧化碳数据*/
value_mq7 = MQ7_GetPPM();
sprintf(str, " CO :%.1f ppm ",value_mq7);
Gui_DrawFont_GBK16(4,110,GREEN,BLACK,(u8 *)str);
OneNet_SendData(); //发送数据
timeCount = 0;
ESP8266_Clear();
}
/*超声波测距获取距离(CM)*/
value_sr04 = Hcsr04GetLength();
/*人体检测*/
status_sr501 = SR501_Check();
//用户处理
//调节灯光亮度
PWM_Control(LED_Light);
//判断一氧化碳浓度是否超过上限
if((int)value_mq7 >= max_mq7)
{
BEEP = 0; //蜂鸣器报警
}
else
{
BEEP = 1; //蜂鸣器关闭
}
}
}
更多推荐
所有评论(0)