grove_barometer

Committer:
JackyZhangFromSeeed
Date:
Tue Jun 09 10:17:13 2015 +0000
Revision:
0:3d05d80776f9
grove_barometer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JackyZhangFromSeeed 0:3d05d80776f9 1
JackyZhangFromSeeed 0:3d05d80776f9 2
JackyZhangFromSeeed 0:3d05d80776f9 3 #include "suli2.h"
JackyZhangFromSeeed 0:3d05d80776f9 4 #include "grove_barometer.h"
JackyZhangFromSeeed 0:3d05d80776f9 5
JackyZhangFromSeeed 0:3d05d80776f9 6
JackyZhangFromSeeed 0:3d05d80776f9 7
JackyZhangFromSeeed 0:3d05d80776f9 8 //local functions
JackyZhangFromSeeed 0:3d05d80776f9 9 static char _read_char(I2C_T *i2c, unsigned char addr);
JackyZhangFromSeeed 0:3d05d80776f9 10 static int _read_int(I2C_T *i2c, unsigned char addr);
JackyZhangFromSeeed 0:3d05d80776f9 11 static unsigned short grove_barometer_readut(I2C_T *i2c);
JackyZhangFromSeeed 0:3d05d80776f9 12 static unsigned long grove_barometer_readup(I2C_T *i2c);
JackyZhangFromSeeed 0:3d05d80776f9 13
JackyZhangFromSeeed 0:3d05d80776f9 14
JackyZhangFromSeeed 0:3d05d80776f9 15
JackyZhangFromSeeed 0:3d05d80776f9 16
JackyZhangFromSeeed 0:3d05d80776f9 17 //local variables
JackyZhangFromSeeed 0:3d05d80776f9 18 static unsigned char cmdbuf[2];
JackyZhangFromSeeed 0:3d05d80776f9 19 static unsigned char databuf[2];
JackyZhangFromSeeed 0:3d05d80776f9 20 static const unsigned char OSS = 0;
JackyZhangFromSeeed 0:3d05d80776f9 21 static short ac1, ac2, ac3;
JackyZhangFromSeeed 0:3d05d80776f9 22 static unsigned short ac4, ac5, ac6;
JackyZhangFromSeeed 0:3d05d80776f9 23 static short b1, b2;
JackyZhangFromSeeed 0:3d05d80776f9 24 static short mb, mc, md;
JackyZhangFromSeeed 0:3d05d80776f9 25 static long PressureCompensate;
JackyZhangFromSeeed 0:3d05d80776f9 26 static long _pressure;
JackyZhangFromSeeed 0:3d05d80776f9 27
JackyZhangFromSeeed 0:3d05d80776f9 28
JackyZhangFromSeeed 0:3d05d80776f9 29 void grove_barometer_init(I2C_T *i2c, int pinsda, int pinscl)
JackyZhangFromSeeed 0:3d05d80776f9 30 {
JackyZhangFromSeeed 0:3d05d80776f9 31 suli_i2c_init(i2c, pinsda, pinscl);
JackyZhangFromSeeed 0:3d05d80776f9 32 }
JackyZhangFromSeeed 0:3d05d80776f9 33
JackyZhangFromSeeed 0:3d05d80776f9 34 // Read 1 byte from the BMP085
JackyZhangFromSeeed 0:3d05d80776f9 35 static char _read_char(I2C_T *i2c, unsigned char addr)
JackyZhangFromSeeed 0:3d05d80776f9 36 {
JackyZhangFromSeeed 0:3d05d80776f9 37 suli_i2c_write(i2c, BMP085_ADDRESS, &addr, 1);
JackyZhangFromSeeed 0:3d05d80776f9 38 suli_i2c_read(i2c, BMP085_ADDRESS, databuf, 1);
JackyZhangFromSeeed 0:3d05d80776f9 39 return databuf[0];
JackyZhangFromSeeed 0:3d05d80776f9 40 }
JackyZhangFromSeeed 0:3d05d80776f9 41
JackyZhangFromSeeed 0:3d05d80776f9 42 // Read 2 bytes from the BMP085
JackyZhangFromSeeed 0:3d05d80776f9 43 static int _read_int(I2C_T *i2c, unsigned char addr)
JackyZhangFromSeeed 0:3d05d80776f9 44 {
JackyZhangFromSeeed 0:3d05d80776f9 45 suli_i2c_write(i2c, BMP085_ADDRESS, &addr, 1);
JackyZhangFromSeeed 0:3d05d80776f9 46 suli_i2c_read(i2c, BMP085_ADDRESS, databuf, 2);
JackyZhangFromSeeed 0:3d05d80776f9 47 return (databuf[0] << 8) + databuf[1];
JackyZhangFromSeeed 0:3d05d80776f9 48 }
JackyZhangFromSeeed 0:3d05d80776f9 49
JackyZhangFromSeeed 0:3d05d80776f9 50 bool grove_barometer_write_setup(I2C_T *i2c)
JackyZhangFromSeeed 0:3d05d80776f9 51 {
JackyZhangFromSeeed 0:3d05d80776f9 52 ac1 = _read_int(i2c, 0xAA);
JackyZhangFromSeeed 0:3d05d80776f9 53 ac2 = _read_int(i2c, 0xAC);
JackyZhangFromSeeed 0:3d05d80776f9 54 ac3 = _read_int(i2c, 0xAE);
JackyZhangFromSeeed 0:3d05d80776f9 55 ac4 = _read_int(i2c, 0xB0);
JackyZhangFromSeeed 0:3d05d80776f9 56 ac5 = _read_int(i2c, 0xB2);
JackyZhangFromSeeed 0:3d05d80776f9 57 ac6 = _read_int(i2c, 0xB4);
JackyZhangFromSeeed 0:3d05d80776f9 58 b1 = _read_int(i2c, 0xB6);
JackyZhangFromSeeed 0:3d05d80776f9 59 b2 = _read_int(i2c, 0xB8);
JackyZhangFromSeeed 0:3d05d80776f9 60 mb = _read_int(i2c, 0xBA);
JackyZhangFromSeeed 0:3d05d80776f9 61 mc = _read_int(i2c, 0xBC);
JackyZhangFromSeeed 0:3d05d80776f9 62 md = _read_int(i2c, 0xBE);
JackyZhangFromSeeed 0:3d05d80776f9 63
JackyZhangFromSeeed 0:3d05d80776f9 64 return true;
JackyZhangFromSeeed 0:3d05d80776f9 65 }
JackyZhangFromSeeed 0:3d05d80776f9 66
JackyZhangFromSeeed 0:3d05d80776f9 67 // Read the uncompensated temperature value
JackyZhangFromSeeed 0:3d05d80776f9 68 static unsigned short grove_barometer_readut(I2C_T *i2c)
JackyZhangFromSeeed 0:3d05d80776f9 69 {
JackyZhangFromSeeed 0:3d05d80776f9 70 unsigned short ut;
JackyZhangFromSeeed 0:3d05d80776f9 71
JackyZhangFromSeeed 0:3d05d80776f9 72 // Wire.beginTransmission(BMP085_ADDRESS);
JackyZhangFromSeeed 0:3d05d80776f9 73 // Wire.write(0xF4);
JackyZhangFromSeeed 0:3d05d80776f9 74 // Wire.write(0x2E);
JackyZhangFromSeeed 0:3d05d80776f9 75 // Wire.endTransmission();
JackyZhangFromSeeed 0:3d05d80776f9 76 cmdbuf[0] = 0xF4;
JackyZhangFromSeeed 0:3d05d80776f9 77 cmdbuf[1] = 0x2E;
JackyZhangFromSeeed 0:3d05d80776f9 78 suli_i2c_write(i2c, BMP085_ADDRESS, cmdbuf, 2); // POWER UP
JackyZhangFromSeeed 0:3d05d80776f9 79
JackyZhangFromSeeed 0:3d05d80776f9 80
JackyZhangFromSeeed 0:3d05d80776f9 81 suli_delay_ms(5);
JackyZhangFromSeeed 0:3d05d80776f9 82 //ut = bmp085ReadInt(0xF6);
JackyZhangFromSeeed 0:3d05d80776f9 83 ut = _read_int(i2c, 0xF6);
JackyZhangFromSeeed 0:3d05d80776f9 84
JackyZhangFromSeeed 0:3d05d80776f9 85 return ut;
JackyZhangFromSeeed 0:3d05d80776f9 86 }
JackyZhangFromSeeed 0:3d05d80776f9 87
JackyZhangFromSeeed 0:3d05d80776f9 88 // Read the uncompensated pressure value
JackyZhangFromSeeed 0:3d05d80776f9 89 static unsigned long grove_barometer_readup(I2C_T *i2c)
JackyZhangFromSeeed 0:3d05d80776f9 90 {
JackyZhangFromSeeed 0:3d05d80776f9 91 unsigned char msb, lsb, xlsb;
JackyZhangFromSeeed 0:3d05d80776f9 92 unsigned long up = 0;
JackyZhangFromSeeed 0:3d05d80776f9 93
JackyZhangFromSeeed 0:3d05d80776f9 94 // Wire.beginTransmission(BMP085_ADDRESS);
JackyZhangFromSeeed 0:3d05d80776f9 95 // Wire.write(0xF4);
JackyZhangFromSeeed 0:3d05d80776f9 96 // Wire.write(0x34 + (OSS<<6));
JackyZhangFromSeeed 0:3d05d80776f9 97 // Wire.endTransmission();
JackyZhangFromSeeed 0:3d05d80776f9 98 cmdbuf[0] = 0xF4;
JackyZhangFromSeeed 0:3d05d80776f9 99 cmdbuf[1] = 0x34 + (OSS<<6);
JackyZhangFromSeeed 0:3d05d80776f9 100 suli_i2c_write(i2c, BMP085_ADDRESS, cmdbuf, 2); // POWER UP
JackyZhangFromSeeed 0:3d05d80776f9 101
JackyZhangFromSeeed 0:3d05d80776f9 102
JackyZhangFromSeeed 0:3d05d80776f9 103 suli_delay_ms(2 + (3<<OSS));
JackyZhangFromSeeed 0:3d05d80776f9 104
JackyZhangFromSeeed 0:3d05d80776f9 105 // Read register 0xF6 (MSB), 0xF7 (LSB), and 0xF8 (XLSB)
JackyZhangFromSeeed 0:3d05d80776f9 106 // msb = bmp085Read(0xF6);
JackyZhangFromSeeed 0:3d05d80776f9 107 // lsb = bmp085Read(0xF7);
JackyZhangFromSeeed 0:3d05d80776f9 108 // xlsb = bmp085Read(0xF8);
JackyZhangFromSeeed 0:3d05d80776f9 109 msb = _read_char(i2c, 0xF6);
JackyZhangFromSeeed 0:3d05d80776f9 110 lsb = _read_char(i2c, 0xF7);
JackyZhangFromSeeed 0:3d05d80776f9 111 xlsb = _read_char(i2c, 0xF8);
JackyZhangFromSeeed 0:3d05d80776f9 112
JackyZhangFromSeeed 0:3d05d80776f9 113 up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
JackyZhangFromSeeed 0:3d05d80776f9 114
JackyZhangFromSeeed 0:3d05d80776f9 115 return up;
JackyZhangFromSeeed 0:3d05d80776f9 116 }
JackyZhangFromSeeed 0:3d05d80776f9 117
JackyZhangFromSeeed 0:3d05d80776f9 118 bool grove_barometer_gettemperature(I2C_T *i2c, float *temperature)
JackyZhangFromSeeed 0:3d05d80776f9 119 {
JackyZhangFromSeeed 0:3d05d80776f9 120 long x1, x2;
JackyZhangFromSeeed 0:3d05d80776f9 121 unsigned short ut = grove_barometer_readut(i2c);
JackyZhangFromSeeed 0:3d05d80776f9 122
JackyZhangFromSeeed 0:3d05d80776f9 123 x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
JackyZhangFromSeeed 0:3d05d80776f9 124 x2 = ((long)mc << 11)/(x1 + md);
JackyZhangFromSeeed 0:3d05d80776f9 125 PressureCompensate = x1 + x2;
JackyZhangFromSeeed 0:3d05d80776f9 126
JackyZhangFromSeeed 0:3d05d80776f9 127 float temp = ((PressureCompensate + 8)>>4);
JackyZhangFromSeeed 0:3d05d80776f9 128 *temperature = temp /10;
JackyZhangFromSeeed 0:3d05d80776f9 129
JackyZhangFromSeeed 0:3d05d80776f9 130 return true;
JackyZhangFromSeeed 0:3d05d80776f9 131 }
JackyZhangFromSeeed 0:3d05d80776f9 132
JackyZhangFromSeeed 0:3d05d80776f9 133 bool grove_barometer_getpressure(I2C_T *i2c, long *pressure)
JackyZhangFromSeeed 0:3d05d80776f9 134 {
JackyZhangFromSeeed 0:3d05d80776f9 135 long x1, x2, x3, b3, b6, p;
JackyZhangFromSeeed 0:3d05d80776f9 136 unsigned long b4, b7;
JackyZhangFromSeeed 0:3d05d80776f9 137 unsigned long up = grove_barometer_readup(i2c);
JackyZhangFromSeeed 0:3d05d80776f9 138
JackyZhangFromSeeed 0:3d05d80776f9 139 b6 = PressureCompensate - 4000;
JackyZhangFromSeeed 0:3d05d80776f9 140 x1 = (b2 * (b6 * b6)>>12)>>11;
JackyZhangFromSeeed 0:3d05d80776f9 141 x2 = (ac2 * b6)>>11;
JackyZhangFromSeeed 0:3d05d80776f9 142 x3 = x1 + x2;
JackyZhangFromSeeed 0:3d05d80776f9 143 b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;
JackyZhangFromSeeed 0:3d05d80776f9 144
JackyZhangFromSeeed 0:3d05d80776f9 145 // Calculate B4
JackyZhangFromSeeed 0:3d05d80776f9 146 x1 = (ac3 * b6)>>13;
JackyZhangFromSeeed 0:3d05d80776f9 147 x2 = (b1 * ((b6 * b6)>>12))>>16;
JackyZhangFromSeeed 0:3d05d80776f9 148 x3 = ((x1 + x2) + 2)>>2;
JackyZhangFromSeeed 0:3d05d80776f9 149 b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;
JackyZhangFromSeeed 0:3d05d80776f9 150
JackyZhangFromSeeed 0:3d05d80776f9 151 b7 = ((unsigned long)(up - b3) * (50000>>OSS));
JackyZhangFromSeeed 0:3d05d80776f9 152 if (b7 < 0x80000000)
JackyZhangFromSeeed 0:3d05d80776f9 153 p = (b7<<1)/b4;
JackyZhangFromSeeed 0:3d05d80776f9 154 else
JackyZhangFromSeeed 0:3d05d80776f9 155 p = (b7/b4)<<1;
JackyZhangFromSeeed 0:3d05d80776f9 156
JackyZhangFromSeeed 0:3d05d80776f9 157 x1 = (p>>8) * (p>>8);
JackyZhangFromSeeed 0:3d05d80776f9 158 x1 = (x1 * 3038)>>16;
JackyZhangFromSeeed 0:3d05d80776f9 159 x2 = (-7357 * p)>>16;
JackyZhangFromSeeed 0:3d05d80776f9 160 p += (x1 + x2 + 3791)>>4;
JackyZhangFromSeeed 0:3d05d80776f9 161
JackyZhangFromSeeed 0:3d05d80776f9 162 _pressure = p;
JackyZhangFromSeeed 0:3d05d80776f9 163 *pressure = _pressure;
JackyZhangFromSeeed 0:3d05d80776f9 164 return true;
JackyZhangFromSeeed 0:3d05d80776f9 165 }
JackyZhangFromSeeed 0:3d05d80776f9 166
JackyZhangFromSeeed 0:3d05d80776f9 167 bool grove_barometer_calcaltitude(I2C_T *i2c, float *altitude)
JackyZhangFromSeeed 0:3d05d80776f9 168 {
JackyZhangFromSeeed 0:3d05d80776f9 169 float A = _pressure/101325;
JackyZhangFromSeeed 0:3d05d80776f9 170 float B = 1/5.25588;
JackyZhangFromSeeed 0:3d05d80776f9 171 float C = pow(A,B);
JackyZhangFromSeeed 0:3d05d80776f9 172 C = 1 - C;
JackyZhangFromSeeed 0:3d05d80776f9 173 C = C /0.0000225577;
JackyZhangFromSeeed 0:3d05d80776f9 174 *altitude = C;
JackyZhangFromSeeed 0:3d05d80776f9 175 return true;
JackyZhangFromSeeed 0:3d05d80776f9 176 }