grove_barometer
grove_barometer.cpp@0:3d05d80776f9, 2015-06-09 (annotated)
- Committer:
- JackyZhangFromSeeed
- Date:
- Tue Jun 09 10:17:13 2015 +0000
- Revision:
- 0:3d05d80776f9
grove_barometer
Who changed what in which revision?
User | Revision | Line number | New 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 | } |