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

Dependents:   SensorManager

Committer:
kim1212
Date:
Sun Dec 04 14:38:21 2016 +0000
Revision:
0:54d7f18450e6
Child:
1:a65c7f637b1e
BMP280??????????????????????????

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 0:54d7f18450e6 7 bmp.frequency(1000000);
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 0:54d7f18450e6 46 void BMP280::init(char t_osr,char p_osr,char t_sb,char IIR){
kim1212 0:54d7f18450e6 47 char data=((t_osr<<5)|(p_osr<<2))|0b11;
kim1212 0:54d7f18450e6 48 writebyte(0xf4,data);//config
kim1212 0:54d7f18450e6 49
kim1212 0:54d7f18450e6 50 data=0;
kim1212 0:54d7f18450e6 51 data=(t_sb<<5)|(IIR<<2);
kim1212 0:54d7f18450e6 52 writebyte(0xf5,data);
kim1212 0:54d7f18450e6 53 }
kim1212 0:54d7f18450e6 54
kim1212 0:54d7f18450e6 55 char BMP280::readbyte(char adr){
kim1212 0:54d7f18450e6 56 cs=0;
kim1212 0:54d7f18450e6 57 bmp.write(adr|0b10000000);
kim1212 0:54d7f18450e6 58 char val=bmp.write(0xff);
kim1212 0:54d7f18450e6 59 cs=1;
kim1212 0:54d7f18450e6 60 return val;
kim1212 0:54d7f18450e6 61
kim1212 0:54d7f18450e6 62 }
kim1212 0:54d7f18450e6 63 void BMP280::writebyte(char adr,char data){
kim1212 0:54d7f18450e6 64 cs=0;
kim1212 0:54d7f18450e6 65 bmp.write(adr&0b1111111);
kim1212 0:54d7f18450e6 66 bmp.write(data);
kim1212 0:54d7f18450e6 67 cs=1;
kim1212 0:54d7f18450e6 68 }
kim1212 0:54d7f18450e6 69 void BMP280::readnbyte(char adr,char *data,char num){
kim1212 0:54d7f18450e6 70 cs=0;
kim1212 0:54d7f18450e6 71 bmp.write(adr|0b10000000);
kim1212 0:54d7f18450e6 72 for(int i=0;i<num;i++)data[i]=bmp.write(0xff);
kim1212 0:54d7f18450e6 73 cs=1;
kim1212 0:54d7f18450e6 74 }
kim1212 0:54d7f18450e6 75
kim1212 0:54d7f18450e6 76 int BMP280::bmp280_compensate_T_int32(int adc_T){
kim1212 0:54d7f18450e6 77 int var1,var2,T;
kim1212 0:54d7f18450e6 78 var1=((((adc_T>>3)-((int)dig_T1<<1)))*((int)dig_T2))>>11;
kim1212 0:54d7f18450e6 79 var2=(((((adc_T>>4)-((int)dig_T1))*((adc_T>>4)-((int)dig_T1)))>>12)*((int)dig_T3))>>14;
kim1212 0:54d7f18450e6 80 t_fine=var1+var2;
kim1212 0:54d7f18450e6 81 T=(t_fine*5+128)>>8;
kim1212 0:54d7f18450e6 82 return T;
kim1212 0:54d7f18450e6 83
kim1212 0:54d7f18450e6 84 }
kim1212 0:54d7f18450e6 85 unsigned int BMP280::bmp280_compensate_P_int64(int adc_P){
kim1212 0:54d7f18450e6 86 int32_t var1, var2;
kim1212 0:54d7f18450e6 87 unsigned int press=0;
kim1212 0:54d7f18450e6 88
kim1212 0:54d7f18450e6 89 var1 = (t_fine >> 1) - 64000;
kim1212 0:54d7f18450e6 90 var2 = (((var1 >> 2) * (var1 >> 2)) >> 11) * dig_P6;
kim1212 0:54d7f18450e6 91 var2 = var2 + ((var1 * dig_P5) << 1);
kim1212 0:54d7f18450e6 92 var2 = (var2 >> 2) + (dig_P4 << 16);
kim1212 0:54d7f18450e6 93 var1 = (((dig_P3 * (((var1 >> 2)*(var1 >> 2)) >> 13)) >> 3) + ((dig_P2 * var1) >> 1)) >> 18;
kim1212 0:54d7f18450e6 94 var1 = ((32768 + var1) * dig_P1) >> 15;
kim1212 0:54d7f18450e6 95 if (var1 == 0) {
kim1212 0:54d7f18450e6 96 return 0;
kim1212 0:54d7f18450e6 97 }
kim1212 0:54d7f18450e6 98 press = (((1048576 - adc_P) - (var2 >> 12))) * 3125;
kim1212 0:54d7f18450e6 99 if(press < 0x80000000) {
kim1212 0:54d7f18450e6 100 press = (press << 1) / var1;
kim1212 0:54d7f18450e6 101 } else {
kim1212 0:54d7f18450e6 102 press = (press / var1) * 2;
kim1212 0:54d7f18450e6 103 }
kim1212 0:54d7f18450e6 104 var1 = ((int32_t)dig_P9 * ((int32_t)(((press >> 3) * (press >> 3)) >> 13))) >> 12;
kim1212 0:54d7f18450e6 105 var2 = (((int32_t)(press >> 2)) * (int32_t)dig_P8) >> 13;
kim1212 0:54d7f18450e6 106 press = (press + ((var1 + var2 + dig_P7) >> 4));
kim1212 0:54d7f18450e6 107
kim1212 0:54d7f18450e6 108 return press;
kim1212 0:54d7f18450e6 109 }
kim1212 0:54d7f18450e6 110 bool BMP280::update(){
kim1212 0:54d7f18450e6 111 if(((readbyte(0xf3)&0b00001000)>>3)==0){//データが見れるか
kim1212 0:54d7f18450e6 112
kim1212 0:54d7f18450e6 113 char data[6];
kim1212 0:54d7f18450e6 114 int adc_T,adc_P;
kim1212 0:54d7f18450e6 115 readnbyte(0xf7,data,6);
kim1212 0:54d7f18450e6 116 adc_T=(int)((data[4]<<4)|(data[3]<<12))|(data[5]>>4);
kim1212 0:54d7f18450e6 117
kim1212 0:54d7f18450e6 118 adc_P=(int)((data[2]>>4)|(data[1]<<4))|(data[0]<<12);
kim1212 0:54d7f18450e6 119
kim1212 0:54d7f18450e6 120 bmp280_compensate_T_int32(adc_T);
kim1212 0:54d7f18450e6 121 press=bmp280_compensate_P_int64(adc_P);
kim1212 0:54d7f18450e6 122
kim1212 0:54d7f18450e6 123 return true;
kim1212 0:54d7f18450e6 124 }
kim1212 0:54d7f18450e6 125
kim1212 0:54d7f18450e6 126 return false;
kim1212 0:54d7f18450e6 127 }
kim1212 0:54d7f18450e6 128
kim1212 0:54d7f18450e6 129 float BMP280::getpress(){
kim1212 0:54d7f18450e6 130 return (float)press;
kim1212 0:54d7f18450e6 131 }