Le forum a migré vers l'adresse suivante:

Forum

Masquer ce message

Simple-Duino Forum Index



Probleme de Prgramme pour un capteur
Goto page: 1, 2  >

 
Post new topic   Reply to topic    Simple-Duino Forum Index -> Arduino & Électronique -> Questions
Previous topic :: Next topic  
Author Message
xezi
Débutant

Offline

Joined: 18 Feb 2014
Posts: 13
Masculin
Niveau d'éléctronique: Intermédiaire

PostPosted: Tue 18 Feb - 17:10 (2014)    Post subject: Probleme de Prgramme pour un capteur Reply with quote

PublicitéSupprimer les publicités ?
Bonjour,

voila dans le cadre d'un projet j'ai été en charge du capteur BMP085, un altimètre permettant de relever la pression atmosphérique pour y déterminer l'altitude. Le programme fonction bien, la pression change sans arrêt. Pour plus de précision je dois relever 5 fois la valeur de la pression ainsi que 5 fois la valeur de l'altitude, en faire une moyenne et l'afficher .
Mais étant débutant je ne sais pas comment faire ...
Je sollicite un peu d'aide !
ps: je pense que les modification à apporter doivent se trouver dans la fonction "loop" ??

voici le programme:

#include <Wire.h>

//L'adresse I2C du BMP085
#define BMP085_ADDRESS 0x77

// Lit 1 byte du BMP085 à 'address'
char bmp085ReadChar(unsigned char address)
{
unsigned char data;

Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(address);
Wire.endTransmission();

Wire.requestFrom(BMP085_ADDRESS, 1);
while(!Wire.available());

return Wire.read();
}

// Lit 2 bytes sur le BMP085
// Le premier byte vient de 'address'
// Le second byte vient de 'address'+1
int bmp085ReadInt(unsigned char address)
{
unsigned char msb, lsb;

Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(address);
Wire.endTransmission();

//on va lire 2 bytes, correspondant à un integer
Wire.requestFrom(BMP085_ADDRESS, 2);

//Attendons que les 2 bytes soient arrivés...
while(Wire.available()<2);
msb = Wire.read();
lsb = Wire.read();

return (int) msb<<8 | lsb;
}

const unsigned char OSS = 0;

// Valeurs de calibration
int ac1;
int ac2;
int ac3;
unsigned int ac4;
unsigned int ac5;
unsigned int ac6;
int b1;
int b2;
int mb;
int mc;
int md;

// b5 est calculé dans bmp085GetTemperature(...),
// et est aussi utilisée dans bmp085GetPressure(...)
// donc ...Temperature(...) doit être appelée avant ...Pressure(...).
long b5;

short temperature;
long pressure;

// Stocke toutes les valeurs de calibration du BMP085 dans des variables globales.
// Ces valeurs sont nécessaires pour calculer la température et la pression.
// Cette fonction doit être appelée au début du programme.
void bmp085Calibration()
{
ac1 = bmp085ReadInt(0xAA);
ac2 = bmp085ReadInt(0xAC);
ac3 = bmp085ReadInt(0xAE);
ac4 = bmp085ReadInt(0xB0);
ac5 = bmp085ReadInt(0xB2);
ac6 = bmp085ReadInt(0xB4);
b1 = bmp085ReadInt(0xB6);
b2 = bmp085ReadInt(0xB8);
mb = bmp085ReadInt(0xBA);
mc = bmp085ReadInt(0xBC);
md = bmp085ReadInt(0xBE);
}
void setup()
{
Serial.begin(9600);
Wire.begin();
bmp085Calibration();
}


// Lit la température non compensée
unsigned int bmp085ReadUT()
{
int ut;

// Ecrit 0x2E dans le registre 0xF4.
// Cela demande une lecture de température.
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x2E);
Wire.endTransmission();

// Attendons au moins 4.5ms
delay(5);

// Lit les 2 octets des registres 0xF6 et 0xF7
ut = bmp085ReadInt(0xF6);
return ut;
}

// Lit la pression non compensée
unsigned long bmp085ReadUP()
{
unsigned char msb, lsb, xlsb;
unsigned long up = 0;

// Ecrit 0x34 + (OSS<<6) dans le registre 0xF4 pour
// demander une lecture de la pression avec le paramètre d'oversampling
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x34 + (OSS<<6));
Wire.endTransmission();

// Attend la fin de conversion, le délai dépend de OSS
delay(2 + (3 << OSS));

// Lit la réponse dans les registres :
// 0xF6 (MSB), 0xF7 (LSB), et 0xF8 (XLSB)
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF6);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 3);

// Attend aue les données soient dispo (3 bytes)
while(Wire.available() < 3);

msb = Wire.read();
lsb = Wire.read();
xlsb = Wire.read();

up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);

return up;
}


// Calcule la température à partir de ut.
// La valeur de sortie est exprimée en dixièmes de degrés.
short bmp085GetTemperature( int ut)
{
long x1, x2;

x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
x2 = ((long)mc << 11)/(x1 + md);
b5 = x1 + x2;

return ((b5 + 8)>>4);
}

// Calcule la pression à partir de up.
// Les valeurs de calibration doivent être initialisées.
// b5 est aussi requise, donc bmp085GetTemperature(...) doit être appelée en premier.
// La valeur de sortie est exprimée en Pascals.
long bmp085GetPressure(unsigned long up)
{
long x1, x2, x3, b3, b6, p;
unsigned long b4, b7;

b6 = b5 - 4000;
// Calcule B3
x1 = (b2 * (b6 * b6)>>12)>>11;
x2 = (ac2 * b6)>>11;
x3 = x1 + x2;
b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;

// Calcule B4
x1 = (ac3 * b6)>>13;
x2 = (b1 * ((b6 * b6)>>12))>>16;
x3 = ((x1 + x2) + 2)>>2;
b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;

b7 = ((unsigned long)(up - b3) * (50000>>OSS));
if (b7 < 0x80000000)
p = (b7<<1)/b4;
else
p = (b7/b4)<<1;

x1 = (p>>8) * (p>>8);
x1 = (x1 * 3038)>>16;
x2 = (-7357 * p)>>16;
p += (x1 + x2 + 3791)>>4;

return p;
}

//Retourne l'altitude théorique
//en fonction de la pression atmosphérique
float getAltitude(long pressure)
{
// Pression au niveau de la mer (Pa)
const float p0 = 101325;
float altitude = (float)44330 * (1 - pow(((float) pressure/p0), 0.190295));
return altitude;
}



//Calculons tout ça dans la boucle principale, et envoyons les résultats dans le port série:

void loop()
{
temperature = bmp085GetTemperature(bmp085ReadUT());
pressure = bmp085GetPressure(bmp085ReadUP());
float altitude = getAltitude(pressure);

Serial.println("***********************");
Serial.print("Temperature: ");
Serial.print(((float)temperature / 10), 1);
Serial.println(" degres");

Serial.print("Pression: ");
Serial.print(pressure, DEC);
Serial.println(" Pascals");

Serial.print("Altitude: ");
Serial.print((int)altitude, DEC);
Serial.println(" metres");

delay(1000);
}
Back to top
Admin
Fondateur

Offline

Joined: 12 Apr 2012
Posts: 860
Masculin
Niveau d'éléctronique: Pro

PostPosted: Thu 20 Feb - 18:42 (2014)    Post subject: Probleme de Prgramme pour un capteur Reply with quote

Bon pour la fonction loop mais je vois pas trop ce que tu veux faire:
En gros ce serait ça ?:
- Lecture de la valeur 1 si i=1 /valeur 2 si i=2 etc...
- si i == 5 alors faire moyenne de val1;val2;val3;val4;val5
- Sinon on recommence et on lit la nème  valeur
____________________________
http://simple-duino.com
Back to top
xezi
Débutant

Offline

Joined: 18 Feb 2014
Posts: 13
Masculin
Niveau d'éléctronique: Intermédiaire

PostPosted: Fri 21 Feb - 16:06 (2014)    Post subject: Probleme de Prgramme pour un capteur Reply with quote

oui voila, mesurer 5 fois la pression, temperature, altitude puis faire la moyenne de chaque partie ( temperature, pression,altitude) et enfin l'afficher !!
Back to top
xezi
Débutant

Offline

Joined: 18 Feb 2014
Posts: 13
Masculin
Niveau d'éléctronique: Intermédiaire

PostPosted: Wed 26 Feb - 09:44 (2014)    Post subject: Probleme de Prgramme pour un capteur Reply with quote

Help !!! svp
Back to top
Admin
Fondateur

Offline

Joined: 12 Apr 2012
Posts: 860
Masculin
Niveau d'éléctronique: Pro

PostPosted: Thu 27 Feb - 08:38 (2014)    Post subject: Probleme de Prgramme pour un capteur Reply with quote

Mon pseudo-programme visible ci-dessus ne t'as pas permis de te lancer ??
Je te fais le bout de code ce week end mais ce sera à toi de l'adapter  Okay
____________________________
http://simple-duino.com
Back to top
xezi
Débutant

Offline

Joined: 18 Feb 2014
Posts: 13
Masculin
Niveau d'éléctronique: Intermédiaire

PostPosted: Thu 27 Feb - 09:10 (2014)    Post subject: Probleme de Prgramme pour un capteur Reply with quote

Merci :)
Back to top
xezi
Débutant

Offline

Joined: 18 Feb 2014
Posts: 13
Masculin
Niveau d'éléctronique: Intermédiaire

PostPosted: Mon 17 Mar - 13:58 (2014)    Post subject: Probleme de Prgramme pour un capteur Reply with quote

Avez vous eu le temps de le faire ?? :)

Dans la fonction loop j'ai ecrit ceci: en rouge . Est-ce correct??

void loop()
{
temperature = bmp085GetTemperature(bmp085ReadUT());
pressure = bmp085GetPressure(bmp085ReadUP());
float altitude = getAltitude(pressure);
int somme = 0;
int valeurmoy=0;



for (i=0;i<9;i++)
{
Wire.beginTransmission(BMP085_ADDRESS);
somme += bmp085GetPressure(bmp085ReadUP()) ; Wire.endTransmission();

}


valeurmoy= somme/10;



Serial.println("***********************");
Serial.print("Temperature: ");
Serial.print(((float)temperature / 10),0);
Serial.println("degres");

Serial.print("Pression: ");
Serial.print(valeurmoy, DEC);
Serial.println("Pascals");

Serial.print("Altitude: ");
Serial.print((int)altitude, DEC);
Serial.println(" metres");

delay(1000);
}
Back to top
Admin
Fondateur

Offline

Joined: 12 Apr 2012
Posts: 860
Masculin
Niveau d'éléctronique: Pro

PostPosted: Mon 17 Mar - 17:03 (2014)    Post subject: Probleme de Prgramme pour un capteur Reply with quote

Oui c'est ça j'ai pas eu le temps de te le faire et j'en suis désolé...
____________________________
http://simple-duino.com
Back to top
xezi
Débutant

Offline

Joined: 18 Feb 2014
Posts: 13
Masculin
Niveau d'éléctronique: Intermédiaire

PostPosted: Tue 18 Mar - 08:15 (2014)    Post subject: Probleme de Prgramme pour un capteur Reply with quote

Admin wrote:
Oui c'est ça j'ai pas eu le temps de te le faire et j'en suis désolé...


Ce n'est pas grave :)


Par contre mon programme ne fonctionne pas ...
Back to top
Admin
Fondateur

Offline

Joined: 12 Apr 2012
Posts: 860
Masculin
Niveau d'éléctronique: Pro

PostPosted: Tue 18 Mar - 12:20 (2014)    Post subject: Probleme de Prgramme pour un capteur Reply with quote

Etonnant...Ah !!
essayes somme = somme + bmp085GetPressure(bmp085ReadUP());


C'est peu être un problème avec le += (je sais plus s'il existe dans l'Arduino)
____________________________
http://simple-duino.com
Back to top
xezi
Débutant

Offline

Joined: 18 Feb 2014
Posts: 13
Masculin
Niveau d'éléctronique: Intermédiaire

PostPosted: Tue 18 Mar - 14:03 (2014)    Post subject: Probleme de Prgramme pour un capteur Reply with quote

j'obtiens toujours une pression bizarre, j'ai l'impression que ca viens du calcul.
On dirais qu'il ne fait pas la somme des 10 valeurs.

Etrange ...

une autre solution ?? Very Happy
Back to top
Admin
Fondateur

Offline

Joined: 12 Apr 2012
Posts: 860
Masculin
Niveau d'éléctronique: Pro

PostPosted: Tue 18 Mar - 22:23 (2014)    Post subject: Probleme de Prgramme pour un capteur Reply with quote

for(i=1,i<11,i++) 
et ça ??
dans ton script on va de i=0 à i=8 donc on a pas 10 valeurs
____________________________
http://simple-duino.com
Back to top
Admin
Fondateur

Offline

Joined: 12 Apr 2012
Posts: 860
Masculin
Niveau d'éléctronique: Pro

PostPosted: Tue 18 Mar - 22:24 (2014)    Post subject: Probleme de Prgramme pour un capteur Reply with quote

Pour info, après vérification, le += en langage "Arduino" ne semble pas existé.
Essayes la solution ci-dessus.
____________________________
http://simple-duino.com
Back to top
xezi
Débutant

Offline

Joined: 18 Feb 2014
Posts: 13
Masculin
Niveau d'éléctronique: Intermédiaire

PostPosted: Wed 19 Mar - 08:35 (2014)    Post subject: Probleme de Prgramme pour un capteur Reply with quote

Exact, c'est une erreur bete de ma part. merci :)

Mais cela ne m'affiche toujours pas la bonne pression...

Vu que faire la valeur moyenne de la pression pour avoir plus de precision ne fonctionne pas, j'ai un autre choix:

Je peux afficher cette même pression une fois toute les 5 secondes par le biais d'une interruption, pouvez vous m'aider à mettre cela en œuvre ??
Back to top
Admin
Fondateur

Offline

Joined: 12 Apr 2012
Posts: 860
Masculin
Niveau d'éléctronique: Pro

PostPosted: Wed 19 Mar - 12:12 (2014)    Post subject: Probleme de Prgramme pour un capteur Reply with quote

Je peux afficher cette même pression une fois toute les 5 secondes par le biais d'une interruption, pouvez vous m'aider à mettre cela en œuvre




Tu pourrais détailler ton idée ?


Pour la moyenne j'ai compris, il faut diviser le résultat final par 10 sinon tu n'as que la somme de toutes les pressions relevées
A la sortie de la boucle for, tu fais moy = somme/10 et tu me dis ce que ça donne
____________________________
http://simple-duino.com
Back to top
Display posts from previous:   
Post new topic   Reply to topic    Simple-Duino Forum Index -> Arduino & Électronique -> Questions All times are GMT + 1 Hour
Goto page: 1, 2  >
Page 1 of 2

 
Jump to:  

Index | Xooit.com free forum | Free support forum | Free forums directory | Report a violation | Cookies | Charte | Conditions générales d'utilisation
Powered by phpBB
Propulsé par Simple-Duino