自学内容网 自学内容网

PM2.5粉尘传感器详解(STM32)

目录

一、介绍

二、传感器原理

1.原理图

2.引脚描述

3.工作原理介绍

4.粉尘浓度转化关系

5.空气污染指数 

三、程序设计

main.c文件

PM25.h文件

PM25.c文件

四、实验效果 

五、资料获取

项目分享


一、介绍

        GP2Y1014AU是日本夏普公司开发的一款光学灰尘浓度检测传感器,设计用来感应空气中的尘埃粒子,其内部对角安放着红外线发光二极管和光电晶体管,使得其能够探测到空气中尘埃反射光,即使非常细小的如烟草烟雾颗粒也能够被检测到,通常应用在空气净化系统中。

以下是PM2.5传感器的参数:

型号

GP2Y1014AU

工作电压

5~7V

工作电流

<20mA

工作温度

-10~65

存储温度

-20~80

灵敏度

0.5V(0.1mg/m3)

最小粒子检出值

0.8微米

哔哩哔哩视频链接:

PM2.5粉尘传感器详解(STM32)

(资料分享见文末) 

二、传感器原理

1.原理图

L-VCC引脚接电阻是用来限流,接电容是用来稳压 

2.引脚描述

引脚名称

描述

L-VCC

LED灯正极

L-GND

LED灯负极

LED

LED灯引脚

S-GND

模块负极

OUT

模拟量输出引脚

VCC

模块正极

3.工作原理介绍

     PM2.5传感器其内部对角安放着红外线发光二极管光电晶体管,它们的光轴相交,当带灰尘的气流通过光轴相交的交叉区域,粉尘对红外光反射,反射的光强与灰尘浓度成正比。光电晶体管能够探测到空气中尘埃反射光,尘埃浓度越高,反射光越多,从而输出模拟电压值越高,通过ADC将模拟值转化为数字电压值,利用比例关系式,最终得到尘埃浓度。

4.粉尘浓度转化关系

V

0.95

1.45

2.00

2.65

3.25

3.60

Mg/m3

0

0.1

0.2

0.3

0.4

0.5

5.空气污染指数 

PM2.5
浓度均值(μg/m3)

空气质量
AQI

空气质量级别

空气质量指数类别

0-35

0-50

一级

35-75

51-100

二级

75-115

101-150

三级

轻度污染

115-150

151-200

四级

中度污染

150-250

201-300

五级

重度污染

250以上

300

六级

严重污染

  三、程序设计

1.使用STM32F103C8T6读取PM2.5粉尘传感器采集的数据,通过串口发送至电脑

2.将读取得到信息数据同时在OLED上显示

PM2.5_LED

PA0

PM2.5_VO

PA1

OLED_SCL

PB11

OLED_SDA

PB10

串口

串口1

main.c文件

#include "stm32f10x.h"
#include "led.h"
#include "usart.h"
#include "delay.h"
#include "oled.h"
#include "PM25.h"
#include "adcx.h"

/*****************辰哥单片机设计******************
STM32
 * 项目:PM2.5粉尘传感器实验                     
 * 版本: V1.0
 * 日期: 2024.9.10
 * MCU:STM32F103C8T6
 * 接口:参看PM25.h
 * BILIBILI:辰哥单片机设计
 * CSDN:辰哥单片机设计
 * 作者:辰哥 

**********************BEGIN***********************/

u16 pm;

int main(void)
{ 

  SystemInit();//配置系统时钟为72M
delay_init(72);
LED_Init();
LED_On();
PM25_Init();
USART1_Config();//串口初始化

OLED_Init();
printf("Start \n");
delay_ms(1000);
//显示“粉尘浓度:”
OLED_ShowChinese(0,0,0,16,1);
OLED_ShowChinese(16,0,1,16,1);
OLED_ShowChinese(32,0,2,16,1);
OLED_ShowChinese(48,0,3,16,1);
OLED_ShowChar(64,0,':',16,1);

  while (1)
  {
LED_Toggle();
pm = Get_PM25_Average_Data();
printf("粉尘浓度: %d\r\n",pm);

OLED_ShowNum(80,0,pm,3,16,1);

delay_ms(500);
  }
}

PM25.h文件

#include "stm32f10x.h"
#include "led.h"
#include "usart.h"
#include "delay.h"
#include "oled.h"
#include "PM25.h"
#include "adcx.h"

/*****************辰哥单片机设计******************
STM32
 * 项目:PM2.5粉尘传感器实验                     
 * 版本: V1.0
 * 日期: 2024.9.10
 * MCU:STM32F103C8T6
 * 接口:参看PM25.h
 * BILIBILI:辰哥单片机设计
 * CSDN:辰哥单片机设计
 * 作者:辰哥 

**********************BEGIN***********************/

u16 pm;

int main(void)
{ 

  SystemInit();//配置系统时钟为72M
delay_init(72);
LED_Init();
LED_On();
PM25_Init();
USART1_Config();//串口初始化

OLED_Init();
printf("Start \n");
delay_ms(1000);
//显示“粉尘浓度:”
OLED_ShowChinese(0,0,0,16,1);
OLED_ShowChinese(16,0,1,16,1);
OLED_ShowChinese(32,0,2,16,1);
OLED_ShowChinese(48,0,3,16,1);
OLED_ShowChar(64,0,':',16,1);

  while (1)
  {
LED_Toggle();
pm = Get_PM25_Average_Data();
printf("粉尘浓度: %d\r\n",pm);

OLED_ShowNum(80,0,pm,3,16,1);

delay_ms(500);
  }
}

PM25.c文件

#include "PM25.h"

/*****************辰哥单片机设计******************
STM32
 * 文件:PM2.5粉尘传感器c文件                   
 * 版本: V1.0
 * 日期: 2024.9.10
 * MCU:STM32F103C8T6
 * 接口:见代码
 * BILIBILI:辰哥单片机设计
 * CSDN:辰哥单片机设计
 * 作者:辰哥

**********************BEGIN***********************/

/**
  * @brief  PM25初始化程序
  * @param  无
  * @retval 无
  */

void PM25_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd (PM25_GPIO_CLK, ENABLE );// 打开 ADC IO端口时钟
GPIO_InitStructure.GPIO_Pin = PM25_LED_GPIO_PIN;// 配置 ADC IO 引脚模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;// 设置为推挽输出

GPIO_Init(PM25_LED_GPIO_PORT, &GPIO_InitStructure);// 初始化 ADC IO

//PA1作为模拟通道输入引脚 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Pin = PM25_VO_GPIO_PIN;
GPIO_Init(PM25_VO_GPIO_PORT, &GPIO_InitStructure);

ADCx_Init();

}

uint16_t PM25_ADC_Read(void)
{
//设置指定ADC的规则组通道,采样时间
return ADC_GetValue(ADC_CHANNEL, ADC_SampleTime_239Cycles5);
}


/**
  * @brief  PM25 ADC数据读取
  * @param  无
  * @retval 返回转换后的PM25模拟信号数值
  */

u16 PM25_GetData(void)
{
uint16_t ADCVal;
int dustVal = 0;
float Voltage;

PM25_LED_H;//置1  开启内部LED
delay_us(280); // 开启LED后的280us的等待时间
ADCVal = PM25_ADC_Read();  //PA1 采样,读取AD值
delay_us(19);  //延时19us,因为这里AD采样的周期为239.5,所以AD转换一次需耗时21us,19加21再加280刚好是320us
PM25_LED_L;//置0  关闭内部LED
delay_us(9680);//需要脉宽比0.32ms/10ms的PWM信号驱动传感器中的LED

Voltage = 3.3f * ADCVal / 4096.f * 2; //获得AO输出口的电压值

dustVal = (0.17*Voltage-0.1)*1000;  //乘以1000单位换成ug/m3//

if (dustVal < 0)
dustVal = 0;            //限位//

if (dustVal>500)        
dustVal=500;

return dustVal;
}

/**
  * @brief  平均值滤波法
  * @param  无
  * @retval 返回滤波后的数据
  */
u16 Get_PM25_Average_Data(void)
{
u16 temp_val=0;
u8 t;
for(t=0;t<PM25_READ_TIMES;t++)//#define PM25_READ_TIMES20定义读取次数,读这么多次,然后取平均值
 
{
temp_val+=PM25_GetData();//读取ADC值
delay_ms(5);
}
temp_val/=PM25_READ_TIMES;//得到平均值
    return (u16)temp_val;//返回算出的ADC平均值
}

四、实验效果 

五、资料获取

项目分享


原文地址:https://blog.csdn.net/qq_44016222/article/details/142328600

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!