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:
- 1:5d994dea50ef
- Parent:
- 0:77f7dcec735f
- Child:
- 2:6ff57cf56fe1
--- a/main.cpp Thu Oct 22 12:08:29 2020 +0000
+++ b/main.cpp Fri Dec 18 16:55:14 2020 +0000
@@ -1,182 +1,45 @@
#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
+#include "BME280.h"
-#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
+BME280 mon_BME280(PB_9,PB_8);
+ // PB_9 : I2C broche SDA platine Grove
+ // PB_8 : I2C broche SCL platine Grove
+Serial pc(SERIAL_TX, SERIAL_RX);
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;
+ double temp, press, hum, alt ;
+ pc.printf("\033[2J"); // Effacer la console TeraTerm
+ pc.printf("\033[0;0H"); // Curseur en 0,0
+ pc.printf("Temperature,pression, humidite Capteur BME280 Bosch Sensortec\n");
+/* data_write[0] = BME280_REG_CHIPID ;
+ int status = mon_i2c.write(BME280_ADDRESS, data_write, 1);
+ if (status == 0) // Si capteur présent acknowledgement = 0 sur bus I2C
+ pc.printf("Capteur BME280 trouve sur bus I2C\n");
+ else
+ pc.printf("Capteur BME280 non trouve sur bus I2C\n");
- 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("Lecture de l'identificateur de la puce BME280\n");
+ mon_i2c.read(BME280_ADDRESS, data_read, 1);
+ if (data_read[0] == BME280_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
+ pc.printf("ID barometre incorrect = %#x \n",data_read[0]); */
- 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) {
-
+ temp = mon_BME280.temperature() ;
+ pc.printf("Temperature %.2lf C\n",temp) ;
+ press = mon_BME280.pression() ;
+ pc.printf("Pression %.3lf hPa\n",press/100) ;
+ double A = press/101325;
+ double B = 1 / 5.25588;
+ alt = pow(A, B);
+ alt = 1.0 - alt;
+ alt = alt/0.0000225577;
+ pc.printf("Altitude %.2lf m\n",alt) ;
+ hum = mon_BME280.humidite() ;
+ pc.printf("Humidite %.2lf %%\n",hum) ;
+ pc.printf("\033[4A");
+ wait(1);
}
-
}
-