Skip to content

BMP180 temperature

BMP180 sensor

Read values from a BMP180 sensor and dump them to the serial port.

For connection details refer here

Screenshot

The code

examples/C/BMP180_UART_DEMO.c

/*
Scan the I2C bus and send results via UART.
*/

#include <avr/kp.h>   // Include file for I/O operations


#define REG_CONTROL 0xF4
#define CMD_TEMP 0x2E

#define REG_RESULT 0xF6

int main (void)
{

uint8_t addresses[20], found,temp_cmd[]={REG_CONTROL, CMD_TEMP}, res[10]={0,0,0,0,0,0,0,0,0,0},i=0;

i2c_init();
uart_init(38400);


for(;;)
    {

	found = i2c_scan(&addresses[0]); // i2c scan will store the addresses in `addresses`, and return total found sensors.

	for(i=0;i<found;i++){	
		uart_send_byte_ascii(addresses[i]); // send address
		uart_send_byte(','); // send comma.

		//BMP180 detected at 119 (0x77). read values from it and send over UART
		for(;addresses[i] == 0x77;){
				delay_ms(10);
				// write to 0x77 (bmp180 address) , 0xF4 and 0x2E
				i2c_write(0x77 , &temp_cmd[0], 2); // init temperature measurement
				delay_ms(10);
				// read 2 bytes from the result register
				i2c_read(0x77, REG_RESULT, &res[0],2);

				uart_send_byte_ascii(res[0]); // send MSB
				uart_send_byte(',');
				uart_send_byte_ascii(res[1]); // send LSB
				uart_send_byte('\n');
				//  rawT = (res[0] << 8) + res[1]
			          //  a = c5 * (rawT  - c6)
                            // Temperature = a + (mc / (a + md))

				// sample values. loaded from the chip: 
				// c5 = 0.004824447631835938 
				// c6 = 20636.0 
				// mc = -942.88
				// md = 16.50625

			}

		

		}
	if(found)
		uart_send_byte('\n');
          delay_ms(500);

  }

return 0;
}

Example calculations

The BMP180 hardware contains a dozen calibration coefficients which must be read and stored before acquiring data. We have avoided this step to avoid complicating the program, and have instead provided sample values for the temperature measurement process.

c5 = 0.004824447631835938 
c6 = 20636.0 
mc = -942.88
md = 16.50625

Sample calculation for raw values 116(MSB), 196(LSB) .

In [2]: (116<<8) + 196
Out[2]: 29892

In [3]: rawt= (116<<8) + 196

In [4]: a = 0.00482444*(rawt - 20636)

In [5]: a
Out[5]: 44.65501664

In [6]: a+(-942/(a+16.506))
Out[6]: 29.253048985591825