Le forum a migré vers l'adresse suivante:

Forum

Masquer ce message

Simple-Duino Index du Forum



Probleme de Prgramme pour un capteur
Aller à la page: 1, 2  >

 
Poster un nouveau sujet   Répondre au sujet    Simple-Duino Index du Forum -> Arduino & Électronique -> Questions
Sujet précédent :: Sujet suivant  
Auteur Message
xezi
Débutant

Hors ligne

Inscrit le: 18 Fév 2014
Messages: 13
Masculin
Niveau d'éléctronique: Intermédiaire

MessagePosté le: Mar 18 Fév - 17:10 (2014)    Sujet du message: Probleme de Prgramme pour un capteur Répondre en citant

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);
}
Revenir en haut
Admin
Fondateur

Hors ligne

Inscrit le: 12 Avr 2012
Messages: 860
Masculin
Niveau d'éléctronique: Pro

MessagePosté le: Jeu 20 Fév - 18:42 (2014)    Sujet du message: Probleme de Prgramme pour un capteur Répondre en citant

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
Revenir en haut
xezi
Débutant

Hors ligne

Inscrit le: 18 Fév 2014
Messages: 13
Masculin
Niveau d'éléctronique: Intermédiaire

MessagePosté le: Ven 21 Fév - 16:06 (2014)    Sujet du message: Probleme de Prgramme pour un capteur Répondre en citant

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

Hors ligne

Inscrit le: 18 Fév 2014
Messages: 13
Masculin
Niveau d'éléctronique: Intermédiaire

MessagePosté le: Mer 26 Fév - 09:44 (2014)    Sujet du message: Probleme de Prgramme pour un capteur Répondre en citant

Help !!! svp
Revenir en haut
Admin
Fondateur

Hors ligne

Inscrit le: 12 Avr 2012
Messages: 860
Masculin
Niveau d'éléctronique: Pro

MessagePosté le: Jeu 27 Fév - 08:38 (2014)    Sujet du message: Probleme de Prgramme pour un capteur Répondre en citant

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
Revenir en haut
xezi
Débutant

Hors ligne

Inscrit le: 18 Fév 2014
Messages: 13
Masculin
Niveau d'éléctronique: Intermédiaire

MessagePosté le: Jeu 27 Fév - 09:10 (2014)    Sujet du message: Probleme de Prgramme pour un capteur Répondre en citant

Merci :)
Revenir en haut
xezi
Débutant

Hors ligne

Inscrit le: 18 Fév 2014
Messages: 13
Masculin
Niveau d'éléctronique: Intermédiaire

MessagePosté le: Lun 17 Mar - 13:58 (2014)    Sujet du message: Probleme de Prgramme pour un capteur Répondre en citant

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);
}
Revenir en haut
Admin
Fondateur

Hors ligne

Inscrit le: 12 Avr 2012
Messages: 860
Masculin
Niveau d'éléctronique: Pro

MessagePosté le: Lun 17 Mar - 17:03 (2014)    Sujet du message: Probleme de Prgramme pour un capteur Répondre en citant

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

Hors ligne

Inscrit le: 18 Fév 2014
Messages: 13
Masculin
Niveau d'éléctronique: Intermédiaire

MessagePosté le: Mar 18 Mar - 08:15 (2014)    Sujet du message: Probleme de Prgramme pour un capteur Répondre en citant

Admin a écrit:
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 ...
Revenir en haut
Admin
Fondateur

Hors ligne

Inscrit le: 12 Avr 2012
Messages: 860
Masculin
Niveau d'éléctronique: Pro

MessagePosté le: Mar 18 Mar - 12:20 (2014)    Sujet du message: Probleme de Prgramme pour un capteur Répondre en citant

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
Revenir en haut
xezi
Débutant

Hors ligne

Inscrit le: 18 Fév 2014
Messages: 13
Masculin
Niveau d'éléctronique: Intermédiaire

MessagePosté le: Mar 18 Mar - 14:03 (2014)    Sujet du message: Probleme de Prgramme pour un capteur Répondre en citant

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
Revenir en haut
Admin
Fondateur

Hors ligne

Inscrit le: 12 Avr 2012
Messages: 860
Masculin
Niveau d'éléctronique: Pro

MessagePosté le: Mar 18 Mar - 22:23 (2014)    Sujet du message: Probleme de Prgramme pour un capteur Répondre en citant

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
Revenir en haut
Admin
Fondateur

Hors ligne

Inscrit le: 12 Avr 2012
Messages: 860
Masculin
Niveau d'éléctronique: Pro

MessagePosté le: Mar 18 Mar - 22:24 (2014)    Sujet du message: Probleme de Prgramme pour un capteur Répondre en citant

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

Hors ligne

Inscrit le: 18 Fév 2014
Messages: 13
Masculin
Niveau d'éléctronique: Intermédiaire

MessagePosté le: Mer 19 Mar - 08:35 (2014)    Sujet du message: Probleme de Prgramme pour un capteur Répondre en citant

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 ??
Revenir en haut
Admin
Fondateur

Hors ligne

Inscrit le: 12 Avr 2012
Messages: 860
Masculin
Niveau d'éléctronique: Pro

MessagePosté le: Mer 19 Mar - 12:12 (2014)    Sujet du message: Probleme de Prgramme pour un capteur Répondre en citant

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
Revenir en haut
Contenu Sponsorisé






MessagePosté le: Aujourd’hui à 09:05 (2017)    Sujet du message: Probleme de Prgramme pour un capteur

Revenir en haut
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Simple-Duino Index du Forum -> Arduino & Électronique -> Questions Toutes les heures sont au format GMT + 1 Heure
Aller à la page: 1, 2  >
Page 1 sur 2

 
Sauter vers:  

Index | creer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Powered by phpBB
Propulsé par Simple-Duino