Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of BMP280 by
BMP280.cpp@8:b60572e2ed05, 2016-09-24 (annotated)
- Committer:
- Dot
- Date:
- Sat Sep 24 19:03:25 2016 +0000
- Revision:
- 8:b60572e2ed05
- Parent:
- 7:c72b726c7dc9
Delivery Version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MACRUM | 1:763a4018aaec | 1 | /** |
12104404 | 7:c72b726c7dc9 | 2 | * BMP280 Combined humidity and pressure sensor library |
MACRUM | 1:763a4018aaec | 3 | * |
MACRUM | 1:763a4018aaec | 4 | * @author Toyomasa Watarai |
MACRUM | 1:763a4018aaec | 5 | * @version 1.0 |
MACRUM | 1:763a4018aaec | 6 | * @date 06-April-2015 |
MACRUM | 1:763a4018aaec | 7 | * |
12104404 | 7:c72b726c7dc9 | 8 | * Library for "BMP280 temperature, humidity and pressure sensor module" from Switch Science |
MACRUM | 1:763a4018aaec | 9 | * https://www.switch-science.com/catalog/2236/ |
MACRUM | 1:763a4018aaec | 10 | * |
12104404 | 7:c72b726c7dc9 | 11 | * For more information about the BMP280: |
12104404 | 7:c72b726c7dc9 | 12 | * http://ae-bst.resource.bosch.com/media/products/dokumente/BMP280/BST-BMP280_DS001-10.pdf |
MACRUM | 1:763a4018aaec | 13 | */ |
MACRUM | 1:763a4018aaec | 14 | |
MACRUM | 0:ade9be832910 | 15 | #include "mbed.h" |
12104404 | 5:7139d5accbc3 | 16 | #include "BMP280.h" |
MACRUM | 0:ade9be832910 | 17 | |
12104404 | 7:c72b726c7dc9 | 18 | BMP280::BMP280(PinName sda, PinName scl, char slave_adr) |
MACRUM | 0:ade9be832910 | 19 | : |
MACRUM | 0:ade9be832910 | 20 | i2c_p(new I2C(sda, scl)), |
MACRUM | 0:ade9be832910 | 21 | i2c(*i2c_p), |
MACRUM | 0:ade9be832910 | 22 | address(slave_adr), |
MACRUM | 0:ade9be832910 | 23 | t_fine(0) |
MACRUM | 0:ade9be832910 | 24 | { |
MACRUM | 0:ade9be832910 | 25 | initialize(); |
MACRUM | 0:ade9be832910 | 26 | } |
MACRUM | 0:ade9be832910 | 27 | |
12104404 | 7:c72b726c7dc9 | 28 | BMP280::BMP280(I2C &i2c_obj, char slave_adr) |
MACRUM | 0:ade9be832910 | 29 | : |
MACRUM | 0:ade9be832910 | 30 | i2c_p(NULL), |
MACRUM | 0:ade9be832910 | 31 | i2c(i2c_obj), |
MACRUM | 0:ade9be832910 | 32 | address(slave_adr), |
MACRUM | 0:ade9be832910 | 33 | t_fine(0) |
MACRUM | 0:ade9be832910 | 34 | { |
MACRUM | 0:ade9be832910 | 35 | initialize(); |
MACRUM | 0:ade9be832910 | 36 | } |
MACRUM | 0:ade9be832910 | 37 | |
12104404 | 7:c72b726c7dc9 | 38 | BMP280::~BMP280() |
MACRUM | 0:ade9be832910 | 39 | { |
MACRUM | 0:ade9be832910 | 40 | if (NULL != i2c_p) |
MACRUM | 0:ade9be832910 | 41 | delete i2c_p; |
MACRUM | 0:ade9be832910 | 42 | } |
MACRUM | 0:ade9be832910 | 43 | |
12104404 | 7:c72b726c7dc9 | 44 | void BMP280::initialize() |
MACRUM | 0:ade9be832910 | 45 | { |
MACRUM | 0:ade9be832910 | 46 | char cmd[18]; |
MACRUM | 0:ade9be832910 | 47 | |
MACRUM | 0:ade9be832910 | 48 | cmd[0] = 0xf2; // ctrl_hum |
MACRUM | 0:ade9be832910 | 49 | cmd[1] = 0x01; // Humidity oversampling x1 |
MACRUM | 0:ade9be832910 | 50 | i2c.write(address, cmd, 2); |
MACRUM | 0:ade9be832910 | 51 | |
MACRUM | 0:ade9be832910 | 52 | cmd[0] = 0xf4; // ctrl_meas |
Dot | 8:b60572e2ed05 | 53 | //cmd[1] = 0x27; // Temparature oversampling x1, Pressure oversampling x1, Normal mode |
Dot | 8:b60572e2ed05 | 54 | cmd[1] = 0x17; // Temparature off, Pressure oversampling x16, Normal mode |
Dot | 8:b60572e2ed05 | 55 | //Set to 00010111 = 0x27 |
MACRUM | 0:ade9be832910 | 56 | i2c.write(address, cmd, 2); |
MACRUM | 0:ade9be832910 | 57 | |
MACRUM | 0:ade9be832910 | 58 | cmd[0] = 0xf5; // config |
Dot | 8:b60572e2ed05 | 59 | //cmd[1] = 0xa0; // Standby 1000ms, Filter off |
Dot | 8:b60572e2ed05 | 60 | cmd[1] = 0x00; // Standby 0.5ms, Filter off |
Dot | 8:b60572e2ed05 | 61 | //cmd[1] = 0x1C; // Standby 0.5ms, Filter on |
Dot | 8:b60572e2ed05 | 62 | //00011100 |
MACRUM | 0:ade9be832910 | 63 | i2c.write(address, cmd, 2); |
MACRUM | 0:ade9be832910 | 64 | |
MACRUM | 0:ade9be832910 | 65 | cmd[0] = 0x88; // read dig_T regs |
MACRUM | 0:ade9be832910 | 66 | i2c.write(address, cmd, 1); |
MACRUM | 0:ade9be832910 | 67 | i2c.read(address, cmd, 6); |
MACRUM | 0:ade9be832910 | 68 | |
MACRUM | 0:ade9be832910 | 69 | dig_T1 = (cmd[1] << 8) | cmd[0]; |
MACRUM | 0:ade9be832910 | 70 | dig_T2 = (cmd[3] << 8) | cmd[2]; |
MACRUM | 0:ade9be832910 | 71 | dig_T3 = (cmd[5] << 8) | cmd[4]; |
MACRUM | 0:ade9be832910 | 72 | |
MACRUM | 0:ade9be832910 | 73 | DEBUG_PRINT("dig_T = 0x%x, 0x%x, 0x%x\n", dig_T1, dig_T2, dig_T3); |
MACRUM | 0:ade9be832910 | 74 | |
MACRUM | 0:ade9be832910 | 75 | cmd[0] = 0x8E; // read dig_P regs |
MACRUM | 0:ade9be832910 | 76 | i2c.write(address, cmd, 1); |
MACRUM | 0:ade9be832910 | 77 | i2c.read(address, cmd, 18); |
MACRUM | 0:ade9be832910 | 78 | |
MACRUM | 0:ade9be832910 | 79 | dig_P1 = (cmd[ 1] << 8) | cmd[ 0]; |
MACRUM | 0:ade9be832910 | 80 | dig_P2 = (cmd[ 3] << 8) | cmd[ 2]; |
MACRUM | 0:ade9be832910 | 81 | dig_P3 = (cmd[ 5] << 8) | cmd[ 4]; |
MACRUM | 0:ade9be832910 | 82 | dig_P4 = (cmd[ 7] << 8) | cmd[ 6]; |
MACRUM | 0:ade9be832910 | 83 | dig_P5 = (cmd[ 9] << 8) | cmd[ 8]; |
MACRUM | 0:ade9be832910 | 84 | dig_P6 = (cmd[11] << 8) | cmd[10]; |
MACRUM | 0:ade9be832910 | 85 | dig_P7 = (cmd[13] << 8) | cmd[12]; |
MACRUM | 0:ade9be832910 | 86 | dig_P8 = (cmd[15] << 8) | cmd[14]; |
MACRUM | 0:ade9be832910 | 87 | dig_P9 = (cmd[17] << 8) | cmd[16]; |
MACRUM | 0:ade9be832910 | 88 | |
MACRUM | 0:ade9be832910 | 89 | DEBUG_PRINT("dig_P = 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n", dig_P1, dig_P2, dig_P3, dig_P4, dig_P5, dig_P6, dig_P7, dig_P8, dig_P9); |
MACRUM | 0:ade9be832910 | 90 | |
12104404 | 6:d03826fe1062 | 91 | /* cmd[0] = 0xA1; // read dig_H regs |
MACRUM | 0:ade9be832910 | 92 | i2c.write(address, cmd, 1); |
MACRUM | 2:c35f637c28ef | 93 | i2c.read(address, cmd, 1); |
MACRUM | 2:c35f637c28ef | 94 | cmd[1] = 0xE1; // read dig_H regs |
MACRUM | 2:c35f637c28ef | 95 | i2c.write(address, &cmd[1], 1); |
MACRUM | 2:c35f637c28ef | 96 | i2c.read(address, &cmd[1], 7); |
MACRUM | 2:c35f637c28ef | 97 | |
MACRUM | 0:ade9be832910 | 98 | dig_H1 = cmd[0]; |
MACRUM | 0:ade9be832910 | 99 | dig_H2 = (cmd[2] << 8) | cmd[1]; |
MACRUM | 0:ade9be832910 | 100 | dig_H3 = cmd[3]; |
MACRUM | 0:ade9be832910 | 101 | dig_H4 = (cmd[4] << 4) | (cmd[5] & 0x0f); |
MACRUM | 2:c35f637c28ef | 102 | dig_H5 = (cmd[6] << 4) | ((cmd[5]>>4) & 0x0f); |
MACRUM | 2:c35f637c28ef | 103 | dig_H6 = cmd[7]; |
MACRUM | 0:ade9be832910 | 104 | |
MACRUM | 0:ade9be832910 | 105 | DEBUG_PRINT("dig_H = 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n", dig_H1, dig_H2, dig_H3, dig_H4, dig_H5, dig_H6); |
12104404 | 6:d03826fe1062 | 106 | */ |
MACRUM | 0:ade9be832910 | 107 | } |
MACRUM | 0:ade9be832910 | 108 | |
12104404 | 7:c72b726c7dc9 | 109 | float BMP280::getTemperature() |
MACRUM | 0:ade9be832910 | 110 | { |
MACRUM | 0:ade9be832910 | 111 | uint32_t temp_raw; |
MACRUM | 0:ade9be832910 | 112 | float tempf; |
MACRUM | 0:ade9be832910 | 113 | char cmd[4]; |
MACRUM | 0:ade9be832910 | 114 | |
MACRUM | 0:ade9be832910 | 115 | cmd[0] = 0xfa; // temp_msb |
MACRUM | 0:ade9be832910 | 116 | i2c.write(address, cmd, 1); |
takafuminaka | 3:d4eb81284ea0 | 117 | i2c.read(address, &cmd[1], 3); |
MACRUM | 0:ade9be832910 | 118 | |
MACRUM | 0:ade9be832910 | 119 | temp_raw = (cmd[1] << 12) | (cmd[2] << 4) | (cmd[3] >> 4); |
MACRUM | 0:ade9be832910 | 120 | |
MACRUM | 0:ade9be832910 | 121 | int32_t temp; |
MACRUM | 0:ade9be832910 | 122 | |
MACRUM | 0:ade9be832910 | 123 | temp = |
MACRUM | 0:ade9be832910 | 124 | (((((temp_raw >> 3) - (dig_T1 << 1))) * dig_T2) >> 11) + |
MACRUM | 0:ade9be832910 | 125 | ((((((temp_raw >> 4) - dig_T1) * ((temp_raw >> 4) - dig_T1)) >> 12) * dig_T3) >> 14); |
MACRUM | 0:ade9be832910 | 126 | |
MACRUM | 0:ade9be832910 | 127 | t_fine = temp; |
MACRUM | 0:ade9be832910 | 128 | temp = (temp * 5 + 128) >> 8; |
MACRUM | 0:ade9be832910 | 129 | tempf = (float)temp; |
MACRUM | 0:ade9be832910 | 130 | |
MACRUM | 0:ade9be832910 | 131 | return (tempf/100.0f); |
MACRUM | 0:ade9be832910 | 132 | } |
MACRUM | 0:ade9be832910 | 133 | |
12104404 | 7:c72b726c7dc9 | 134 | float BMP280::getPressure() |
MACRUM | 0:ade9be832910 | 135 | { |
MACRUM | 0:ade9be832910 | 136 | uint32_t press_raw; |
MACRUM | 0:ade9be832910 | 137 | float pressf; |
MACRUM | 0:ade9be832910 | 138 | char cmd[4]; |
MACRUM | 0:ade9be832910 | 139 | |
MACRUM | 0:ade9be832910 | 140 | cmd[0] = 0xf7; // press_msb |
MACRUM | 0:ade9be832910 | 141 | i2c.write(address, cmd, 1); |
takafuminaka | 3:d4eb81284ea0 | 142 | i2c.read(address, &cmd[1], 3); |
MACRUM | 0:ade9be832910 | 143 | |
MACRUM | 0:ade9be832910 | 144 | press_raw = (cmd[1] << 12) | (cmd[2] << 4) | (cmd[3] >> 4); |
MACRUM | 0:ade9be832910 | 145 | |
MACRUM | 0:ade9be832910 | 146 | int32_t var1, var2; |
MACRUM | 0:ade9be832910 | 147 | uint32_t press; |
MACRUM | 0:ade9be832910 | 148 | |
MACRUM | 0:ade9be832910 | 149 | var1 = (t_fine >> 1) - 64000; |
MACRUM | 0:ade9be832910 | 150 | var2 = (((var1 >> 2) * (var1 >> 2)) >> 11) * dig_P6; |
MACRUM | 0:ade9be832910 | 151 | var2 = var2 + ((var1 * dig_P5) << 1); |
MACRUM | 0:ade9be832910 | 152 | var2 = (var2 >> 2) + (dig_P4 << 16); |
MACRUM | 0:ade9be832910 | 153 | var1 = (((dig_P3 * (((var1 >> 2)*(var1 >> 2)) >> 13)) >> 3) + ((dig_P2 * var1) >> 1)) >> 18; |
MACRUM | 0:ade9be832910 | 154 | var1 = ((32768 + var1) * dig_P1) >> 15; |
MACRUM | 0:ade9be832910 | 155 | if (var1 == 0) { |
MACRUM | 0:ade9be832910 | 156 | return 0; |
MACRUM | 0:ade9be832910 | 157 | } |
MACRUM | 0:ade9be832910 | 158 | press = (((1048576 - press_raw) - (var2 >> 12))) * 3125; |
MACRUM | 0:ade9be832910 | 159 | if(press < 0x80000000) { |
MACRUM | 0:ade9be832910 | 160 | press = (press << 1) / var1; |
MACRUM | 0:ade9be832910 | 161 | } else { |
MACRUM | 0:ade9be832910 | 162 | press = (press / var1) * 2; |
MACRUM | 0:ade9be832910 | 163 | } |
MACRUM | 0:ade9be832910 | 164 | var1 = ((int32_t)dig_P9 * ((int32_t)(((press >> 3) * (press >> 3)) >> 13))) >> 12; |
MACRUM | 0:ade9be832910 | 165 | var2 = (((int32_t)(press >> 2)) * (int32_t)dig_P8) >> 13; |
MACRUM | 0:ade9be832910 | 166 | press = (press + ((var1 + var2 + dig_P7) >> 4)); |
MACRUM | 0:ade9be832910 | 167 | |
MACRUM | 0:ade9be832910 | 168 | pressf = (float)press; |
MACRUM | 0:ade9be832910 | 169 | return (pressf/100.0f); |
12104404 | 7:c72b726c7dc9 | 170 | } |