BMP280から気圧データを取得します。updateで更新動作、getpressで値を読み出します

Dependents:   SensorManager

Committer:
kim1212
Date:
Tue Feb 13 04:19:43 2018 +0000
Revision:
1:a65c7f637b1e
Parent:
0:54d7f18450e6
?????????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kim1212 0:54d7f18450e6 1 #include "BMP280.h"
kim1212 0:54d7f18450e6 2
kim1212 0:54d7f18450e6 3
kim1212 0:54d7f18450e6 4 BMP280::BMP280(PinName mosi,PinName miso,PinName sck,PinName _cs):bmp(mosi,miso,sck),cs(_cs)
kim1212 0:54d7f18450e6 5 {
kim1212 0:54d7f18450e6 6 cs=1;
kim1212 1:a65c7f637b1e 7 bmp.frequency(10000000);
kim1212 0:54d7f18450e6 8 bmp.format(8,3);
kim1212 0:54d7f18450e6 9
kim1212 0:54d7f18450e6 10 wait(0.1);
kim1212 0:54d7f18450e6 11 press=0;
kim1212 0:54d7f18450e6 12
kim1212 0:54d7f18450e6 13 writebyte(0xe0,0xb6);//reset
kim1212 0:54d7f18450e6 14 wait_ms(100);
kim1212 0:54d7f18450e6 15
kim1212 0:54d7f18450e6 16 char buf[2];
kim1212 0:54d7f18450e6 17 while((readbyte(0xf3)&0b00000001));
kim1212 0:54d7f18450e6 18
kim1212 0:54d7f18450e6 19 readnbyte(0x88,buf,2);
kim1212 0:54d7f18450e6 20 dig_T1=((unsigned short)(buf[1]<<8)|buf[0]);
kim1212 0:54d7f18450e6 21 readnbyte(0x8a,buf,2);
kim1212 0:54d7f18450e6 22 dig_T2=((short)(buf[1]<<8)|buf[0]);
kim1212 0:54d7f18450e6 23 readnbyte(0x8c,buf,2);
kim1212 0:54d7f18450e6 24 dig_T3=((short)(buf[1]<<8)|buf[0]);
kim1212 0:54d7f18450e6 25 readnbyte(0x8e,buf,2);
kim1212 0:54d7f18450e6 26 dig_P1=((unsigned short)(buf[1]<<8)|buf[0]);
kim1212 0:54d7f18450e6 27 readnbyte(0x90,buf,2);
kim1212 0:54d7f18450e6 28 dig_P2=((short)(buf[1]<<8)|buf[0]);
kim1212 0:54d7f18450e6 29 readnbyte(0x92,buf,2);
kim1212 0:54d7f18450e6 30 dig_P3=((short)(buf[1]<<8)|buf[0]);
kim1212 0:54d7f18450e6 31 readnbyte(0x94,buf,2);
kim1212 0:54d7f18450e6 32 dig_P4=((short)(buf[1]<<8)|buf[0]);
kim1212 0:54d7f18450e6 33 readnbyte(0x96,buf,2);
kim1212 0:54d7f18450e6 34 dig_P5=((short)(buf[1]<<8)|buf[0]);
kim1212 0:54d7f18450e6 35 readnbyte(0x98,buf,2);
kim1212 0:54d7f18450e6 36 dig_P6=((short)(buf[1]<<8)|buf[0]);
kim1212 0:54d7f18450e6 37 readnbyte(0x9a,buf,2);
kim1212 0:54d7f18450e6 38 dig_P7=((short)(buf[1]<<8)|buf[0]);
kim1212 0:54d7f18450e6 39 readnbyte(0x9c,buf,2);
kim1212 0:54d7f18450e6 40 dig_P8=((short)(buf[1]<<8)|buf[0]);
kim1212 0:54d7f18450e6 41 readnbyte(0x9e,buf,2);
kim1212 0:54d7f18450e6 42 dig_P9=((short)(buf[1]<<8)|buf[0]);
kim1212 0:54d7f18450e6 43
kim1212 0:54d7f18450e6 44 }
kim1212 0:54d7f18450e6 45
kim1212 1:a65c7f637b1e 46 void BMP280::init(char t_osr,char p_osr,char IIR){
kim1212 1:a65c7f637b1e 47 _t_osr=t_osr;
kim1212 1:a65c7f637b1e 48 _p_osr=p_osr;
kim1212 1:a65c7f637b1e 49 _IIR=IIR;
kim1212 1:a65c7f637b1e 50
kim1212 1:a65c7f637b1e 51 //forced mode trigger
kim1212 1:a65c7f637b1e 52 char data=((t_osr<<5)|(p_osr<<2))|0b01;
kim1212 0:54d7f18450e6 53 writebyte(0xf4,data);//config
kim1212 0:54d7f18450e6 54
kim1212 0:54d7f18450e6 55 data=0;
kim1212 1:a65c7f637b1e 56 data=(IIR<<2);
kim1212 0:54d7f18450e6 57 writebyte(0xf5,data);
kim1212 0:54d7f18450e6 58 }
kim1212 0:54d7f18450e6 59
kim1212 0:54d7f18450e6 60 char BMP280::readbyte(char adr){
kim1212 0:54d7f18450e6 61 cs=0;
kim1212 0:54d7f18450e6 62 bmp.write(adr|0b10000000);
kim1212 0:54d7f18450e6 63 char val=bmp.write(0xff);
kim1212 0:54d7f18450e6 64 cs=1;
kim1212 0:54d7f18450e6 65 return val;
kim1212 0:54d7f18450e6 66
kim1212 0:54d7f18450e6 67 }
kim1212 0:54d7f18450e6 68 void BMP280::writebyte(char adr,char data){
kim1212 0:54d7f18450e6 69 cs=0;
kim1212 0:54d7f18450e6 70 bmp.write(adr&0b1111111);
kim1212 0:54d7f18450e6 71 bmp.write(data);
kim1212 0:54d7f18450e6 72 cs=1;
kim1212 0:54d7f18450e6 73 }
kim1212 0:54d7f18450e6 74 void BMP280::readnbyte(char adr,char *data,char num){
kim1212 0:54d7f18450e6 75 cs=0;
kim1212 0:54d7f18450e6 76 bmp.write(adr|0b10000000);
kim1212 0:54d7f18450e6 77 for(int i=0;i<num;i++)data[i]=bmp.write(0xff);
kim1212 0:54d7f18450e6 78 cs=1;
kim1212 0:54d7f18450e6 79 }
kim1212 0:54d7f18450e6 80
kim1212 0:54d7f18450e6 81 int BMP280::bmp280_compensate_T_int32(int adc_T){
kim1212 0:54d7f18450e6 82 int var1,var2,T;
kim1212 0:54d7f18450e6 83 var1=((((adc_T>>3)-((int)dig_T1<<1)))*((int)dig_T2))>>11;
kim1212 0:54d7f18450e6 84 var2=(((((adc_T>>4)-((int)dig_T1))*((adc_T>>4)-((int)dig_T1)))>>12)*((int)dig_T3))>>14;
kim1212 0:54d7f18450e6 85 t_fine=var1+var2;
kim1212 0:54d7f18450e6 86 T=(t_fine*5+128)>>8;
kim1212 0:54d7f18450e6 87 return T;
kim1212 0:54d7f18450e6 88
kim1212 0:54d7f18450e6 89 }
kim1212 0:54d7f18450e6 90 unsigned int BMP280::bmp280_compensate_P_int64(int adc_P){
kim1212 0:54d7f18450e6 91 int32_t var1, var2;
kim1212 0:54d7f18450e6 92 unsigned int press=0;
kim1212 0:54d7f18450e6 93
kim1212 0:54d7f18450e6 94 var1 = (t_fine >> 1) - 64000;
kim1212 0:54d7f18450e6 95 var2 = (((var1 >> 2) * (var1 >> 2)) >> 11) * dig_P6;
kim1212 0:54d7f18450e6 96 var2 = var2 + ((var1 * dig_P5) << 1);
kim1212 0:54d7f18450e6 97 var2 = (var2 >> 2) + (dig_P4 << 16);
kim1212 0:54d7f18450e6 98 var1 = (((dig_P3 * (((var1 >> 2)*(var1 >> 2)) >> 13)) >> 3) + ((dig_P2 * var1) >> 1)) >> 18;
kim1212 0:54d7f18450e6 99 var1 = ((32768 + var1) * dig_P1) >> 15;
kim1212 0:54d7f18450e6 100 if (var1 == 0) {
kim1212 0:54d7f18450e6 101 return 0;
kim1212 0:54d7f18450e6 102 }
kim1212 0:54d7f18450e6 103 press = (((1048576 - adc_P) - (var2 >> 12))) * 3125;
kim1212 0:54d7f18450e6 104 if(press < 0x80000000) {
kim1212 0:54d7f18450e6 105 press = (press << 1) / var1;
kim1212 0:54d7f18450e6 106 } else {
kim1212 0:54d7f18450e6 107 press = (press / var1) * 2;
kim1212 0:54d7f18450e6 108 }
kim1212 0:54d7f18450e6 109 var1 = ((int32_t)dig_P9 * ((int32_t)(((press >> 3) * (press >> 3)) >> 13))) >> 12;
kim1212 0:54d7f18450e6 110 var2 = (((int32_t)(press >> 2)) * (int32_t)dig_P8) >> 13;
kim1212 0:54d7f18450e6 111 press = (press + ((var1 + var2 + dig_P7) >> 4));
kim1212 0:54d7f18450e6 112
kim1212 0:54d7f18450e6 113 return press;
kim1212 0:54d7f18450e6 114 }
kim1212 0:54d7f18450e6 115 bool BMP280::update(){
kim1212 0:54d7f18450e6 116 if(((readbyte(0xf3)&0b00001000)>>3)==0){//データが見れるか
kim1212 0:54d7f18450e6 117
kim1212 0:54d7f18450e6 118 char data[6];
kim1212 0:54d7f18450e6 119 int adc_T,adc_P;
kim1212 0:54d7f18450e6 120 readnbyte(0xf7,data,6);
kim1212 0:54d7f18450e6 121 adc_T=(int)((data[4]<<4)|(data[3]<<12))|(data[5]>>4);
kim1212 0:54d7f18450e6 122
kim1212 0:54d7f18450e6 123 adc_P=(int)((data[2]>>4)|(data[1]<<4))|(data[0]<<12);
kim1212 0:54d7f18450e6 124
kim1212 1:a65c7f637b1e 125 //forced mode trigger
kim1212 1:a65c7f637b1e 126 char buf=((_t_osr<<5)|(_p_osr<<2))|0b01;
kim1212 1:a65c7f637b1e 127 writebyte(0xf4,buf);//config
kim1212 1:a65c7f637b1e 128 buf=(_IIR<<2);
kim1212 1:a65c7f637b1e 129 writebyte(0xf5,buf);
kim1212 1:a65c7f637b1e 130
kim1212 0:54d7f18450e6 131 bmp280_compensate_T_int32(adc_T);
kim1212 0:54d7f18450e6 132 press=bmp280_compensate_P_int64(adc_P);
kim1212 0:54d7f18450e6 133
kim1212 1:a65c7f637b1e 134
kim1212 1:a65c7f637b1e 135
kim1212 0:54d7f18450e6 136 return true;
kim1212 1:a65c7f637b1e 137 }else return false;
kim1212 0:54d7f18450e6 138
kim1212 0:54d7f18450e6 139 }
kim1212 0:54d7f18450e6 140
kim1212 1:a65c7f637b1e 141 unsigned int BMP280::getpress(){
kim1212 1:a65c7f637b1e 142 return press;
kim1212 0:54d7f18450e6 143 }