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 CW_copy by
BMP280/BMP280.cpp@1:dc648c5624b9, 2018-01-10 (annotated)
- Committer:
- joseph_adamu
- Date:
- Wed Jan 10 09:50:29 2018 +0000
- Revision:
- 1:dc648c5624b9
version for export
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| joseph_adamu | 1:dc648c5624b9 | 1 | /** |
| joseph_adamu | 1:dc648c5624b9 | 2 | * BMP280 Combined humidity and pressure sensor library |
| joseph_adamu | 1:dc648c5624b9 | 3 | * |
| joseph_adamu | 1:dc648c5624b9 | 4 | * @author Toyomasa Watarai |
| joseph_adamu | 1:dc648c5624b9 | 5 | * @version 1.0 |
| joseph_adamu | 1:dc648c5624b9 | 6 | * @date 06-April-2015 |
| joseph_adamu | 1:dc648c5624b9 | 7 | * |
| joseph_adamu | 1:dc648c5624b9 | 8 | * bugfixing by charly |
| joseph_adamu | 1:dc648c5624b9 | 9 | * |
| joseph_adamu | 1:dc648c5624b9 | 10 | * Library for "BMP280 temperature, humidity and pressure sensor module" from Switch Science |
| joseph_adamu | 1:dc648c5624b9 | 11 | * https://www.switch-science.com/catalog/2236/ |
| joseph_adamu | 1:dc648c5624b9 | 12 | * |
| joseph_adamu | 1:dc648c5624b9 | 13 | * For more information about the BMP280: |
| joseph_adamu | 1:dc648c5624b9 | 14 | * http://ae-bst.resource.bosch.com/media/products/dokumente/BMP280/BST-BMP280_DS001-10.pdf |
| joseph_adamu | 1:dc648c5624b9 | 15 | */ |
| joseph_adamu | 1:dc648c5624b9 | 16 | |
| joseph_adamu | 1:dc648c5624b9 | 17 | #include "mbed.h" |
| joseph_adamu | 1:dc648c5624b9 | 18 | #include "BMP280.h" |
| joseph_adamu | 1:dc648c5624b9 | 19 | |
| joseph_adamu | 1:dc648c5624b9 | 20 | BMP280::BMP280(PinName sda, PinName scl, char slave_adr) |
| joseph_adamu | 1:dc648c5624b9 | 21 | : |
| joseph_adamu | 1:dc648c5624b9 | 22 | i2c_p(new I2C(sda, scl)), |
| joseph_adamu | 1:dc648c5624b9 | 23 | i2c(*i2c_p), |
| joseph_adamu | 1:dc648c5624b9 | 24 | address(slave_adr<<1), |
| joseph_adamu | 1:dc648c5624b9 | 25 | t_fine(0) |
| joseph_adamu | 1:dc648c5624b9 | 26 | { |
| joseph_adamu | 1:dc648c5624b9 | 27 | initialize(); |
| joseph_adamu | 1:dc648c5624b9 | 28 | } |
| joseph_adamu | 1:dc648c5624b9 | 29 | |
| joseph_adamu | 1:dc648c5624b9 | 30 | BMP280::BMP280(I2C &i2c_obj, char slave_adr) |
| joseph_adamu | 1:dc648c5624b9 | 31 | : |
| joseph_adamu | 1:dc648c5624b9 | 32 | i2c_p(NULL), |
| joseph_adamu | 1:dc648c5624b9 | 33 | i2c(i2c_obj), |
| joseph_adamu | 1:dc648c5624b9 | 34 | address(slave_adr<<1), |
| joseph_adamu | 1:dc648c5624b9 | 35 | t_fine(0) |
| joseph_adamu | 1:dc648c5624b9 | 36 | { |
| joseph_adamu | 1:dc648c5624b9 | 37 | initialize(); |
| joseph_adamu | 1:dc648c5624b9 | 38 | } |
| joseph_adamu | 1:dc648c5624b9 | 39 | |
| joseph_adamu | 1:dc648c5624b9 | 40 | BMP280::~BMP280() |
| joseph_adamu | 1:dc648c5624b9 | 41 | { |
| joseph_adamu | 1:dc648c5624b9 | 42 | if (NULL != i2c_p) |
| joseph_adamu | 1:dc648c5624b9 | 43 | delete i2c_p; |
| joseph_adamu | 1:dc648c5624b9 | 44 | } |
| joseph_adamu | 1:dc648c5624b9 | 45 | |
| joseph_adamu | 1:dc648c5624b9 | 46 | void BMP280::initialize() |
| joseph_adamu | 1:dc648c5624b9 | 47 | { |
| joseph_adamu | 1:dc648c5624b9 | 48 | char cmd[18]; |
| joseph_adamu | 1:dc648c5624b9 | 49 | |
| joseph_adamu | 1:dc648c5624b9 | 50 | //cmd[0] = 0xf2; // ctrl_hum |
| joseph_adamu | 1:dc648c5624b9 | 51 | //cmd[1] = 0x01; // Humidity oversampling x1 |
| joseph_adamu | 1:dc648c5624b9 | 52 | //i2c.write(address, cmd, 2); |
| joseph_adamu | 1:dc648c5624b9 | 53 | |
| joseph_adamu | 1:dc648c5624b9 | 54 | cmd[0] = 0xf4; // ctrl_meas |
| joseph_adamu | 1:dc648c5624b9 | 55 | //cmd[1] = 0x27; // Temparature oversampling x1, Pressure oversampling x1, Normal mode |
| joseph_adamu | 1:dc648c5624b9 | 56 | cmd[1] = 0b01010111; // Temparature oversampling x2 010, Pressure oversampling x16 101, Normal mode 11 |
| joseph_adamu | 1:dc648c5624b9 | 57 | i2c.write(address, cmd, 2); |
| joseph_adamu | 1:dc648c5624b9 | 58 | |
| joseph_adamu | 1:dc648c5624b9 | 59 | cmd[0] = 0xf5; // config |
| joseph_adamu | 1:dc648c5624b9 | 60 | cmd[1] = 0b10111100; // Standby 1000ms, Filter x16 |
| joseph_adamu | 1:dc648c5624b9 | 61 | i2c.write(address, cmd, 2); |
| joseph_adamu | 1:dc648c5624b9 | 62 | |
| joseph_adamu | 1:dc648c5624b9 | 63 | cmd[0] = 0x88; // read dig_T regs |
| joseph_adamu | 1:dc648c5624b9 | 64 | i2c.write(address, cmd, 1); |
| joseph_adamu | 1:dc648c5624b9 | 65 | i2c.read(address, cmd, 6); |
| joseph_adamu | 1:dc648c5624b9 | 66 | |
| joseph_adamu | 1:dc648c5624b9 | 67 | dig_T1 = (cmd[1] << 8) | cmd[0]; |
| joseph_adamu | 1:dc648c5624b9 | 68 | dig_T2 = (cmd[3] << 8) | cmd[2]; |
| joseph_adamu | 1:dc648c5624b9 | 69 | dig_T3 = (cmd[5] << 8) | cmd[4]; |
| joseph_adamu | 1:dc648c5624b9 | 70 | |
| joseph_adamu | 1:dc648c5624b9 | 71 | DEBUG_PRINT("dig_T = 0x%x, 0x%x, 0x%x\n\r", dig_T1, dig_T2, dig_T3); |
| joseph_adamu | 1:dc648c5624b9 | 72 | DEBUG_PRINT("dig_T = %d, %d, %d\n\r", dig_T1, dig_T2, dig_T3); |
| joseph_adamu | 1:dc648c5624b9 | 73 | |
| joseph_adamu | 1:dc648c5624b9 | 74 | cmd[0] = 0x8E; // read dig_P regs |
| joseph_adamu | 1:dc648c5624b9 | 75 | i2c.write(address, cmd, 1); |
| joseph_adamu | 1:dc648c5624b9 | 76 | i2c.read(address, cmd, 18); |
| joseph_adamu | 1:dc648c5624b9 | 77 | |
| joseph_adamu | 1:dc648c5624b9 | 78 | dig_P1 = (cmd[ 1] << 8) | cmd[ 0]; |
| joseph_adamu | 1:dc648c5624b9 | 79 | dig_P2 = (cmd[ 3] << 8) | cmd[ 2]; |
| joseph_adamu | 1:dc648c5624b9 | 80 | dig_P3 = (cmd[ 5] << 8) | cmd[ 4]; |
| joseph_adamu | 1:dc648c5624b9 | 81 | dig_P4 = (cmd[ 7] << 8) | cmd[ 6]; |
| joseph_adamu | 1:dc648c5624b9 | 82 | dig_P5 = (cmd[ 9] << 8) | cmd[ 8]; |
| joseph_adamu | 1:dc648c5624b9 | 83 | dig_P6 = (cmd[11] << 8) | cmd[10]; |
| joseph_adamu | 1:dc648c5624b9 | 84 | dig_P7 = (cmd[13] << 8) | cmd[12]; |
| joseph_adamu | 1:dc648c5624b9 | 85 | dig_P8 = (cmd[15] << 8) | cmd[14]; |
| joseph_adamu | 1:dc648c5624b9 | 86 | dig_P9 = (cmd[17] << 8) | cmd[16]; |
| joseph_adamu | 1:dc648c5624b9 | 87 | |
| joseph_adamu | 1:dc648c5624b9 | 88 | 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); |
| joseph_adamu | 1:dc648c5624b9 | 89 | |
| joseph_adamu | 1:dc648c5624b9 | 90 | /* cmd[0] = 0xA1; // read dig_H regs |
| joseph_adamu | 1:dc648c5624b9 | 91 | i2c.write(address, cmd, 1); |
| joseph_adamu | 1:dc648c5624b9 | 92 | i2c.read(address, cmd, 1); |
| joseph_adamu | 1:dc648c5624b9 | 93 | cmd[1] = 0xE1; // read dig_H regs |
| joseph_adamu | 1:dc648c5624b9 | 94 | i2c.write(address, &cmd[1], 1); |
| joseph_adamu | 1:dc648c5624b9 | 95 | i2c.read(address, &cmd[1], 7); |
| joseph_adamu | 1:dc648c5624b9 | 96 | |
| joseph_adamu | 1:dc648c5624b9 | 97 | dig_H1 = cmd[0]; |
| joseph_adamu | 1:dc648c5624b9 | 98 | dig_H2 = (cmd[2] << 8) | cmd[1]; |
| joseph_adamu | 1:dc648c5624b9 | 99 | dig_H3 = cmd[3]; |
| joseph_adamu | 1:dc648c5624b9 | 100 | dig_H4 = (cmd[4] << 4) | (cmd[5] & 0x0f); |
| joseph_adamu | 1:dc648c5624b9 | 101 | dig_H5 = (cmd[6] << 4) | ((cmd[5]>>4) & 0x0f); |
| joseph_adamu | 1:dc648c5624b9 | 102 | dig_H6 = cmd[7]; |
| joseph_adamu | 1:dc648c5624b9 | 103 | |
| joseph_adamu | 1:dc648c5624b9 | 104 | 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); |
| joseph_adamu | 1:dc648c5624b9 | 105 | */ |
| joseph_adamu | 1:dc648c5624b9 | 106 | } |
| joseph_adamu | 1:dc648c5624b9 | 107 | |
| joseph_adamu | 1:dc648c5624b9 | 108 | float BMP280::getTemperature() |
| joseph_adamu | 1:dc648c5624b9 | 109 | { |
| joseph_adamu | 1:dc648c5624b9 | 110 | int32_t temp_raw; |
| joseph_adamu | 1:dc648c5624b9 | 111 | float tempf; |
| joseph_adamu | 1:dc648c5624b9 | 112 | char cmd[4]; |
| joseph_adamu | 1:dc648c5624b9 | 113 | |
| joseph_adamu | 1:dc648c5624b9 | 114 | cmd[0] = 0xfa; // temp_msb |
| joseph_adamu | 1:dc648c5624b9 | 115 | i2c.write(address, cmd, 1); |
| joseph_adamu | 1:dc648c5624b9 | 116 | i2c.read(address, &cmd[1], 3); |
| joseph_adamu | 1:dc648c5624b9 | 117 | |
| joseph_adamu | 1:dc648c5624b9 | 118 | temp_raw = (cmd[1] << 12) | (cmd[2] << 4) | (cmd[3] >> 4); |
| joseph_adamu | 1:dc648c5624b9 | 119 | DEBUG_PRINT("\r\ntemp_raw:%d",temp_raw); |
| joseph_adamu | 1:dc648c5624b9 | 120 | |
| joseph_adamu | 1:dc648c5624b9 | 121 | int32_t temp1, temp2,temp; |
| joseph_adamu | 1:dc648c5624b9 | 122 | |
| joseph_adamu | 1:dc648c5624b9 | 123 | temp1 =((((temp_raw >> 3) - (dig_T1 << 1))) * dig_T2) >> 11; |
| joseph_adamu | 1:dc648c5624b9 | 124 | temp2 =(((((temp_raw >> 4) - dig_T1) * ((temp_raw >> 4) - dig_T1)) >> 12) * dig_T3) >> 14; |
| joseph_adamu | 1:dc648c5624b9 | 125 | DEBUG_PRINT(" temp1:%d temp2:%d",temp1, temp2); |
| joseph_adamu | 1:dc648c5624b9 | 126 | t_fine = temp1+temp2; |
| joseph_adamu | 1:dc648c5624b9 | 127 | DEBUG_PRINT(" t_fine:%d",t_fine); |
| joseph_adamu | 1:dc648c5624b9 | 128 | temp = (t_fine * 5 + 128) >> 8; |
| joseph_adamu | 1:dc648c5624b9 | 129 | tempf = (float)temp; |
| joseph_adamu | 1:dc648c5624b9 | 130 | DEBUG_PRINT(" tempf:%f",tempf); |
| joseph_adamu | 1:dc648c5624b9 | 131 | |
| joseph_adamu | 1:dc648c5624b9 | 132 | return (tempf/100.0f); |
| joseph_adamu | 1:dc648c5624b9 | 133 | } |
| joseph_adamu | 1:dc648c5624b9 | 134 | |
| joseph_adamu | 1:dc648c5624b9 | 135 | float BMP280::getPressure() |
| joseph_adamu | 1:dc648c5624b9 | 136 | { |
| joseph_adamu | 1:dc648c5624b9 | 137 | uint32_t press_raw; |
| joseph_adamu | 1:dc648c5624b9 | 138 | float pressf; |
| joseph_adamu | 1:dc648c5624b9 | 139 | char cmd[4]; |
| joseph_adamu | 1:dc648c5624b9 | 140 | |
| joseph_adamu | 1:dc648c5624b9 | 141 | cmd[0] = 0xf7; // press_msb |
| joseph_adamu | 1:dc648c5624b9 | 142 | i2c.write(address, cmd, 1); |
| joseph_adamu | 1:dc648c5624b9 | 143 | i2c.read(address, &cmd[1], 3); |
| joseph_adamu | 1:dc648c5624b9 | 144 | |
| joseph_adamu | 1:dc648c5624b9 | 145 | press_raw = (cmd[1] << 12) | (cmd[2] << 4) | (cmd[3] >> 4); |
| joseph_adamu | 1:dc648c5624b9 | 146 | |
| joseph_adamu | 1:dc648c5624b9 | 147 | int32_t var1, var2; |
| joseph_adamu | 1:dc648c5624b9 | 148 | uint32_t press; |
| joseph_adamu | 1:dc648c5624b9 | 149 | |
| joseph_adamu | 1:dc648c5624b9 | 150 | var1 = (t_fine >> 1) - 64000; |
| joseph_adamu | 1:dc648c5624b9 | 151 | var2 = (((var1 >> 2) * (var1 >> 2)) >> 11) * dig_P6; |
| joseph_adamu | 1:dc648c5624b9 | 152 | var2 = var2 + ((var1 * dig_P5) << 1); |
| joseph_adamu | 1:dc648c5624b9 | 153 | var2 = (var2 >> 2) + (dig_P4 << 16); |
| joseph_adamu | 1:dc648c5624b9 | 154 | var1 = (((dig_P3 * (((var1 >> 2)*(var1 >> 2)) >> 13)) >> 3) + ((dig_P2 * var1) >> 1)) >> 18; |
| joseph_adamu | 1:dc648c5624b9 | 155 | var1 = ((32768 + var1) * dig_P1) >> 15; |
| joseph_adamu | 1:dc648c5624b9 | 156 | if (var1 == 0) { |
| joseph_adamu | 1:dc648c5624b9 | 157 | return 0; |
| joseph_adamu | 1:dc648c5624b9 | 158 | } |
| joseph_adamu | 1:dc648c5624b9 | 159 | press = (((1048576 - press_raw) - (var2 >> 12))) * 3125; |
| joseph_adamu | 1:dc648c5624b9 | 160 | if(press < 0x80000000) { |
| joseph_adamu | 1:dc648c5624b9 | 161 | press = (press << 1) / var1; |
| joseph_adamu | 1:dc648c5624b9 | 162 | } else { |
| joseph_adamu | 1:dc648c5624b9 | 163 | press = (press / var1) * 2; |
| joseph_adamu | 1:dc648c5624b9 | 164 | } |
| joseph_adamu | 1:dc648c5624b9 | 165 | var1 = ((int32_t)dig_P9 * ((int32_t)(((press >> 3) * (press >> 3)) >> 13))) >> 12; |
| joseph_adamu | 1:dc648c5624b9 | 166 | var2 = (((int32_t)(press >> 2)) * (int32_t)dig_P8) >> 13; |
| joseph_adamu | 1:dc648c5624b9 | 167 | press = (press + ((var1 + var2 + dig_P7) >> 4)); |
| joseph_adamu | 1:dc648c5624b9 | 168 | |
| joseph_adamu | 1:dc648c5624b9 | 169 | pressf = (float)press; |
| joseph_adamu | 1:dc648c5624b9 | 170 | return (pressf/100.0f); |
| joseph_adamu | 1:dc648c5624b9 | 171 | } |
