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.
Diff: main.cpp
- Revision:
- 0:77f7dcec735f
- Child:
- 1:5d994dea50ef
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Thu Oct 22 12:08:29 2020 +0000
@@ -0,0 +1,182 @@
+#include "mbed.h"
+
+I2C mon_i2c(PB_9,PB_8); // I2C_SDA I2C_SCL;
+Serial pc(SERIAL_TX, SERIAL_RX);
+
+#define BMP280_ADDRESS (0x77 << 1) // Adresse déclalée de 1 bit car I2C Mbed utilise des adresses sur 8 bits
+
+#define BMP280_REG_DIG_T1 0x88
+#define BMP280_REG_DIG_T2 0x8A
+#define BMP280_REG_DIG_T3 0x8C
+
+#define BMP280_REG_DIG_P1 0x8E
+#define BMP280_REG_DIG_P2 0x90
+#define BMP280_REG_DIG_P3 0x92
+#define BMP280_REG_DIG_P4 0x94
+#define BMP280_REG_DIG_P5 0x96
+#define BMP280_REG_DIG_P6 0x98
+#define BMP280_REG_DIG_P7 0x9A
+#define BMP280_REG_DIG_P8 0x9C
+#define BMP280_REG_DIG_P9 0x9E
+
+#define BMP280_REG_CHIPID 0xD0
+#define BMP280_REG_VERSION 0xD1
+#define BMP280_REG_SOFTRESET 0xE0
+
+#define BMP280_STATUS_ADDR 0xF3
+#define BMP280_CTRL_MEAS_ADDR 0xF4
+#define BMP280_REG_CONFIG 0xF5
+
+#define BMP280_REG_PRESSUREDATA 0xF7
+#define BMP280_REG_TEMPDATA 0xFA
+
+#define BMP280_CHIP_ID 0x58
+
+int main()
+{
+
+// Données de calibration du capteur BMP280
+ uint16_t dig_T1; // uin16_t 16 bits non signés
+ int16_t dig_T2; // int16_t 16 bits signés
+ int16_t dig_T3;
+ uint16_t dig_P1;
+ int16_t dig_P2;
+ int16_t dig_P3;
+ int16_t dig_P4;
+ int16_t dig_P5;
+ int16_t dig_P6;
+ int16_t dig_P7;
+ int16_t dig_P8;
+ int16_t dig_P9;
+
+ char data_write[2] ;
+ char data_read[24] ;
+
+ pc.printf("\nTemperature/pression issues du barometre BMP280 de Bosch Sensortec\n");
+ // wait_ms(500) ;
+ data_write[0] = BMP280_REG_CHIPID ;
+ int status = mon_i2c.write(BMP280_ADDRESS, data_write, 1, 0);
+
+ if (status != 0) // Si le capteur est présent on recoit un acknoledgement
+ pc.printf("Barometre BMP280 non trouve sur bus I2C \n");
+ else
+ pc.printf("Barometre BMP280 trouve sur bus I2C \n");
+
+ pc.printf("Lecture de l'identificateur de la puce BMP280 \n");
+ mon_i2c.read(BMP280_ADDRESS, data_read, 1, 0);
+ if (data_read[0] == BMP280_CHIP_ID)
+ pc.printf("ID barometre correct = %#x \n",data_read[0]);
+ else
+ pc.printf("ID barometre incorrect = %#x \n",data_read[0]);
+
+ // Configuration de la précision pour la mesure de température et de pression
+
+ // oversampling Temperature (3bits): oversampling Pression (3bits): Power control mode (2bits)
+ // voir documentation constructeur p 25-26 et p 15
+ // Ici on choisit le mode handheld device low-power avec filtre RII décrit p 14 de la doc constructeur
+ // T oversampling *2, P oversampling *16, Normal mode, IIR filter coeff = 4
+ // Registre BMP280_CTRL_MEAS_ADDR (0xF4)
+ // osrs_t(2:0) : osrs_p(2:0) : mode(1:0)
+ // 010 : 111 : 11 = 0x5F hexa
+
+ data_write[0] = BMP280_CTRL_MEAS_ADDR ;
+ data_write[1] = 0b01011111 ; //0x5F
+ mon_i2c.write(BMP280_ADDRESS, data_write, 2, 0);
+
+ // Registre BMP280_REG_CONFIG (0xF5)
+ // 000 : 111 : 00 = 0x1C en hexadécimal
+
+ data_write[0] = BMP280_REG_CONFIG ;
+ data_write[1] = 0b00011100 ; //0x1C
+ mon_i2c.write(BMP280_ADDRESS, data_write, 2, 0);
+
+ // Laisser le temps au capteur d'effectuer quelques mesures avant de récupérer les données
+ wait_ms(100) ;
+
+ //Lecture des données de calibration du capteur par paquet de 16 bits
+ // 3 mots de 16 bits pour la température
+ // 9 mots de 16 bits pour la pression
+ // Voir p 21 de la documentation constructeur
+ // Démarre la lecture à partir de l'adresse BMP280_REG_DIG_T1 0x88
+ // Jusqu'à l'adresse BMP280_REG_DIG_P9 0x9E
+ // Lecture des 24 octets en une seule fois //
+ // 8 bits LSB en premier dans data_read[0], 8 bits MSB en second dans data_read[1] ;
+
+ data_write[0] = BMP280_REG_DIG_T1 ;
+ mon_i2c.write(BMP280_ADDRESS, data_write, 1, 0);
+ mon_i2c.read(BMP280_ADDRESS, data_read, 24, 0);
+
+ dig_T1 = (uint16_t) ( ((uint16_t) (data_read[1] << 8) | (uint16_t) data_read[0]) ) ;
+ dig_T2 = (int16_t) ( ((int16_t) (data_read[3] << 8) | (int16_t) data_read[2]) ) ;
+ dig_T3 = (int16_t) ( ((int16_t) (data_read[5] << 8) | (int16_t) data_read[4]) ) ;
+ dig_P1 = (uint16_t) ( ((uint16_t) (data_read[7] << 8) | (uint16_t) data_read[6]) ) ;;
+ dig_P2 = (int16_t) ( ((int16_t) (data_read[9] << 8) | (int16_t) data_read[8]) ) ;
+ dig_P3 = (int16_t) ( ((int16_t) (data_read[11] << 8) | (int16_t) data_read[10]) ) ;
+ dig_P4 = (int16_t) ( ((int16_t) (data_read[13] << 8) | (int16_t) data_read[12]) ) ;
+ dig_P5 = (int16_t) ( ((int16_t) (data_read[15] << 8) | (int16_t) data_read[14]) ) ;
+ dig_P6 = (int16_t) ( ((int16_t) (data_read[17] << 8) | (int16_t) data_read[16]) ) ;
+ dig_P7 = (int16_t) ( ((int16_t) (data_read[19] << 8) | (int16_t) data_read[18]) ) ;
+ dig_P8 = (int16_t) ( ((int16_t) (data_read[21] << 8) | (int16_t) data_read[20]) ) ;
+ dig_P9 = (int16_t) ( ((int16_t) (data_read[23] << 8) | (int16_t) data_read[22]) ) ;
+
+ // Lecture des données de température fournies par le capteur
+ int32_t temp_32bits = 0;
+ data_write[0] = BMP280_REG_TEMPDATA ;
+ mon_i2c.write(BMP280_ADDRESS, data_write, 1, 0);
+ mon_i2c.read(BMP280_ADDRESS, data_read, 3, 0);
+ temp_32bits = (int32_t) ( ((int32_t) (data_read[0] << 12) | (int32_t) (data_read[1] << 4) | (int16_t) data_read[2] >> 4) ) ;
+
+ // pc.printf("Temperature en 32 bits = %d\n",temp_32bits) ;
+ /* @brief This API is used to get the compensated temperature from
+ * uncompensated temperature. This API uses double floating precision.
+ */
+ // API extraite du construteur https://github.com/BoschSensortec/BMP280_driver et modifiée pour les besoins du programme
+ double var1, var2;
+
+ double temperature ; // Température en double précision
+
+ var1 = (((double) temp_32bits) / 16384.0 - ((double) dig_T1) / 1024.0) * ((double)dig_T2) ;
+ var2 = ((((double) temp_32bits) / 131072.0 - ((double) dig_T1) / 8192.0) *
+ (((double) temp_32bits) / 131072.0 - ((double) dig_T1) / 8192.0)) *
+ ((double) dig_T3);
+ temperature = ((var1 + var2) / 5120.0);
+
+ int32_t t_fine = 0;
+ t_fine = (int32_t) (var1 + var2);
+
+ pc.printf("Temperature lue = %.2lf C \n",temperature) ;
+
+ // Lecture des données de pression fournies par le capteur
+ int32_t press_32bits = 0;
+ data_write[0] = BMP280_REG_PRESSUREDATA ;
+ mon_i2c.write(BMP280_ADDRESS, data_write, 1, 0);
+ mon_i2c.read(BMP280_ADDRESS, data_read, 3, 0);
+ press_32bits = (int32_t) ( ((int32_t) (data_read[0] << 12) | (int32_t) (data_read[1] << 4) | (int16_t) data_read[2] >> 4) ) ;
+
+ /* @brief This API is used to get the compensated pressure from
+ * uncompensated pressure. This API uses double floating precision.
+ */
+ // API extraite du constructeur https://github.com/BoschSensortec/BMP280_driver et modifiée pour les besoins du programme
+
+ double pression ; // Pression en double précision
+ var1 = ((double) t_fine / 2.0) - 64000.0;
+ var2 = var1 * var1 * ((double) dig_P6) / 32768.0;
+ var2 = var2 + var1 * ((double) dig_P5) * 2.0;
+ var2 = (var2 / 4.0) + (((double) dig_P4) * 65536.0);
+ var1 = (((double) dig_P3) * var1 * var1 / 524288.0 + ((double) dig_P2) * var1) /
+ 524288.0;
+ var1 = (1.0 + var1 / 32768.0) * ((double) dig_P1);
+ press_32bits = (uint32_t)(1048576.0 - (double) press_32bits);
+ press_32bits = (uint32_t)((press_32bits - (var2 / 4096.0)) * 6250.0 / var1);
+ var1 = ((double) dig_P9) * press_32bits * press_32bits / 2147483648.0;
+ var2 = press_32bits * ((double) dig_P8) / 32768.0;
+ pression = (press_32bits + (var1 + var2 + ((double) dig_P7)) / 16.0);
+
+ pc.printf("Pression lue = %.2lf hPa \n",pression/100) ;
+
+ while (1) {
+
+ }
+
+}
+