Capteur de pression BMP085




Caractéristiques:


BMP085 est un capteur de pression qui consomme peu d'énergie. Sa précision peut atteindre 0.03hPa et sa consommation 3μa.

Plage de pression: 300 - 1100 hPa (9000 mètres au dessus du niveau de la mer à -500 m).

Tension d'alimentation: 1,8 V - 3,6 V.

Précision: en mode faible puissance, 0.06hpa (0,5 m).

Précision en mode normale 0.03hPa (0,25 m).

Mesure de température.

Interface i2c.

Compensation de température.


Spécification ici.




Suivant les modèles le raccordement peut être différent.


Prérequis:


Mise en route du bus I2C.


Montage:


Raccordement:


BMP085              RPI


Pin1 VCC           Pin1 3,3V

Pin2 SDA           Pin3 SDA

Pin3 SCL           Pin5 SCL

Pin6 GND          Pin6 GND


Programme en C:


Le programme utilise la bibliothèque smbus. http://www.lm-sensors.org/browser/i2c-tools/trunk/lib/smbus.c et http://www.lm-sensors.org/browser/i2c-tools/trunk/include/i2c/smbus.h/

Cette bibliothèque sera installée dans le même répertoire que le programme.

Dans le fichier smbus.c il faudra changer l'emplacement de l'entête : #include <i2c/smbus.h> par #include "smbus.h" car l'entête sera dans le même répertoire que l’application.



Voici le programme bmp085.C issu du site https://www.john.geek.nz/2012/08/reading-data-from-a-bosch-bmp085-with-a-raspberry-pi/#more-2234


Suivant la version du Raspberry, il faut modifier la connexion du bus I2C( i2c-0 pour ancienne version ou ic2-1 pour version 512MB V2).



Programme:


/*

Modifié par Christophe CARON 17/10/2014

www.caron.ws


Raspberry Pi Bosch BMP085 communication code.

By:      John Burns (www.john.geek.nz)

Date:    01 August 2012

License: CC BY-SA v3.0 - http://creativecommons.org/licenses/by-sa/3.0/


This is a derivative work based on:

  BMP085 Extended Example Code

  by: Jim Lindblom

  SparkFun Electronics

  date: 1/18/11

  license: CC BY-SA v3.0 - http://creativecommons.org/licenses/by-sa/3.0/

  Source: http://www.sparkfun.com/tutorial/Barometric/BMP085_Example_Code.pde


Compile with: gcc -lm -Wall -o bmp085 ./smbus.c ./bmp085.c



Circuit detail:

  Using a Spark Fun Barometric Pressure Sensor - BMP085 breakout board

  link: https://www.sparkfun.com/products/9694

  This comes with pull up resistors already on the i2c lines.

  BMP085 pins below are as marked on the Sparkfun BMP085 Breakout board


  SDA   -    P1-03 / IC20-SDA

  SCL   -    P1-05 / IC20_SCL

  XCLR   -    Not Connected

  EOC   -   Not Connected

  GND   -   P1-06 / GND

  VCC   -    P1-01 / 3.3V

 

  Note: Make sure you use P1-01 / 3.3V NOT the 5V pin.

*/


#include <stdio.h>

#include <math.h>

#include <stdint.h>

#include <fcntl.h>

#include <stdlib.h>

#include <unistd.h>

#include <linux/i2c-dev.h>

#include <linux/i2c.h>

#include <sys/ioctl.h>

#include "smbus.h"


#define BMP085_I2C_ADDRESS 0x77


const unsigned char BMP085_OVERSAMPLING_SETTING = 3;


// Calibration values - These are stored in the BMP085

short int ac1;

short int ac2;

short int ac3;

unsigned short int ac4;

unsigned short int ac5;

unsigned short int ac6;

short int b1;

short int b2;

short int mb;

short int mc;

short int md;


int b5;


unsigned int temperature, pressure, altitude,seapressure;



// Open a connection to the bmp085

// Returns a file id

int bmp085_i2c_Begin()

{

  int fd;

  char *fileName = "/dev/i2c-1";

 

  // Open port for reading and writing

  if ((fd = open(fileName, O_RDWR)) < 0)

     exit(1);

 

  // Set the port options and set the address of the device

  if (ioctl(fd, I2C_SLAVE, BMP085_I2C_ADDRESS) < 0) {              

     close(fd);

     exit(1);

  }


  return fd;

}


// Read two words from the BMP085 and supply it as a 16 bit integer

__s32 bmp085_i2c_Read_Int(int fd, __u8 address)

{

  __s32 res = i2c_smbus_read_word_data(fd, address);

  if (res < 0) {

     close(fd);

     exit(1);

  }


  // Convert result to 16 bits and swap bytes

  res = ((res<<8) & 0xFF00) | ((res>>8) & 0xFF);


  return res;

}


//Write a byte to the BMP085

void bmp085_i2c_Write_Byte(int fd, __u8 address, __u8 value)

{

  if (i2c_smbus_write_byte_data(fd, address, value) < 0) {

     close(fd);

     exit(1);

  }

}


// Read a block of data BMP085

void bmp085_i2c_Read_Block(int fd, __u8 address, __u8 length, __u8 *values)

{

  if(i2c_smbus_read_i2c_block_data(fd, address,length,values)<0) {

     close(fd);

     exit(1);

  }

}



void bmp085_Calibration()

{

  int fd = bmp085_i2c_Begin();

  ac1 = bmp085_i2c_Read_Int(fd,0xAA);

  ac2 = bmp085_i2c_Read_Int(fd,0xAC);

  ac3 = bmp085_i2c_Read_Int(fd,0xAE);

  ac4 = bmp085_i2c_Read_Int(fd,0xB0);

  ac5 = bmp085_i2c_Read_Int(fd,0xB2);

  ac6 = bmp085_i2c_Read_Int(fd,0xB4);

  b1 = bmp085_i2c_Read_Int(fd,0xB6);

  b2 = bmp085_i2c_Read_Int(fd,0xB8);

  mb = bmp085_i2c_Read_Int(fd,0xBA);

  mc = bmp085_i2c_Read_Int(fd,0xBC);

  md = bmp085_i2c_Read_Int(fd,0xBE);

  close(fd);

}


// Read the uncompensated temperature value

unsigned int bmp085_ReadUT()

{

  unsigned int ut = 0;

  int fd = bmp085_i2c_Begin();


  // Write 0x2E into Register 0xF4

  // This requests a temperature reading

  bmp085_i2c_Write_Byte(fd,0xF4,0x2E);

 

  // Wait at least 4.5ms

  usleep(5000);


  // Read the two byte result from address 0xF6

  ut = bmp085_i2c_Read_Int(fd,0xF6);


  // Close the i2c file

  close (fd);

 

  return ut;

}


// Read the uncompensated pressure value

unsigned int bmp085_ReadUP()

{

  unsigned int up = 0;

  int fd = bmp085_i2c_Begin();


  // Write 0x34+(BMP085_OVERSAMPLING_SETTING<<6) into register 0xF4

  // Request a pressure reading w/ oversampling setting

  bmp085_i2c_Write_Byte(fd,0xF4,0x34 + (BMP085_OVERSAMPLING_SETTING<<6));


  // Wait for conversion, delay time dependent on oversampling setting

  usleep((2 + (3<<BMP085_OVERSAMPLING_SETTING)) * 1000);


  // Read the three byte result from 0xF6

  // 0xF6 = MSB, 0xF7 = LSB and 0xF8 = XLSB

  __u8 values[3];

  bmp085_i2c_Read_Block(fd, 0xF6, 3, values);


  up = (((unsigned int) values[0] << 16) | ((unsigned int) values[1] << 8) | (unsigned int) values[2]) >> (8-BMP085_OVERSAMPLING_SETTING);


  return up;

}


// Calculate pressure given uncalibrated pressure

// Value returned will be in units of XXXXX

unsigned int bmp085_GetPressure(unsigned int up)

{

  int x1, x2, x3, b3, b6, p;

  unsigned int b4, b7;

 

  b6 = b5 - 4000;

  // Calculate B3

  x1 = (b2 * (b6 * b6)>>12)>>11;

  x2 = (ac2 * b6)>>11;

  x3 = x1 + x2;

  b3 = (((((int)ac1)*4 + x3)<<BMP085_OVERSAMPLING_SETTING) + 2)>>2;

 

  // Calculate B4

  x1 = (ac3 * b6)>>13;

  x2 = (b1 * ((b6 * b6)>>12))>>16;

  x3 = ((x1 + x2) + 2)>>2;

  b4 = (ac4 * (unsigned int)(x3 + 32768))>>15;

 

  b7 = ((unsigned int)(up - b3) * (50000>>BMP085_OVERSAMPLING_SETTING));

  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;

}


// Calculate temperature given uncalibrated temperature

// Value returned will be in units of 0.1 deg C

unsigned int bmp085_GetTemperature(unsigned int ut)

{

  int x1, x2;

 

  x1 = (((int)ut - (int)ac6)*(int)ac5) >> 15;

  x2 = ((int)mc << 11)/(x1 + md);

  b5 = x1 + x2;


  unsigned int result = ((b5 + 8)>>4);  


  return result;

}


// This Altitude part is stolen from some some unknown

// Arduino library.  The number divided into pressure for

// float A is derived from the local pressure as explained

// at http://learn.adafruit.com/bmp085/using-the-bmp085.

unsigned int bmp085_Altitude(float pressure)

{

  float A = 44330.0 * (1.0 - pow(pressure / 101325.0, (1.0/5.255)));

  return A;

}

unsigned int bmp085_SeaPressure(float pressure,float altitude_m)

{

     float A = pressure/(pow(1.0 - (altitude_m/44330.0), 5.255));

  return A;

}



int main(int argc, char **argv)


{


  bmp085_Calibration();


  temperature = bmp085_GetTemperature(bmp085_ReadUT());

  pressure = bmp085_GetPressure(bmp085_ReadUP());

       altitude = bmp085_Altitude(pressure);

               seapressure=bmp085_SeaPressure(pressure,altitude);


  printf("Temperature        \t%0.1f%cC\n", ((double)temperature)/10,0x00B0);

  printf("Pression        \t%0.2fPa\n", ((double)pressure));

  printf("Altitude        \t%0.1f Meter\n", ((double)altitude));

  printf("Pression Niv Mer\t%0.1f Pa\n", ((double)seapressure));


  return 0;

}


Programme et bibliothèque ici.


Installation:


Décompresser l'archive dans un répertoire de votre RPI.

Taper les commande suivante dans votre terminal:


mkdir bmp085

unzip bmp085.zip -d bmp085


Compilation du programme.

Aller dans le répertoire du programme.


cd bmp085


Et lancer la compilation.


gcc -lm -Wall -o bmp085 ./smbus.c ./bmp085.c



Lancement du programme:


Taper la commande suivante:


./bmp085


Voila le résultat:



Ce programme effectue la même chose que celui en Python. 863-Utilisation du capteur BMP085


Mise à jour 18/10/2014

Créé avec HelpNDoc Personal Edition: Produire des livres électroniques facilement