现在人们对大气环境及室内环境都比较关注。PM2.5在生活中也是常见的词汇。在有些产品中就要求检测PM2.5的数值。检测PM2.5的手段多种多样,在要求不高时我们通常可以采用激光模块。在这一篇中,我们将讨论HLPM025K3 PM2.5传感器驱动的设计与实现。

1、功能概述

  HLPM025K3传感器采用激光散射原理。即令激光照射在空气中的悬浮颗粒物上产生散射,同时在某一特定角度收集散射光,得到散射光强随时间变化的曲线。通过稳定的气 体对流系统,使外界空气均匀的通过自主研发设计的风路,同时在风路中设有多个精密的光学传感器,可以精确的获得粒子的尺寸、速度和质量等信息,加以统计学原理,继而计算出总的粒子质量,从而实时的得到空气中所被关注的粒子的浓度,达到检测PM2.5以及PM10的目的。其基本原理如下图所示:

  HLPM025K3传感器采用串行通讯,采用6脚通讯接口,其引脚定义如下图所示:

  HLPM025K3传感器采用TTL串行通讯,采用9600的波特率,8为数据位,1为停止位,无校验的方式。HLPM025K3传感器通讯采取主动发送模式,0.8到1.2秒发送一次数据。其数据包含7个字节,具体格式如下:

  其中,校验位=PM2.5(H)+PM2.5(L)+PM10(H)+PM10(L)
  接收到的数据按公式计算后得到 PM2.5 和 PM10 的值。
  PM2.5 = (PM2.5(H)×256 + PM2.5(L))×0.1;
  PM10 = (PM2.5(H)×256 + PM2.5(L))×0.1;

2、驱动设计与实现

  我们已经了解了HLPM025K3型PM2.5传感器的基本情况。在这一节中我们将设计并实现HLPM025K3型PM2.5传感器的驱动。

2.1、对象定义

  在使用一个对象之前我们需要获得一个对象。同样的我们想要HLPM025K3 PM2.5传感器就需要先定义HLPM025K3 PM2.5传感器的对象。

2.1.1、对象的抽象

  我们要得到HLPM025K3 PM2.5传感器对象,需要先分析其基本特性。一般来说,一个对象至少包含两方面的特性:属性与操作。接下来我们就来从这两个方面思考一下HLPM025K3 PM2.5传感器的对象。
  先来考虑属性,作为属性肯定是用于标识或记录对象特征的东西。我们来考虑HLPM025K3 PM2.5传感器对象属性。我们将测量数据作为对象的属性,因为他们表示了对象当前的状态。
  接着我们还需要考虑HLPM025K3 PM2.5传感器对象的操作问题。对象本身除了接受数据并没有什么需要操作的。我们使用队列来存储接收到的数据,所以入队出队过程可看作是其操作。
  根据上述我们对HLPM025K3 PM2.5传感器的分析,我们可以定义HLPM025K3 PM2.5传感器的对象类型如下:

/*定义HLPM025K3对象类型*/
typedef struct HlpmObject {float pm25;      //PM2.5测量值float pm100;  //PM10测量值struct DwinRxBuffer{uint8_t queue[HLPMRxBufferLength]; //键值存储队列uint8_t pRead;                                  //读队列指针uint8_t pWrite;                                  //写队列指针uint16_t (*DeQueue)(struct HlpmObject *hlpm,uint8_t *rxBuf); //出队操作void (*EnQueue)(struct HlpmObject *hlpm,uint8_t rData);               //入队操作}rxBuffer;                    //定义接收缓存队列
}HlpmObjectType;

2.1.2、对象初始化

  我们知道,一个对象仅作声明是不能使用的,我们需要先对其进行初始化,所以这里我们来考虑HLPM025K3 PM2.5传感器对象的初始化函数。一般来说,初始化函数需要处理几个方面的问题。一是检查输入参数是否合理;二是为对象的属性赋初值;三是对对象作必要的初始化配置。据此我们设计HLPM025K3 PM2.5传感器对象的初始化函数如下:

/*HLPM对象初始化函数*/
void HlpmInitialization(HlpmObjectType *hlpm)
{if(hlpm==NULL){return;}hlpm->pm25=0.0;hlpm->pm100=0.0;hlpm->rxBuffer.pRead=0;hlpm->rxBuffer.pWrite=0;hlpm->rxBuffer.EnQueue=BufferDataEnQueue;hlpm->rxBuffer.DeQueue=BufferDataDeQueue;
}

2.2、对象操作

  我们已经完成了HLPM025K3 PM2.5传感器对象类型的定义和对象初始化函数的设计。但我们的主要目标是获取对象的信息,接下来我们还要实现面向HLPM025K3 PM2.5传感器的各类操作。
  由于HLPM025K3 PM2.5传感器对象是自主发送,所以我们需要做的就是接收消息并解析。

/*解析PM2.5和PM10的数据*/
bool ParsingPMData(HlpmObjectType *hlpm)
{uint16_t length=0;uint8_t receivedData[7]={0};bool isValid=false;length=hlpm->rxBuffer.DeQueue(hlpm,receivedData);if(length>0){isValid=CheckDataIsValid(receivedData);if(isValid){hlpm->pm25=SynthesisPMValue(receivedData+1);hlpm->pm100=SynthesisPMValue(receivedData+3);}}return isValid;
}

3、驱动的使用

  我们已经设计并实现了HLPM025K3 PM2.5传感器对象的驱动程序。接下来我们设计一个简单的应用来验证这一驱动程序是否可行。

3.1、声明并初始化对象

  使用基于对象的操作我们需要先得到这个对象,所以我们先要使用前面定义的HLPM025K3 PM2.5传感器对象类型声明一个HLPM025K3 PM2.5传感器对象变量,具体操作格式如下:
  HlpmObjectType hlpm;
  声明了这个对象变量并不能立即使用,我们还需要使用驱动中定义的初始化函数对这个变量进行初始化。这个初始化函数所需要的输入参数如下:
  HlpmObjectType *hlpm,HLPM025K3 PM2.5传感器对象
  这个对象变量我们已经定义了,所以只需输入这个对象就好了。于是我们可以调用初始化函数如下:
  HlpmInitialization(&hlpm);
  对于串口通讯,我们可以使用多种方式,我们在此使用中断来接收数据,具体实现如下:

//数据接收中断处理函数
void HLPM_USART_ReceiveDataHandle(void)
{uint8_t res;// 接收寄存器为空,等待字节被对应的串口完全接收 if(__HAL_UART_GET_FLAG(&hlpmhuart,UART_FLAG_RXNE)!=RESET){   // 获取接收到的字节数HAL_UART_Receive(&hlpmhuart,&res,1,1000);hlpm.rxBuffer.EnQueue(&hlpm,res);__HAL_UART_CLEAR_FLAG(&hlpmhuart,UART_FLAG_RXNE);}
}

3.2、基于对象进行操作

  我们定义了对象变量并使用初始化函数给其作了初始化。接着我们就来考虑操作这一对象获取我们想要的数据。我们在驱动中已经将获取数据并转换为转换值的比例值,接下来我们使用这一驱动开发我们的应用实例。

/*数据获取*/
void GetDataFromHLPM025K3(void)
{float pm25Value;float pm10Value;ParsingPMData(&hlpm);pm25Value=hlpm.pm25;pm10Value=hlpm.pm100;
}

4、应用总结

  我们已经设计并实现了HLPM025K3 PM2.5传感器对象的驱动程序,并且设计了简单的验证程序。HLPM025K3 PM2.5传感器的操作本身比较简单,只需要通过串口获取数据就可以了。
  驱动中采用了FIFO队列存储接收到的HLPM025K3 PM2.5传感器数据,主要是考虑到被动接收的情况下,能够保证正确的解析数据。如果不使用也是没有问题的,本身不是HLPM025K3 PM2.5传感器对象所必需的。

欢迎关注:

外设驱动库开发笔记32:HLPM025K3 PM2.5传感器驱动相关推荐

  1. 外设驱动库开发笔记15:DHT11温湿度传感器驱动

    与DS18B20一样DHT11也是采用单总线,但所不同的是DHT11可同时实现温度和湿度的检测.在我们的产品中经常使用它来检测环境的温湿度信息.这一篇我们将设计并封装DHT11的驱动程序,以方便重复使 ...

  2. 外设驱动库开发笔记21:BME680环境传感器驱动

    环境传感器是一类我们很常用的传感器.它可以方便我们获取压力.温度.湿度以及空气质量等数据.在这一篇中,我们将分析BME680环境传感器的功能,并设计和实现BME680环境传感器的驱动. 1.功能概述 ...

  3. 外设驱动库开发笔记19:BMP280压力温度传感器驱动

    压力和温度监测在嵌入式系统开发中是非常常见的需求,特别是对环境大气压力和温度的检测需求就更常见了.我们一般都会选择一些封装较小操作比较方便的压力传感器.BMP280就是满足这一要求的器件.在这一篇中我 ...

  4. 外设驱动库开发笔记45:MS4515DO压力传感器驱动

      很多时候我们需要检测流量和压力这些参数,比如我们要检测大气压,或者通过测量差压来获得输送流体的流量等,都需要用到压力传感器.这一篇我们就来讨论MS4515DO压力传感器的数据获取. 1.功能概述 ...

  5. 外设驱动库开发笔记50:HP203B气压传感器驱动

      在我们的项目中,经常会有需要检测大气压力的时候.这次我们在大气环境监测的过程中用到了HP203B这款气压传感器.所以这一篇中,我们来思考HP203B气压传感器的驱动设计. 1.功能概述   HP2 ...

  6. 外设驱动库开发笔记13:MLX90614红外温度传感器驱动

    红外温度传感器一般用于非接触式的温度检测.在我们的系统中经常会有这样的需求.所以我们将其设计为通用的驱动库以备复用.这一篇我们将讲述MLX90614红外温度传感器驱动的设计与实现. 1.功能概述 ML ...

  7. 外设驱动库开发笔记0:EPD总体设计

    在产品开发过程中,不可避免需要使用很多外部的元件及传感器,这些元器件也许是板载的,也许是板外的,但不管怎样,为其开发驱动程序都是必须的.每次都需要为这些元器件编写驱动程序.但每次重复编写调试很麻烦,于 ...

  8. 外设驱动库开发笔记54:外设库驱动设计改进的思考

      不知不觉中我们已经发布了五十多篇外设驱动的文章.前段时间有一位网友提出了一些非常中肯的建议,这也让我们开始考虑怎么优化驱动程序设计的问题.在这一篇中我们将来讨论这一问题. 1.问题分析   首先我 ...

  9. 外设驱动库开发笔记34:OLED显示屏驱动

      现在OLED显示屏在嵌入式系统中应用的越来越多.对于一些显示信息不太复杂,以显示信息为主的需求,我们一般会选择OLED显示屏.在这一篇中,我们将讨论OLED显示屏驱动的设计与实现. 1.功能概述 ...

最新文章

  1. 皮一皮:这样的消息我也想收...
  2. springboot配置html资源路径,SpringBoot普通.html文件视图配置
  3. java与c/c++进行socket通信的一些问题
  4. php thumbs.db,window_Win8系统删除thumbs.db文件的方法,  最近有Win8系统用户反映, - phpStudy...
  5. CSS中实现水平/垂直居中
  6. python---(10) python模块的使用
  7. android app记录执行日志 捕获奔溃异常 ,存储日志到文件
  8. linux纯终端下中文输入,Linux中文输入法的问题解决
  9. Delphi视频教程
  10. 1.1音响系统放大器设计
  11. JAVA_OPTS 参数介绍 使用记录
  12. 《东周列国志》第四十七回 弄玉吹箫双跨凤 赵盾背秦立灵公
  13. 阿里成立“平头哥”半导体公司,明年推神经网络芯片
  14. 水星mw325r设置无线服务器未响应,水星MW325R无线路由器设置教程
  15. 清北学堂集训day1
  16. cortex系列处理器排行_arm处理器排行_ARM Cortex A系列处理器性能分类比较ARM处理器排名 ZNDS资讯...
  17. OpenJDK源码赏析之二:java虚拟机启动流程到首函数调用全流程
  18. 11.NDP协议分析与实践
  19. Ubuntu 安装及共享打印机
  20. HTML实现狗屁不通文章生成器

热门文章

  1. 滤波 放电速度比充电慢 模电
  2. 基于SpringBoot项目的https
  3. linux下的idea的界面问题,错位以及各种...
  4. DB2 错误代码 命令大全
  5. 冲刺阶段(二)第五天 5月16日
  6. 【计算机网络复习 数据链路层】3.6.2 以太网
  7. 获取axios的return值
  8. js读取服务器上的txt文件,javascript – 每15秒读取一次文本文件的内容
  9. 计算机仿真在机械行业中的应用,计算机仿真技术机械行业应用
  10. 分区助手扩大c盘后自动修复_磁盘分区工具,这个好用;无论调整C盘还是系统迁移...