TA的每日心情 | 怒 2023-7-25 22:49 |
---|
签到天数: 385 天 连续签到: 1 天 [LV.9]以坛为家II
|
1、夏普光学灰尘传感器(GP2Y1010AU0F)介绍
Sharp's GP2Y1010AU0F 是一款光学空气质量传感器,设计用来感应空气中的尘埃粒子,其内部对角安放着红外线发光二极管和光电晶体管,使得其能够探测到空气中尘埃反射光,即使非常 细小的如烟草烟雾颗粒也能够被检测到,通常在空气净化系统中应用。该装置中,一个红外发光二极管和光电晶体管,对角布置成允许其检测到在空气中的灰尘反射 光。
2、规范
电源电压:5-7V
工作温度:-10-65摄氏度
消耗电流:20mA最大
最小粒子检出值:0.8微米
灵敏度:0.5V/(0.1mg/m3)
清洁空气中电压:0.9V 典型值
工作温度:-10~65℃
存储温度:-20~80℃
使用寿命:5年
尺寸大小:46mm×30mm×17.6mm
重量大小:15g
3、检测原理
其原理如下图,传感器中心有个洞可以让空气自由流过,定向发射LED光,通过检测经过空气中灰尘折射过后的光线来判断灰尘的含量。
4、接线说明
5、驱动代码:
gp2y.h
/** **************************************************************************************** * * @file gp2y.h * * @brief GP2Y1010AU0F传感器操作模块头文件 * * Copyright (C) sunsjw 2015 * * $Rev: 1.0 $ * **************************************************************************************** */#ifndef __GP2Y_H#define __GP2Y_H#include "gd32f20x.h"#include <stdint.h>#define GP2Y_ON GPIO_ResetBits(GPIOA,GPIO_PIN_1)#define GP2Y_OFF GPIO_SetBits(GPIOA,GPIO_PIN_1)void GP2Y_init(void);float GP2Y_Read(void);void gp2y_io_config(void);#endifgp2y.c
<em>/** **************************************************************************************** * * @file gp2y.c * * @brief GP2Y1010AU0F传感器操作模块文件 * * Copyright (C) sunsjw 2015 * * $Rev: 1.0 $ * **************************************************************************************** */#include "gp2y.h"//-----------------------------------------------------------------------// ADC配置定义//-----------------------------------------------------------------------void ADC_config(void){ ADC_InitPara adc_stru; adc_stru.ADC_Channel_Number = 1; adc_stru.ADC_Data_Align = ADC_DATAALIGN_RIGHT; adc_stru.ADC_Mode = ADC_MODE_INDEPENDENT; adc_stru.ADC_Mode_Continuous = DISABLE; adc_stru.ADC_Mode_Scan = DISABLE; adc_stru.ADC_Trig_External = ADC_EXTERNAL_TRIGGER_MODE_NONE; ADC_Init(ADC1,&adc_stru); ADC_RegularChannel_Config(ADC1,ADC_CHANNEL_4,1,ADC_SAMPLETIME_28POINT5 ); //ADC_ExternalTrigConv_Enable(ADC1,ENABLE); ADC_Enable(ADC1,ENABLE); ADC_Calibration(ADC1);}/*! * @brief 粉尘传感器GP2Y1010AU0F初始化 * * @param None * * @return None */void GP2Y_init(){ ADC_config();}/*! * @brief 粉尘传感器GP2Y1010AU0F的IO配置 * * @param None * * @return None */void gp2y_io_config(){ //红外管开关 GPIO_InitPara gpio_stru; gpio_stru.GPIO_Mode = GPIO_MODE_OUT_PP; gpio_stru.GPIO_Pin = GPIO_PIN_1; gpio_stru.GPIO_Speed = GPIO_SPEED_10MHZ; GPIO_Init(GPIOA,&gpio_stru); //配置ADC引脚 gpio_stru.GPIO_Mode = GPIO_MODE_AIN; gpio_stru.GPIO_Pin = GPIO_PIN_4; gpio_stru.GPIO_Speed = GPIO_SPEED_10MHZ; GPIO_Init(GPIOA,&gpio_stru);}/*! * @brief 从粉尘传感器GP2Y1010AU0F读取数据 * * @param None * * @return 电压值 */float GP2Y_Read(){ uint16_t adcData; float voltRead; ADC_SoftwareStartConv_Enable(ADC1,ENABLE); // Get ADC input while(ADC_GetBitState(ADC1,ADC_FLAG_EOC)!=SET); adcData = ADC_GetConversionValue(ADC1); //PRINTF("ADC:%d\n",adcData); // Convert ADC value to a voltage based on 3.3V VREFH on board voltRead = (float)adcData * (3.3 / 4096.0); return voltRead;}</em>主程序读PM2.5的函数
void ShowPM25(void){ int new_pm25 = 0; static int prev_pm25 = 0; int last_pm25 = 0; GP2Y_ON; DelayUs(280); float adValue = GP2Y_Read(); DelayUs(40); GP2Y_OFF; DelayUs(9680); /*无尘测得电压值为0.6,手册上每0.1mg/m3 电压增加0.5V *使用excel记算得出公式:y = 0.2x-0.12 */ new_pm25 = (0.2f*adValue-0.12f)*1000; //电压-灰尘转换 /*一阶滤波*/ last_pm25 = 0.2*new_pm25+0.8*prev_pm25; prev_pm25 = new_pm25; sprintf((char*)showBuffer,"M25:%3d ug/",last_pm25); OLED_ShowString(0,6,showBuffer); OLED_ShowCHinese(112,6,10);//显示m³}上面计算new_pm25用excel计算出来的函数公式图:
0.6V时PM2.5是0,然后电压每增加0.25V,PM2.5增加0.05。如果你的传感器无尘时的没量值是0.8那么就只需要把0.6改为0.8,Execl会自动帮你求出函数的公式来。Excel我把上传上来。
PM25计算公式.xls
6、效果图
热门推荐:
轻轻松松入门GD32F207开发板 |
|