基于STM32的空气质量检测系统设计

摘要

随着环境污染问题的日益严重,空气质量检测已成为人们关注的焦点。本文设计了一种基于STM32的空气质量检测系统,该系统能够实时采集当前环境下的温湿度、甲醛、PM2.5值,并在采集值超过预设阈值时通过蜂鸣器自动报警。采集到的数据会显示在LCD1602显示屏上,并自动上传至上位机(手机),方便用户随时查看。此外,系统还提供了三个按键,用户可以通过这些按键任意设置报警阈值。

关键词

STM32;空气质量检测;温湿度;甲醛;PM2.5;LCD1602;上位机;报警阈值

目录

一、引言

二、系统总体设计

(一)硬件设计

  1. 主控制器选型
  2. 传感器选型
  3. 显示模块选型
  4. 通信模块选型
  5. 报警模块选型
  6. 按键模块选型

(二)软件设计

  1. 开发环境选择
  2. 系统功能划分
  3. 数据采集与处理
  4. 报警功能实现
  5. 数据显示与上传
  6. 按键设置功能

三、系统硬件实现

(一)主控制器电路
(二)传感器电路
(三)显示模块电路
(四)通信模块电路
(五)报警模块电路
(六)按键模块电路

四、系统软件实现

(一)数据采集与处理程序设计
(二)报警功能程序设计
(三)数据显示与上传程序设计
(四)按键设置功能程序设计

五、系统测试与结果分析

(一)测试环境搭建
(二)功能测试
(三)性能测试
(四)结果分析

六、结论与展望

(一)结论
(二)展望

一、引言

随着工业化和城市化的快速发展,空气质量问题日益凸显,对人们的健康和生活质量产生了严重影响。因此,对空气质量的实时监测显得尤为重要。传统的空气质量检测设备通常体积庞大、价格昂贵,且操作复杂,不适合家庭或小型场所使用。本文设计了一种基于STM32的空气质量检测系统,该系统具有体积小、成本低、操作简便等优点,能够实时监测环境中的温湿度、甲醛、PM2.5等参数,并在参数异常时及时报警,同时支持数据上传至手机,方便用户随时查看。

二、系统总体设计

(一)硬件设计

  1. 主控制器选型

本系统选用STM32F103C8T6单片机作为主控制器。STM32F103C8T6是一款基于ARM Cortex-M3内核的32位微控制器,具有高性能、低功耗、丰富的外设资源等优点,能够满足本系统的设计要求。

  1. 传感器选型
  • 温湿度传感器:选用DHT11传感器。DHT11是一款数字式温湿度传感器,具有低成本、宽供电电压范围(3V至5.5V)、通过单数据线进行数字信号传输等特点。其温度测量范围为0°C至50°C,湿度测量范围为20%RH至90%RH,适用于一般室内环境监测。
  • 甲醛传感器:选用ZE08-CH2O甲醛传感器。该传感器能够实时检测室内甲醛浓度,并根据温度湿度对甲醛检测结果的影响进行校准,确保测量结果的准确性。
  • PM2.5传感器:选用GP2Y1014AU粉尘传感器。该传感器利用光学散射原理测量空气中PM2.5颗粒物的浓度,具有测量范围广、精度高等特点。
  1. 显示模块选型

选用LCD1602液晶显示模块。LCD1602是一种字符型液晶显示模块,能够显示16个字符×2行,具有低成本、低功耗、简易接口等优点。在本系统中,LCD1602用于显示当前环境的温湿度、甲醛、PM2.5值等参数。

  1. 通信模块选型

选用ESP8266 Wi-Fi模块。ESP8266是一款低功耗、高性能的Wi-Fi模块,支持串口通信,能够将采集到的数据上传至云端服务器,实现远程监控和数据管理。

  1. 报警模块选型

选用有源蜂鸣器作为报警模块。有源蜂鸣器内部带震荡源,只要一通电就会发出声音,适合用于本系统的报警功能。

  1. 按键模块选型

选用三个独立按键作为按键模块。这三个按键分别用于设置温湿度、甲醛、PM2.5的报警阈值。

(二)软件设计

  1. 开发环境选择

本系统采用STM32CubeIDE作为开发环境。STM32CubeIDE是一款集成开发环境(IDE),专为STM32微控制器设计,提供了图形化的配置工具、代码生成器、调试器等功能,能够大大提高开发效率。

  1. 系统功能划分

本系统主要分为数据采集与处理、报警功能、数据显示与上传、按键设置等四个功能模块。

  • 数据采集与处理:负责采集温湿度、甲醛、PM2.5传感器的数据,并进行处理和分析。
  • 报警功能:当采集到的数据超过预设阈值时,触发蜂鸣器报警。
  • 数据显示与上传:将采集到的数据显示在LCD1602显示屏上,并通过ESP8266模块上传至云端服务器。
  • 按键设置:用户通过按键设置温湿度、甲醛、PM2.5的报警阈值。
  1. 数据采集与处理

通过STM32的ADC(模数转换器)采集温湿度、甲醛、PM2.5传感器的模拟电压信号,并将其转换为数字信号。然后,对采集到的数据进行滤波、校准等处理,确保数据的准确性。

  1. 报警功能实现

当采集到的数据超过预设阈值时,通过GPIO(通用目的输入/输出)引脚控制有源蜂鸣器发出报警声音。报警阈值可以通过按键进行设置。

  1. 数据显示与上传

将采集到的数据显示在LCD1602显示屏上,并通过ESP8266模块将数据上传至云端服务器。云端服务器可以将数据存储在数据库中,并提供API接口供手机APP调用,实现远程监控和数据管理。

  1. 按键设置功能

通过GPIO引脚检测按键的按下和释放状态,并根据按键的按下顺序和次数设置温湿度、甲醛、PM2.5的报警阈值。按键设置功能通过中断方式实现,确保按键响应的实时性。

三、系统硬件实现

(一)主控制器电路

STM32F103C8T6单片机的电路连接主要包括电源、时钟、复位、调试接口等。电源采用5V直流电源供电,通过稳压芯片将电压转换为3.3V供单片机使用。时钟电路采用外部晶振提供时钟信号,复位电路采用上电复位和手动复位相结合的方式。调试接口采用SWD接口,方便进行程序下载和调试。

(二)传感器电路

  1. DHT11传感器电路

DHT11传感器的数据引脚与STM32的GPIO引脚相连,通过单总线协议进行通信。在电路设计中,需要注意数据引脚的上拉电阻和电容的选择,以确保通信的稳定性和可靠性。

  1. ZE08-CH2O甲醛传感器电路

ZE08-CH2O甲醛传感器的输出信号为模拟电压信号,通过STM32的ADC引脚进行采集。在电路设计中,需要注意传感器的供电电压和输出信号的范围,以确保ADC能够正确采集到数据。

  1. 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引脚的电平变化来判断按键的按下和释放状态。

四、系统软件实现

(一)数据采集与处理程序设计

数据采集与处理程序主要包括传感器初始化、数据采集、数据处理等部分。

  1. 传感器初始化

在程序开始时,需要对DHT11、ZE08-CH2O、GP2Y1014AU等传感器进行初始化操作。初始化操作包括设置传感器的工作模式、校准参数等。

  1. 数据采集

通过STM32的ADC引脚采集DHT11、ZE08-CH2O、GP2Y1014AU等传感器的模拟电压信号,并将其转换为数字信号。在采集过程中,需要注意ADC的采样频率和分辨率的设置,以确保采集到的数据的准确性。

  1. 数据处理

对采集到的数据进行滤波、校准等处理。滤波操作可以采用均值滤波、中值滤波等方法来平滑数据,减少噪声干扰。校准操作可以根据传感器的特性曲线对采集到的数据进行修正,确保测量结果的准确性。

(二)报警功能程序设计

报警功能程序主要包括报警阈值设置、报警条件判断、报警操作等部分。

  1. 报警阈值设置

通过按键设置温湿度、甲醛、PM2.5的报警阈值。在程序开始时,可以设置一个默认的报警阈值。用户可以通过按键来调整报警阈值的大小。

  1. 报警条件判断

在数据采集与处理程序中,将采集到的数据与报警阈值进行比较。如果采集到的数据超过报警阈值,则触发报警条件。

  1. 报警操作

当触发报警条件时,通过GPIO引脚控制有源蜂鸣器发出报警声音。同时,可以在LCD1602显示屏上显示报警信息,提醒用户注意环境变化。

(三)数据显示与上传程序设计

数据显示与上传程序主要包括数据显示、数据上传等部分。

  1. 数据显示

将采集到的温湿度、甲醛、PM2.5值显示在LCD1602显示屏上。在显示过程中,需要注意数据的格式化和刷新频率的设置,以确保显示效果的清晰和流畅。

  1. 数据上传

通过ESP8266模块将采集到的数据上传至云端服务器。在上传过程中,需要注意串口通信的波特率、数据格式等参数的设置,以确保数据上传的稳定性和可靠性。同时,还需要处理网络连接的异常情况,如网络断开、重连等。

(四)按键设置功能程序设计

按键设置功能程序主要包括按键检测、按键处理等部分。

  1. 按键检测

通过GPIO引脚检测按键的按下和释放状态。在检测过程中,需要注意按键的去抖处理,以避免因按键抖动而产生的误判。

  1. 按键处理

根据按键的按下顺序和次数来设置温湿度、甲醛、PM2.5的报警阈值。在按键处理过程中,需要注意按键的优先级和互斥性,以确保按键设置的正确性和稳定性。

五、系统测试与结果分析

(一)测试环境搭建

在实验室环境下搭建测试平台,包括STM32开发板、DHT11温湿度传感器、ZE08-CH2O甲醛传感器、GP2Y1014AU粉尘传感器、LCD1602液晶显示模块、ESP8266 Wi-Fi模块、有源蜂鸣器、按键模块等硬件设备。同时,还需要准备一台电脑作为上位机,用于接收和显示采集到的数据。

(二)功能测试

  1. 数据采集功能测试

通过改变实验室环境的温湿度、甲醛浓度、PM2.5浓度等参数,测试系统是否能够正确采集到这些参数的值。测试结果表明,系统能够准确采集到温湿度、甲醛、PM2.5等参数的值,并显示在LCD1602显示屏上。

  1. 报警功能测试

通过设置不同的报警阈值,测试系统是否能够在采集到的数据超过报警阈值时正确触发报警。测试结果表明,当采集到的数据超过报警阈值时,系统能够正确触发有源蜂鸣器发出报警声音,并在LCD1602显示屏上显示报警信息。

  1. 数据显示与上传功能测试

测试系统是否能够将采集到的数据显示在LCD1602显示屏上,并通过ESP8266模块上传至云端服务器。测试结果表明,系统能够正确显示采集到的数据,并通过ESP8266模块将数据上传至云端服务器。上位机能够接收到数据并正确显示。

  1. 按键设置功能测试

通过按键设置不同的报警阈值,测试系统是否能够正确响应按键操作并设置报警阈值。测试结果表明,系统能够正确响应按键操作,并根据按键的按下顺序和次数设置温湿度、甲醛、PM2.5的报警阈值。

(三)性能测试

  1. 数据采集精度测试

通过与其他高精度测量设备进行对比测试,评估系统采集到的数据的精度。测试结果表明,系统采集到的温湿度、甲醛、PM2.5等参数的值与高精度测量设备的测量结果相差不大,满足一般室内环境监测的需求。

  1. 系统稳定性测试

通过长时间运行系统,测试系统的稳定性。测试结果表明,系统在长时间运行过程中未出现死机、数据丢失等异常情况,表现出良好的稳定性。

  1. 通信性能测试

测试ESP8266模块的通信性能,包括数据传输速度、网络连接的稳定性等。测试结果表明,ESP8266模块能够稳定地与云端服务器进行通信,数据传输速度较快,满足系统需求。

(四)结果分析

通过功能测试和性能测试,可以看出本系统基本实现了预期的设计目标。系统能够准确采集到温湿度、甲醛、PM2.5等参数的值,并在采集到的数据超过报警阈值时正确触发报警。同时,系统还能够将采集到的数据显示在LCD1602显示屏上,并通过ESP8266模块上传至云端服务器,实现远程监控和数据管理。此外,系统还提供了按键设置功能,方便用户根据实际需求设置报警阈值。

然而,在测试过程中也发现了一些不足之处。例如,在数据采集精度方面,虽然系统采集到的数据与高精度测量设备的测量结果相差不大,但仍存在一定的误差。这可能是由于传感器的精度限制、电路干扰等因素导致的。在未来的研究中,可以考虑采用更高精度的传感器、优化电路设计等方法来提高数据采集精度。

六、结论与展望

(一)结论

本文设计了一种基于STM32的空气质量检测系统,该系统能够实时采集当前环境下的温湿度、甲醛、PM2.5值,并在采集值超过预设阈值时通过蜂鸣器自动报警。采集到的数据会显示在LCD1602显示屏上,并自动上传至上位机(手机),方便用户随时查看。此外,系统还提供了三个按键,用户可以通过这些按键任意设置报警阈值。通过系统测试与结果分析,可以看出本系统基本实现了预期的设计目标,具有体积小、成本低、操作简便等优点,适用于家庭或小型场所的空气质量监测。

(二)展望

在未来的研究中,可以从以下几个方面对系统进行改进和优化:

  1. 提高数据采集精度:采用更高精度的传感器、优化电路设计等方法来提高数据采集精度,减少误差。

  2. 增加监测参数:除了温湿度、甲醛、PM2.5等参数外,还可以增加对其他空气质量参数的监测,如TVOC(总挥发性有机化合物)、CO(一氧化碳)等,以更全面地评估空气质量。

  3. 优化报警功能:可以设计更智能的报警算法,如根据空气质量的变化趋势进行预测性报警,提前提醒用户采取措施改善空气质量。

  4. 实现远程控制:除了数据上传功能外,还可以实现远程控制功能,如通过手机APP远程控制通风设备、空气净化器等设备的开关状态,以更便捷地改善室内空气质量。

  5. 集成智能家居系统:将本系统与智能家居系统集成,实现与其他智能家居设备的联动控制,如当空气质量较差时自动开启空气净化器、关闭窗户等操作,以提供更智能、更舒适的家居环境。

//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;	//蜂鸣器关闭
		}
	}
}


















Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐