Derive MS5611 en altitude

Bonjour,
J’utilise ce module achete chez Drotek sur une arduino nano
Les soudures I2C, pullups et adressages ont ete effectuees
Le module est connecte sur l’arduino via SDA et SCL
La librairie telechargee sur Drotek ne fonctionne pas chez moi, j’utilise l’exemple MS561101B_altitude
l’altitude et la pression atmosphérique sont complètement délirante !
j’obtiens ceci :
"
temp: 26.73 degC pres: 3068.80 mbar altitude: -8768.44 m
temp: 26.73 degC pres: 3068.80 mbar altitude: -8768.44 m
temp: 26.73 degC pres: 3068.80 mbar altitude: -8768.44 m
temp: 26.73 degC pres: 3068.80 mbar altitude: -8768.44 m
temp: 26.73 degC pres: 3068.80 mbar altitude: -8768.44 m
temp: 26.73 degC pres: 3068.80 mbar altitude: -8768.42 m
temp: 26.73 degC pres: 3068.80 mbar altitude: -8768.42 m
temp: 26.73 degC pres: 3068.80 mbar altitude: -8768.42 m
temp: 26.74 degC pres: 3068.80 mbar altitude: -8768.47 m
temp: 26.74 degC pres: 3068.80 mbar altitude: -8768.47 m
temp: 26.74 degC pres: 3068.79 mbar altitude: -8768.46 m
temp: 26.74 degC pres: 3068.79 mbar altitude: -8768.46 m
temp: 26.74 degC pres: 3068.79 mbar altitude: -8768.46 m
temp: 26.74 degC pres: 3068.79 mbar altitude: -8768.46 m
"
j’en ai trouve une autre qui semble fonctionner
J’ai bien la temperature, la pression et l’altitude
Cependant l’altitude varie enormement, sur une plage de 1m environ
L’altitude derive de 1m puis reviens doucement vers sa valeur de depart et rederive de 1m environ et ainsi de suite
1 cycle se produit sur moins de 5 minutes
Que se passe t’il ???

Sinon j’ai trouve un code sur le forum (drotek.fr/forum/viewtopic.php?f=10&t=59) qui fonctionne bien pour la temperature et la pression mais il n’y a pas d’altitude integree dans le code donc je ne peux pas comparer…

Au pire auriez vous un code mesurant simplement l’altitude pour voir d’ou vient se probleme de derive ?

Bonjour,

C’est normal que la pression dérive dans le temps. 5 min me parait pas trop surprenant.
Nous utilisons le code Multiwii qui est open source pour tester les cartes. Je pense que vous pouvez vous inspirer de ce qu’il y a dedans.

un cycle complet se produit en moins de 5 minutes
et par moment il y a des variations de 80cm en l’espace d’une seconde…
des variations dans le temps je suis d’accord mais variations brusques comme celle ci ce n’est pas normal
Hormis le code multiwii, que puis je faire d’autre ? car le code multiwii fait des milliers de lignes sur plusieurs onglets, donc pour ressortir uniquement ce qui m’intéresse ce n’est pas possible…

sino je viens de faire les test de mesure uniquement de la temperature et de la pression et il n’y a pour ainsi dire aucune variation notable, donc pourquoi l’altitude varie autant ?
voici un bout de log et les valeurs ne changent pour ainsi dire pas du tout depuis 10 minutes

TEMPERATURE = 19.59 C : PRESSURE = 983.85 mbar TEMPERATURE = 19.59 C : PRESSURE = 983.85 mbar TEMPERATURE = 19.59 C : PRESSURE = 983.87 mbar TEMPERATURE = 19.59 C : PRESSURE = 983.88 mbar TEMPERATURE = 19.59 C : PRESSURE = 983.87 mbar TEMPERATURE = 19.59 C : PRESSURE = 983.86 mbar TEMPERATURE = 19.59 C : PRESSURE = 983.87 mbar TEMPERATURE = 19.59 C : PRESSURE = 983.85 mbar TEMPERATURE = 19.59 C : PRESSURE = 983.88 mbar TEMPERATURE = 19.59 C : PRESSURE = 983.87 mbar TEMPERATURE = 19.59 C : PRESSURE = 983.87 mbar TEMPERATURE = 19.59 C : PRESSURE = 983.88 mbar TEMPERATURE = 19.59 C : PRESSURE = 983.87 mbar TEMPERATURE = 19.59 C : PRESSURE = 983.88 mbar TEMPERATURE = 19.59 C : PRESSURE = 983.88 mbar TEMPERATURE = 19.59 C : PRESSURE = 983.89 mbar TEMPERATURE = 19.59 C : PRESSURE = 983.87 mbar TEMPERATURE = 19.59 C : PRESSURE = 983.86 mbar TEMPERATURE = 19.59 C : PRESSURE = 983.87 mbar TEMPERATURE = 19.59 C : PRESSURE = 983.86 mbar TEMPERATURE = 19.59 C : PRESSURE = 983.88 mbar TEMPERATURE = 19.59 C : PRESSURE = 983.87 mbar TEMPERATURE = 19.59 C : PRESSURE = 983.88 mbar TEMPERATURE = 19.59 C : PRESSURE = 983.86 mbar TEMPERATURE = 19.59 C : PRESSURE = 983.88 mbar

Merci pour votre aide

Effectivement la pression ne varie pas bcp.
Ca semble venir du code.

et auriez vous un code qui me permettrait d’avoir une altitude stable svp ?

Comment je vous l’ai dit juste avant nous utilisons le code Multiwii.
Il faut juste extraire du code la partie qui correspond au MS5611.

le problème c’est que récupérer toutes les parties en lien avec le MS5611 est totalement impossible, cela renvoie sur plusieurs onglets
Sinon avez vous simplement la formule de calcul de l’altitude ? cela me permettrait d’écrire le programme avec la formule de calcul de l’altitude
Merci pour votre aide

It’s so simple :slight_smile:

[code]/*****************************************
MS5611 Sensor

Code example writen by Leo Nutz

with altitude calculation (1/2015)

© 2012 www.ALTDuino.de

******************************************/

#include <Wire.h>

#define ADDRESS 0x77 // or 0x76 sensor address

uint32_t D1 = 0;
uint32_t D2 = 0;
int64_t dT = 0;
int64_t OFF = 0;
int64_t SENS = 0;
int32_t T = 0;
int32_t P = 0;
uint16_t C[7];

float Temperature;
float Pressure;
float Altitude;

void setup()
{
// Disable internal pullups because 10Kohms are on the breakout
PORTC |= (1 << 4);
PORTC |= (1 << 5);

Wire.begin();
Serial.begin(9600);
delay(100);
initial(ADDRESS);
}

void loop()
{
D2 = read_SENSOR(ADDRESS, 0x58); // get raw temperature value from sensor
D1 = read_SENSOR(ADDRESS, 0x48); // get raw pressure value from sensor

dT = D2 - ((int64_t)C[5] << 8);
OFF = ((int64_t)C[2] << 16) + ((dT * C[4]) >> 7);
SENS = ((int64_t)C[1] << 15) + ((dT * C[3]) >> 8);

T = (((int64_t)dT * (int64_t)C[6]) >> 23) + 2000; // calculate temperature

if(T < 2000) // if temperature lower than 20 Celsius
{
int32_t T1 = 0;
int64_t OFF1 = 0;
int64_t SENS1 = 0;

T1    = pow(dT, 2) / 2147483648;
OFF1  = 5 * (((T - 2000) << 2) >> 2);
SENS1 = 5 * (((T - 2000) << 2) >> 4);

if(T < -1500) // if temperature lower than -15 Celsius 
{
  OFF1  = OFF1  +  7 *  ((T + 1500) << 2);
  SENS1 = SENS1 + 11 * (((T + 1500) << 2) >> 2);
} // lower than -15 celsius

T    -=    T1;
OFF  -=  OFF1; 
SENS -= SENS1;

}

P = ((((int64_t)D1 * SENS) >> 21) - OFF) >> 15; // calculate pressure

Temperature = (float)T / 100;
Pressure = (float)P / 100;
Altitude = (pow(1013.25f / Pressure, 0.190223f) - 1.0f) * 44330.08f;

Serial.print(“TEMPERATURE = “); Serial.print(Temperature); Serial.print(” C : PRESSURE = “); Serial.print(Pressure); Serial.print(” mbar”); Serial.print(" C : ALTITUDE = “); Serial.print(Altitude); Serial.println(” meters");

delay(100);
}

uint32_t read_SENSOR(uint8_t address, uint8_t code)
{
uint32_t value = 0;
// initialize pressure/temperature conversion
Wire.beginTransmission(address);
Wire.write(code);
Wire.endTransmission();
delay(10);
// send conversion command, start read sequence
Wire.beginTransmission(address);
Wire.write(0x00); // read command
Wire.endTransmission();
// set device address and start read sequence
Wire.requestFrom(address, (uint8_t)3);
if (Wire.available() >= 3)
{
for(uint8_t i = 0; i < 3; i++)
{
value = (value << 8) | Wire.read();
}
}
return value;
} // end read_SENSOR

void initial(uint8_t address)
{

Serial.println();
Serial.println(“PROM COEFFICIENTS”);

Wire.beginTransmission(address);
Wire.write(0x1E); // reset
Wire.endTransmission();
delay(10);

for (int i = 0; i < 6; i++) {

Wire.beginTransmission(address);
Wire.write(0xA2 + (i * 2));
Wire.endTransmission();

Wire.requestFrom(address, (uint8_t)6);
delay(10);
if(Wire.available())
{
   C* = Wire.read() << 8 | Wire.read();
}
else {
  Serial.println("Error reading PROM 1");
}
Serial.print("C"); Serial.print(i); Serial.print(" = "); Serial.println(C*);

}
Serial.println();
}[/code]**