天天看點

HaaS EDU場景式應用學習 - 大氣壓海拔儀實驗介紹涉及知識點開發環境準備硬體設計軟體設計開發者支援

HaaS EDU場景式應用學習 - 大氣壓海拔儀實驗介紹涉及知識點開發環境準備硬體設計軟體設計開發者支援

實驗介紹

本章主要介紹大氣壓計的實作,EDU k1闆載了SI的一款溫濕度傳感器SPL06,該傳感器不但能測量大氣壓,還能測量溫度。由于大氣壓的跟海拔成反比關系,如果知道當地大氣壓,則可以估算出當地的海拔高度。本章我們将向大家介紹如何使用haas1000來讀取傳感器資訊,并把所有這些顯示在OLED子產品上。

開始學習之前我們先看一下顯示效果。如下:

HaaS EDU場景式應用學習 - 大氣壓海拔儀實驗介紹涉及知識點開發環境準備硬體設計軟體設計開發者支援

涉及知識點

- I2C通信原理
- SPL06大氣壓傳感器原理
- OLED繪圖
           
  • 1
  • 2
  • 3

I2C通信原理

上一章已有介紹,這裡不在贅述。

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
           
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

典型應用

- 增強GPS導航(航位推算、坡度檢測等)
- 室内外導航
- 休閑體育
- 天氣預報
- 垂直速度訓示(上升/下降速度)
           

開發環境準備

硬體

開發用電腦一台
HAAS EDU K1 開發闆一塊
USB2TypeC 資料線一根
           

軟體

AliOS Things開發環境搭建

開發環境的搭建請參考 @ref HaaS_EDU_K1_Quick_Start (搭建開發環境章節),其中詳細的介紹了AliOS Things 3.3的IDE內建開發環境的搭建流程。
           

HaaS EDU K1 DEMO 代碼下載下傳

HaaS EDU K1 DEMO 的代碼下載下傳請參考 @ref HaaS_EDU_K1_Quick_Start (建立工程章節),其中,
選擇解決方案: 基于教育開發闆的示例
選擇開發闆: haaseduk1 board configure
           

代碼編譯、燒錄

參考 @ref HaaS_EDU_K1_Quick_Start (3.1 編譯工程章節),點選 ✅ 即可完成編譯固件。
參考 @ref HaaS_EDU_K1_Quick_Start (3.2 燒錄鏡像章節),點選 "⚡️" 即可完成燒錄固件。
           

硬體設計

在本實驗中,SPL06貼片在主機闆上,通過I2C與MCU通信,I2C從裝置位址:0x77。

原理圖如下所示:

HaaS EDU場景式應用學習 - 大氣壓海拔儀實驗介紹涉及知識點開發環境準備硬體設計軟體設計開發者支援

SPL06特性

寄存器清單

HaaS EDU場景式應用學習 - 大氣壓海拔儀實驗介紹涉及知識點開發環境準備硬體設計軟體設計開發者支援

讀取大氣壓

壓力資料寄存器

這個壓力資料寄存器包含24位(3個位元組)的壓力值。

HaaS EDU場景式應用學習 - 大氣壓海拔儀實驗介紹涉及知識點開發環境準備硬體設計軟體設計開發者支援
HaaS EDU場景式應用學習 - 大氣壓海拔儀實驗介紹涉及知識點開發環境準備硬體設計軟體設計開發者支援
HaaS EDU場景式應用學習 - 大氣壓海拔儀實驗介紹涉及知識點開發環境準備硬體設計軟體設計開發者支援

校準寄存器

校準系數寄存器包含用于計算補償壓力和溫度值時所用的系數。

HaaS EDU場景式應用學習 - 大氣壓海拔儀實驗介紹涉及知識點開發環境準備硬體設計軟體設計開發者支援

如何計算氣壓

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)
           

讀取溫度

溫度資料寄存器

溫度寄存器同樣儲存着24位(3個位元組)的溫度資料。

HaaS EDU場景式應用學習 - 大氣壓海拔儀實驗介紹涉及知識點開發環境準備硬體設計軟體設計開發者支援
HaaS EDU場景式應用學習 - 大氣壓海拔儀實驗介紹涉及知識點開發環境準備硬體設計軟體設計開發者支援
HaaS EDU場景式應用學習 - 大氣壓海拔儀實驗介紹涉及知識點開發環境準備硬體設計軟體設計開發者支援

如何計算溫度

1、從校準系數(COEF)寄存器讀取校準系數(c0和c1)。
2、根據標明的精度速率選擇比例因子kT(溫度),表4列出了比例因子。
3、從溫度寄存器或FIFO讀取溫度結果。
4計算比例測量結果。
Traw_sc=Traw/kT
5計算補償測量結果
Tcomp(°C)=c0*0.5+c1*Traw_sc
           

軟體設計

應用代碼部分

檔案路徑如下:

solutions/eduk1_demo/k1_apps/barometer/barometer.c
solutions/eduk1_demo/k1_apps/barometer/barometer.h
           

周期性讀取大氣壓以及溫度,并列印到OLED螢幕上。

OLED_Clear();

OLED_Icon_Draw(14, 4, &icon_atmp_16_16, 0);
sprintf(pressure_str, " %-10.3lfkPa", spl06_data.pressure / 10);
LOGD(EDU_TAG, "%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);
LOGD(EDU_TAG, "%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);
LOGD(EDU_TAG, "%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);
LOGD(EDU_TAG, "%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();
           
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

驅動部分

驅動代碼整體分為三部分

- 初始化部分
- 溫度值讀取
- 大氣壓校準以及高度估算。
           

初始化

- I2C初始化
- 晶片複位以及模式配置(包含壓力以及溫度模式配置,同時采集溫度以及大氣壓,打開FIFO接收)
           

在 AliOS Things 3.3中,對I2C的操作才用了VFS的方式,開發者隻需要open相應的device裝置,開發者隻需要關心連結到的I2C裝置号,從器件的裝置位址,從器件支援的I2C速率。知道了從裝置位址,讀寫位址也可以計算出,AliOS Things 會自動處理這些計算。

int32_t ret = sensor_i2c_open(SPL06_I2C_PORT, EEPROM_CHIP_ADDRESS, I2C_BUS_BIT_RATES_100K, 0);
if (ret) {
    LOGE("SENSOR", "sensor i2c open failed, ret:%d\n", ret);
    return;
}
aos_msleep(500);

tmp = i2c_eeprom_read_uint8_t(EEPROM_CHIP_ADDRESS, 0x0D);
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
// 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;
}

c0 = get_c0();
c1 = get_c1();
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;
           
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

氣壓讀取及校準代碼

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);
           

開發者支援

HaaS官方:

https://haas.iot.aliyun.com/

HaaS技術社群:

https://blog.csdn.net/HaaSTech

開發者釘釘群和公衆号見下圖,開發者釘釘群每天都有技術支援同學值班。

HaaS EDU場景式應用學習 - 大氣壓海拔儀實驗介紹涉及知識點開發環境準備硬體設計軟體設計開發者支援

繼續閱讀