外设驱动库开发笔记32:HLPM025K3 PM2.5传感器驱动
现在人们对大气环境及室内环境都比较关注。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传感器驱动相关推荐
- 外设驱动库开发笔记15:DHT11温湿度传感器驱动
与DS18B20一样DHT11也是采用单总线,但所不同的是DHT11可同时实现温度和湿度的检测.在我们的产品中经常使用它来检测环境的温湿度信息.这一篇我们将设计并封装DHT11的驱动程序,以方便重复使 ...
- 外设驱动库开发笔记21:BME680环境传感器驱动
环境传感器是一类我们很常用的传感器.它可以方便我们获取压力.温度.湿度以及空气质量等数据.在这一篇中,我们将分析BME680环境传感器的功能,并设计和实现BME680环境传感器的驱动. 1.功能概述 ...
- 外设驱动库开发笔记19:BMP280压力温度传感器驱动
压力和温度监测在嵌入式系统开发中是非常常见的需求,特别是对环境大气压力和温度的检测需求就更常见了.我们一般都会选择一些封装较小操作比较方便的压力传感器.BMP280就是满足这一要求的器件.在这一篇中我 ...
- 外设驱动库开发笔记45:MS4515DO压力传感器驱动
很多时候我们需要检测流量和压力这些参数,比如我们要检测大气压,或者通过测量差压来获得输送流体的流量等,都需要用到压力传感器.这一篇我们就来讨论MS4515DO压力传感器的数据获取. 1.功能概述 ...
- 外设驱动库开发笔记50:HP203B气压传感器驱动
在我们的项目中,经常会有需要检测大气压力的时候.这次我们在大气环境监测的过程中用到了HP203B这款气压传感器.所以这一篇中,我们来思考HP203B气压传感器的驱动设计. 1.功能概述 HP2 ...
- 外设驱动库开发笔记13:MLX90614红外温度传感器驱动
红外温度传感器一般用于非接触式的温度检测.在我们的系统中经常会有这样的需求.所以我们将其设计为通用的驱动库以备复用.这一篇我们将讲述MLX90614红外温度传感器驱动的设计与实现. 1.功能概述 ML ...
- 外设驱动库开发笔记0:EPD总体设计
在产品开发过程中,不可避免需要使用很多外部的元件及传感器,这些元器件也许是板载的,也许是板外的,但不管怎样,为其开发驱动程序都是必须的.每次都需要为这些元器件编写驱动程序.但每次重复编写调试很麻烦,于 ...
- 外设驱动库开发笔记54:外设库驱动设计改进的思考
不知不觉中我们已经发布了五十多篇外设驱动的文章.前段时间有一位网友提出了一些非常中肯的建议,这也让我们开始考虑怎么优化驱动程序设计的问题.在这一篇中我们将来讨论这一问题. 1.问题分析 首先我 ...
- 外设驱动库开发笔记34:OLED显示屏驱动
现在OLED显示屏在嵌入式系统中应用的越来越多.对于一些显示信息不太复杂,以显示信息为主的需求,我们一般会选择OLED显示屏.在这一篇中,我们将讨论OLED显示屏驱动的设计与实现. 1.功能概述 ...
最新文章
- 皮一皮:这样的消息我也想收...
- springboot配置html资源路径,SpringBoot普通.html文件视图配置
- java与c/c++进行socket通信的一些问题
- php thumbs.db,window_Win8系统删除thumbs.db文件的方法, 最近有Win8系统用户反映, - phpStudy...
- CSS中实现水平/垂直居中
- python---(10) python模块的使用
- android app记录执行日志 捕获奔溃异常 ,存储日志到文件
- linux纯终端下中文输入,Linux中文输入法的问题解决
- Delphi视频教程
- 1.1音响系统放大器设计
- JAVA_OPTS 参数介绍 使用记录
- 《东周列国志》第四十七回 弄玉吹箫双跨凤 赵盾背秦立灵公
- 阿里成立“平头哥”半导体公司,明年推神经网络芯片
- 水星mw325r设置无线服务器未响应,水星MW325R无线路由器设置教程
- 清北学堂集训day1
- cortex系列处理器排行_arm处理器排行_ARM Cortex A系列处理器性能分类比较ARM处理器排名 ZNDS资讯...
- OpenJDK源码赏析之二:java虚拟机启动流程到首函数调用全流程
- 11.NDP协议分析与实践
- Ubuntu 安装及共享打印机
- HTML实现狗屁不通文章生成器
热门文章
- 滤波 放电速度比充电慢 模电
- 基于SpringBoot项目的https
- linux下的idea的界面问题,错位以及各种...
- DB2 错误代码 命令大全
- 冲刺阶段(二)第五天 5月16日
- 【计算机网络复习 数据链路层】3.6.2 以太网
- 获取axios的return值
- js读取服务器上的txt文件,javascript – 每15秒读取一次文本文件的内容
- 计算机仿真在机械行业中的应用,计算机仿真技术机械行业应用
- 分区助手扩大c盘后自动修复_磁盘分区工具,这个好用;无论调整C盘还是系统迁移...