目录
一、介绍
二、传感器原理
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 | 空气质量 | 空气质量级别 | 空气质量指数类别 |
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 开启内部LEDdelay_us(280); // 开启LED后的280us的等待时间ADCVal = PM25_ADC_Read(); //PA1 采样,读取AD值delay_us(19); //延时19us,因为这里AD采样的周期为239.5,所以AD转换一次需耗时21us,19加21再加280刚好是320usPM25_LED_L; //置0 关闭内部LEDdelay_us(9680); //需要脉宽比0.32ms/10ms的PWM信号驱动传感器中的LEDVoltage = 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平均值
}