気圧・温度・湿度センサBME280を使うためのライブラリ

Dependents:   SWAN_IZU2019_v1

Committer:
Sigma884
Date:
Tue Feb 19 12:35:35 2019 +0000
Revision:
1:0a0ad1327b0f
Parent:
0:9f2a22c6ced2
MODE -> BME_MODE

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sigma884 0:9f2a22c6ced2 1 #include "mbed.h"
Sigma884 0:9f2a22c6ced2 2 #include "BME280_lib.h"
Sigma884 0:9f2a22c6ced2 3
Sigma884 0:9f2a22c6ced2 4 BME280_lib::BME280_lib(I2C &user_i2c, AD0 ad0){
Sigma884 0:9f2a22c6ced2 5 i2c = &user_i2c;
Sigma884 0:9f2a22c6ced2 6 slave = ad0;
Sigma884 0:9f2a22c6ced2 7
Sigma884 0:9f2a22c6ced2 8 i2c -> frequency(400000);
Sigma884 0:9f2a22c6ced2 9
Sigma884 0:9f2a22c6ced2 10 configMeasure(NORMAL, 1, 1, 1);
Sigma884 0:9f2a22c6ced2 11 configFilter(0);
Sigma884 0:9f2a22c6ced2 12
Sigma884 0:9f2a22c6ced2 13 readCOMP();
Sigma884 0:9f2a22c6ced2 14 }
Sigma884 0:9f2a22c6ced2 15
Sigma884 0:9f2a22c6ced2 16 int BME280_lib::connectCheck(){
Sigma884 0:9f2a22c6ced2 17 cmd[0] = BME_ID;
Sigma884 0:9f2a22c6ced2 18 i2c -> write(slave << 1, cmd, 1);
Sigma884 0:9f2a22c6ced2 19 i2c -> read(slave << 1 | 1, buff, 1);
Sigma884 0:9f2a22c6ced2 20
Sigma884 0:9f2a22c6ced2 21 if(buff[0] == 0x60){
Sigma884 0:9f2a22c6ced2 22 return 1;
Sigma884 0:9f2a22c6ced2 23 }
Sigma884 0:9f2a22c6ced2 24 else{
Sigma884 0:9f2a22c6ced2 25 return 0;
Sigma884 0:9f2a22c6ced2 26 }
Sigma884 0:9f2a22c6ced2 27 }
Sigma884 0:9f2a22c6ced2 28
Sigma884 1:0a0ad1327b0f 29 void BME280_lib::configMeasure(BME_MODE mode, int temp_over_sampling, int pres_over_sampling, int hum_over_sampling){
Sigma884 0:9f2a22c6ced2 30 cmd[0] = BME_CTRL_HUM;
Sigma884 0:9f2a22c6ced2 31 switch(hum_over_sampling){
Sigma884 0:9f2a22c6ced2 32 case 0:
Sigma884 0:9f2a22c6ced2 33 cmd[1] = 0x00;
Sigma884 0:9f2a22c6ced2 34 break;
Sigma884 0:9f2a22c6ced2 35
Sigma884 0:9f2a22c6ced2 36 case 1:
Sigma884 0:9f2a22c6ced2 37 cmd[1] = 0x01;
Sigma884 0:9f2a22c6ced2 38 break;
Sigma884 0:9f2a22c6ced2 39
Sigma884 0:9f2a22c6ced2 40 case 2:
Sigma884 0:9f2a22c6ced2 41 cmd[1] = 0x02;
Sigma884 0:9f2a22c6ced2 42 break;
Sigma884 0:9f2a22c6ced2 43
Sigma884 0:9f2a22c6ced2 44 case 4:
Sigma884 0:9f2a22c6ced2 45 cmd[1] = 0x03;
Sigma884 0:9f2a22c6ced2 46 break;
Sigma884 0:9f2a22c6ced2 47
Sigma884 0:9f2a22c6ced2 48 case 8:
Sigma884 0:9f2a22c6ced2 49 cmd[1] = 0x04;
Sigma884 0:9f2a22c6ced2 50 break;
Sigma884 0:9f2a22c6ced2 51
Sigma884 0:9f2a22c6ced2 52 case 16:
Sigma884 0:9f2a22c6ced2 53 cmd[1] = 0x05;
Sigma884 0:9f2a22c6ced2 54 break;
Sigma884 0:9f2a22c6ced2 55
Sigma884 0:9f2a22c6ced2 56 default:
Sigma884 0:9f2a22c6ced2 57 cmd[1] = 0x00;
Sigma884 0:9f2a22c6ced2 58 }
Sigma884 0:9f2a22c6ced2 59 i2c -> write(slave << 1, cmd, 2);
Sigma884 0:9f2a22c6ced2 60
Sigma884 0:9f2a22c6ced2 61 cmd[0] = BME_CTRL_MEAS;
Sigma884 0:9f2a22c6ced2 62 cmd[1] = mode;
Sigma884 0:9f2a22c6ced2 63 switch(pres_over_sampling){
Sigma884 0:9f2a22c6ced2 64 case 0:
Sigma884 0:9f2a22c6ced2 65 cmd[1] = cmd[1] | (0x00 << 2);
Sigma884 0:9f2a22c6ced2 66 break;
Sigma884 0:9f2a22c6ced2 67
Sigma884 0:9f2a22c6ced2 68 case 1:
Sigma884 0:9f2a22c6ced2 69 cmd[1] = cmd[1] | (0x01 << 2);
Sigma884 0:9f2a22c6ced2 70 break;
Sigma884 0:9f2a22c6ced2 71
Sigma884 0:9f2a22c6ced2 72 case 2:
Sigma884 0:9f2a22c6ced2 73 cmd[1] = cmd[1] | (0x02 << 2);
Sigma884 0:9f2a22c6ced2 74 break;
Sigma884 0:9f2a22c6ced2 75
Sigma884 0:9f2a22c6ced2 76 case 4:
Sigma884 0:9f2a22c6ced2 77 cmd[1] = cmd[1] | (0x03 << 2);
Sigma884 0:9f2a22c6ced2 78 break;
Sigma884 0:9f2a22c6ced2 79
Sigma884 0:9f2a22c6ced2 80 case 8:
Sigma884 0:9f2a22c6ced2 81 cmd[1] = cmd[1] | (0x04 << 2);
Sigma884 0:9f2a22c6ced2 82 break;
Sigma884 0:9f2a22c6ced2 83
Sigma884 0:9f2a22c6ced2 84 case 16:
Sigma884 0:9f2a22c6ced2 85 cmd[1] = cmd[1] | (0x05 << 2);
Sigma884 0:9f2a22c6ced2 86 break;
Sigma884 0:9f2a22c6ced2 87
Sigma884 0:9f2a22c6ced2 88 default:
Sigma884 0:9f2a22c6ced2 89 cmd[1] = cmd[1] | (0x00 << 2);
Sigma884 0:9f2a22c6ced2 90 }
Sigma884 0:9f2a22c6ced2 91 switch(temp_over_sampling){
Sigma884 0:9f2a22c6ced2 92 case 0:
Sigma884 0:9f2a22c6ced2 93 cmd[1] = cmd[1] | (0x00 << 5);
Sigma884 0:9f2a22c6ced2 94 break;
Sigma884 0:9f2a22c6ced2 95
Sigma884 0:9f2a22c6ced2 96 case 1:
Sigma884 0:9f2a22c6ced2 97 cmd[1] = cmd[1] | (0x01 << 5);
Sigma884 0:9f2a22c6ced2 98 break;
Sigma884 0:9f2a22c6ced2 99
Sigma884 0:9f2a22c6ced2 100 case 2:
Sigma884 0:9f2a22c6ced2 101 cmd[1] = cmd[1] | (0x02 << 5);
Sigma884 0:9f2a22c6ced2 102 break;
Sigma884 0:9f2a22c6ced2 103
Sigma884 0:9f2a22c6ced2 104 case 4:
Sigma884 0:9f2a22c6ced2 105 cmd[1] = cmd[1] | (0x03 << 5);
Sigma884 0:9f2a22c6ced2 106 break;
Sigma884 0:9f2a22c6ced2 107
Sigma884 0:9f2a22c6ced2 108 case 8:
Sigma884 0:9f2a22c6ced2 109 cmd[1] = cmd[1] | (0x04 << 5);
Sigma884 0:9f2a22c6ced2 110 break;
Sigma884 0:9f2a22c6ced2 111
Sigma884 0:9f2a22c6ced2 112 case 16:
Sigma884 0:9f2a22c6ced2 113 cmd[1] = cmd[1] | (0x05 << 5);
Sigma884 0:9f2a22c6ced2 114 break;
Sigma884 0:9f2a22c6ced2 115
Sigma884 0:9f2a22c6ced2 116 default:
Sigma884 0:9f2a22c6ced2 117 cmd[1] = cmd[1] | (0x00 << 5);
Sigma884 0:9f2a22c6ced2 118 }
Sigma884 0:9f2a22c6ced2 119 i2c -> write(slave << 1, cmd, 2);
Sigma884 0:9f2a22c6ced2 120 }
Sigma884 0:9f2a22c6ced2 121
Sigma884 0:9f2a22c6ced2 122 void BME280_lib::configFilter(int filter){
Sigma884 0:9f2a22c6ced2 123 cmd[0] = BME_CONFIG;
Sigma884 0:9f2a22c6ced2 124 switch(filter){
Sigma884 0:9f2a22c6ced2 125 case 0:
Sigma884 0:9f2a22c6ced2 126 cmd[1] = 0x00 << 2;
Sigma884 0:9f2a22c6ced2 127 break;
Sigma884 0:9f2a22c6ced2 128
Sigma884 0:9f2a22c6ced2 129 case 1:
Sigma884 0:9f2a22c6ced2 130 cmd[1] = 0x01 << 2;
Sigma884 0:9f2a22c6ced2 131 break;
Sigma884 0:9f2a22c6ced2 132
Sigma884 0:9f2a22c6ced2 133 case 2:
Sigma884 0:9f2a22c6ced2 134 cmd[1] = 0x02 << 2;
Sigma884 0:9f2a22c6ced2 135 break;
Sigma884 0:9f2a22c6ced2 136
Sigma884 0:9f2a22c6ced2 137 case 4:
Sigma884 0:9f2a22c6ced2 138 cmd[1] = 0x03 << 2;
Sigma884 0:9f2a22c6ced2 139 break;
Sigma884 0:9f2a22c6ced2 140
Sigma884 0:9f2a22c6ced2 141 case 8:
Sigma884 0:9f2a22c6ced2 142 cmd[1] = 0x04 << 2;
Sigma884 0:9f2a22c6ced2 143 break;
Sigma884 0:9f2a22c6ced2 144
Sigma884 0:9f2a22c6ced2 145 case 16:
Sigma884 0:9f2a22c6ced2 146 cmd[1] = 0x05 << 2;
Sigma884 0:9f2a22c6ced2 147 break;
Sigma884 0:9f2a22c6ced2 148
Sigma884 0:9f2a22c6ced2 149 default:
Sigma884 0:9f2a22c6ced2 150 cmd[1] = 0x00;
Sigma884 0:9f2a22c6ced2 151 break;
Sigma884 0:9f2a22c6ced2 152 }
Sigma884 0:9f2a22c6ced2 153 i2c -> write(slave << 1, cmd, 2);
Sigma884 0:9f2a22c6ced2 154 }
Sigma884 0:9f2a22c6ced2 155
Sigma884 0:9f2a22c6ced2 156 void BME280_lib::getData(float *temp, float *pres, float *hum){
Sigma884 0:9f2a22c6ced2 157 cmd[0] = BME_TEMP;
Sigma884 0:9f2a22c6ced2 158 i2c -> write(slave << 1, cmd, 1);
Sigma884 0:9f2a22c6ced2 159 i2c -> read(slave << 1 | 1, buff, 3);
Sigma884 0:9f2a22c6ced2 160 adc = (buff[0] << 12) | (buff[1] << 4) | (buff[0] >> 4);
Sigma884 0:9f2a22c6ced2 161 *temp = (float)calcT() / 100.0;
Sigma884 0:9f2a22c6ced2 162
Sigma884 0:9f2a22c6ced2 163 cmd[0] = BME_PRESS;
Sigma884 0:9f2a22c6ced2 164 i2c -> write(slave << 1, cmd, 1);
Sigma884 0:9f2a22c6ced2 165 i2c -> read(slave << 1 | 1, buff, 3);
Sigma884 0:9f2a22c6ced2 166 adc = (buff[0] << 12) | (buff[1] << 4) | (buff[0] >> 4);
Sigma884 0:9f2a22c6ced2 167 *pres = (float)calcP() / 256.0 / 100.0;
Sigma884 0:9f2a22c6ced2 168
Sigma884 0:9f2a22c6ced2 169 cmd[0] = BME_HUM;
Sigma884 0:9f2a22c6ced2 170 i2c -> write(slave << 1, cmd, 1);
Sigma884 0:9f2a22c6ced2 171 i2c -> read(slave << 1 | 1, buff, 3);
Sigma884 0:9f2a22c6ced2 172 adc = (buff[0] << 8) | buff[1];
Sigma884 0:9f2a22c6ced2 173 *hum = (float)calcH() / 1024.0;
Sigma884 0:9f2a22c6ced2 174 }
Sigma884 0:9f2a22c6ced2 175
Sigma884 0:9f2a22c6ced2 176 float BME280_lib::getTemp(){
Sigma884 0:9f2a22c6ced2 177 getData(&temp, &pres, &hum);
Sigma884 0:9f2a22c6ced2 178 return temp;
Sigma884 0:9f2a22c6ced2 179 }
Sigma884 0:9f2a22c6ced2 180
Sigma884 0:9f2a22c6ced2 181 float BME280_lib::getPres(){
Sigma884 0:9f2a22c6ced2 182 getData(&temp, &pres, &hum);
Sigma884 0:9f2a22c6ced2 183 return pres;
Sigma884 0:9f2a22c6ced2 184 }
Sigma884 0:9f2a22c6ced2 185
Sigma884 0:9f2a22c6ced2 186 float BME280_lib::getHum(){
Sigma884 0:9f2a22c6ced2 187 getData(&temp, &pres, &hum);
Sigma884 0:9f2a22c6ced2 188 return hum;
Sigma884 0:9f2a22c6ced2 189 }
Sigma884 0:9f2a22c6ced2 190
Sigma884 0:9f2a22c6ced2 191 float BME280_lib::getAlt(float pres_0, float temp_0){
Sigma884 0:9f2a22c6ced2 192 pres = getPres();
Sigma884 0:9f2a22c6ced2 193 return -(273.0 + temp_0) / 0.0342 * log(pres / pres_0);
Sigma884 0:9f2a22c6ced2 194 }
Sigma884 0:9f2a22c6ced2 195
Sigma884 0:9f2a22c6ced2 196 float BME280_lib::getAlt2(float pres_0, float temp_0){
Sigma884 0:9f2a22c6ced2 197 pres = getPres();
Sigma884 0:9f2a22c6ced2 198 return (273.0 + temp_0) / 0.0065 * (1.0 - (float)pow((double)(pres / pres_0), 0.190));
Sigma884 0:9f2a22c6ced2 199 }
Sigma884 0:9f2a22c6ced2 200
Sigma884 0:9f2a22c6ced2 201
Sigma884 0:9f2a22c6ced2 202 void BME280_lib::readCOMP(){
Sigma884 0:9f2a22c6ced2 203 cmd[0] = BME_COMP1;
Sigma884 0:9f2a22c6ced2 204 i2c -> write(slave << 1, cmd, 1);
Sigma884 0:9f2a22c6ced2 205 i2c -> read(slave << 1 | 1, buff, 25);
Sigma884 0:9f2a22c6ced2 206 dig_T1 = buff[0] | (buff[1] << 8);
Sigma884 0:9f2a22c6ced2 207 dig_T2 = buff[2] | (buff[3] << 8);
Sigma884 0:9f2a22c6ced2 208 dig_T3 = buff[4] | (buff[5] << 8);
Sigma884 0:9f2a22c6ced2 209 dig_P1 = buff[6] | (buff[7] << 8);
Sigma884 0:9f2a22c6ced2 210 dig_P2 = buff[8] | (buff[9] << 8);
Sigma884 0:9f2a22c6ced2 211 dig_P3 = buff[10] | (buff[11] << 8);
Sigma884 0:9f2a22c6ced2 212 dig_P4 = buff[12] | (buff[13] << 8);
Sigma884 0:9f2a22c6ced2 213 dig_P5 = buff[14] | (buff[15] << 8);
Sigma884 0:9f2a22c6ced2 214 dig_P6 = buff[16] | (buff[17] << 8);
Sigma884 0:9f2a22c6ced2 215 dig_P7 = buff[18] | (buff[19] << 8);
Sigma884 0:9f2a22c6ced2 216 dig_P8 = buff[20] | (buff[21] << 8);
Sigma884 0:9f2a22c6ced2 217 dig_P9 = buff[22] | (buff[23] << 8);
Sigma884 0:9f2a22c6ced2 218 dig_H1 = buff[24];
Sigma884 0:9f2a22c6ced2 219
Sigma884 0:9f2a22c6ced2 220 cmd[0] = BME_COMP2;
Sigma884 0:9f2a22c6ced2 221 i2c -> write(slave << 1, cmd, 1);
Sigma884 0:9f2a22c6ced2 222 i2c -> read(slave << 1 | 1, buff, 7);
Sigma884 0:9f2a22c6ced2 223 dig_H2 = buff[0] | (buff[1] << 8);
Sigma884 0:9f2a22c6ced2 224 dig_H3 = buff[2];
Sigma884 0:9f2a22c6ced2 225 dig_H4 = (buff[3] << 4) | (buff[4] & 0x0F);
Sigma884 0:9f2a22c6ced2 226 dig_H5 = ((buff[4] >> 4) & 0x0F) | (buff[5] << 4);
Sigma884 0:9f2a22c6ced2 227 dig_H6 = buff[6];
Sigma884 0:9f2a22c6ced2 228 }
Sigma884 0:9f2a22c6ced2 229
Sigma884 0:9f2a22c6ced2 230 int BME280_lib::calcT(){
Sigma884 0:9f2a22c6ced2 231 T_var1 = ((((adc >> 3) - ((int)dig_T1 << 1))) * ((int)dig_T2)) >> 11;
Sigma884 0:9f2a22c6ced2 232 T_var2 = (((((adc >> 4) - ((int)dig_T1)) * ((adc >> 4) - ((int)dig_T1))) >> 12) * ((int)dig_T3)) >> 14;
Sigma884 0:9f2a22c6ced2 233 t_fine = T_var1 + T_var2;
Sigma884 0:9f2a22c6ced2 234 T = (t_fine * 5 + 128) >> 8;
Sigma884 0:9f2a22c6ced2 235 return T;
Sigma884 0:9f2a22c6ced2 236 }
Sigma884 0:9f2a22c6ced2 237
Sigma884 0:9f2a22c6ced2 238 unsigned int BME280_lib::calcP(){
Sigma884 0:9f2a22c6ced2 239 P_var1 = ((long long)t_fine) - 128000;
Sigma884 0:9f2a22c6ced2 240 P_var2 = P_var1 * P_var1 * (long long)dig_P6;
Sigma884 0:9f2a22c6ced2 241 P_var2 = P_var2 + ((P_var1 * (long long)dig_P5) << 17);
Sigma884 0:9f2a22c6ced2 242 P_var2 = P_var2 + (((long long)dig_P4) << 35);
Sigma884 0:9f2a22c6ced2 243 P_var1 = ((P_var1 * P_var1 * (long long)dig_P3) >> 8) + ((P_var1 * (long long)dig_P2) << 12);
Sigma884 0:9f2a22c6ced2 244 P_var1 = (((((long long)1) << 47) + P_var1)) * ((long long)dig_P1) >> 33;
Sigma884 0:9f2a22c6ced2 245 if(P_var1 == 0){
Sigma884 0:9f2a22c6ced2 246 return 0;
Sigma884 0:9f2a22c6ced2 247 }
Sigma884 0:9f2a22c6ced2 248 P = 1048576 - adc;
Sigma884 0:9f2a22c6ced2 249 P = (((P << 31) - P_var2) * 3125) / P_var1;
Sigma884 0:9f2a22c6ced2 250 P_var1 = (((long long)dig_P9) * (P >> 13) * (P >> 13)) >> 25;
Sigma884 0:9f2a22c6ced2 251 P_var2 = (((long long)dig_P8) * P) >> 19;
Sigma884 0:9f2a22c6ced2 252 P = ((P + P_var1 + P_var2) >> 8) + (((long long)dig_P7) << 4);
Sigma884 0:9f2a22c6ced2 253 return (unsigned int)P;
Sigma884 0:9f2a22c6ced2 254 }
Sigma884 0:9f2a22c6ced2 255
Sigma884 0:9f2a22c6ced2 256 unsigned int BME280_lib::calcH(){
Sigma884 0:9f2a22c6ced2 257 v_x1 = (t_fine - ((int)76800));
Sigma884 0:9f2a22c6ced2 258 v_x1 = (((((adc << 14) - (((int)dig_H4) << 20) - (((int)dig_H5) * v_x1)) +
Sigma884 0:9f2a22c6ced2 259 ((int)16384)) >> 15) * (((((((v_x1 * ((int)dig_H6)) >> 10) *
Sigma884 0:9f2a22c6ced2 260 (((v_x1 * ((int)dig_H3)) >> 11) + ((int)32768))) >> 10) +
Sigma884 0:9f2a22c6ced2 261 ((int)2097152)) * ((int)dig_H2) + 8192) >> 14));
Sigma884 0:9f2a22c6ced2 262 v_x1 = (v_x1 - (((((v_x1 >> 15) * (v_x1 >> 15)) >> 7) * ((int)dig_H1)) >> 4));
Sigma884 0:9f2a22c6ced2 263 v_x1 = (v_x1 < 0 ? 0 : v_x1);
Sigma884 0:9f2a22c6ced2 264 v_x1 = (v_x1 > 419430400 ? 419430400 : v_x1);
Sigma884 0:9f2a22c6ced2 265 return (unsigned int)(v_x1 >> 12);
Sigma884 0:9f2a22c6ced2 266 }