Pierre Provent / Mbed 2 deprecated Test_Barometre_BME280_NUCLEO_F429ZI

Dependencies:   mbed

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?

UserRevisionLine numberNew 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