Added temp compensated altitude calculations

This commit is contained in:
KTOWN
2013-06-17 22:03:43 +02:00
parent 9b87eaefb5
commit 491d1375e7
3 changed files with 51 additions and 9 deletions

View File

@ -19,6 +19,7 @@
#endif
#include <Wire.h>
#include <Math.h>
#include <limits.h>
#include "Adafruit_BMP085.h"
@ -322,14 +323,29 @@ void Adafruit_BMP085::getTemperature(float *temp)
/**************************************************************************/
/*!
Converts pressure in hPa to altitude in meters
Calculates the altitude (in meters) from the specified atmospheric
pressure (in hPa), sea-level pressure (in hPa), and temperature (in <20>C)
@param seaLevel Sea-level pressure in hPa
@param atmospheric Atmospheric pressure in hPa
@param temp Temperature in degrees Celsius
*/
/**************************************************************************/
float Adafruit_BMP085::pressureToAltitude(float pressure_hPa)
float Adafruit_BMP085::pressureToAltitude(float seaLevel, float atmospheric, float temp)
{
return (pressure_hPa
/ (float) pow(1.0F - (SENSORS_PRESSURE_SEALEVELHPA / 44330.0f), 5.255f))
/ 10;
/* Hyposometric formula: */
/* */
/* ((P0/P)^(1/5.257) - 1) * (T + 273.15) */
/* h = ------------------------------------- */
/* 0.0065 */
/* */
/* where: h = height (in meters) */
/* P0 = sea-level pressure (in hPa) */
/* P = atmospheric pressure (in hPa) */
/* T = temperature (in <20>C) */
return (((float)pow((seaLevel/atmospheric), 0.190223F) - 1.0F)
* (temp + 273.15F)) / 0.0065F;
}
/**************************************************************************/

View File

@ -96,7 +96,7 @@ class Adafruit_BMP085 : public Adafruit_Sensor
bool begin(bmp085_mode_t mode = BMP085_MODE_ULTRAHIGHRES);
void getTemperature(float *temp);
void getPressure(float *pressure);
float pressureToAltitude(float pressure_hPa);
float pressureToAltitude(float seaLevel, float atmospheric, float temp);
void getEvent(sensors_event_t*);
void getSensor(sensor_t*);

View File

@ -23,6 +23,7 @@
History
=======
2013/JUN/17 - Updated altitude calculations (KTOWN)
2013/FEB/13 - First version (KTOWN)
*/
@ -79,7 +80,7 @@ void setup(void)
*/
/**************************************************************************/
void loop(void)
{
{
/* Get a new sensor event */
sensors_event_t event;
bmp.getEvent(&event);
@ -87,12 +88,37 @@ void loop(void)
/* Display the results (barometric pressure is measure in hPa) */
if (event.pressure)
{
/* Display atmospheric pressue in hPa */
Serial.print(event.pressure); Serial.print(" hPa");
Serial.print(" ("); Serial.print(bmp.pressureToAltitude(event.pressure)); Serial.println(" m)");
/* Calculating altitude with reasonable accuracy requires pressure *
* sea level pressure for your position at the moment the data is *
* converted, as well as the ambient temperature in degress *
* celcius. If you don't have these values, a 'generic' value of *
* 1013.25 hPa can be used (defined as SENSORS_PRESSURE_SEALEVELHPA *
* in sensors.h), but this isn't ideal and will give variable *
* results from one day to the next. *
* *
* You can usually find the current SLP value by looking at weather *
* websites or from environmental information centers near any major *
* airport. *
* *
* For example, for Paris, France you can check the current mean *
* pressure and sea level at: http://bit.ly/16Au8ol */
float seaLevelPressure = SENSORS_PRESSURE_SEALEVELHPA;
float temperature;
bmp.getTemperature(&temperature);
Serial.print(" (");
Serial.print(bmp.pressureToAltitude(seaLevelPressure,
event.pressure,
temperature));
Serial.println(" m)");
}
else
{
Serial.println("Sensor error");
}
delay(250);
}
}