BMP180 Interfacing with Arduino | In Depth

BMP180 with Raduino

BMP180This video is all about interfacing BMP180 module with Arduino. BMP180 will help us to measure environmental temperature and pressure and by using that we can calculate the altitude which can be used in various applications like weather monitoring, navigation etc. The BMP180 sensor module comes with the I2C interface and with a default address 0x77 which is not configurable limiting stacking of multiple modules to that same I2C bus. In this tutorial, we will interface the module with Arduino by using I2C interface that is analog input pin A4 and A5. And for this, we are not going to use any library although if you are interested you can use any library available online which are actually pretty easy to use. Interfacing the module without any library will help us learn how it works as well as we can interface to other devices also where libraries are not available.

 

#include <Wire.h>
#include <stdio.h>
#include <math.h>

#define BMP180_ADDR 0x77 // 7-bit address
#define BMP180_REG_CONTROL 0xF4
#define BMP180_REG_RESULT 0xF6
#define BMP180_COMMAND_TEMPERATURE 0x2E
#define BMP180_COMMAND_PRESSURE 0x34 //0x34 0x74 0xB4 0xF4

uint16_t unSignedIntTempVar,AC4,AC5,AC6;
int16_t signedIntTempVar,AC1,AC2,AC3,VB1,VB2,MB,MC,MD;

double c5,c6,mc,md,x0,x1,x2,y0,y1,y2,p0,p1,p2;
char _error;

void setup()
{
  Serial.begin(9600); 
  Serial.println("REBOOT");
  if (begin())
    Serial.println("BMP180 init success");
  else{
    Serial.println("BMP180 init fail\n\n");
    while(1);
  }
}

void loop(){
  char status;
  double T,P,p0,a;
  
    
    if (measureParameters(P,T) != 0){

      Serial.print("temperature: ");
      Serial.print(T,2);
      Serial.print(" deg C, ");
      Serial.print((9.0/5.0)*T+32.0,2);
      Serial.println(" deg F");
    
      Serial.print("absolute pressure: ");
      Serial.print(P,2);
      Serial.print(" mb, ");
      Serial.print(P*0.0295333727,2);
      Serial.println(" inHg");
      
      a = 44330.0*(1-pow(P/1013.25,1/5.255));
      Serial.print("computed altitude: ");
      Serial.print(a,0);
      Serial.print(" meters, ");
      Serial.print(a*3.28084,0);
      Serial.println(" feet");
    }
    else 
      Serial.println("error retrieving pressure measurement\n");
  delay(5000);

}
char begin(){
  double c3,c4,b1;
  Wire.begin();

  if(readCompData(0xAA))
    AC1=signedIntTempVar;
  if(readCompData(0xAC))
    AC2=signedIntTempVar;
  if(readCompData(0xAE))
    AC3=signedIntTempVar;
  if(readCompData(0xB0))
    AC4=unSignedIntTempVar;
  if(readCompData(0xB2))
    AC5=unSignedIntTempVar;
  if(readCompData(0xB4))
    AC6=unSignedIntTempVar;
  if(readCompData(0xB6))
    VB1=signedIntTempVar;
  if(readCompData(0xB8))
    VB2=signedIntTempVar;
  if(readCompData(0xBA))
    MB=signedIntTempVar;
  if(readCompData(0xBC))
    MC=signedIntTempVar;
  if(readCompData(0xBE))
    MD=signedIntTempVar;

  c3 = 160.0 * pow(2,-15) * AC3;
  c4 = pow(10,-3) * pow(2,-15) * AC4;
  b1 = pow(160,2) * pow(2,-30) * VB1;
  c5 = (pow(2,-15) / 160) * AC5;
  c6 = AC6;
  mc = (pow(2,11) / pow(160,2)) * MC;
  md = MD / 160.0;
  x0 = AC1;
  x1 = 160.0 * pow(2,-13) * AC2;
  x2 = pow(160,2) * pow(2,-25) * VB2;
  y0 = c4 * pow(2,15);
  y1 = c4 * c3;
  y2 = c4 * b1;
  p0 = (3791.0 - 8.0) / 1600.0;
  p1 = 1.0 - 7357.0 * pow(2,-20);
  p2 = 3038.0 * 100.0 * pow(2,-36);
  
  return(1);
}


char readCompData(char address){
  unsigned char data[2];
  char x;

  Wire.beginTransmission(BMP180_ADDR);
  Wire.write(address);
  _error = Wire.endTransmission();
  if (_error == 0){
    Wire.requestFrom(BMP180_ADDR,2);
    while(Wire.available() != 2) ;
    for(x=0;x<2;x++){
      data[x] = Wire.read();
    }
    signedIntTempVar = (int16_t)((data[0]<<8)|data[1]);
    unSignedIntTempVar = (((uint16_t)data[0]<<8)|(uint16_t)data[1]);
    return(1);
  }
  signedIntTempVar= unSignedIntTempVar= 0;
  return(0);
}


char writeBytes(unsigned char *values, char length){
  char x;

  Wire.beginTransmission(BMP180_ADDR);
  Wire.write(values,length);
  _error = Wire.endTransmission();
  if (_error == 0)
    return(1);
  else
    return(0);
} 


char measureParameters(double &P, double &T){
  unsigned char data[3],delay1,x1;
  char result;
  double up,ut;

  data[0] = BMP180_REG_CONTROL;
  data[1] = BMP180_COMMAND_TEMPERATURE;
  writeBytes(data, 2);
  delay(5);

  Wire.beginTransmission(BMP180_ADDR);
  Wire.write(BMP180_REG_RESULT);

  if (Wire.endTransmission() == 0){
    Wire.requestFrom(BMP180_ADDR,2);
    while(Wire.available() != 2) ;
    for(x1=0;x1<2;x1++){
      data[x1] = Wire.read();
    }
    ut = (data[0] * 256.0) + data[1];
    T= calculateTemperature(ut);
  }
  else
    return(0);
 
  data[0] = BMP180_REG_CONTROL;
  data[1] = BMP180_COMMAND_PRESSURE;
  delay1 = 26;//5,8,14,26
  result = writeBytes(data, 2);
  delay(delay1);
  
  Wire.beginTransmission(BMP180_ADDR);
  Wire.write(BMP180_REG_RESULT);
  
  if (Wire.endTransmission() == 0){
    Wire.requestFrom(BMP180_ADDR,3);
    while(Wire.available() != 3) ;
    for(x1=0;x1<3;x1++){
      data[x1] = Wire.read();
    }
    
    up = (data[0] * 256.0) + data[1] + (data[2]/256.0);
    P=calculatePressure(up,T);
    return(1);
  }
  return(0);
}
double calculateTemperature(double ut){
  double T,a;

  a = c5 * (ut - c6);
  T = a + (mc / (a + md));
  
  return T;
}
double calculatePressure(double up,double T){
  double P;
  double s,x,y,z;
  
  s = T - 25.0;
  x = (x2 * pow(s,2)) + (x1 * s) + x0;
  y = (y2 * pow(s,2)) + (y1 * s) + y0;
  z = (up - x) / y;
  P = (p2 * pow(z,2)) + (p1 * z) + p0;
  
  return P;
}

 

 

Links :
Website (BOSCH SensorTec): bit.ly/2kFHiA6
Schematic : bit.ly/2jUFW5a
Code : bit.ly/2kA3465
Datasheet : bit.ly/2jUJNPu

Buy BMP180 : amzn.to/2jVbToN
Buy Arduino : amzn.to/2kzN04g

********************************************************************
Subscribe YouTube : goo.gl/FhfdL7

Guys Subscribe to my channel for latest contents into your inbox.
Support me to keep going.

Support me on Patreon : bit.ly/2jcjTSo

Suvendu Swain
Catch Me On

Suvendu Swain

Blogger/ Educationist at WeArGenius
A person passionate about tech stuffs.
Suvendu Swain
Catch Me On

Latest posts by Suvendu Swain (see all)

Related posts