OneNET麒麟座应用开发之八:采集大气压力等环境参数

采集大气压力和温度也是核算大气标准状况下的各种数据的必须参数,为此我们必须知道压力和温度才能计算标准状况下的各种参数,于此我们需要一个既能检测压力也能检测温度的元件。

1、硬件概述

MS5837压力传感器是一种可用于电路板上,适用于检测10-1200mbar压力范围的传感器,灵敏度非常高,理论上能够检测到0.01mbar的压力变化,实际使用过程中测试并无明显的变化。

(1)硬件连接

MS5837采用I2C总线通讯,与STM32的MCU可以实现I2C通讯。硬件连接方式如下:

我们发现OneNET麒麟座的I2C引到了J3的第4和5引脚,但是我们发现在OLED的接口也是这个,所以我们直接用这个,因为电源也正好合适,具体位置如下图红框处:

(3)寄存器分配

MS5837只有5个基本命令:复位、读取出厂校准值、数据1转换(压力值数据)、数据2转换(温度值数据)和读取ADC的转换结果。具体分配如下:

2、软件设计

因为MS5837的地址是固定的,所以一个I2C总线只能挂1个MS5837模块。为了让程序具有较好的可移植性,我们在便写程序时不使用对硬件的直接操作,而采用函数指针来操作,所以我们定义了:

/*向MS5837下发指令,指令格式均为1个字节*/

typedef void (*WriteCommandToMs5837Type)(uint8_t deviceAddress,uint8_t command);

/*从MS5837读取多个字节数据的值*/

typedef void (*ReadBytesFromMs5837Type)(uint8_t deviceAddress,uint8_t *pData,uint16_t bytesNum);

以上两个函数指针来实现针对硬件的读写操作。接下来我们开始编写代码。

1)复位操作

复位操作的数据流如下图所示,只需要发送一条命令就可完成:

/*复位MS5837操作*/

void ResetForMs5837(uint8_t deviceAddress,WriteCommandToMs5837Type WriteCommandToMs5837)

{

uint8_t command=COMMAND_RESET;

/*下发复位命令*/

WriteCommandToMs5837(deviceAddress,command);

}

2)读取校准值

校准值是出厂时厂家校准的各种系数,每台设备都有差异,是固定不变的,只需要一次读取就可以了,共有6个系数,均为16为整数。首先发送读系数的命令,然后读取就可以了,每次读取1个,分6次读取。过程数据流如下图所示:

/*从MS5837的PROM中读取校准数据*/

void GetCalibrationData(uint8_t deviceAddress,uint16_t *caliPara,WriteCommandToMs5837Type WriteCommandToMs5837,ReadBytesFromMs5837Type ReadBytesFromMs5837)

{

/*C1压力灵敏度*/

caliPara[0]=ReadPromFromMs5837(deviceAddress,COMMAND_PROM_READ_C1,WriteCommandToMs5837,ReadBytesFromMs5837);

/*C2压力补偿值*/

caliPara[1]=ReadPromFromMs5837(deviceAddress,COMMAND_PROM_READ_C2,WriteCommandToMs5837,ReadBytesFromMs5837);

/*C3压力灵敏度温度系数*/

caliPara[2]=ReadPromFromMs5837(deviceAddress,COMMAND_PROM_READ_C3,WriteCommandToMs5837,ReadBytesFromMs5837);

/*C4压力补偿温度系数*/

caliPara[3]=ReadPromFromMs5837(deviceAddress,COMMAND_PROM_READ_C4,WriteCommandToMs5837,ReadBytesFromMs5837);

/*C5参考温度*/

caliPara[4]=ReadPromFromMs5837(deviceAddress,COMMAND_PROM_READ_C5,WriteCommandToMs5837,ReadBytesFromMs5837);

/*C6温度传感器温度系数*/

caliPara[5]=ReadPromFromMs5837(deviceAddress,COMMAND_PROM_READ_C6,WriteCommandToMs5837,ReadBytesFromMs5837);

}

3)读取转换值

读取转换结果值是我们的目的,可以读取温度和压力两个量,不过一次只能读一个。首先发送命令设定采集压力还是温度,并设定精度。然后发送读取的命令,最后读取对应的值。再使用校准系数计算出最终的物理值。

/*获取转换值,包括温度和压力*/

void GetConversionValue(uint8_t deviceAddress,float *pPres,float *pTemp,uint16_t *caliPara,uint16_t *semaphore,WriteCommandToMs5837Type WriteCommandToMs5837,ReadBytesFromMs5837Type ReadBytesFromMs5837)

{

uint16_t senst1;        //C1压力灵敏度

uint16_t offt1;         //C2压力补偿值

uint16_t tcs;           //C3压力灵敏度温度系数

uint16_t tco;           //C4压力补偿温度系数

uint16_t tref;          //C5参考温度

uint16_t tempsens;      //C6温度传感器温度系数

/*从MS5837的PROM中读取校准数据*/

if(*semaphore>0)

{

GetCalibrationData(deviceAddress,caliPara,WriteCommandToMs5837,ReadBytesFromMs5837);

*semaphore=*semaphore-1;

}

senst1=caliPara[0];

offt1=caliPara[1];

tcs=caliPara[2];

tco=caliPara[3];

tref=caliPara[4];

tempsens=caliPara[5];

uint32_t digitalPressureValue;

uint32_t digitalTemperatureValue;

/*读取压力数据*/

digitalPressureValue=ReadConversionFromMs5837(deviceAddress,COMMAND_CONVERTD1OSR4096,WriteCommandToMs5837,ReadBytesFromMs5837);

Delayms(20);

/*读取温度数据*/

digitalTemperatureValue=ReadConversionFromMs5837(deviceAddress,COMMAND_CONVERTD2OSR4096,WriteCommandToMs5837,ReadBytesFromMs5837);

/*对温度进行一阶修正*/

int32_t dT;

int32_t temp;

dT=digitalTemperatureValue-tref*256;

temp=(int32_t)(2000+dT*tempsens/pow(2,23));

/*对压力进行一阶修正*/

int64_t off;

int64_t sens;

int32_t pres;

off=(int64_t)(offt1*pow(2,17)+(tco*dT)/pow(2,6));

sens=(int64_t)(senst1*pow(2,16)+(tcs*dT)/pow(2,7));

pres=(int32_t)((digitalPressureValue*sens/pow(2,21)-off)/pow(2,15));

/*对温度和压力进行二阶修正*/

int64_t ti=0;

int64_t offi=0;

int64_t sensi=0;

int64_t off2=0;

int64_t sens2=0;

if(temp<2000)

{

ti=(int64_t)(11*dT*dT/pow(2,35));

offi=(int64_t)(31*(temp-2000)*(temp-2000)/pow(2,3));

sensi=(int64_t)(63*(temp-2000)*(temp-2000)/pow(2,5));

off2=off-offi;

sens2=sens-sensi;

temp=temp-(int32_t)ti;

pres=(int32_t)((digitalPressureValue*sens2/pow(2,21)-off2)/pow(2,15));

}

if((-4000<=temp)&&(temp<=8500))

{

*pTemp=(float)temp/100.0;

}

if((1000<=pres)&&(pres<=120000))

{

*pPres=(float)pres/100.0;

}

}

最终在STM32的I2C接口实现通讯时,实现2个WriteCommandToMs5837Type(uint8_t deviceAddress,uint8_t command);和ReadBytesFromMs5837Type(uint8_t deviceAddress,uint8_t *pData,uint16_t bytesNum);函数并调用就可以了,更换平台也只需要重写这两个函数就能实现移植。

3、结果展示

完成上述开发后,编译下载。我们也将数据结果上传到OneNET,具体显示结果如下:

上图分别显示了,大气压力,温度以及湿度等参数。

时间: 2024-10-03 13:38:53

OneNET麒麟座应用开发之八:采集大气压力等环境参数的相关文章

OneNET麒麟座应用开发之七:控制采样电机

气体采样采用主动抽取气体的方式保证充足而平稳的气流,所以我们采用气泵抽取气体来完成. 1.设计概述 客户对这部分要求能够设定电机的速度,但并不需要动态调节.对电机的控制有很多方式,我们采用比较简单的方式.我们采用定时器产生PWM舶来实现这一控制过程. 2.硬件连接 对电机的控制我们使用高级定时器TIM1产生PWM波来控制,对于OneNET麒麟座中TIM1的通道1.2.3以及他们的互补输出均已经引到了端子排J2-5(PA10).2-6(PA9).J2-7(PA8).J5-7(PA7).J3-2(P

OneNET麒麟座应用开发之五:获取加速度传感器ADXL345数据

由于数据采集站基本都安装在野外或者楼顶,安装位置以及震动对检测数据的准确性有一定影响.所以想要有一个位置状态数据,正好发现麒麟作上有ADXL345,这样一个数字输出的加速度传感器.如图中红框所示: 1.ADXL345概述 ADXL345是ADI公司推出的基于iMEMS技术的3轴.数字输出加速度传感器.该加速度传感器的特点如下: 分辨率高.最高13位分辨率. 量程可变.具有+/-2g,+/-4g,+/-8g,+/-16g可变的测量范围. 灵敏度高.最高达3.9mg/LSB,能测量不到1.0°的倾斜

OneNET麒麟座应用开发之十:空气质量数据监测站项目总结

大气质量数据监测站用于测试空气质量监测及数据采集,实现野外或者室内空气质量的检测. 1.项目概述 本项目是一个定制项目,要求采集大气的压力.温度.湿度.PM25.位置等数据并上传到指定的后台服务器.但有时候因为没有条件或因为各种原因不能联网,则采用本地保存的方式,本地保存我们决定使用SD卡来实现.除此外,为了实现显式需求,还需要配套一些东西来实现饮食的需求,如实时时钟记录,上传联网方式的选择等. 2.硬件设计 本项目涉及到的硬件并不复杂,我们对其中几个实用比较多的电路做一个说明.首先说一下串口通

OneNET麒麟座应用开发之二:串口读取PM25传感器数据

作为环境数据监测站首先要获取大气中可吸入颗粒物的数据.为了检测PM25数据,我们采用北京海联信为的HLPM025K3型号传感器,该传感器使用激光法测量PM25和PM10的数据. 该型传感器的检测对象如下: M2.5:测量空气中0.3-2.5微米颗粒物: PM10:测量空气中 0.3-10微米颗粒物. 该传感器采用的通讯协议如下: (1)波特率: 9600bit/S;数据位:8位;停止位:1位;校验位:无; (2)数据发送间隔时间为0.8-1.2S(秒) , (3)数据格式:7个字节,其中校验位=

MVC5 网站开发之八 栏目功能 添加、修改和删除

本次实现栏目的浏览.添加.修改和删除. 栏目一共有三种类型. 常规栏目-可以添加子栏目,也可以添加内容模型.当不选择内容模型时,不能添加内容. 单页栏目-栏目只有一个页面,可以设置视图. 链接栏目-栏目为一个链接,点击后转到相应链接. 在视图中原本栏目的树形显示插件使用Bootstrap TreeView 1.2.0(MVC5 网站开发之六 管理员 2.添加.删除.重置密码.修改密码.列表浏览),后来使用中发现zTree使用起来更习惯,所以更换成zTree了. 目录 MVC5网站开发之一 总体概

php开发通用采集程序

php采集程序构建基本步骤: 采集程序是什么?获取远程数据(文字.图片.图片)并快速保存到本地或指定地址. 如天气预报(小偷程序): 远程获取-->替换内容-->展示给用户 如实时更新的新闻(采集内容): 远程获取-->提取内容-->分类存储-->读取内容--->展示内容 ************************* 设计PHP采集入库UML       列表正则:       终端正则: ************************** file_get_c

iOS平台添加Google Admob -2/2(Unity3D开发之八)

猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=572 在上一篇文章中主要是编写了iOS Admob的接口实现.那么现在我们要做的事就是在unity中调用iOS Admob并展示. 一.实现Unity中对外接口,内部负责调用iOS Admob接口.LHiOSAdmob.cs using UnityEngine; using System.Collections; using Sy

如何减轻软件开发的回测压力?Facebook 已经用上了机器学习

如何减轻软件开发的回测压力,从而提高工程师的生产效率?MATEUSZ MACHALICA.ALEX SAMYLKIN 等人组成的 Facebook 研究团队提出使用一个利用机器学习的新系统来创建一个为特定代码更改选择回归测试的概率模型,从而更好地执行这种回归测试. 为了高效地开发新产品特征和更新,Facebook 研究团队使用基于主干的开发模型来管理对代码库的改动.一旦一位工程师的代码更改被接入主分支(主干),他们试图让它对从事该产品或服务的其他工程师快速可见.这种基于主干的开发模型比使用特征分

OneNET麒麟座应用开发之九:与SD卡通讯并保存数据

由于需要记录的数据量比较大,而且有些时候,有的用户不方便实时上传数据,所以要求使用SD卡存储数据然后人工收取上传.为此我们选择了一种通用的SD卡读写器. 1.读卡器简介 该读卡器整合 SD 卡规范和 FAT 文件格式规范,只要通过本模块规定的通讯协议就可以把数据存储在 SD 卡中的文件中.该读卡器连接方便采用串口通讯方式,如下图: 该读卡器摸块通讯协议比较简单,本模块的通讯协议分为命令发送和命令的应答两部分,其中命令格式由4个部分组成:命令识别码(0x55 0xAA),命令号,字节数(参数的个数