Fabriquer un thermomètre / baromètre / altimètre avec Arduino, 2ème partie

Nous avons câblé le capteur, il ne reste plus qu’à écrire le programme qui nous permettra d’obtenir la température, la pression atmosphérique et l’altitude.

La première chose à faire, c’est de pouvoir communiquer avec le module BMP085. Nous aurons besoin de 2 fonctions de lecture, pour lire respectivement des valeurs de 8 et 16 bits.

Nous sommes à présent capables de lire des valeurs du module. Cool! On va en avoir besoin pour lire les 11 coefficients de calibration, stockés dans l’EEPROM du BMP085. Ces valeurs vont nous permettre de calculer la pression absolue. Il suffit de les lire une seule fois, au début du programme. Nous allons les mettre dans la fonction setup().

 

Une fois que les valeurs de calibration sont lues, il nous faut encore deux variables pour calculer la température et la pression : ut et up. Ce sont les valeurs de température et pression non compensées, notre point de départ pour déterminer les valeurs réelles de température et pression. A chaque fois qu’on veut obtenit la température ou la pression, il faut lire au préalable ces valeurs.

La température non compensée est sur 16 bits (type int), la pression sur 32 bits (type long).

 

Dans ces deux fonctions, nous utilisons la fonction delay() pour laisser le temps au BMP085 de terminer ses traitements.

Le paramètre d’oversampling (OSS) indique au capteur de calculer une moyenne de plusieurs mesures, afin d’avoir une précision accrue. Ici, il est désactivé.

La durée d’attente est le maximum indiqué dans le datasheet du module, mais nous pourrions à la place nous baser sur le pin EOC (End Of Conversion) pour connaitre avec précision le moment où le BMP05 a terminé de lire les données. Tant qu’il travaille, le pin EOC est à l’état LOW, et dès qu’il a terminé, il passe à HIGH.

 

Nous avons toutes les variables requises pour calculer la température et la pression. Dans le datasheet, une formule assez cool nous donne la température, et une autre, beaucoup, beaucoup plus barbue, nous donne la pression.

Merci à Jimbo, chez Sparkfun, d’avoir transcrit tout ça en C, ça fait vraiment plaisir 🙂

 

Bon alors là, on est pas mal ! Encore une fonction pour calculer l’altitude à partir de la pression :

 

 

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

 

 

Et voilà la sortie, au chalet, par cette soirée de février :

Ce qui est assez réaliste aujourd’hui, puisqu’on estime être à 930 m rééls. Mais selon la météo, on se retrouve dans une fourchette de 870 à 1000 et quelques…

 

Je tiens une fois encore à remercier l’article de SparkFun, dont cet article est essentiellement une traduction. Je vous invite à le lire pour plus de précisions. Sans lui, je me serais tapé la tête contre le lambris… J’y serais probablement arrivé, mais en beaucoup plus de temps 🙂

 

12 pensées sur “Fabriquer un thermomètre / baromètre / altimètre avec Arduino, 2ème partie”

  1. J’essaye moi aussi de me faire une petite station météo a base d’un arduino et d’une poignée de capteurs, dont ce BMP085.
    J’ai un peu le même souci que vous, l’altitude retournée varie (alors que mon capteur en bouge a priori) pas de place, et ma pression atmosphérique me donne souvent des écarts significatifs avec les valeurs de météo officielle.
    Avez vous trouvé une solution pour « fixer » l’altitude et récupérer des valeurs de pression plus cohérentes ?

    1. Bonjour, vous avez eu du pot car votre commentaire avait été filtré par l’antispam… Merde, quoi! le 1er commentaire de ce blog!
      On peut effectivement obtenir la pression standard en fixant l’altitude, en manipulant un peu la formule.
      Je vais ajouter cette possibilité dans un nouveau post.

      A bientôt!

  2. Bonjour, n’étant pas du tout un pro d’arduino je suis tombé sur ce site, j’ai copié comme un ane et ça marche.
    Bon pas pratique d’emmener un ordi dans l’autogire aussi en bidouillant, j’ai réussi à afficher l’altitude et la pression, hélas sur deux afficheurs lcd 40 broches alors qu’avec un bouton un seul aurait suffit mais c’est déjà pas si mal.
    Librairie SevenSegments les deux cpp et h
    Un circuit intégré commande afficheur AY0438
    Le lien:
    http://code.google.com/p/arduino-seven-segment/#Various_LCD_Modules_Supported

    Merci pour ce code.

  3. Bonjour,
    Dans le cadre de mes études je réalise un altimètre avec arduino.
    Je vous remercie d’avoir mis votre programme en ligne.
    Lorsque je vérifie mon programme, tout va bien mais quand je le téléverse vers la carte, j’ai ce message d’erreur :
    .
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x00
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x00
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x00
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x00
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x00
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x00
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x00
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x00
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x00
    Problème de téléversement vers la carte. Voir http://www.arduino.cc/en/Guide/Troubleshooting#upload pour suggestions.

    Sauriez vous d’où cela provient ?

    Merci d’avance
    Antoine

  4. Salut Antoine,

    Mmmm, la dernière fois que j’ai vu une erreur dans ce genre, j’avais des trucs connectés sur les ports rx et tx.
    Tu arrives à envoyer un programme basique comme par exemple blink, sans rien brancher du tout sur ta carte?

    1. Tout d’abord merci d’avoir répondu si rapidement.
      J’ai réessayé aujourd’hui et ca a marché donc tant mieux ! Et oui le programme basique blink fonctionne.
      Je ne m’y connais pas trop en arduino…
      Comment on fait pour ensuite afficher la température, la pression et l’altitude comme vous l’avez fait sur votre article ?

      Encore merci
      Antoine

      1. En fait pour l’exemple j’affichais les infos dans la console série de l’environnement Arduino (la petite loupe e n haut à droite).
        Ce sont les instructions Serial.println() qui écrivent dans cette console.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Es-tu capable de répondre à ça? * Time limit is exhausted. Please reload the CAPTCHA.