int read_bmp280_values()

in shakti/parashu/main.c [124:202]


int read_bmp280_values(i2c_struct * instance, uint32_t reg_offset,
		       uint32_t *pressure, uint32_t *temperature, uint32_t delay)
{
	unsigned char read_buf[6] = {'\0'};
	int32_t adc_P, adc_T, var1, var2, t_fine; 
	int32_t temp;
	int32_t p;

	//Writes the slave address for write
	i2c_send_slave_address(instance, BMP280_SLAVE_ADDRESS, I2C_WRITE, 800);

	//Writes the pointer to address that needs to be read
	i2c_write_data(instance, reg_offset , delay);

	//Stops the I2C transaction to start reading the temperature value.
	instance->control = I2C_STOP;

	//Writes the slave address for read
	i2c_send_slave_address(instance, BMP280_SLAVE_ADDRESS, I2C_READ, 800);

	/* Make a dummy read as per spec of the I2C controller */
	i2c_read_data(instance, read_buf, delay);

	//Read Pressure
	i2c_read_data(instance, &read_buf[0], delay);
	i2c_read_data(instance, &read_buf[1], delay);
	i2c_read_data(instance, &read_buf[2], delay);

	//Read Temperature	
	i2c_read_data(instance, &read_buf[3], delay);
	i2c_read_data(instance, &read_buf[4], delay);
	instance->control = I2C_NACK;
	i2c_read_data(instance, &read_buf[5], delay);

	instance->control = I2C_STOP;
	adc_P = ((read_buf[0] << 12) | (read_buf[1] << 4) | (read_buf[2] >> 4));
	adc_T = ((read_buf[3] << 12) | (read_buf[4] << 4) | (read_buf[5] >> 4));

	// Calculate TEMPERATURE
	var1 = ((((adc_T / 8) - ((int32_t)bmp280_calib_dig_T1 * 2))) * ((int32_t)bmp280_calib_dig_T2)) / 2048;
	var2 = (((((adc_T / 16) - ((int32_t)bmp280_calib_dig_T1)) * ((adc_T / 16) - ((int32_t)bmp280_calib_dig_T1))) / 4096) * ((int32_t)bmp280_calib_dig_T3)) / 16384;
	t_fine = var1 + var2;

	temp = (t_fine * 5 + 128) / 256;
	*temperature = temp;

	printf("\nTemperature Value:%lu.%lu °C", (temp/100),(temp%100));

	//Calculate Pressure
	var1 = 0; 
	var2 = 0;

	var1 = (((int32_t)t_fine) / 2) - (int32_t)64000;
	var2 = (((var1/4) * (var1/4)) / 2048 ) * ((int32_t)bmp280_calib_dig_P6);
	var2 = var2 + ((var1 * ((int32_t)bmp280_calib_dig_P5)) * 2);
	var2 = (var2/4) + (((int32_t)bmp280_calib_dig_P4) * 65536);
	var1 = ((((int32_t)bmp280_calib_dig_P3 * (((var1/4) * (var1/4)) / 8192 )) / 8) + ((((int32_t)bmp280_calib_dig_P2) * var1)/2)) / 262144;
	var1 =((((32768 + var1)) * ((int32_t)bmp280_calib_dig_P1)) / 32768);

	if (var1 == 0)
		return 0; // avoid exception caused by division by zero

	p = (((uint32_t)(((int32_t)1048576) - adc_P) - (var2 / 4096))) * 3125;

	if (p < (int32_t) 0x80000000)
		p = (p * 2) / ((uint32_t)var1);

	else
		p = (p / (uint32_t)var1) * 2;

	var1 = (((int32_t)bmp280_calib_dig_P9) * ((int32_t)(((p/8) * (p/8)) / 8192))) / 4096;
	var2 = (((int32_t)(p/4)) * ((int32_t)bmp280_calib_dig_P8)) / 8192;

	p = (uint32_t)((int32_t)p + ((var1 + var2 + (int32_t)bmp280_calib_dig_P7)/16));
	*pressure = p;

	printf("\nThe Pressure Value:%lu.%lu Kpa",(p/1000),(p%1000));
	return 0;
}