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平均值
}

四、实验效果

五、资料获取

项目分享

相关推荐
chipsense6 小时前
电流传感器型号从数据库查询并排序输出到网页的方法
数据库·php·传感器·霍尔电流传感器
代码游侠6 小时前
ARM开发——阶段问题综述(二)
运维·arm开发·笔记·单片机·嵌入式硬件·学习
DLGXY7 小时前
STM32——旋转编码器计次(七)
stm32·单片机·嵌入式硬件
羽获飞7 小时前
从零开始学嵌入式之STM32——3.使用寄存器点亮一盏LED灯
单片机·嵌入式硬件
浩子智控8 小时前
商业航天计算机抗辐射设计
单片机·嵌入式硬件
独处东汉11 小时前
freertos开发空气检测仪之输入子系统结构体设计
数据结构·人工智能·stm32·单片机·嵌入式硬件·算法
風清掦11 小时前
【江科大STM32学习笔记-04】0.96寸OLED显示屏
笔记·stm32·学习
czy878747512 小时前
机智云 MCU OTA可以对MCU程序进行无线远程升级。
单片机·嵌入式硬件
A9better14 小时前
嵌入式开发学习日志52——二值与计数信号量
单片机·嵌入式硬件·学习
日更嵌入式的打工仔15 小时前
(实用向)中断服务程序(ISR)的优化方向
笔记·单片机