Coef de transformation Bme 280

Bonjour à tous,

Actuellement je travaille sous arduino avec un BME 280. Je souhaiterais OBTENIR le coef de transformation des valeurs brutes de la température et pression en valeurs industrielles.

Je récupère mes valeurs brute avec temp_raw et pres_raw. Et mes valeurs industrielles avec temp_act et press_act.

J'ai décortiqué la datasheet et impossible de trouver comment on passe de la valeur brute en valeur industrielle..

Merci pour votre aide

voici mon code :

#include <Wire.h>

#define BME280_ADDRESS 0x76
unsigned long int hum_raw,temp_raw,pres_raw;
signed long int t_fine;

uint16_t dig_T1; // définition des ports d'entrée
int16_t dig_T2;
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;
int8_t dig_H1;
int16_t dig_H2;
int8_t dig_H3;
int16_t dig_H4;
int16_t dig_H5;
int8_t dig_H6;

void setup()//programme maitre
{
uint8_t osrs_t = 1; //Température fréquence d'échantillonnage x 1
uint8_t osrs_p = 1; //Pression fréquence d'échantillonnage x 1
uint8_t osrs_h = 1; //Humidité fréquence d'échantillonnage x 1
uint8_t mode = 3; //Mode ormal
uint8_t t_sb = 5; //Temps d'attente 1000ms
uint8_t filter = 0; //Filtre off
uint8_t spi3w_en = 0; //SPI Disactivé

uint8_t ctrl_meas_reg = (osrs_t << 5) | (osrs_p << 2) | mode; //définition des bits en SPI pour mot 8bits
uint8_t config_reg = (t_sb << 5) | (filter << 2) | spi3w_en;
uint8_t ctrl_hum_reg = osrs_h;

Serial.begin(9600); //lancement communication serie à 9600 bauds
Wire.begin(); //lancement communication

writeReg(0xF2,ctrl_hum_reg); // configuration de com
writeReg(0xF4,ctrl_meas_reg);
writeReg(0xF5,config_reg);
readTrim();
}

void loop()//programme boucle
{
double temp_act = 0.0, press_act = 0.0,hum_act=0.0;//definition variables double precision
signed long int temp_cal;//definition variable signée
unsigned long int press_cal,hum_cal;//definition variable non-signée

readData(); //lecture

temp_cal = calibration_T(temp_raw); //affectation des parametres
press_cal = calibration_P(pres_raw);
hum_cal = calibration_H(hum_raw);
temp_act = (double)temp_cal / 100.0;//ajustement des valeurs
press_act = (double)press_cal / 100.0;
hum_act = (double)hum_cal / 1024.0;

Serial.print("TEMP raw : ");// ecrire sur port serie en I2c
Serial.print(temp_raw);

Serial.print(" DegC TEMP cal : ");
Serial.print(temp_cal);
Serial.print(" DegC PRESS : ");
Serial.print(press_cal);
Serial.print("pres raw : ");// ecrire sur port serie en I2c
Serial.print(pres_raw);
Serial.print(" hPa HUM : ");
Serial.print(hum_act);
Serial.println(" %");

delay(500); //attente de 1000ms
}
void readTrim()
{
/* DEMANDE DE D'INFORMATION AU BME280*/
/* TEMPERATURE*/
uint8_t data[32],i=0;
Wire.beginTransmission(BME280_ADDRESS);
Wire.write(0x88);
Wire.endTransmission();
Wire.requestFrom(BME280_ADDRESS,24);
while(Wire.available()){
data = Wire.read();

  • i++;*
  • }*
    _ /PRESSION/_
  • Wire.beginTransmission(BME280_ADDRESS);*
  • Wire.write(0xA1);*
  • Wire.endTransmission();*
  • Wire.requestFrom(BME280_ADDRESS,1);*
    _ data = Wire.read();_
    * i++;*
    _ /HUMIDITE/
    * Wire.beginTransmission(BME280_ADDRESS);
    _
    Wire.write(0xE1);*

    * Wire.endTransmission();*
    * Wire.requestFrom(BME280_ADDRESS,7);
    _
    while(Wire.available()){_
    _ data = Wire.read();
    i++;
    }
    /CONVERTION SPI/_

    dig_T1 = (data[1] << 8) | data[0];
    dig_T2 = (data[3] << 8) | data[2];
    dig_T3 = (data[5] << 8) | data[4];
    dig_P1 = (data[7] << 8) | data[6];
    dig_P2 = (data[9] << 8) | data[8];
    dig_P3 = (data[11]<< 8) | data[10];
    dig_P4 = (data[13]<< 8) | data[12];
    dig_P5 = (data[15]<< 8) | data[14];
    dig_P6 = (data[17]<< 8) | data[16];
    dig_P7 = (data[19]<< 8) | data[18];
    dig_P8 = (data[21]<< 8) | data[20];
    dig_P9 = (data[23]<< 8) | data[22];
    dig_H1 = data[24];
    dig_H2 = (data[26]<< 8) | data[25];
    dig_H3 = data[27];
    dig_H4 = (data[28]<< 4) | (0x0F & data[29]);
    dig_H5 = (data[30] << 4) | ((data[29] >> 4) & 0x0F);
    dig_H6 = data[31];
    _}
    / DEMANDE DE D'INFORMATION AU BME280*/

    void writeReg(uint8_t reg_address, uint8_t data)
    {
    * Wire.beginTransmission(BME280_ADDRESS);
    Wire.write(reg_address);*

    * Wire.write(data);
    Wire.endTransmission();
    }
    void readData()
    {
    int i = 0;_
    uint32_t data[8];
    Wire.beginTransmission(BME280_ADDRESS);
    _ Wire.write(0xF7);
    Wire.endTransmission();_
    Wire.requestFrom(BME280_ADDRESS,8);
    _ while(Wire.available()){
    data = Wire.read();
    i++;
    }
    /CONVERTION I2C/_

    pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4);
    temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4);
    hum_raw = (data[6] << 8) | data[7];
    _}
    /PARAMETRE DE CALIBRATION VOIR DOC FABRICANT/
    signed long int calibration_T(signed long int adc_T)
    {*_

* signed long int var1, var2, T;*
var1 = ((((adc_T >> 3) - ((signed long int)dig_T1<<1))) * ((signed long int)dig_T2)) >> 11;
var2 = (((((adc_T >> 4) - ((signed long int)dig_T1)) * ((adc_T>>4) - ((signed long int)dig_T1))) >> 12) * ((signed long int)dig_T3)) >> 14;

* t_fine = var1 + var2;
T = (t_fine * 5 + 128) >> 8;
_ return T;
}
unsigned long int calibration_P(signed long int adc_P)
{
signed long int var1, var2;
unsigned long int P;_

var1 = (((signed long int)t_fine)>>1) - (signed long int)64000;
var2 = (((var1>>2) * (var1>>2)) >> 11) * ((signed long int)dig_P6);
var2 = var2 + ((var1((signed long int)dig_P5))<<1);

* var2 = (var2>>2)+(((signed long int)dig_P4)<<16);
var1 = (((dig_P3 * (((var1>>2)(var1>>2)) >> 13)) >>3) + ((((signed long int)dig_P2) * var1)>>1))>>18;

var1 = ((((32768+var1))((signed long int)dig_P1))>>15);
_ if (var1 == 0)
{
return 0;
}
P = (((unsigned long int)(((signed long int)1048576)-adc_P)-(var2>>12)))*3125;
if(P<0x80000000)
{
P = (P << 1) / ((unsigned long int) var1);
}
else*

* {
P = (P / (unsigned long int)var1) * 2;
}_

var1 = (((signed long int)dig_P9) * ((signed long int)(((P>>3) * (P>>3))>>13)))>>12;
var2 = (((signed long int)(P>>2)) * ((signed long int)dig_P8))>>13;
P = (unsigned long int)((signed long int)P + ((var1 + var2 + dig_P7) >> 4));
_ return P;
}
unsigned long int calibration_H(signed long int adc_H)
{_

signed long int v_x1;*

* v_x1 = (t_fine - ((signed long int)76800));
v_x1 = (((((adc_H << 14) -(((signed long int)dig_H4) << 20) - (((signed long int)dig_H5) * v_x1)) +
((signed long int)16384)) >> 15) * (((((((v_x1 * ((signed long int)dig_H6)) >> 10)
(((v_x1 * ((signed long int)dig_H3)) >> 11) + ((signed long int) 32768))) >> 10) + (( signed long int)2097152))
((signed long int) dig_H2) + 8192) >> 14));

v_x1 = (v_x1 - (((((v_x1 >> 15) * (v_x1 >> 15)) >> 7) * ((signed long int)dig_H1)) >> 4));
v_x1 = (v_x1 < 0 ? 0 : v_x1);
v_x1 = (v_x1 > 419430400 ? 419430400 : v_x1);
return (unsigned long int)(v_x1 >> 12);
_}*_

:frowning:

ici

:slight_smile:

Merci :slight_smile:

#include <Wire.h>

#define BME280_ADDRESS 0x76
unsigned long int hum_raw,temp_raw,pres_raw;
signed long int t_fine;

uint16_t dig_T1; // définition des ports d'entrée
 int16_t dig_T2;
 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;
 int8_t  dig_H1;
 int16_t dig_H2;
 int8_t  dig_H3;
 int16_t dig_H4;
 int16_t dig_H5;
 int8_t  dig_H6;

void setup()//programme maitre
{
    uint8_t osrs_t = 1;             //Température fréquence d'échantillonnage x 1
    uint8_t osrs_p = 1;             //Pression fréquence d'échantillonnage x 1
    uint8_t osrs_h = 1;             //Humidité fréquence d'échantillonnage x 1
    uint8_t mode = 3;               //Mode ormal
    uint8_t t_sb = 5;               //Temps d'attente 1000ms
    uint8_t filter = 0;             //Filtre off 
    uint8_t spi3w_en = 0;           //SPI Disactivé
    
    uint8_t ctrl_meas_reg = (osrs_t << 5) | (osrs_p << 2) | mode; //définition des bits en SPI pour mot 8bits
    uint8_t config_reg    = (t_sb << 5) | (filter << 2) | spi3w_en;
    uint8_t ctrl_hum_reg  = osrs_h;
    
    Serial.begin(9600); //lancement communication serie à 9600 bauds
    Wire.begin(); //lancement communication
    
    writeReg(0xF2,ctrl_hum_reg); // configuration de com
    writeReg(0xF4,ctrl_meas_reg);
    writeReg(0xF5,config_reg);
    readTrim();                    
}


void loop()//programme boucle
{
    double temp_act = 0.0, press_act = 0.0,hum_act=0.0;//definition variables double precision
    signed long int temp_cal;//definition variable signée 
    unsigned long int press_cal,hum_cal;//definition variable non-signée 
    
    readData(); //lecture
    
    temp_cal = calibration_T(temp_raw); //affectation des parametres
    press_cal = calibration_P(pres_raw);
    hum_cal = calibration_H(hum_raw);
    temp_act = (double)temp_cal / 100.0;//ajustement des valeurs
    press_act = (double)press_cal / 100.0;
    hum_act = (double)hum_cal / 1024.0;

    Serial.print("TEMP raw : ");// ecrire sur port serie en I2c
    Serial.print(temp_raw);
    
     Serial.print(" DegC  TEMP cal : ");
     Serial.print(temp_cal); 
    Serial.print(" DegC  PRESS : ");
    Serial.print(press_cal);
     Serial.print("pres raw : ");// ecrire sur port serie en I2c
    Serial.print(pres_raw);
    Serial.print(" hPa  HUM : ");
    Serial.print(hum_act);
    Serial.println(" %");    
    
    delay(500); //attente de 1000ms
}
void readTrim()
{
   /* DEMANDE DE D'INFORMATION AU BME280*/
    /* TEMPERATURE*/
        uint8_t data[32],i=0;
    Wire.beginTransmission(BME280_ADDRESS);
    Wire.write(0x88);
    Wire.endTransmission();
    Wire.requestFrom(BME280_ADDRESS,24);
    while(Wire.available()){
        data[i] = Wire.read();
        i++;
    }
    /*PRESSION*/
    Wire.beginTransmission(BME280_ADDRESS);
    Wire.write(0xA1);
    Wire.endTransmission();
    Wire.requestFrom(BME280_ADDRESS,1);
    data[i] = Wire.read();
    i++;
    /*HUMIDITE*/
    Wire.beginTransmission(BME280_ADDRESS);
    Wire.write(0xE1);
    Wire.endTransmission();
    Wire.requestFrom(BME280_ADDRESS,7);
    while(Wire.available()){
        data[i] = Wire.read();
        i++;    
    }
    /*CONVERTION SPI*/
    dig_T1 = (data[1] << 8) | data[0];
    dig_T2 = (data[3] << 8) | data[2];
    dig_T3 = (data[5] << 8) | data[4];
    dig_P1 = (data[7] << 8) | data[6];
    dig_P2 = (data[9] << 8) | data[8];
    dig_P3 = (data[11]<< 8) | data[10];
    dig_P4 = (data[13]<< 8) | data[12];
    dig_P5 = (data[15]<< 8) | data[14];
    dig_P6 = (data[17]<< 8) | data[16];
    dig_P7 = (data[19]<< 8) | data[18];
    dig_P8 = (data[21]<< 8) | data[20];
    dig_P9 = (data[23]<< 8) | data[22];
    dig_H1 = data[24];
    dig_H2 = (data[26]<< 8) | data[25];
    dig_H3 = data[27];
    dig_H4 = (data[28]<< 4) | (0x0F & data[29]);
    dig_H5 = (data[30] << 4) | ((data[29] >> 4) & 0x0F);
    dig_H6 = data[31];   
}

/* DEMANDE DE D'INFORMATION AU BME280*/
void writeReg(uint8_t reg_address, uint8_t data)
{
    Wire.beginTransmission(BME280_ADDRESS);
    Wire.write(reg_address);
    Wire.write(data);
    Wire.endTransmission();    
}


void readData()
{
    int i = 0;
    uint32_t data[8];
    Wire.beginTransmission(BME280_ADDRESS);
    Wire.write(0xF7);
    Wire.endTransmission();
    Wire.requestFrom(BME280_ADDRESS,8);
    while(Wire.available()){
        data[i] = Wire.read();
        i++;
    }
     /*CONVERTION I2C*/
    pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4);
    temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4);
    hum_raw  = (data[6] << 8) | data[7];
}

/*PARAMETRE DE CALIBRATION VOIR DOC FABRICANT*/
signed long int calibration_T(signed long int adc_T)
{
    
    signed long int var1, var2, T;
    var1 = ((((adc_T >> 3) - ((signed long int)dig_T1<<1))) * ((signed long int)dig_T2)) >> 11;
    var2 = (((((adc_T >> 4) - ((signed long int)dig_T1)) * ((adc_T>>4) - ((signed long int)dig_T1))) >> 12) * ((signed long int)dig_T3)) >> 14;
    
    t_fine = var1 + var2;
    T = (t_fine * 5 + 128) >> 8;
    return T; 
}

unsigned long int calibration_P(signed long int adc_P)
{
    signed long int var1, var2;
    unsigned long int P;
    var1 = (((signed long int)t_fine)>>1) - (signed long int)64000;
    var2 = (((var1>>2) * (var1>>2)) >> 11) * ((signed long int)dig_P6);
    var2 = var2 + ((var1*((signed long int)dig_P5))<<1);
    var2 = (var2>>2)+(((signed long int)dig_P4)<<16);
    var1 = (((dig_P3 * (((var1>>2)*(var1>>2)) >> 13)) >>3) + ((((signed long int)dig_P2) * var1)>>1))>>18;
    var1 = ((((32768+var1))*((signed long int)dig_P1))>>15);
    if (var1 == 0)
    {
        return 0;
    }    
    P = (((unsigned long int)(((signed long int)1048576)-adc_P)-(var2>>12)))*3125;
    if(P<0x80000000)
    {
       P = (P << 1) / ((unsigned long int) var1);   
    }
    else
    {
        P = (P / (unsigned long int)var1) * 2;    
    }
    var1 = (((signed long int)dig_P9) * ((signed long int)(((P>>3) * (P>>3))>>13)))>>12;
    var2 = (((signed long int)(P>>2)) * ((signed long int)dig_P8))>>13;
    P = (unsigned long int)((signed long int)P + ((var1 + var2 + dig_P7) >> 4));
    return P;
}

unsigned long int calibration_H(signed long int adc_H)
{
    signed long int v_x1;
    
    v_x1 = (t_fine - ((signed long int)76800));
    v_x1 = (((((adc_H << 14) -(((signed long int)dig_H4) << 20) - (((signed long int)dig_H5) * v_x1)) + 
              ((signed long int)16384)) >> 15) * (((((((v_x1 * ((signed long int)dig_H6)) >> 10) * 
              (((v_x1 * ((signed long int)dig_H3)) >> 11) + ((signed long int) 32768))) >> 10) + (( signed long int)2097152)) * 
              ((signed long int) dig_H2) + 8192) >> 14));
   v_x1 = (v_x1 - (((((v_x1 >> 15) * (v_x1 >> 15)) >> 7) * ((signed long int)dig_H1)) >> 4));
   v_x1 = (v_x1 < 0 ? 0 : v_x1);
   v_x1 = (v_x1 > 419430400 ? 419430400 : v_x1);
   return (unsigned long int)(v_x1 >> 12);   
}

une valeur brute, je peux comprendre.

une valeur industrielle ? tu peux expliciter ?

Bonjour,
La librairie Adafruit_BME280_Library te donnes directement les valeurs en ° et Pascal