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.
BME280.cpp
- Committer:
- pierreprovent
- Date:
- 2020-12-18
- Revision:
- 1:5d994dea50ef
- Child:
- 2:6ff57cf56fe1
File content as of revision 1:5d994dea50ef:
#include "mbed.h"
#include "BME280.h"
BME280::BME280(PinName sda, PinName scl):i2c(sda, scl)
{
init();
read_calibration_data() ;
}
void BME280::init()
{
// Configuration de la mesure de température, pression et humidité
// Mode ""normal" pour des mesures régulières et précises de P, T, H.
// T et P filtrées par IIR et suréchantillonnage
// Choix d'un mode "indoor navigation" p 17-18 doc constructeur
// Registres : ctrl_hum osrs_h[2:0] = 001 oversampling humidity x1
// ctrl_hum = 00000 001
// ctrl_meas osrs_t[2:0] = 010 oversampling temperature x2
// ctrl_meas osrs_p[2:0] = 101 oversampling pressure x16
// ctrl_meas mode[1:0] = 11 Normal mode
// ctrl_meas = 010 101 11
// config t_sb[2:0] = 000 t_standby 0.5 ms
// config filter[2:0] = 100 filtre IIR à 16 coefficients
// config = 000 100 00
data_write[0] = BME280_CTRL_HUM_ADDR ;
data_write[1] = ??????????? ;
i2c.write(BME280_ADDRESS, data_write, 2);
data_write[0] = BME280_CTRL_MEAS_ADDR ;
data_write[1] = ??????????? ;
i2c.write(BME280_ADDRESS, data_write, 2);
data_write[0] = BME280_CONFIG_ADDR ;
data_write[1] = ??????????? ;
i2c.write(BME280_ADDRESS, data_write, 2);
}
void BME280::read_calibration_data()
{
//Lecture des données de calibration de température et de pression du capteur
// 3 mots de 16 bits pour la température
// 9 mots de 16 bits pour la pression
// p 22-23
// Démarre la lecture à partir de l'adresse BME280_REG_DIG_T1 0x88
// Jusqu'à l'adresse BME280_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] ;
// Et lecture de 2 octets supplémentaires, adresse 0xA0 et 0xA1
// 0xA1 contient une donnée de calibration pour l'humidité
// Les 7 autres octets de calibration d'humidité seront lus après de l'adresse 0xE1 à 0xE7
data_write[0] = BME280_REG_DIG_T1 ;
i2c.write(BME280_ADDRESS, data_write, 1);
i2c.read(BME280_ADDRESS, data_read, 26);
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] ) ;
dig_H1 = (uint8_t) data_read[25] ;
//Lecture des données de calibration d'humidité
// 7 octets de l'adresse 0xE1 à 0xE7
data_write[0] = BME280_REG_DIG_H2 ;
i2c.write(BME280_ADDRESS, data_write, 1);
i2c.read(BME280_ADDRESS, data_read, 7);
dig_H2 = (int16_t) ( (int16_t) (data_read[1] << 8) | (int16_t) data_read[0] ) ;
dig_H3 = (uint8_t) data_read[2] ;
dig_H4 = (int16_t) ( (int16_t) (data_read[4] & 0x0F) | (int16_t) data_read[3] *16 ) ;
dig_H5 = (int16_t) ( ((int16_t) data_read[5] * 16 | (int16_t) data_read[4]) >> 4 ) ;
dig_H6 = (int8_t) data_read[6] ;
}
double BME280::temperature()
{
double temperature ; // Température en double précision
int32_t temp_32bits;
data_write[0] = BME280_REG_TEMPDATA ;
i2c.write(BME280_ADDRESS, data_write, 1);
i2c.read(BME280_ADDRESS, data_read, 3);
temp_32bits = (int32_t) ( ((int32_t) data_read[0] << 12 | (int32_t) data_read[1] << 4 | (int16_t) data_read[2] >> 4) ) ;
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);
t_fine = (int32_t) (var1 + var2);
return temperature ;
}
double BME280::pression()
{
double pression ; // Pression en double precision
int32_t press_32bits;
data_write[0] = BME280_REG_PRESSUREDATA ;
i2c.write(BME280_ADDRESS, data_write, 1);
i2c.read(BME280_ADDRESS, data_read, 3);
press_32bits = (int32_t) ( ((int32_t) data_read[0] << 12 | (int32_t) data_read[1] << 4 | (int16_t) data_read[2] >> 4) ) ;
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);
if (var1 == 0.0)
return 0; // avoid exception caused by division by zero
pression = 1048576.0 - (double)press_32bits ;
pression = (pression-(var2/4096.0))* 6250.0/var1;
var1 = ((double) dig_P9) * pression * pression / 2147483648.0;
var2 = pression * ((double) dig_P8) / 32768.0;
pression = pression + (var1 + var2 + ((double) dig_P7)) / 16.0;
return pression ;
}
double BME280::humidite()
{
double humidite ; // Humidite en double precision
int32_t hum_32bits;
data_write[0] = BME280_REG_HUMDATA ;
i2c.write(BME280_ADDRESS, data_write, 1);
i2c.read(BME280_ADDRESS, data_read, 2);
hum_32bits = (int32_t) ( ((int32_t) data_read[0] << 8 | (int32_t) data_read[1] ) ) ;
humidite = (double)t_fine - 76800.0;
humidite = (hum_32bits - (((double)dig_H4) * 64.0 + ((double)dig_H5) / 16384.0 * humidite)) *
(((double)dig_H2) / 65536.0 * (1.0 + ((double)dig_H6) / 67108864.0 * humidite *
(1.0 + ((double)dig_H3) / 67108864.0 * humidite)));
humidite = humidite * (1.0 - ((double)dig_H1) * humidite / 524288.0);
if (humidite > 100.0)
humidite = 100.0;
else if (humidite < 0.0)
humidite = 0.0;
return humidite;
}