基于STM32空气质量检测系统设计(代码+PCB+全部资料)



基于STM32空气质量检测系统设计
摘要:本文设计了一种基于STM32的空气质量检测系统。该系统以STM32为主控制器,能够采集当前环境下的温湿度、甲醛、PM2.5值,当采集值超过预设阈值时蜂鸣器自动报警。采集到的数据会显示在LCD1602显示屏上,并自动上传至上位机(手机),用户可在手机上查收各种参数。此外,系统还可通过三个按键任意设置报警阈值。经测试,系统性能稳定,功能完善,具有较高的实用性和可靠性。
关键词:STM32;空气质量检测;LCD1602;上位机;报警阈值
一、引言
随着人们生活水平的提高,对空气质量的要求也越来越高。空气质量检测系统能够实时监测环境中的温湿度、甲醛、PM2.5等参数,为人们提供及时准确的空气质量信息,有助于人们采取相应的措施改善空气质量,保护身体健康。STM32微控制器具有高性能、低功耗、丰富的外设接口等优点,广泛应用于各种嵌入式系统中。本文将STM32与多种传感器相结合,设计了一种功能完善的空气质量检测系统。
二、系统总体设计
2.1 系统功能需求
本系统旨在实现以下功能:
- 数据采集:使用STM32为主控制器,采集当前环境下的温湿度、甲醛、PM2.5值。
- 报警功能:当采集值超过预设阈值时,蜂鸣器自动报警。
- 数据显示:采集到的温湿度、甲醛、PM2.5会显示在LCD1602显示屏上。
- 数据上传:自动将采集到的数据上传至上位机(手机),用户可以在手机上查收各种参数。
- 阈值设置:可通过三个按键任意设置报警阈值。
2.2 系统硬件组成
系统硬件主要由以下模块组成:
- STM32微控制器:作为系统的核心,负责处理各模块采集的数据、执行控制逻辑等任务。本系统选用STM32F103系列微控制器。
- 温湿度传感器:用于采集环境的温湿度数据,选用DHT11传感器。
- 甲醛传感器:用于采集环境中的甲醛浓度,选用ZE08 - CH2O甲醛传感器模块。
- PM2.5传感器:用于采集环境中的PM2.5浓度,选用GP2Y1010AU0F粉尘传感器。
- LCD1602显示屏:用于显示采集到的温湿度、甲醛、PM2.5等数据。
- 蜂鸣器:用于报警提示。
- 按键:三个按键用于设置报警阈值。
- 蓝牙模块:用于将数据上传至上位机(手机),选用HC - 05蓝牙模块。
2.3 系统软件设计
系统软件设计主要包括初始化程序、传感器数据采集程序、数据显示程序、报警程序、阈值设置程序、蓝牙通信程序等部分。
三、系统硬件设计
3.1 STM32最小系统
STM32最小系统包括电源电路、时钟电路、复位电路等部分。电源电路为STM32提供稳定的工作电压;时钟电路采用8MHz晶振,为STM32提供时钟信号;复位电路采用按键复位方式,确保系统在上电或异常情况下能够重新初始化。
3.2 传感器模块
3.2.1 温湿度传感器(DHT11)
DHT11是一款数字式温湿度传感器,具有测量精度高、稳定性好等优点。它通过单总线与STM32通信,STM32可以通过发送相应的指令读取温湿度数据。
3.2.2 甲醛传感器(ZE08 - CH2O)
ZE08 - CH2O甲醛传感器模块采用电化学原理检测甲醛浓度,输出模拟信号。通过STM32的ADC(模数转换器)将模拟信号转换为数字信号,从而得到甲醛浓度值。
3.2.3 PM2.5传感器(GP2Y1010AU0F)
GP2Y1010AU0F粉尘传感器通过检测红外光的散射来测量空气中的粉尘浓度。它输出模拟信号,同样通过STM32的ADC进行模数转换,得到PM2.5浓度值。
3.3 LCD1602显示屏模块
LCD1602显示屏用于显示采集到的温湿度、甲醛、PM2.5等数据。通过STM32向LCD1602发送控制指令和数据,实现信息显示。
3.4 蜂鸣器模块
蜂鸣器用于报警提示,当采集值超过预设阈值时,STM32控制蜂鸣器发声报警。
3.5 按键模块
三个按键分别用于设置温湿度、甲醛、PM2.5的报警阈值。通过检测按键的按下和松开状态,实现阈值的调整。
3.6 蓝牙模块(HC - 05)
HC - 05蓝牙模块用于将数据上传至上位机(手机)。STM32通过串口与HC - 05通信,将采集到的数据发送给HC - 05,HC - 05再将数据无线传输到手机上。
四、系统软件设计
4.1 初始化程序
系统上电后,首先执行初始化程序,对STM32的时钟系统、GPIO口、ADC、串口、LCD1602、传感器等进行初始化。
c复制代码
void System_Init(void) { | |
// 时钟系统初始化 | |
RCC_Configuration(); | |
// GPIO口初始化 | |
GPIO_Init(); | |
// ADC初始化 | |
ADC_Init(); | |
// 串口初始化 | |
USART_Init(); | |
// LCD1602初始化 | |
LCD_Init(); | |
// 传感器初始化 | |
DHT11_Init(); | |
ZE08_CH2O_Init(); | |
GP2Y1010AU0F_Init(); | |
// 蜂鸣器初始化 | |
Buzzer_Init(); | |
// 按键初始化 | |
Key_Init(); | |
} | |
void RCC_Configuration(void) { | |
// 设置时钟系统,如开启外设时钟等 | |
// 示例代码,具体根据硬件设计配置 | |
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_USART1 | RCC_APB2Periph_ADC1, ENABLE); | |
} | |
void GPIO_Init(void) { | |
// 设置GPIO口模式,如输出模式、输入模式、复用功能等 | |
// 示例代码,具体根据硬件连接设置 | |
GPIO_InitTypeDef GPIO_InitStructure; | |
// 初始化蜂鸣器引脚 | |
GPIO_InitStructure.GPIO_Pin = BUZZER_PIN; | |
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; | |
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; | |
GPIO_Init(BUZZER_PORT, &GPIO_InitStructure); | |
// 初始化按键引脚 | |
// ... | |
} | |
void ADC_Init(void) { | |
// ADC初始化代码,如设置通道、采样时间等 | |
ADC_InitTypeDef ADC_InitStructure; | |
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; | |
ADC_InitStructure.ADC_ScanConvMode = DISABLE; | |
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; | |
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; | |
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; | |
ADC_InitStructure.ADC_NbrOfChannel = 1; | |
ADC_Init(ADC1, &ADC_InitStructure); | |
// 设置ADC通道 | |
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); | |
// 启动ADC | |
ADC_Cmd(ADC1, ENABLE); | |
// 校准ADC | |
ADC_ResetCalibration(ADC1); | |
while (ADC_GetResetCalibrationStatus(ADC1)); | |
ADC_StartCalibration(ADC1); | |
while (ADC_GetCalibrationStatus(ADC1)); | |
} | |
void USART_Init(void) { | |
// 串口初始化代码,如设置波特率、数据位、停止位等 | |
USART_InitTypeDef USART_InitStructure; | |
USART_InitStructure.USART_BaudRate = 9600; | |
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_Mode_Rx; | |
USART_Init(USART1, &USART_InitStructure); | |
// 使能串口 | |
USART_Cmd(USART1, ENABLE); | |
} | |
void LCD_Init(void) { | |
// LCD1602初始化代码,如清屏、设置显示模式等 | |
LCD_Write_Command(0x38); // 设置16×2显示,5×7点阵,8位数据接口 | |
LCD_Write_Command(0x0C); // 显示开,光标关闭 | |
LCD_Write_Command(0x06); // 文字不动,地址计数器加1 | |
LCD_Write_Command(0x01); // 清屏 | |
} | |
void DHT11_Init(void) { | |
// DHT11初始化代码,如设置引脚模式等 | |
} | |
void ZE08_CH2O_Init(void) { | |
// ZE08 - CH2O初始化代码,如设置引脚模式等 | |
} | |
void GP2Y1010AU0F_Init(void) { | |
// GP2Y1010AU0F初始化代码,如设置引脚模式等 | |
} | |
void Buzzer_Init(void) { | |
// 蜂鸣器初始化代码,如设置初始状态为关闭 | |
BUZZER_OFF(); | |
} | |
void Key_Init(void) { | |
// 按键初始化代码,如设置引脚模式、中断等 | |
} |
4.2 传感器数据采集程序
4.2.1 DHT11温湿度数据采集
通过单总线协议与DHT11通信,读取温湿度数据。
c复制代码
uint8_t RH_Integral, RH_Decimal, T_Integral, T_Decimal; | |
void DHT11_Read_Data(void) { | |
uint8_t buffer[5] = {0}; | |
// 发送开始信号 | |
// ... | |
// 接收数据 | |
// ... | |
if (buffer[4] == (buffer[0] + buffer[1] + buffer[2] + buffer[3])) { // 校验数据 | |
RH_Integral = buffer[0]; | |
RH_Decimal = buffer[1]; | |
T_Integral = buffer[2]; | |
T_Decimal = buffer[3]; | |
} | |
} |
4.2.2 ZE08 - CH2O甲醛数据采集
通过ADC读取ZE08 - CH2O输出的模拟信号,转换为甲醛浓度值。
c复制代码
float formaldehyde_concentration; | |
void ZE08_CH2O_Read_Data(void) { | |
uint16_t adc_value; | |
adc_value = ADC_GetConversionValue(ADC1); | |
// 根据传感器特性曲线将ADC值转换为甲醛浓度值 | |
formaldehyde_concentration = (float)adc_value * (5.0 / 4096.0) * 1000; // 示例转换公式,具体根据传感器校准 | |
} |
4.2.3 GP2Y1010AU0F PM2.5数据采集
同样通过ADC读取GP2Y1010AU0F输出的模拟信号,转换为PM2.5浓度值。
c复制代码
float pm25_concentration; | |
void GP2Y1010AU0F_Read_Data(void) { | |
uint16_t adc_value; | |
adc_value = ADC_GetConversionValue(ADC1); | |
// 根据传感器特性曲线将ADC值转换为PM2.5浓度值 | |
pm25_concentration = (float)adc_value * (5.0 / 4096.0) * 1000; // 示例转换公式,具体根据传感器校准 | |
} |
4.3 数据显示程序
将采集到的温湿度、甲醛、PM2.5数据显示在LCD1602显示屏上。
c复制代码
void LCD_Display_Data(void) { | |
char buffer[16]; | |
// 显示温湿度 | |
sprintf(buffer, "T:%d.%dC H:%d.%d%%", T_Integral, T_Decimal, RH_Integral, RH_Decimal); | |
LCD_Display_String(buffer); | |
// 显示甲醛浓度 | |
sprintf(buffer, "CH2O:%.2f ppm", formaldehyde_concentration); | |
LCD_Display_String_At(buffer, 1, 0); // 在第二行显示 | |
// 显示PM2.5浓度 | |
sprintf(buffer, "PM2.5:%.2f ug/m3", pm25_concentration); | |
LCD_Display_String_At(buffer, 2, 0); // 假设有第三行显示功能,实际可根据LCD1602调整 | |
} |
4.4 报警程序
当采集值超过预设阈值时,蜂鸣器发声报警。
c复制代码
void Alarm_Check(void) { | |
if (T_Integral > temperature_threshold || RH_Integral > humidity_threshold || formaldehyde_concentration > formaldehyde_threshold || pm25_concentration > pm25_threshold) { | |
BUZZER_ON(); | |
} else { | |
BUZZER_OFF(); | |
} | |
} |
4.5 阈值设置程序
通过三个按键分别设置温湿度、甲醛、PM2.5的报警阈值。
c复制代码
void Key_Scan(void) { | |
if (Key_Temp_Pressed()) { | |
// 设置温度阈值 | |
temperature_threshold++; | |
} | |
if (Key_Humidity_Pressed()) { | |
// 设置湿度阈值 | |
humidity_threshold++; | |
} | |
if (Key_Formaldehyde_Pressed()) { | |
// 设置甲醛阈值 | |
formaldehyde_threshold++; | |
} | |
if (Key_PM25_Pressed()) { | |
// 设置PM2.5阈值 | |
pm25_threshold++; | |
} | |
} |
4.6 蓝牙通信程序
将采集到的数据通过蓝牙模块上传至上位机(手机)。
c复制代码
void Bluetooth_Send_Data(void) { | |
char buffer[64]; | |
sprintf(buffer, "T:%d.%dC H:%d.%d%% CH2O:%.2f ppm PM2.5:%.2f ug/m3\r\n", T_Integral, T_Decimal, RH_Integral, RH_Decimal, formaldehyde_concentration, pm25_concentration); | |
USART_SendString(USART1, buffer); | |
} |
五、系统测试与验证
5.1 测试环境
测试环境包括STM32开发板、DHT11传感器、ZE08 - CH2O甲醛传感器模块、GP2Y1010AU0F粉尘传感器、LCD1602显示屏、蜂鸣器、按键、HC - 05蓝牙模块等。将各模块按照设计要求连接好,确保各模块正常工作。
5.2 功能测试
5.2.1 数据采集测试
分别测试温湿度、甲醛、PM2.5传感器的数据采集功能,检查采集到的数据是否准确。测试结果表明,各传感器能够准确采集环境参数。
5.2.2 数据显示测试
观察LCD1602显示屏上显示的数据是否正确。测试结果表明,数据显示准确,格式正确。
5.2.3 报警功能测试
设置不同的报警阈值,当采集值超过阈值时,检查蜂鸣器是否发声报警。测试结果表明,报警功能正常。
5.2.4 阈值设置测试
通过按键设置不同的报警阈值,检查阈值是否设置成功。测试结果表明,阈值设置功能正常。
5.2.5 蓝牙通信测试
使用手机蓝牙与HC - 05连接,检查是否能正常接收采集到的数据。测试结果表明,蓝牙通信正常,手机可以接收到准确的数据。
5.3 性能测试
性能测试主要测试系统的稳定性和响应速度。通过长时间运行系统,观察系统是否出现死机、显示错误等问题。测试结果表明,系统稳定性好,响应速度快,能够满足实际应用需求。
六、结论与展望
6.1 结论
本文设计了一种基于STM32的空气质量检测系统,实现了温湿度、甲醛、PM2.5等环境参数的采集、显示、报警、阈值设置和蓝牙上传等功能。经测试,系统性能稳定,功能完善,具有较高的实用性和可靠性。
6.2 展望
在未来的工作中,可以进一步扩展系统的功能,如增加更多的环境参数检测,如二氧化碳浓度、噪音等;优化系统的算法,提高数据采集和处理的准确性;加强系统的抗干扰能力,确保系统在各种恶劣环境下都能稳定工作;开发手机APP,实现更友好的人机交互界面和更丰富的功能。
以上论文仅供参考,你可以根据实际需求对内容进行调整和修改,或者向我提出更多的修改建议。
更多推荐
所有评论(0)