LPS22HBのライブラリ
Dependents: HYBRYD2018_IZU_ROCKET Hybrid_IZU201811_STMBBM_v4 Hybrid_IZU2019
pqLPS22HB_lib.cpp@1:42cd33e0f174, 2017-08-10 (annotated)
- Committer:
- Sigma884
- Date:
- Thu Aug 10 21:00:39 2017 +0000
- Revision:
- 1:42cd33e0f174
- Parent:
- 0:52880f880b81
- Child:
- 2:96d154c590f4
LPS22HB?????????; ???????????????; ??????????????
Who changed what in which revision?
User | Revision | Line number | New 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 | 0:52880f880b81 | 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 | } |