LPS22HBのライブラリ

Dependents:   HYBRYD2018_IZU_ROCKET Hybrid_IZU201811_STMBBM_v4 Hybrid_IZU2019

Committer:
Sigma884
Date:
Wed Feb 20 12:26:08 2019 +0000
Revision:
4:b5c758ebd064
Parent:
2:96d154c590f4
getAlt2 comming!!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sigma884 0:52880f880b81 1 #include "pqLPS22HB_lib.h"
Sigma884 0:52880f880b81 2 #include "mbed.h"
Sigma884 1:42cd33e0f174 3 #include "math.h"
Sigma884 0:52880f880b81 4
Sigma884 0:52880f880b81 5 /**********
Sigma884 0:52880f880b81 6 コンストラクタ
Sigma884 0:52880f880b81 7 ・AD0がHIGHかLOWかを選択
Sigma884 0:52880f880b81 8 ・使用するI2Cを選択
Sigma884 0:52880f880b81 9 **********/
Sigma884 0:52880f880b81 10 pqLPS22HB_lib :: pqLPS22HB_lib(AD0 ad0, I2C &userI2C){
Sigma884 0:52880f880b81 11 slave = ad0;
Sigma884 0:52880f880b81 12 i2c = &userI2C;
Sigma884 0:52880f880b81 13 }
Sigma884 0:52880f880b81 14
Sigma884 0:52880f880b81 15 /**********
Sigma884 0:52880f880b81 16 センサー起動(void)
Sigma884 0:52880f880b81 17 ・データ更新レートを選択(1, 10, 25, 50, 75)
Sigma884 0:52880f880b81 18 **********/
Sigma884 0:52880f880b81 19 void pqLPS22HB_lib :: begin(int drate){
Sigma884 0:52880f880b81 20 cmd_ctrl_reg1[0] = CTRL_REG1;
Sigma884 0:52880f880b81 21 switch(drate){
Sigma884 0:52880f880b81 22 case 1:
Sigma884 0:52880f880b81 23 cmd_ctrl_reg1[1] = 0x10;
Sigma884 0:52880f880b81 24 break;
Sigma884 0:52880f880b81 25
Sigma884 0:52880f880b81 26 case 10:
Sigma884 0:52880f880b81 27 cmd_ctrl_reg1[1] = 0x20;
Sigma884 0:52880f880b81 28 break;
Sigma884 0:52880f880b81 29
Sigma884 0:52880f880b81 30 case 25:
Sigma884 0:52880f880b81 31 cmd_ctrl_reg1[1] = 0x30;
Sigma884 0:52880f880b81 32 break;
Sigma884 0:52880f880b81 33
Sigma884 0:52880f880b81 34 case 50:
Sigma884 0:52880f880b81 35 cmd_ctrl_reg1[1] = 0x40;
Sigma884 0:52880f880b81 36 break;
Sigma884 0:52880f880b81 37
Sigma884 0:52880f880b81 38 case 75:
Sigma884 0:52880f880b81 39 cmd_ctrl_reg1[1] = 0x50;
Sigma884 0:52880f880b81 40 break;
Sigma884 0:52880f880b81 41
Sigma884 0:52880f880b81 42 default:
Sigma884 0:52880f880b81 43 cmd_ctrl_reg1[1] = 0x00;
Sigma884 0:52880f880b81 44 }
Sigma884 0:52880f880b81 45
Sigma884 0:52880f880b81 46 i2c -> frequency(400000);
Sigma884 0:52880f880b81 47 i2c -> write(slave, cmd_ctrl_reg1, 2, true);
Sigma884 2:96d154c590f4 48 //wait(0.5f);
Sigma884 0:52880f880b81 49 }
Sigma884 0:52880f880b81 50
Sigma884 0:52880f880b81 51 /**********
Sigma884 0:52880f880b81 52 FIFO設定(void)(未実装)
Sigma884 0:52880f880b81 53 ・モードを選択(したい)
Sigma884 0:52880f880b81 54 ・FIFO ウォーターマークレベルを選択(したい)
Sigma884 0:52880f880b81 55 **********/
Sigma884 0:52880f880b81 56 void pqLPS22HB_lib :: setFIFO(){ //??
Sigma884 0:52880f880b81 57 cmd_ctrl_reg2[0] = CTRL_REG2;
Sigma884 0:52880f880b81 58 cmd_ctrl_reg2[1] = 0x40;
Sigma884 0:52880f880b81 59 cmd_fifo_ctrl[0] = FIFO_CTRL;
Sigma884 0:52880f880b81 60 cmd_fifo_ctrl[1] = 0x5F;
Sigma884 0:52880f880b81 61 i2c -> write(slave, cmd_ctrl_reg2, 2, true);
Sigma884 0:52880f880b81 62 i2c -> write(slave, cmd_fifo_ctrl, 2, true);
Sigma884 0:52880f880b81 63 }
Sigma884 0:52880f880b81 64
Sigma884 0:52880f880b81 65 /**********
Sigma884 0:52880f880b81 66 Who Am I(int)
Sigma884 0:52880f880b81 67 接続できているかを判定
Sigma884 0:52880f880b81 68 接続OK:0
Sigma884 0:52880f880b81 69 接続NG:-1
Sigma884 0:52880f880b81 70 **********/
Sigma884 0:52880f880b81 71 int pqLPS22HB_lib :: whoAmI(){
Sigma884 0:52880f880b81 72 cmd_who_am_i[0] = WHO_AM_I;
Sigma884 0:52880f880b81 73 i2c -> write(slave, cmd_who_am_i, 1, true);
Sigma884 0:52880f880b81 74 i2c -> read(slave | 1, &cmd_who_am_i[0], 1, true);
Sigma884 0:52880f880b81 75
Sigma884 0:52880f880b81 76 if(cmd_who_am_i[0] == 0xB1){
Sigma884 0:52880f880b81 77 return 0;
Sigma884 0:52880f880b81 78 }
Sigma884 0:52880f880b81 79 else{
Sigma884 0:52880f880b81 80 return -1;
Sigma884 0:52880f880b81 81 }
Sigma884 0:52880f880b81 82 }
Sigma884 0:52880f880b81 83
Sigma884 0:52880f880b81 84 /**********
Sigma884 0:52880f880b81 85 気圧を取得(float)
Sigma884 0:52880f880b81 86 **********/
Sigma884 0:52880f880b81 87 float pqLPS22HB_lib :: getPres(){
Sigma884 0:52880f880b81 88 cmd_p[0] = P_XL;
Sigma884 0:52880f880b81 89 cmd_p[1] = P_L;
Sigma884 0:52880f880b81 90 cmd_p[2] = P_H;
Sigma884 0:52880f880b81 91
Sigma884 0:52880f880b81 92 for(int c1 = 0; c1 < 3; c1 ++){
Sigma884 0:52880f880b81 93 i2c -> write(slave, &cmd_p[c1], 1, true);
Sigma884 0:52880f880b81 94 i2c -> read(slave | 1, &cmd_p[c1], 1, true);
Sigma884 0:52880f880b81 95 data_p[c1] = (int)cmd_p[c1];
Sigma884 0:52880f880b81 96 }
Sigma884 0:52880f880b81 97
Sigma884 0:52880f880b81 98 return (float)(data_p[0] | data_p[1] << 8 | data_p[2] << 16) / 4096.0f;
Sigma884 0:52880f880b81 99 }
Sigma884 0:52880f880b81 100
Sigma884 0:52880f880b81 101 /**********
Sigma884 0:52880f880b81 102 温度を取得(float)
Sigma884 0:52880f880b81 103 **********/
Sigma884 0:52880f880b81 104 float pqLPS22HB_lib :: getTemp(){
Sigma884 0:52880f880b81 105 cmd_t[0] = T_L;
Sigma884 0:52880f880b81 106 cmd_t[1] = T_H;
Sigma884 0:52880f880b81 107
Sigma884 0:52880f880b81 108 for(int c1 = 0; c1 < 2; c1 ++){
Sigma884 0:52880f880b81 109 i2c -> write(slave, &cmd_t[c1], 1, true);
Sigma884 0:52880f880b81 110 i2c -> read(slave | 1, &cmd_t[c1], 1, true);
Sigma884 0:52880f880b81 111 data_t[c1] = (int)cmd_t[c1];
Sigma884 0:52880f880b81 112 }
Sigma884 0:52880f880b81 113
Sigma884 0:52880f880b81 114 if(data_t[1] >= 128){
Sigma884 0:52880f880b81 115 return 20.0 - (float)(65536 - (data_t[0] | data_t[1] << 8)) / 480.0f;
Sigma884 0:52880f880b81 116 }
Sigma884 0:52880f880b81 117 else{
Sigma884 0:52880f880b81 118 return 20.0 + (float)(data_t[0] | data_t[1] << 8) / 480.0f;
Sigma884 0:52880f880b81 119 }
Sigma884 0:52880f880b81 120 }
Sigma884 1:42cd33e0f174 121
Sigma884 1:42cd33e0f174 122 /**********
Sigma884 1:42cd33e0f174 123 高度を計算(float)
Sigma884 1:42cd33e0f174 124 ・引数に0m地点での気圧・温度を入れる
Sigma884 1:42cd33e0f174 125 ・計算式のソース:http://www.geocities.jp/u4ren6/Main/Excel_Data0017.html
Sigma884 1:42cd33e0f174 126 **********/
Sigma884 1:42cd33e0f174 127 float pqLPS22HB_lib :: getAlt(float P_0, float T_0){
Sigma884 1:42cd33e0f174 128 pres_0 = P_0;
Sigma884 1:42cd33e0f174 129 temp_0 = T_0;
Sigma884 1:42cd33e0f174 130 pres_now = getPres();
Sigma884 1:42cd33e0f174 131
Sigma884 1:42cd33e0f174 132 return -(273.0 + temp_0) / 0.0342 * log(pres_now / pres_0);
Sigma884 1:42cd33e0f174 133 }
Sigma884 4:b5c758ebd064 134
Sigma884 4:b5c758ebd064 135 /**********
Sigma884 4:b5c758ebd064 136 高度を取得(float)
Sigma884 4:b5c758ebd064 137 ※温度の高度による変化を考慮
Sigma884 4:b5c758ebd064 138 ※こちらを推奨
Sigma884 4:b5c758ebd064 139 ・引数に0m地点での気圧・温度を入れる
Sigma884 4:b5c758ebd064 140 ・計算式のソース:http://zakii.la.coocan.jp/physics/31_pressure.htm
Sigma884 4:b5c758ebd064 141 **********/
Sigma884 4:b5c758ebd064 142 float pqLPS22HB_lib :: getAlt2(float P_0, float T_0){
Sigma884 4:b5c758ebd064 143 pres = getPres();
Sigma884 4:b5c758ebd064 144 return (273.0 + T_0) / 0.0065 * (1.0 - (float)pow((double)(pres / P_0), 0.190));
Sigma884 4:b5c758ebd064 145 }