Change to comply with mbed os 5.1, as the attach function as used has been deprecated
Dependents: Barometer-Example LoRaWAN-demo-72-bootcamp
Fork of BMP085 by
BMP085 library supporting mbed os low power
BMP085.cpp@0:fb197da45ba8, 2015-11-15 (annotated)
- Committer:
- asmellby
- Date:
- Sun Nov 15 18:05:18 2015 +0000
- Revision:
- 0:fb197da45ba8
- Child:
- 1:33acd2e1edab
Barometer library
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
asmellby | 0:fb197da45ba8 | 1 | #include "BMP085.h" |
asmellby | 0:fb197da45ba8 | 2 | |
asmellby | 0:fb197da45ba8 | 3 | void BMP085::init(void) { |
asmellby | 0:fb197da45ba8 | 4 | _callback.attach(this, &BMP085::_callback_handler); |
asmellby | 0:fb197da45ba8 | 5 | |
asmellby | 0:fb197da45ba8 | 6 | _cal_data.ac1 = read_cal_register(BMP085_CAL_AC1); |
asmellby | 0:fb197da45ba8 | 7 | _cal_data.ac2 = read_cal_register(BMP085_CAL_AC2); |
asmellby | 0:fb197da45ba8 | 8 | _cal_data.ac3 = read_cal_register(BMP085_CAL_AC3); |
asmellby | 0:fb197da45ba8 | 9 | _cal_data.ac4 = read_cal_register(BMP085_CAL_AC4); |
asmellby | 0:fb197da45ba8 | 10 | _cal_data.ac5 = read_cal_register(BMP085_CAL_AC5); |
asmellby | 0:fb197da45ba8 | 11 | _cal_data.ac6 = read_cal_register(BMP085_CAL_AC6); |
asmellby | 0:fb197da45ba8 | 12 | _cal_data.b1 = read_cal_register(BMP085_CAL_B1); |
asmellby | 0:fb197da45ba8 | 13 | _cal_data.b2 = read_cal_register(BMP085_CAL_B2); |
asmellby | 0:fb197da45ba8 | 14 | _cal_data.mb = read_cal_register(BMP085_CAL_MB); |
asmellby | 0:fb197da45ba8 | 15 | _cal_data.mc = read_cal_register(BMP085_CAL_MC); |
asmellby | 0:fb197da45ba8 | 16 | _cal_data.md = read_cal_register(BMP085_CAL_MD); |
asmellby | 0:fb197da45ba8 | 17 | } |
asmellby | 0:fb197da45ba8 | 18 | |
asmellby | 0:fb197da45ba8 | 19 | uint16_t BMP085::read_cal_register(BMP085_Register reg) { |
asmellby | 0:fb197da45ba8 | 20 | _tx_buf[0] = reg; |
asmellby | 0:fb197da45ba8 | 21 | _state = BMP085_BUSY; |
asmellby | 0:fb197da45ba8 | 22 | _i2c.transfer(BMP085_ADDR, (char*)_tx_buf, 1, (char*)_rx_buf, 2, _callback); |
asmellby | 0:fb197da45ba8 | 23 | while(_state != BMP085_IDLE) { |
asmellby | 0:fb197da45ba8 | 24 | sleep(); |
asmellby | 0:fb197da45ba8 | 25 | } |
asmellby | 0:fb197da45ba8 | 26 | return (_rx_buf[0] << 8) | _rx_buf[1]; |
asmellby | 0:fb197da45ba8 | 27 | } |
asmellby | 0:fb197da45ba8 | 28 | |
asmellby | 0:fb197da45ba8 | 29 | uint16_t BMP085::read_uc_temperature(void) { |
asmellby | 0:fb197da45ba8 | 30 | LowPowerTimeout delay; |
asmellby | 0:fb197da45ba8 | 31 | _tx_buf[0] = BMP085_CTRL; |
asmellby | 0:fb197da45ba8 | 32 | _tx_buf[1] = BMP085_CMD_READ_TEMP; |
asmellby | 0:fb197da45ba8 | 33 | _state = BMP085_BUSY; |
asmellby | 0:fb197da45ba8 | 34 | _i2c.transfer(BMP085_ADDR, (char*)_tx_buf, 2, (char*)NULL, 0, _callback); |
asmellby | 0:fb197da45ba8 | 35 | while(_state != BMP085_IDLE) { |
asmellby | 0:fb197da45ba8 | 36 | sleep(); |
asmellby | 0:fb197da45ba8 | 37 | } |
asmellby | 0:fb197da45ba8 | 38 | |
asmellby | 0:fb197da45ba8 | 39 | _state = BMP085_BUSY; |
asmellby | 0:fb197da45ba8 | 40 | delay.attach(this, &BMP085::_callback_handler, 0.01); |
asmellby | 0:fb197da45ba8 | 41 | while(_state != BMP085_IDLE) { |
asmellby | 0:fb197da45ba8 | 42 | sleep(); |
asmellby | 0:fb197da45ba8 | 43 | } |
asmellby | 0:fb197da45ba8 | 44 | |
asmellby | 0:fb197da45ba8 | 45 | _tx_buf[0] = BMP085_DATA_TEMP; |
asmellby | 0:fb197da45ba8 | 46 | _state = BMP085_BUSY; |
asmellby | 0:fb197da45ba8 | 47 | _i2c.transfer(BMP085_ADDR, (char*)_tx_buf, 1, (char*)_rx_buf, 2, _callback); |
asmellby | 0:fb197da45ba8 | 48 | while(_state != BMP085_IDLE) { |
asmellby | 0:fb197da45ba8 | 49 | sleep(); |
asmellby | 0:fb197da45ba8 | 50 | } |
asmellby | 0:fb197da45ba8 | 51 | return (_rx_buf[0] << 8) | _rx_buf[1]; |
asmellby | 0:fb197da45ba8 | 52 | } |
asmellby | 0:fb197da45ba8 | 53 | |
asmellby | 0:fb197da45ba8 | 54 | uint32_t BMP085::read_uc_pressure(void) { |
asmellby | 0:fb197da45ba8 | 55 | LowPowerTimeout delay; |
asmellby | 0:fb197da45ba8 | 56 | _tx_buf[0] = BMP085_CTRL; |
asmellby | 0:fb197da45ba8 | 57 | _tx_buf[1] = BMP085_CMD_READ_PRESSURE + ((uint8_t)_mode << 6); |
asmellby | 0:fb197da45ba8 | 58 | _state = BMP085_BUSY; |
asmellby | 0:fb197da45ba8 | 59 | _i2c.transfer(BMP085_ADDR, (char*)_tx_buf, 2, (char*)NULL, 0, _callback); |
asmellby | 0:fb197da45ba8 | 60 | while(_state != BMP085_IDLE) { |
asmellby | 0:fb197da45ba8 | 61 | sleep(); |
asmellby | 0:fb197da45ba8 | 62 | } |
asmellby | 0:fb197da45ba8 | 63 | |
asmellby | 0:fb197da45ba8 | 64 | _state = BMP085_BUSY; |
asmellby | 0:fb197da45ba8 | 65 | delay.attach(this, &BMP085::_callback_handler, 0.01f); |
asmellby | 0:fb197da45ba8 | 66 | while(_state != BMP085_IDLE) { |
asmellby | 0:fb197da45ba8 | 67 | sleep(); |
asmellby | 0:fb197da45ba8 | 68 | } |
asmellby | 0:fb197da45ba8 | 69 | |
asmellby | 0:fb197da45ba8 | 70 | _tx_buf[0] = BMP085_DATA_PRESSURE; |
asmellby | 0:fb197da45ba8 | 71 | _state = BMP085_BUSY; |
asmellby | 0:fb197da45ba8 | 72 | _i2c.transfer(BMP085_ADDR, (char*)_tx_buf, 1, (char*)_rx_buf, 3, _callback); |
asmellby | 0:fb197da45ba8 | 73 | while(_state != BMP085_IDLE) { |
asmellby | 0:fb197da45ba8 | 74 | sleep(); |
asmellby | 0:fb197da45ba8 | 75 | } |
asmellby | 0:fb197da45ba8 | 76 | return ((_rx_buf[0] << 16) | (_rx_buf[1] << 8) | _rx_buf[2]) >> (8 - (uint8_t)_mode); |
asmellby | 0:fb197da45ba8 | 77 | } |
asmellby | 0:fb197da45ba8 | 78 | |
asmellby | 0:fb197da45ba8 | 79 | void BMP085::measure() { |
asmellby | 0:fb197da45ba8 | 80 | int t, p, ut, up, x1, x2, x3, b3, b5, b6; |
asmellby | 0:fb197da45ba8 | 81 | uint32_t b4, b7; |
asmellby | 0:fb197da45ba8 | 82 | |
asmellby | 0:fb197da45ba8 | 83 | ut = read_uc_temperature(); |
asmellby | 0:fb197da45ba8 | 84 | |
asmellby | 0:fb197da45ba8 | 85 | x1 = (ut - _cal_data.ac6) * _cal_data.ac5 / (1 << 15); |
asmellby | 0:fb197da45ba8 | 86 | x2 = (int)_cal_data.mc * (1 << 11) / (x1 + _cal_data.md); |
asmellby | 0:fb197da45ba8 | 87 | b5 = x1 + x2; |
asmellby | 0:fb197da45ba8 | 88 | t = (b5 + 8) / (1 << 4); |
asmellby | 0:fb197da45ba8 | 89 | _temperature = (float)t / 10.0; |
asmellby | 0:fb197da45ba8 | 90 | |
asmellby | 0:fb197da45ba8 | 91 | up = read_uc_pressure(); |
asmellby | 0:fb197da45ba8 | 92 | |
asmellby | 0:fb197da45ba8 | 93 | b6 = b5 - 4000; |
asmellby | 0:fb197da45ba8 | 94 | x1 = (_cal_data.b2 * (b6 * b6 / (1 << 12))) / (1 << 11); |
asmellby | 0:fb197da45ba8 | 95 | x2 = _cal_data.ac2 * b6 / (1 << 11); |
asmellby | 0:fb197da45ba8 | 96 | x3 = x1 + x2; |
asmellby | 0:fb197da45ba8 | 97 | b3 = ((((unsigned int)_cal_data.ac1 * 4 + x3) << (int)_mode) + 2) / 4; |
asmellby | 0:fb197da45ba8 | 98 | x1 = _cal_data.ac3 * b6 / (1 << 13); |
asmellby | 0:fb197da45ba8 | 99 | x2 = (_cal_data.b1 * (b6 * b6 / (1 << 12))) / (1 << 16); |
asmellby | 0:fb197da45ba8 | 100 | x3 = ((x1 + x2) + 2) / (1 << 2); |
asmellby | 0:fb197da45ba8 | 101 | b4 = _cal_data.ac4 * (unsigned int)(x3 + 32768) / (1 << 15); |
asmellby | 0:fb197da45ba8 | 102 | b7 = ((unsigned int)up - b3) * (50000 >> (int)_mode); |
asmellby | 0:fb197da45ba8 | 103 | if (b7 < (unsigned int)0x80000000) { |
asmellby | 0:fb197da45ba8 | 104 | p = (b7 * 2) / b4; |
asmellby | 0:fb197da45ba8 | 105 | } else { |
asmellby | 0:fb197da45ba8 | 106 | p = (b7 / b4) * 2; |
asmellby | 0:fb197da45ba8 | 107 | } |
asmellby | 0:fb197da45ba8 | 108 | x1 = (p / (1 << 8)) * (p / (1 << 8)); |
asmellby | 0:fb197da45ba8 | 109 | x1 = (x1 * 3038) / (1 << 16); |
asmellby | 0:fb197da45ba8 | 110 | x2 = (-7357 * p) / (1 << 16); |
asmellby | 0:fb197da45ba8 | 111 | p = p + (x1 + x2 + 3791) / (1 << 4); |
asmellby | 0:fb197da45ba8 | 112 | _pressure = (float)p / 100.0; |
asmellby | 0:fb197da45ba8 | 113 | } |
asmellby | 0:fb197da45ba8 | 114 | |
asmellby | 0:fb197da45ba8 | 115 | void BMP085::_callback_handler(int event) { |
asmellby | 0:fb197da45ba8 | 116 | _state = BMP085_IDLE; |
asmellby | 0:fb197da45ba8 | 117 | } |
asmellby | 0:fb197da45ba8 | 118 | |
asmellby | 0:fb197da45ba8 | 119 | void BMP085::_callback_handler() { |
asmellby | 0:fb197da45ba8 | 120 | _state = BMP085_IDLE; |
asmellby | 0:fb197da45ba8 | 121 | } |