HaaS EDU场景式应用学习 - 大气压海拔仪

HaaS EDU场景式应用整体介绍

1、实验介绍

本实验主要介绍大气压计的实现,EDU k1板载了SI的一款温湿度传感器SPL06,该传感器不但能测量大气压,还能测量温度。由于大气压的跟海拔成反比关系,如果知道当地大气压,则可以估算出当地的海拔高度。本实验我们将向大家介绍如何使用haas1000来读取传感器信息,并把所有这些显示在OLED模块上。

开始学习之前我们先看一下显示效果。如下:

2、涉及知识点

  • SPL06大气压传感器原理
  • OLED绘图
扫描二维码关注公众号,回复: 12656282 查看本文章

SPL06传感器简介

  SPL06-007是歌尔推出的小型化数字气压传感器,具有高精度和低功耗的特点。SPL06-007既是压力传感器又是温度传感器。压力传感器元件基于电容式传感原理,确保温度变化时的高精度。小封装使SPL06-007成为移动应用和可穿戴设备的理想选择。

SPL06-007的内部信号处理器将压力和温度传感器元件的输出转换为24位结果。每个压力传感器已单独校准,并包含校准系数。这些系数用于将测量结果转换为真实压力和温度值。

SPL06-007有一个FIFO,可以存储最新的32个测量值。通过使用FIFO,主机处理器可以在两次读出之间的较长时间内保持休眠模式。这可以降低整个系统的功耗。传感器测量和校准系数可通过串行I2C接口获得。

主要特点

  • 压力范围:300hPa到1100hPa(+9000米到-500米(与海平面有关))
  • 温度范围:-40到+85°C
  • 电源电压:1.7V到3.6V(VDD),1.2V到3.6V(VDDIO)
  • 包装:带金属盖的LGA包装
  • 封装:2.5mm x 2.0mm;
  • 相对精度:±0.06hPa,相当于±0.5m
  • 绝对精度:典型。±1hPa(300hPa到1100hPa)
  • 温度精度:±0.5°C。
  • 压力温度灵敏度:<0.5Pa/K
  • 测量时间:典型值:28 ms;最小值:3 ms。
  • 平均电流消耗:高精度:60μA,低功耗:3μA,待机:<1μA。
  • I2C和SPI接口,嵌入式24位ADC
  • FIFO:存储最新的32个压力或温度测量值。
  • 无铅、无卤、符合RoHS

典型应用

  • 增强GPS导航(航位推算、坡度检测等)
  • 室内外导航
  • 休闲体育
  • 天气预报
  • 垂直速度指示(上升/下降速度)

 

3、软硬件环境准备

3.1、硬件

  • 1、开发用电脑一台
  • 2、HaaS EDU K1开发板一个 (开发板内置SPL06传感器)
  • 3、USB Type-C 数据线一根

3.2、软件

"大气压海拔仪"功能已经包含在edu_demo应用中,并且包含在发布版本中。每次重启系统后切换屏幕即可看到大气压、海拔及以及温度等信息。

3.2.1、固件版本

版本号:VER 1.0.0

3.2.2、代码路径

下载代码

git clone https://github.com/alibaba/AliOS-Things.git -b dev_3.1.0_haas

对于国内用户,为避免从github下载速度较慢,可以从gitee上下载。

git clone https://gitee.com/alios-things/AliOS-Things.git -b dev_3.1.0_haas

3.2.3、编译

进入代码的顶层目录如AliOS-Things进行编译。可以直接编译application/example/目录下的demo app,或者自己开发的app。下面以编译helloworld_demo为例。

aos make edu_demo@haaseduk1 -c config
aos make

3.2.4、烧录

见开发环境章节

3.2.5、上手把玩

实验运行结果如下:

第一行显示为大气压值,单位为Pa,第二行显示为高度值,单位为m,第三行显示为温度信息。

如下图:

4、硬件设计

在本实验中,SPL06贴片在主板上,通过I2C与MCU通信,I2C从设备地址:0x77。

原理图如下所示:

HaaS EDU K1 SI7006部分原理图

4.1、SPL06特性

寄存器列表

4.2、读取大气压

压力数据寄存器

这个压力数据寄存器包含24位(3个字节)的压力值。

校准寄存器

校准系数寄存器包含用于计算补偿压力和温度值时所用的系数。

如何计算气压

1、从校准系数寄存器读取校准系数(c00、c10、c20、c30、c01、c11和c21)。

2、根据选定的精度速率选择比例因子kT(温度)和kP(压力)。表4列出了比例因子。

3、从寄存器或FIFO读取压力和温度结果。根据所选的测量速率,自上次压力测量后可能没有测量温度。

4、计算比例测量结果。

Traw_sc = Traw/kT

Praw_sc = Praw/kP

5、计算补偿测量结果。

Pcomp(Pa)= c00+ Praw_sc*(c10+ Praw_sc*(c20+ Praw_sc*c30)) + Traw_sc*c01 + Traw_sc*Praw_sc*(c11+Praw_sc*c21)

4.3、读取温度

温度数据寄存器

温度寄存器同样保存着24位(3个字节)的温度数据。

如何计算温度

1、从校准系数(COEF)寄存器读取校准系数(c0和c1)。

2、根据选定的精度速率选择比例因子kT(温度),表4列出了比例因子。

3、从温度寄存器或FIFO读取温度结果。

4计算比例测量结果。

Traw_sc=Traw/kT

5计算补偿测量结果

Tcomp(°C)=c0*0.5+c1*Traw_sc

5、软件设计

5.1、应用代码部分

文件路径如下:

application/example/edu_demo/k1_apps/barometer/barometer.c

application/example/edu_demo/k1_apps/barometer/barometer.h

周期性读取大气压以及温度,并打印到OLED屏幕上。

        OLED_Clear();

        OLED_Icon_Draw(14, 4, &icon_atmp_16_16, 0);
        sprintf(pressure_str, " %-12.2lfPa", spl06_data.pressure);
        printf("%s\n", pressure_str);
        OLED_Show_String(32, 6, pressure_str, 12, 1);

        OLED_Icon_Draw(14, 23, &icon_asl_16_16, 0);
        sprintf(altitude_str, " %-12.2lfm", spl06_data.altitude);
        printf("%s\n", altitude_str);
        OLED_Show_String(32, 25, altitude_str, 12, 1);

        OLED_Icon_Draw(14, 44, &icon_tempC_16_16, 0);
        sprintf(Ctemp_str, "%-5.2lf", spl06_data.Ctemp);
        printf("%s\n", Ctemp_str);
        OLED_Show_String(30, 46, Ctemp_str, 12, 1);

        OLED_Icon_Draw(66, 44, &icon_tempF_16_16, 0);
        sprintf(Ftemp_str, "%-5.2lf", spl06_data.Ftemp);
        printf("%s\n", Ftemp_str);
        OLED_Show_String(82, 46, Ftemp_str, 12, 1);

        OLED_Icon_Draw(2, 24, &icon_skip_left, 0);
        OLED_Icon_Draw(122, 24, &icon_skip_right, 0);

        spl06_getdata(&spl06_data);

        OLED_Refresh_GRAM();

5.2、驱动部分

文件路径如下:

components/peripherals/sensor/drv/drv_baro_goertek_spl06.c

驱动代码整体分为三部分;

  • 初始化部分
  • 温度值读取
  • 大气压校准以及高度估算。

初始化包含:

  • I2C初始化
  • 芯片复位以及模式配置(包含压力以及温度模式配置,同时采集温度以及大气压,打开FIFO接收)
i2c_dev.port = 1;
i2c_dev.config.address_width = I2C_HAL_ADDRESS_WIDTH_7BIT;
i2c_dev.config.freq = I2C_BUS_BIT_RATES_100K;
i2c_dev.config.mode = I2C_MODE_MASTER;
i2c_dev.config.dev_addr = 0x77;
hal_i2c_init(&i2c_dev);

printf("\nDevice Reset\n");
i2c_eeprom_write_uint8_t(EEPROM_CHIP_ADDRESS, 0X0C, 0b1001);
aos_msleep(100);

tmp = i2c_eeprom_read_uint8_t(EEPROM_CHIP_ADDRESS, 0x0D);
//  printf("ID: %d\n", tmp);
i2c_eeprom_write_uint8_t(EEPROM_CHIP_ADDRESS, 0X06, 0x03);   // Pressure 8x oversampling
i2c_eeprom_write_uint8_t(EEPROM_CHIP_ADDRESS, 0X07, 0X83);   // Temperature 8x oversampling
i2c_eeprom_write_uint8_t(EEPROM_CHIP_ADDRESS, 0X08, 0B0111); // continuous temp and pressure measurement
//i2c_eeprom_write_uint8_t(EEPROM_CHIP_ADDRESS, 0X08, 0B0001); // standby pressure measurement
i2c_eeprom_write_uint8_t(EEPROM_CHIP_ADDRESS, 0X09, 0X00); // FIFO Pressure measurement

温度读取及校准代码

tmp_Byte = i2c_eeprom_read_uint8_t(EEPROM_CHIP_ADDRESS, 0X07); // MSB
tmp_Byte = tmp_Byte & 0B00000111;

switch (tmp_Byte)
{
    case 0B000:
        k = 524288.0d;
        break;

    case 0B001:
        k = 1572864.0d;
        break;

    case 0B010:
        k = 3670016.0d;
        break;

    case 0B011:
        k = 7864320.0d;
        break;

    case 0B100:
        k = 253952.0d;
        break;

    case 0B101:
        k = 516096.0d;
        break;

    case 0B110:
        k = 1040384.0d;
        break;

    case 0B111:
        k = 2088960.0d;
        break;
}

double traw_sc = (double)traw / get_temperature_scale_factor();
//printf("traw_sc: %0.2f\n", traw_sc);

sp->Ctemp = (double)c0 * 0.5f + (double)c1 * traw_sc;
sp->Ftemp = (sp->Ctemp * 9 / 5) + 32;

气压读取及校准代码

  c0 = get_c0();
  c1 = get_c1();
  c00 = get_c00();
  c10 = get_c10();
  c01 = get_c01();
  c11 = get_c11();
  c20 = get_c20();
  c21 = get_c21();
  c30 = get_c30();

  int32_t praw = get_praw();
  double praw_sc = (double)(praw) / get_pressure_scale_factor();
  double pcomp = (double)(c00) + praw_sc * ((double)(c10) + praw_sc * ((double)(c20) + praw_sc * (double)(c30))) + traw_sc * (double)(c01) + traw_sc * praw_sc * ((double)(c11) + praw_sc * (double)(c21));
  sp->pressure = pcomp / 100; // convert to mb

  double local_pressure = 1011.1; //本地参考海平面参考气压值
  sp->altitude = get_altitude(pcomp, local_pressure);

6、开发者技术支持

如需更多技术支持,可加入钉钉开发者群,或者关注微信公众号

更多技术与解决方案介绍,请访问阿里云AIoT首页https://iot.aliyun.com/

猜你喜欢

转载自blog.csdn.net/HaaSTech/article/details/114168408