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文件

cpp 复制代码
#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文件

cpp 复制代码
#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文件

cpp 复制代码
#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_TIMES	20	定义读取次数,读这么多次,然后取平均值
 
	{
		temp_val+=PM25_GetData();	//读取ADC值
		delay_ms(5);
	}
	temp_val/=PM25_READ_TIMES;//得到平均值
    return (u16)temp_val;//返回算出的ADC平均值
}

四、实验效果

五、资料获取

项目分享

相关推荐
PegasusYu1 小时前
STM32CUBEIDE FreeRTOS操作教程(九):eventgroup事件标志组
stm32·教程·rtos·stm32cubeide·free-rtos·eventgroup·时间标志组
lantiandianzi5 小时前
基于单片机的多功能跑步机控制系统
单片机·嵌入式硬件
文弱书生6565 小时前
输出比较简介
stm32
哔哥哔特商务网6 小时前
高集成的MCU方案已成电机应用趋势?
单片机·嵌入式硬件
跟着杰哥学嵌入式6 小时前
单片机进阶硬件部分_day2_项目实践
单片机·嵌入式硬件
电子科技圈6 小时前
IAR与鸿轩科技共同推进汽车未来
科技·嵌入式硬件·mcu·汽车
东芝、铠侠总代136100683937 小时前
浅谈TLP184小型平面光耦
单片机·嵌入式硬件·物联网·平面
lantiandianzi7 小时前
基于单片机中医药柜管理系统的设计
单片机·嵌入式硬件
嵌入式知识大讲堂7 小时前
HDMI数据传输三种使用场景
单片机
黑客呀8 小时前
[系统安全]Rootkit基础
stm32·单片机·系统安全