By using an Arduino Uno board (programming in Simulink), I am tring to read data from a BMP180 sensor and to calculate the true temperature and pressure, by following the functions shown in figure 4 (pag. 15) in the datasheet:
While the temperature reading appears correct, there are some problems with the pressure: in my opinion, by considering the “calculate true pressure” in the datasheet, the coefficients B6, X1, X2, X3, B3, B4, B7, p, UP, are returned when the value 0x2E is write into 0xF4 register: in fact, similar values are returned to me, from my BMP180, when I write the 0x2E value into 0xF4 register, instead of 0x34 (pressure, with OSS = 0).
Moreover, a pressure value of 69964 Pa appears irrealistic: by considering the figure 5, it means an altitude of about 3000 m over the sea level (I do not know if the Bosch research center is so high).
The if condition is not respected: in fact, 0x80000000 means 2147483648 in decimal. Therefore, being B7 = 1171050000 the value 70003 would be returned, as p, instead 69964.
I developed, in Simulink, two different functions: one to calculate the true temperature, the other to calculate the true pressure. If I use, as inputs, the same datasheet values, the two functions return, respectively, 150 and 70003. Therefore, they are correct.
But, if I use the real time data from the sensor, while the temperature (0x2E into 0xF4 register) is a realistic value (about 22 – 24 °C), the pressure (0x34 into 0xF4 register) is not a realistic value (about 81000 Pa), by considering an altitude of 44 m over the sea level of my office.
The BMP180 sensor run properly, since I tested it with an example for the IDE of Arduino Uno.
Therefore my question is: is the “calculate true pressure” function shown in the figure 4 of the datasheet correct or is there a problem?
Solved! Go to Solution.
The BMP180 is end of life and not recommended for new design. We suggest you to switch to our latest pressure sensor BMP388, and use the our standard API available for download from Github.
thank you for the answer and the suggestion. I will be happy to use the new BMP388 for future projects. Actually, I am tring to re-programming some electronic board (Arduino Uno based), where the BMP180 is still employed. At the begin, the temperature reading were sufficient. But now, the pressure is required. To avoid the lost and/or the modification of each board, a check of the mentioned datasheet is needed.
Unfortunately because the product reached end-of-life for some time now, we cannot review this specific documentation. A recommendation from our side we be to look for the latest datasheet revision on our official website rather than third-parties (although this specific section may be identical).
For reference implentation of this algorithm, we provide generic C-code sensor API/drivers as recommended by Elrhoul. It can be found here for the BMP180, and includes the bmp180_data_readout_template() example that shows a typical sensor data read-out sequence including the compensation formulas.
Althought usually I use Simulink as programming languange, from the code that you suggested me I do not find how the true pressure is calculated: in fact, the function:
returns the compensated pressure, but no informations about how this function works can be deduct from the code. This is my problem.