PM2.5浓度PM10浓度如何区别哪个首要污染物
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PM2.5浓度PM10浓度如何区别哪个首要污染物相关的知识,希望对你有一定的参考价值。
PM2.5即细颗粒物.细颗粒物又称细粒、细颗粒、PM2.5.细颗粒物指环境空气中空气动力学当量直径小于等于 2.5 微米的颗粒物,也称PM2.5、可入肺颗粒物.它能较长时间悬浮于空气中,其在空气中含量(浓度)越高,就代表空气污染越严重.虽然PM2.5只是地球大气成分中含量很少的组分,但它对空气质量和能见度等有重要的影响.与较粗的大气颗粒物相比,PM2.5粒径小,面积大,活性强,易附带有毒、有害物质(例如,重金属、微生物等),且在大气中的停留时间长、输送距离远,因而对人体健康和大气环境质量的影响更大.
PM10(particulate matter )有些颗粒物因粒径大或颜色黑可以为肉眼所见,比如烟尘.有些则小到使用电子显微镜才可观察到.通常把空气动力学当量直径在10微米以下的颗粒物称为PM10,又称为可吸入颗粒物或飘尘.可吸入颗粒物的浓度以每立方米空气中可吸入颗粒物的微克数表示.2012年1月10日北京出现大雾天,官方首次公布PM10最高浓度.
挥之不去的雾霾对人的呼吸系统心血管有危害美国进口普卫欣京.东有效减少雾霾的吸入。祝您生活愉快! 参考技术A 一般的,空气质量监测针对6种污染物的7个指标进行。
6种污染物分别是:
PM10、PM2.5、二氧化硫、二氧化氮、臭氧、一氧化碳
7个指标分别是:
PM10、PM2.5、二氧化硫、二氧化氮、臭氧、一氧化碳和臭氧8小时滑动平均值。
每个时段内的各个污染物平均浓度,与对应的评价体系中的分级浓度进行比较计算,得到各个污染物的指数。
举例如下:
二氧化硫的日均值是A(不考虑单位),分级评价体系中,B浓度<A<D浓度。
B浓度对应的指数(体系自己制定的)是54,D浓度对应的指数是87,则根据体系给出的计算公式,得到A浓度下对应的指数为62。则二氧化硫的日均值指数是62.
同理,可以得到其他5中污染物的日均值指数。
选择6种污染物中指数最大的那个,就是首要污染物。
特殊的,在现行的空气质量发布体系中,如果空气质量达到1级,虽然6个污染物的指数仍有大小之分,但是根据体系规定,不在确定首要污染物了。 参考技术B 首要污染物是相对于不同污染物而言,PM2.5,PM10都是指可吸入颗粒物,因PM10是指粒径小于PM10的颗粒物,PM10浓度包含PM2.5,因此PM10浓度总是高于或等于PM2
毕业设计 - 基于STM32的空气质量检测仪 - 环境检测盒子
文章目录
1 简介
Hi,大家好,这里是丹成学长,今天向大家介绍一个 单片机项目
基于STM32的空气质量检测仪
大家可用于 课程设计 或 毕业设计
技术解答、毕设帮助、开题指导
print("Q 746876041")
2 系统设计概述
如今人们大约 80%的时间是在室内度过的, 室内空气质量与我们每个人的工作和生活都息息相关, 因此对生活环境的空气质量提出了更高的要求。 针对雾霾、 室内装修等污染问题, 人们还没有有效的办法控制空气中的有害物质, 这一问题也成为人们的健康隐患, 因此对室内的空气质量进行检测至关重要。
当室内有害气体的浓度超标时, 会对人们的身心健康带来不可忽视的影响。 为了让人们及时准确地获得室内有害气体甲醛、 PM2.5 的浓度, 采取有效措施改善生活环境的空气质量, 提高工作效率。 根据我国室内空气监管标准 GB50325-2010, 学长设计了一款基于STM32F103C8T6 单片机的便携式、 低功耗室内空气质量检测仪。 该检测仪可以实时测量室内的温湿度、 甲醛浓度、 PM2.5 浓度, 并在液晶显示屏 LCD12864 上实时显示出来, 当甲醛浓度或 PM2.5 浓度超过报警值时, 测试仪通过亮红灯和蜂鸣器鸣叫的方式提醒用户室内有害气体超标。
用户可以根据需要通过 GSM 短信方式将室内空气质量情况发送到移动终端, 最后系统在 Visual Studio 2012 平台运用 C#语言开发上位机, 可以实时显示空气质量指标。
3 系统总体方案
学长设计为了能够实时检测室内的空气质量情况, 提高系统的稳定性和自动化程度, 将系统分为硬件设计和软件设计。 本文研制的室内 空气质 量检测仪是基于 32 位单片机STM32C8T6 进行设计的, 将整个系统模块化, 主要包括 STM32 最小系统、 温湿度检测模块、 甲醛气体检测模块、 PM2.5 检测模块、 按键、 液晶显示器、 蜂鸣器、 GSM 模块、蓝牙模块、 移动终端和上位机以及电源管理电路。 其系统结构框图如图所示。
在整个室内空气质量检测系统中, STM32 芯片是整个系统的主控制器, 整个检测系统都是在它的控制下完成的, 并且 STM32 为测试仪提供外部接口, 如液晶显示屏、
按键、 数据采集电路。 首先通过温湿度、 甲醛浓度以及 PM2.5 等传感器进行温湿度、 甲醛气体及 PM2.5 浓度信号采集, 再将采集到的信号送至中央处理单元 STM32 单片机进行信号转换、 放大和处理。 通过库函数编程控制检测系统的工作流程, 可以通过按键输入控制输出显示不同的测量数据以及设置甲醛和 PM2.5 浓度报警值, 当气体浓度值超过报警值时, 通过蜂鸣器鸣叫的方式提醒用户室内有害气体超标, 并在液晶屏上实时显示。利用 GSM 通信模块可以通过短信的形式将用户室内的空气质量情况发到移动终端, 实现了仪器的智能化。 STM32 最小系统通过蓝牙模块与上位机通信, 上位机可以实时显示测量数据。
4 硬件设计方案
学长设计的系统所研究的室内空气质量检测仪, 系统硬件由 STM32 单片机、 电源、 温湿度传感器、 甲醛检测模块、 PM2. 5 检测模块、 按键输入模块、 液晶显示模块、 报警电路、 GSM短信接收模块和蓝牙模块等部分组成。 该系统采用 USB 供电, 通过 USB 数据线与电脑USB 接口相连, 输出+5V 的直流电压, 输出电压在 500mA 左右, 在目前普遍采用 USB接口的情况, 这样也提高了电源的来源以及可靠性, 用户也可以通过手机充电器、 充电宝对测试仪供电, 给用户使用该测试仪带来了很大的便利 模块化的设计可以使系统设计更加简单, 系统功耗降低, 操作变得简单, 可以进行现场检测, 通过液晶显示屏用户直观地读出测量数据。 空气质量检测仪检的整体硬件设计结构如下图所示。
4.1 stm32 主控
STM32C8T6(最小核心板),当然,用其他型号的32,如STM32ZET6也是可以的。
4.2 温度采集模块
系统采用的传感器为含有已校准数字信号输出的温湿度复合传感器 DHT11。该传感器是一款已经得到业界广泛认可的安全性高、 稳定性较强、 性价比高的集中数字化传感器的温湿度。
传感器可以传输信号高达 20 米以上, 可以满足大部分场合的测量要求;具有四针的单排引脚封装系统, 这样外部连接就变得简单; 同时因其超小的体积和极低的功耗在暖通空调、 汽车、 气象站、 除湿器等各行业广泛应用。
4.3 甲醛浓度检测模块
综合考虑甲醛检测精度和测量成本后, 系统选用 ZE08-CH 2 O 电化学甲醛传感器检测室内空气中的甲醛浓度含量, 因该模块精度高、 功耗低,体积小的特点, 成为了制作空气质量检测仪、 空气净化器的优良器件。 相比其他甲醛
传感器主要有以下特点 :
- (1) 分辨率和灵敏度高;
- (2) 功耗低、 使用寿命长;
- (2) UART、 模拟电压信号、 PWM 等多方式输出;
- (3) 具有优秀的抗干扰性、 稳定性高;
- (4) 内置温度补偿单元, 线性输出。
4.4 PM2. 5 浓度检测模块
系统选用夏普公司授权弘成基科技有限公司生产的型号为 YW-51GJ 的 PM2.5 气敏粉尘传感器, 该产品主要针对香烟颗粒、 细微颗粒等特别细微的颗粒等检测对象, 通过脉冲高度来判断细颗粒物浓度, 常用于空气净化器、 车载空气净化系统以及民用空气质量检测系统中, 符合本系统的设计要求。
YW-51GJ PM2.5 粉尘传感器实物图如图所示。
可以看到该 PM2.5 传感器中间有一个圆孔, 其内部安装红外线发光二极管和光电晶体管, 当微小颗粒物进入传感器的圆孔内时, 根据微小颗粒物对光的散射原理, 当细颗粒物(PM2.5) 经过传感器内部的检测孔时会对光线形成散射作用。 部分光线通过光轴,经过透镜后聚焦到感光元件上, 光信号经过感光元件转换为电信号输出。
4.5 液晶显示模块设计
4.6 GSM 模块
经综合考虑学长选用了 SIM800C GSM 无线通信模块, 这是 SIMCOM 公司生产的基于 MT6261 芯片平台的新一代 GSM 模块, 性价比高, 支持蓝牙功能, 支持 51、MSP430、STM32 等主流单片机开发 。
在该模块中, 通信接口为 TTL 电平串口, 引出四根排针与控制器通信。 在 IPX 天线接口连接通信天线, Micro-SIM 卡卡座可以插入移动、 联通和物联网卡, 插入 SIM 卡即可发信息给用户移动终端, SIM 卡插进去听到“咔哒” 响声表明插卡正确, SIM800C GSM 模块实物图如图所示。
4.7 蓝牙模块
为了能够实现测试仪与上位机的通信, 本文采用的是 HC-05 嵌入式蓝牙串口通信模块[65] , 分为两个小模块 a、 b, 如下图所示依次左右排列, 模块 a 与通过 USB 接口与电脑相连, 模块 b 通过四根排母线与测试仪对应的排针相连接。
为了实现主控制器 STM32 与蓝牙模块的连接, 通过导线连接对应接口, 蓝牙接口电路原理图如图所示。
5 软件部分设计
系统主要实现温湿度、 甲醛浓度以及 PM2.5 浓度的检测与显示功能, 通过传感器不断采集数据, 同时对这些数据进行处理、 修正和补偿, 将数据转换为温湿度以及气体浓度进行显示, 让用户可以知道室内的空气质量。 与硬件系统一样分模块设计, 软件设计分成人机交互模块和数据处理模块两部分
5.1 初始化
系统上电后, 先对系统的各模块传感器、 12864LCD 显示屏、 按键等外设进行初始化, 设置标志位和定时器。 之后读取温湿度、 甲醛浓度、 PM2.5 浓度对应的模拟电流电压等电信号参数值, 将数据进行 AD 转换, 对数字量处理后转换为对应的温湿度、 甲醛浓度、 PM2.5 浓度显示出来。 软件设计的主程序流程图下图所示。
5.2 温湿度检测程序设计
DHT11 温湿度传感器硬件设计可以知道温湿度检测电路连接十分简单,DHT11 通过引脚 2(DATA) 给 STM32 发送单总线数字信号。 在电路开始工作的时候,为了跳过不稳定状态, DHT11 需要用一秒的时间不发任何指令。
5.3 甲醛浓度检测程序设计
由甲醛硬件模块设计可以知道本系统采用 ZE08-CH2O 电化学甲醛传感器采集甲醛浓度信号, 利用系统 STM32 单片机自带的 2 个 AD 转换器对甲醛浓度进行采集, 这些AD 转换器具有 10 个通道, 可以单独使用, 也可以实现复用。
5.4 PM2. 5 浓度检测程序设计
章 PM2.5 硬件设计可以知道系统选用了 YM-51 PM2.5 传感器, 通过该模块可以对室内 PM2.5 浓度测量, 传感器通过 RXD 向 STM32 发送数据, 接线图如下所示
PM2.5 浓度检测软件程序流程与甲醛浓度检测流程类似, 首先关闭中断, 再对与PM2.5 检测模块相关的时钟、 AD 转换器进行初始化设置, 确定 AD 转换器的工作模式、触发方式等。 之后打开中断在中断服务程序中实现数据采集, 1 秒内采集 10 次, 对这些数据采用限幅平均滤波法进行软件滤波, 去除因电路干扰产生干扰有效数据的毛刺。
5.5 短信发送程序设计
章 GSM 模块硬件设计可知本文采用 SIM800C GSM 模块实现短信收发的功能。 手机短消息主要采用 PDU(协议数据单元) 模式和 TEXT 模式, PDU 模式同时支持中文和英文短信, 而 TEXT 模式只支持英文短信
效果展示
设计好各个模块原理图, 然后制作出 PCB 板, 通过导线将各个模块与系统主板连接, 室内空气质量检测检测仪实物图如下所示。
室内空气质量实时显示
短信收发测试
6 项目源码
6.1 ADC部分
#include "adc.h"
#include "delay.h"
//初始化ADC
//这里我们仅以规则通道为例
//我们默认将开启通道0~3
void Adc_Init(void)
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE ); //使能ADC1通道时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
//PA1 作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit(ADC1); //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式
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数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
ADC_ResetCalibration(ADC1); //使能复位校准
while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
ADC_StartCalibration(ADC1); //开启AD校准
while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
// ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
//获得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)
//设置指定ADC的规则组通道,一个序列,采样时间
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采样时间为239.5周期
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
u16 Get_Adc_Average(u8 ch,u8 times)
u32 temp_val=0;
u8 t;
for(t=0;t<times;t++)
temp_val+=Get_Adc(ch);
delay_ms(5);
return temp_val/times;
6.2 DS18B20
#include "ds18b20.h"
#include "delay.h"
//复位DS18B20
void DS18B20_Rst(void)
DS18B20_IO_OUT(); //SET PA0 OUTPUT
DS18B20_DQ_OUT=0; //拉低DQ
delay_us(750); //拉低750us
DS18B20_DQ_OUT=1; //DQ=1
delay_us(15); //15US
//等待DS18B20的回应
//返回1:未检测到DS18B20的存在
//返回0:存在
u8 DS18B20_Check(void)
u8 retry=0;
DS18B20_IO_IN();//SET PA0 INPUT
while (DS18B20_DQ_IN&&retry<200)
retry++;
delay_us(1);
;
if(retry>=200)return 1;
else retry=0;
while (!DS18B20_DQ_IN&&retry<240)
retry++;
delay_us(1);
;
if(retry>=240)return 1;
return 0;
//从DS18B20读取一个位
//返回值:1/0
u8 DS18B20_Read_Bit(void) // read one bit
u8 data;
DS18B20_IO_OUT();//SET PA0 OUTPUT
DS18B20_DQ_OUT=0;
delay_us(2);
DS18B20_DQ_OUT=1;
DS18B20_IO_IN();//SET PA0 INPUT
delay_us(12);
if(DS18B20_DQ_IN)data=1;
else data=0;
delay_us(50);
return data;
//从DS18B20读取一个字节
//返回值:读到的数据
u8 DS18B20_Read_Byte(void) // read one byte
u8 i,j,dat;
dat=0;
for (i=1;i<=8;i++)
j=DS18B20_Read_Bit();
dat=(j<<7)|(dat>>1);
return dat;
//写一个字节到DS18B20
//dat:要写入的字节
void DS18B20_Write_Byte(u8 dat)
u8 j;
u8 testb;
DS18B20_IO_OUT();//SET PA0 OUTPUT;
for (j=1;j<=8;j++)
testb=dat&0x01;
dat=dat>>1;
if (testb)
DS18B20_DQ_OUT=0;// Write 1
delay_us(2);
DS18B20_DQ_OUT=1;
delay_us(60);
else
DS18B20_DQ_OUT=0;// Write 0
delay_us(60);
DS18B20_DQ_OUT=1;
delay_us(2);
//开始温度转换
void DS18B20_Start(void)// ds1820 start convert
DS18B20_Rst();
DS18B20_Check();
DS18B20_Write_Byte(0xcc);// skip rom
DS18B20_Write_Byte(0x44);// convert
//初始化DS18B20的IO口 DQ 同时检测DS的存在
//返回1:不存在
//返回0:存在
u8 DS18B20_Init(void)
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PORTA口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PORTA0 推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_0); //输出1
DS18B20_Rst();
return DS18B20_Check();
//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250)
short DS18B20_Get_Temp(void)
u8 temp;
u8 TL,TH;
short tem;
DS18B20_Start (); // ds1820 start convert
DS18B20_Rst();
DS18B20_Check();
DS18B20_Write_Byte(0xcc);// skip rom
DS18B20_Write_Byte(0xbe);// convert
TL=DS18B20_Read_Byte(); // LSB
TH=DS18B20_Read_Byte(); // MSB
if(TH>7)
TH=~TH;
TL=~TL;
temp=0;//温度为负
else temp=1;//温度为正
tem=TH; //获得高八位
tem<<=8;
tem+=TL;//获得底八位
tem=(float)tem*0.625;//转换
if(temp)return tem; //返回温度值
else return -tem;
6.3 RTC部分
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "rtc.h"
//Mini STM32开发板
//RTC实时时钟 驱动代码
//正点原子@ALIENTEK
//2010/6/6
_calendar_obj calendar;//时钟结构体
static void RTC_NVIC_Config(void)
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; //RTC全局中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级1位,从优先级3位
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //先占优先级0位,从优先级4位
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能该通道中断
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
//实时时钟配置
//初始化RTC时钟,同时检测时钟是否工作正常
//BKP->DR1用于保存是否第一次配置的设置
//返回0:正常
//其他:错误代码
u8 RTC_Init(void)
//检查是不是第一次配置时钟
u8 temp=0;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟
PWR_BackupAccessCmd(ENABLE); //使能后备寄存器访问
if (BKP_ReadBackupRegister(BKP_DR1) != 0x5050) //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎
BKP_DeInit(); //复位备份区域
RCC_LSEConfig(RCC_LSE_ON); //设置外部低速晶振(LSE),使用外设低速晶振
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) //检查指定的RCC标志位设置与否,等待低速晶振就绪
temp++;
delay_ms(10);
if(temp>=250)return 1;//初始化时钟失败,晶振有问题
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟
RCC_RTCCLKCmd(ENABLE); //使能RTC时钟
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_WaitForSynchro(); //等待RTC寄存器同步
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_EnterConfigMode();/// 允许配置
RTC_SetPrescaler(32767); //设置RTC预分频的值
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_Set(2020,5,5,12,59,00); //设置时间
RTC_ExitConfigMode(); //退出配置模式
BKP_WriteBackupRegister(BKP_DR1, 0X5050); //向指定的后备寄存器中写入用户程序数据
else//系统继续计时
RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_NVIC_Config();//RCT中断分组设置
RTC_Get();//更新时间
return 0; //ok
//RTC时钟中断
//每秒触发一次
//extern u16 tcnt;
void RTC_IRQHandler(void)
if (RTC_GetITStatus(RTC_IT_SEC) != RESET)//秒钟中断
RTC_Get();//更新时间
if(RTC_GetITStatus(RTC_IT_ALR)!= RESET)//闹钟中断
RTC_ClearITPendingBit(RTC_IT_ALR); //清闹钟中断
RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW); //清闹钟中断
RTC_WaitForLastTask();
//判断是否是闰年函数
//月份 1 2 3 4 5 6 7 8 9 10 11 12
//闰年 31 29 31 30 31 30 31 31 30 31 30 31
//非闰年 31 28 31 30 31 30 31 31 30 31 30 31
//输入:年份
//输出:该年份是不是闰年.1,是.0,不是
u8 Is_Leap_Year(u16 year)
if(year%4==0) //必须能被4整除
if(year%以上是关于PM2.5浓度PM10浓度如何区别哪个首要污染物的主要内容,如果未能解决你的问题,请参考以下文章