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.
main.cpp@0:77f7dcec735f, 2020-10-22 (annotated)
- Committer:
- pierreprovent
- Date:
- Thu Oct 22 12:08:29 2020 +0000
- Revision:
- 0:77f7dcec735f
- Child:
- 1:5d994dea50ef
Barometre Grove
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| pierreprovent | 0:77f7dcec735f | 1 | #include "mbed.h" |
| pierreprovent | 0:77f7dcec735f | 2 | |
| pierreprovent | 0:77f7dcec735f | 3 | I2C mon_i2c(PB_9,PB_8); // I2C_SDA I2C_SCL; |
| pierreprovent | 0:77f7dcec735f | 4 | Serial pc(SERIAL_TX, SERIAL_RX); |
| pierreprovent | 0:77f7dcec735f | 5 | |
| pierreprovent | 0:77f7dcec735f | 6 | #define BMP280_ADDRESS (0x77 << 1) // Adresse déclalée de 1 bit car I2C Mbed utilise des adresses sur 8 bits |
| pierreprovent | 0:77f7dcec735f | 7 | |
| pierreprovent | 0:77f7dcec735f | 8 | #define BMP280_REG_DIG_T1 0x88 |
| pierreprovent | 0:77f7dcec735f | 9 | #define BMP280_REG_DIG_T2 0x8A |
| pierreprovent | 0:77f7dcec735f | 10 | #define BMP280_REG_DIG_T3 0x8C |
| pierreprovent | 0:77f7dcec735f | 11 | |
| pierreprovent | 0:77f7dcec735f | 12 | #define BMP280_REG_DIG_P1 0x8E |
| pierreprovent | 0:77f7dcec735f | 13 | #define BMP280_REG_DIG_P2 0x90 |
| pierreprovent | 0:77f7dcec735f | 14 | #define BMP280_REG_DIG_P3 0x92 |
| pierreprovent | 0:77f7dcec735f | 15 | #define BMP280_REG_DIG_P4 0x94 |
| pierreprovent | 0:77f7dcec735f | 16 | #define BMP280_REG_DIG_P5 0x96 |
| pierreprovent | 0:77f7dcec735f | 17 | #define BMP280_REG_DIG_P6 0x98 |
| pierreprovent | 0:77f7dcec735f | 18 | #define BMP280_REG_DIG_P7 0x9A |
| pierreprovent | 0:77f7dcec735f | 19 | #define BMP280_REG_DIG_P8 0x9C |
| pierreprovent | 0:77f7dcec735f | 20 | #define BMP280_REG_DIG_P9 0x9E |
| pierreprovent | 0:77f7dcec735f | 21 | |
| pierreprovent | 0:77f7dcec735f | 22 | #define BMP280_REG_CHIPID 0xD0 |
| pierreprovent | 0:77f7dcec735f | 23 | #define BMP280_REG_VERSION 0xD1 |
| pierreprovent | 0:77f7dcec735f | 24 | #define BMP280_REG_SOFTRESET 0xE0 |
| pierreprovent | 0:77f7dcec735f | 25 | |
| pierreprovent | 0:77f7dcec735f | 26 | #define BMP280_STATUS_ADDR 0xF3 |
| pierreprovent | 0:77f7dcec735f | 27 | #define BMP280_CTRL_MEAS_ADDR 0xF4 |
| pierreprovent | 0:77f7dcec735f | 28 | #define BMP280_REG_CONFIG 0xF5 |
| pierreprovent | 0:77f7dcec735f | 29 | |
| pierreprovent | 0:77f7dcec735f | 30 | #define BMP280_REG_PRESSUREDATA 0xF7 |
| pierreprovent | 0:77f7dcec735f | 31 | #define BMP280_REG_TEMPDATA 0xFA |
| pierreprovent | 0:77f7dcec735f | 32 | |
| pierreprovent | 0:77f7dcec735f | 33 | #define BMP280_CHIP_ID 0x58 |
| pierreprovent | 0:77f7dcec735f | 34 | |
| pierreprovent | 0:77f7dcec735f | 35 | int main() |
| pierreprovent | 0:77f7dcec735f | 36 | { |
| pierreprovent | 0:77f7dcec735f | 37 | |
| pierreprovent | 0:77f7dcec735f | 38 | // Données de calibration du capteur BMP280 |
| pierreprovent | 0:77f7dcec735f | 39 | uint16_t dig_T1; // uin16_t 16 bits non signés |
| pierreprovent | 0:77f7dcec735f | 40 | int16_t dig_T2; // int16_t 16 bits signés |
| pierreprovent | 0:77f7dcec735f | 41 | int16_t dig_T3; |
| pierreprovent | 0:77f7dcec735f | 42 | uint16_t dig_P1; |
| pierreprovent | 0:77f7dcec735f | 43 | int16_t dig_P2; |
| pierreprovent | 0:77f7dcec735f | 44 | int16_t dig_P3; |
| pierreprovent | 0:77f7dcec735f | 45 | int16_t dig_P4; |
| pierreprovent | 0:77f7dcec735f | 46 | int16_t dig_P5; |
| pierreprovent | 0:77f7dcec735f | 47 | int16_t dig_P6; |
| pierreprovent | 0:77f7dcec735f | 48 | int16_t dig_P7; |
| pierreprovent | 0:77f7dcec735f | 49 | int16_t dig_P8; |
| pierreprovent | 0:77f7dcec735f | 50 | int16_t dig_P9; |
| pierreprovent | 0:77f7dcec735f | 51 | |
| pierreprovent | 0:77f7dcec735f | 52 | char data_write[2] ; |
| pierreprovent | 0:77f7dcec735f | 53 | char data_read[24] ; |
| pierreprovent | 0:77f7dcec735f | 54 | |
| pierreprovent | 0:77f7dcec735f | 55 | pc.printf("\nTemperature/pression issues du barometre BMP280 de Bosch Sensortec\n"); |
| pierreprovent | 0:77f7dcec735f | 56 | // wait_ms(500) ; |
| pierreprovent | 0:77f7dcec735f | 57 | data_write[0] = BMP280_REG_CHIPID ; |
| pierreprovent | 0:77f7dcec735f | 58 | int status = mon_i2c.write(BMP280_ADDRESS, data_write, 1, 0); |
| pierreprovent | 0:77f7dcec735f | 59 | |
| pierreprovent | 0:77f7dcec735f | 60 | if (status != 0) // Si le capteur est présent on recoit un acknoledgement |
| pierreprovent | 0:77f7dcec735f | 61 | pc.printf("Barometre BMP280 non trouve sur bus I2C \n"); |
| pierreprovent | 0:77f7dcec735f | 62 | else |
| pierreprovent | 0:77f7dcec735f | 63 | pc.printf("Barometre BMP280 trouve sur bus I2C \n"); |
| pierreprovent | 0:77f7dcec735f | 64 | |
| pierreprovent | 0:77f7dcec735f | 65 | pc.printf("Lecture de l'identificateur de la puce BMP280 \n"); |
| pierreprovent | 0:77f7dcec735f | 66 | mon_i2c.read(BMP280_ADDRESS, data_read, 1, 0); |
| pierreprovent | 0:77f7dcec735f | 67 | if (data_read[0] == BMP280_CHIP_ID) |
| pierreprovent | 0:77f7dcec735f | 68 | pc.printf("ID barometre correct = %#x \n",data_read[0]); |
| pierreprovent | 0:77f7dcec735f | 69 | else |
| pierreprovent | 0:77f7dcec735f | 70 | pc.printf("ID barometre incorrect = %#x \n",data_read[0]); |
| pierreprovent | 0:77f7dcec735f | 71 | |
| pierreprovent | 0:77f7dcec735f | 72 | // Configuration de la précision pour la mesure de température et de pression |
| pierreprovent | 0:77f7dcec735f | 73 | |
| pierreprovent | 0:77f7dcec735f | 74 | // oversampling Temperature (3bits): oversampling Pression (3bits): Power control mode (2bits) |
| pierreprovent | 0:77f7dcec735f | 75 | // voir documentation constructeur p 25-26 et p 15 |
| pierreprovent | 0:77f7dcec735f | 76 | // Ici on choisit le mode handheld device low-power avec filtre RII décrit p 14 de la doc constructeur |
| pierreprovent | 0:77f7dcec735f | 77 | // T oversampling *2, P oversampling *16, Normal mode, IIR filter coeff = 4 |
| pierreprovent | 0:77f7dcec735f | 78 | // Registre BMP280_CTRL_MEAS_ADDR (0xF4) |
| pierreprovent | 0:77f7dcec735f | 79 | // osrs_t(2:0) : osrs_p(2:0) : mode(1:0) |
| pierreprovent | 0:77f7dcec735f | 80 | // 010 : 111 : 11 = 0x5F hexa |
| pierreprovent | 0:77f7dcec735f | 81 | |
| pierreprovent | 0:77f7dcec735f | 82 | data_write[0] = BMP280_CTRL_MEAS_ADDR ; |
| pierreprovent | 0:77f7dcec735f | 83 | data_write[1] = 0b01011111 ; //0x5F |
| pierreprovent | 0:77f7dcec735f | 84 | mon_i2c.write(BMP280_ADDRESS, data_write, 2, 0); |
| pierreprovent | 0:77f7dcec735f | 85 | |
| pierreprovent | 0:77f7dcec735f | 86 | // Registre BMP280_REG_CONFIG (0xF5) |
| pierreprovent | 0:77f7dcec735f | 87 | // 000 : 111 : 00 = 0x1C en hexadécimal |
| pierreprovent | 0:77f7dcec735f | 88 | |
| pierreprovent | 0:77f7dcec735f | 89 | data_write[0] = BMP280_REG_CONFIG ; |
| pierreprovent | 0:77f7dcec735f | 90 | data_write[1] = 0b00011100 ; //0x1C |
| pierreprovent | 0:77f7dcec735f | 91 | mon_i2c.write(BMP280_ADDRESS, data_write, 2, 0); |
| pierreprovent | 0:77f7dcec735f | 92 | |
| pierreprovent | 0:77f7dcec735f | 93 | // Laisser le temps au capteur d'effectuer quelques mesures avant de récupérer les données |
| pierreprovent | 0:77f7dcec735f | 94 | wait_ms(100) ; |
| pierreprovent | 0:77f7dcec735f | 95 | |
| pierreprovent | 0:77f7dcec735f | 96 | //Lecture des données de calibration du capteur par paquet de 16 bits |
| pierreprovent | 0:77f7dcec735f | 97 | // 3 mots de 16 bits pour la température |
| pierreprovent | 0:77f7dcec735f | 98 | // 9 mots de 16 bits pour la pression |
| pierreprovent | 0:77f7dcec735f | 99 | // Voir p 21 de la documentation constructeur |
| pierreprovent | 0:77f7dcec735f | 100 | // Démarre la lecture à partir de l'adresse BMP280_REG_DIG_T1 0x88 |
| pierreprovent | 0:77f7dcec735f | 101 | // Jusqu'à l'adresse BMP280_REG_DIG_P9 0x9E |
| pierreprovent | 0:77f7dcec735f | 102 | // Lecture des 24 octets en une seule fois // |
| pierreprovent | 0:77f7dcec735f | 103 | // 8 bits LSB en premier dans data_read[0], 8 bits MSB en second dans data_read[1] ; |
| pierreprovent | 0:77f7dcec735f | 104 | |
| pierreprovent | 0:77f7dcec735f | 105 | data_write[0] = BMP280_REG_DIG_T1 ; |
| pierreprovent | 0:77f7dcec735f | 106 | mon_i2c.write(BMP280_ADDRESS, data_write, 1, 0); |
| pierreprovent | 0:77f7dcec735f | 107 | mon_i2c.read(BMP280_ADDRESS, data_read, 24, 0); |
| pierreprovent | 0:77f7dcec735f | 108 | |
| pierreprovent | 0:77f7dcec735f | 109 | dig_T1 = (uint16_t) ( ((uint16_t) (data_read[1] << 8) | (uint16_t) data_read[0]) ) ; |
| pierreprovent | 0:77f7dcec735f | 110 | dig_T2 = (int16_t) ( ((int16_t) (data_read[3] << 8) | (int16_t) data_read[2]) ) ; |
| pierreprovent | 0:77f7dcec735f | 111 | dig_T3 = (int16_t) ( ((int16_t) (data_read[5] << 8) | (int16_t) data_read[4]) ) ; |
| pierreprovent | 0:77f7dcec735f | 112 | dig_P1 = (uint16_t) ( ((uint16_t) (data_read[7] << 8) | (uint16_t) data_read[6]) ) ;; |
| pierreprovent | 0:77f7dcec735f | 113 | dig_P2 = (int16_t) ( ((int16_t) (data_read[9] << 8) | (int16_t) data_read[8]) ) ; |
| pierreprovent | 0:77f7dcec735f | 114 | dig_P3 = (int16_t) ( ((int16_t) (data_read[11] << 8) | (int16_t) data_read[10]) ) ; |
| pierreprovent | 0:77f7dcec735f | 115 | dig_P4 = (int16_t) ( ((int16_t) (data_read[13] << 8) | (int16_t) data_read[12]) ) ; |
| pierreprovent | 0:77f7dcec735f | 116 | dig_P5 = (int16_t) ( ((int16_t) (data_read[15] << 8) | (int16_t) data_read[14]) ) ; |
| pierreprovent | 0:77f7dcec735f | 117 | dig_P6 = (int16_t) ( ((int16_t) (data_read[17] << 8) | (int16_t) data_read[16]) ) ; |
| pierreprovent | 0:77f7dcec735f | 118 | dig_P7 = (int16_t) ( ((int16_t) (data_read[19] << 8) | (int16_t) data_read[18]) ) ; |
| pierreprovent | 0:77f7dcec735f | 119 | dig_P8 = (int16_t) ( ((int16_t) (data_read[21] << 8) | (int16_t) data_read[20]) ) ; |
| pierreprovent | 0:77f7dcec735f | 120 | dig_P9 = (int16_t) ( ((int16_t) (data_read[23] << 8) | (int16_t) data_read[22]) ) ; |
| pierreprovent | 0:77f7dcec735f | 121 | |
| pierreprovent | 0:77f7dcec735f | 122 | // Lecture des données de température fournies par le capteur |
| pierreprovent | 0:77f7dcec735f | 123 | int32_t temp_32bits = 0; |
| pierreprovent | 0:77f7dcec735f | 124 | data_write[0] = BMP280_REG_TEMPDATA ; |
| pierreprovent | 0:77f7dcec735f | 125 | mon_i2c.write(BMP280_ADDRESS, data_write, 1, 0); |
| pierreprovent | 0:77f7dcec735f | 126 | mon_i2c.read(BMP280_ADDRESS, data_read, 3, 0); |
| pierreprovent | 0:77f7dcec735f | 127 | temp_32bits = (int32_t) ( ((int32_t) (data_read[0] << 12) | (int32_t) (data_read[1] << 4) | (int16_t) data_read[2] >> 4) ) ; |
| pierreprovent | 0:77f7dcec735f | 128 | |
| pierreprovent | 0:77f7dcec735f | 129 | // pc.printf("Temperature en 32 bits = %d\n",temp_32bits) ; |
| pierreprovent | 0:77f7dcec735f | 130 | /* @brief This API is used to get the compensated temperature from |
| pierreprovent | 0:77f7dcec735f | 131 | * uncompensated temperature. This API uses double floating precision. |
| pierreprovent | 0:77f7dcec735f | 132 | */ |
| pierreprovent | 0:77f7dcec735f | 133 | // API extraite du construteur https://github.com/BoschSensortec/BMP280_driver et modifiée pour les besoins du programme |
| pierreprovent | 0:77f7dcec735f | 134 | double var1, var2; |
| pierreprovent | 0:77f7dcec735f | 135 | |
| pierreprovent | 0:77f7dcec735f | 136 | double temperature ; // Température en double précision |
| pierreprovent | 0:77f7dcec735f | 137 | |
| pierreprovent | 0:77f7dcec735f | 138 | var1 = (((double) temp_32bits) / 16384.0 - ((double) dig_T1) / 1024.0) * ((double)dig_T2) ; |
| pierreprovent | 0:77f7dcec735f | 139 | var2 = ((((double) temp_32bits) / 131072.0 - ((double) dig_T1) / 8192.0) * |
| pierreprovent | 0:77f7dcec735f | 140 | (((double) temp_32bits) / 131072.0 - ((double) dig_T1) / 8192.0)) * |
| pierreprovent | 0:77f7dcec735f | 141 | ((double) dig_T3); |
| pierreprovent | 0:77f7dcec735f | 142 | temperature = ((var1 + var2) / 5120.0); |
| pierreprovent | 0:77f7dcec735f | 143 | |
| pierreprovent | 0:77f7dcec735f | 144 | int32_t t_fine = 0; |
| pierreprovent | 0:77f7dcec735f | 145 | t_fine = (int32_t) (var1 + var2); |
| pierreprovent | 0:77f7dcec735f | 146 | |
| pierreprovent | 0:77f7dcec735f | 147 | pc.printf("Temperature lue = %.2lf C \n",temperature) ; |
| pierreprovent | 0:77f7dcec735f | 148 | |
| pierreprovent | 0:77f7dcec735f | 149 | // Lecture des données de pression fournies par le capteur |
| pierreprovent | 0:77f7dcec735f | 150 | int32_t press_32bits = 0; |
| pierreprovent | 0:77f7dcec735f | 151 | data_write[0] = BMP280_REG_PRESSUREDATA ; |
| pierreprovent | 0:77f7dcec735f | 152 | mon_i2c.write(BMP280_ADDRESS, data_write, 1, 0); |
| pierreprovent | 0:77f7dcec735f | 153 | mon_i2c.read(BMP280_ADDRESS, data_read, 3, 0); |
| pierreprovent | 0:77f7dcec735f | 154 | press_32bits = (int32_t) ( ((int32_t) (data_read[0] << 12) | (int32_t) (data_read[1] << 4) | (int16_t) data_read[2] >> 4) ) ; |
| pierreprovent | 0:77f7dcec735f | 155 | |
| pierreprovent | 0:77f7dcec735f | 156 | /* @brief This API is used to get the compensated pressure from |
| pierreprovent | 0:77f7dcec735f | 157 | * uncompensated pressure. This API uses double floating precision. |
| pierreprovent | 0:77f7dcec735f | 158 | */ |
| pierreprovent | 0:77f7dcec735f | 159 | // API extraite du constructeur https://github.com/BoschSensortec/BMP280_driver et modifiée pour les besoins du programme |
| pierreprovent | 0:77f7dcec735f | 160 | |
| pierreprovent | 0:77f7dcec735f | 161 | double pression ; // Pression en double précision |
| pierreprovent | 0:77f7dcec735f | 162 | var1 = ((double) t_fine / 2.0) - 64000.0; |
| pierreprovent | 0:77f7dcec735f | 163 | var2 = var1 * var1 * ((double) dig_P6) / 32768.0; |
| pierreprovent | 0:77f7dcec735f | 164 | var2 = var2 + var1 * ((double) dig_P5) * 2.0; |
| pierreprovent | 0:77f7dcec735f | 165 | var2 = (var2 / 4.0) + (((double) dig_P4) * 65536.0); |
| pierreprovent | 0:77f7dcec735f | 166 | var1 = (((double) dig_P3) * var1 * var1 / 524288.0 + ((double) dig_P2) * var1) / |
| pierreprovent | 0:77f7dcec735f | 167 | 524288.0; |
| pierreprovent | 0:77f7dcec735f | 168 | var1 = (1.0 + var1 / 32768.0) * ((double) dig_P1); |
| pierreprovent | 0:77f7dcec735f | 169 | press_32bits = (uint32_t)(1048576.0 - (double) press_32bits); |
| pierreprovent | 0:77f7dcec735f | 170 | press_32bits = (uint32_t)((press_32bits - (var2 / 4096.0)) * 6250.0 / var1); |
| pierreprovent | 0:77f7dcec735f | 171 | var1 = ((double) dig_P9) * press_32bits * press_32bits / 2147483648.0; |
| pierreprovent | 0:77f7dcec735f | 172 | var2 = press_32bits * ((double) dig_P8) / 32768.0; |
| pierreprovent | 0:77f7dcec735f | 173 | pression = (press_32bits + (var1 + var2 + ((double) dig_P7)) / 16.0); |
| pierreprovent | 0:77f7dcec735f | 174 | |
| pierreprovent | 0:77f7dcec735f | 175 | pc.printf("Pression lue = %.2lf hPa \n",pression/100) ; |
| pierreprovent | 0:77f7dcec735f | 176 | |
| pierreprovent | 0:77f7dcec735f | 177 | while (1) { |
| pierreprovent | 0:77f7dcec735f | 178 | |
| pierreprovent | 0:77f7dcec735f | 179 | } |
| pierreprovent | 0:77f7dcec735f | 180 | |
| pierreprovent | 0:77f7dcec735f | 181 | } |
| pierreprovent | 0:77f7dcec735f | 182 |