Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
HP03SA.h
00001 /* mbed HP03SA Library, for an I2C Pressure and Temperature sensor which provides derived Altitude values 00002 * Copyright (c) 2015, v01: WH, Initial version, ported in part from Elektor weatherstation (Sept 2011), Author: W. Waetzig 00003 * See http://www.elektor-labs.com/project/usb-long-term-weather-logger-100888.12037.html 00004 * Code also based on several other public sources: 00005 * See http://en.wikipedia.org/wiki/Atmospheric_pressure 00006 * See https://learn.sparkfun.com/tutorials/bmp180-barometric-pressure-sensor-hookup-?_ga=1.94307604.888266135.1310146152 00007 * 00008 * The HP03S pressure sensor from Hope Microelectronics contains a piezoresistive transducer and 00009 * integrated 16-bit A/D converter (ADC), along with control logic and an I2C interface. 00010 * The transducer outputs one voltage that depends on pressure and one that depends on temperature. 00011 * These analogue values are alternately converted by the ADC and the results made available on the I2C interface. 00012 * During the manufacturing process eleven sensor-specific calibration values with a length of two bytes are stored 00013 * in the device’s EEPROM, and these can also be retrieved by the microcontroller. 00014 * The correction-parameters are read out from the device in used in the calculation. 00015 * A 32 kHz clock with an amplitude of 3 V is required to drive the ADC. This could be derived from the mbed PwmOut. 00016 * The HP03SA has an absolute pressure range between 300-1100 hPa. Operating temp is -20 to +60 degrees Celsius. 00017 * Note: 1 atm = 1013.25 hPa = 1013.25 mbar 00018 * 00019 * Unit conversions see http://www.hoperf.com/docs/guide/160.htm 00020 * 00021 * bar Bar convert to 100,000 Pascals exactly 00022 * psi Pounds per Square Inch convert to 6894.76 Pascals 00023 * mb or mbar Millibar convert to 100 Pascals (1 hPa) exactly 00024 * hPa Hectopascal convert to 100 Pascals exactly 00025 * kPa Kilopascal convert to 1,000 Pascals 00026 * MPa Megapascal convert to 1,000,000 Pascals 00027 * Kgf/cm² or kg/cm² Kilogram force per Square Centimetre convert to 98,066.5 Pascals 00028 * N/m² Newton per Square Meter convert to 1 Pascal (SI unit for pressure) 00029 * torr Torr convert to 133.322 Pascals 00030 * mtorr Millitorr convert to 0.133322 Pascals 00031 * mm Hg convert to 133.322387415 Pascals 00032 * 1 atm 1 Atmosphere convert to 101325 Pascals exactly (760 mm Hg) 00033 * 1 atm 1 Atmosphere convert to 1013.25 hPa exactly 00034 * Dynes/cm² or D/cm² Dynes per Square Centimetre convert to 0.1 Pascals exactly 00035 * oz/in² Ounces per Square Inch convert to 430.922 Pascals 00036 * tsi (UK) or tfsi (UK) Tonnes Force per Square Inch (Long, UK) convert to 15444300 Pascals 00037 * tsi (USA) or tfsi (USA) Ton Force per Square Inch (Short, USA) convert to 13789500 Pascals 00038 * tsf (USA) or tfsf (USA) Tons Force per Square Foot (Short, USA) convert to 95760.5 Pascals 00039 * psf Pounds per Square Foot convert to 47.8803 Pascals 00040 * g/cm² or gf/cm² Grammes Force per Square Centimetre convert to 98.0665 Pascals 00041 * 00042 * The Altitude calculation is based on the ICAO Standard Atmosphere model ISA. The code has 00043 * certainly not been thoroughly validated! Use at own risk. 00044 * 00045 * QNH is the barometric altimeter setting that causes an altimeter to read 00046 * airfield elevation above mean sea level when on the airfield. In ISA temperature 00047 * conditions the altimeter will read altitude above mean sea level in the vicinity of the airfield. 00048 * Note: Remember QNH as mnemonic for "nautical height" 00049 * Average sea-level pressure is 101.325 kPa (1013.25 hPa or mbar) or 29.92 inches (inHg) or 00050 * 760 millimetres of mercury (mmHg). In aviation weather reports (METAR), QNH is transmitted 00051 * around the world in hectopascals or millibars (1 hectopascal = 1 millibar), except in the 00052 * United States, Canada, and Colombia where it is reported in inches (to two decimal places) of mercury. 00053 * 00054 * 00055 * Permission is hereby granted, free of charge, to any person obtaining a copy 00056 * of this software and associated documentation files (the "Software"), to deal 00057 * in the Software without restriction, including without limitation the rights 00058 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 00059 * copies of the Software, and to permit persons to whom the Software is 00060 * furnished to do so, subject to the following conditions: 00061 * 00062 * The above copyright notice and this permission notice shall be included in 00063 * all copies or substantial portions of the Software. 00064 * 00065 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00066 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00067 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 00068 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00069 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00070 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 00071 * THE SOFTWARE. 00072 */ 00073 #ifndef MBED_HP03SA_H 00074 #define MBED_HP03SA_H 00075 00076 #include "mbed.h" 00077 00078 /** An interface for the HP03S I2C pressure and temperature sensor 00079 * 00080 * @code 00081 * #include "mbed.h" 00082 * #include "HP03S.h" 00083 * 00084 * // I2C Communication 00085 * I2C i2c(p28,p27); // SDA, SCL 00086 * 00087 * // Serial Communication* 00088 * Serial pc(USBTX,USBRX); 00089 * 00090 * // Instantiate HP03SA 00091 * HP03SA hp03sa(&i2c, D_XCLR); // I2C bus, XCLK Pin 00092 * // Generate the 32kHz master clock for HP03SA 00093 * PwmOut mclk(p21); 00094 * 00095 * int main() { 00096 * pc.printf("Hello World!\n"); 00097 * 00098 * //Init MCLK for HP03SA 00099 * mclk.period_us(30); //32768 KHz 00100 * mclk.pulsewidth_us(15); //32768 KHz 00101 * 00102 * while(1) { 00103 * // Take reading from sensor 00104 * hp03sa.sample(); 00105 * 00106 * // Show Pressure 00107 * pc.printf("Absolute atmospheric pressure is %.1f [hPa]\r\n", (float) hp03sa.getAbsPressure() / 10.0f); 00108 * pc.printf("Sealevel atmospheric pressure is %.1f [hPa]\r\n", (float) hp03sa.getSeaPressure(20) / 10.0f); // About right where I live.. 00109 * 00110 * // Show Temperature 00111 * pc.printf("Ambient temperature is %.1f [C]\r\n", (float) hp03sa.getTemperature() / 10.0f); 00112 * 00113 * // Show Altitude meters 00114 * pc.printf("Altitude estimated at %d [m]\r\n", hp03sa.getAltitude()); 00115 * 00116 * // Show Altitude Ft 00117 * pc.printf("Altitude estimated at %d [ft]\r\n", hp03sa.getAltitudeFt()); 00118 * 00119 * wait(1.0); 00120 * } 00121 * } 00122 * @endcode 00123 */ 00124 00125 // Device I2C Slave addresses 00126 #define HP03SA_BARO_SA 0xEE 00127 #define HP03SA_EEPROM_SA 0xA0 00128 00129 //ISA computation constants 00130 #define RLGM 0.19026674f // ISA Exponent (R * L) / (g * M) 00131 #define GMRL 5.25578009f // ISA Exponent (g * M) / (R * L) 00132 #define LBASE_X10 0.065f // ISA Temp Lapse (i.e. drop) in K per meter x10 00133 #define TBASE_X10 (150.0f + 2731.5f) // ISA Ref Temp in K x10 00134 #define PBASE_X10 (1013.25f * 10.0f) // ISA Ref Pres in hPa x10 00135 00136 /** Create an HP03SA Class instance 00137 * 00138 */ 00139 class HP03SA { 00140 00141 public: 00142 00143 /** Create an HP03SA device instance 00144 * 00145 * @param i2c I2C Bus 00146 * @param XCLR Clock enable control line 00147 */ 00148 HP03SA(I2C *i2c, PinName XCLR); 00149 00150 /** Get Status 00151 * 00152 * @return bool Sensor ready 00153 */ 00154 bool getStatus(void); 00155 00156 /** Get Pressure and Temperature sample 00157 * 00158 * @return none 00159 */ 00160 void sample(void); 00161 00162 /** Get Absolute Atmospheric Pressure in hPa x 10 00163 * Note: sample() must be called before getAbsPressure() 00164 * 00165 * @return int Pressure in hPa x 10 00166 */ 00167 int getAbsPressure(void); 00168 00169 /** Get Sealevel Atmospheric Pressure in hPa x 10 00170 * Note: sample() must be called before getSeaPressure() 00171 * 00172 * @param int alt_meter Altitude above Mean Sea Level where measurement is taken 00173 * @return int Pressure at sea level in hPa x 10 00174 */ 00175 int getSeaPressure(int alt_meter); 00176 00177 /** Get Temperature as int in °Celsius x 10 00178 * Note: sample() must be called before getTemperature() 00179 * 00180 * @return int Temperature in °Celsius x 10 00181 */ 00182 int getTemperatureInt(void); 00183 00184 /** Get Temperature as float in °Celsius 00185 * Note: sample() must be called before getTemperatureFl() 00186 * 00187 * @return float Temperature in °Celsius 00188 */ 00189 float getTemperature(void); 00190 00191 /** Get Altitude in meters using ISA 00192 * Note: sample() must be called before getAltitude() 00193 * 00194 * @return int Altitude in meters above Mean Sea Level (MSL) 00195 */ 00196 int getAltitude(void); 00197 00198 /** Get Altitude in feet using ISA 00199 * Note: sample() must be called before getAltitudeFt() 00200 * 00201 * @return int Altitude in feet above Mean Sea Level (MSL) 00202 */ 00203 int getAltitudeFt(); 00204 00205 /** Set QNH Pressure to calibrate sensor 00206 * 00207 * @param int pressure_x10 at Mean Sea Level in hPa x 10 00208 * The getAltitude() reading will be 0 m for the set pressure. 00209 */ 00210 void setPressure(int pressure_x10 = PBASE_X10); 00211 00212 /** Set QNH Altitude in meter to calibrate sensor 00213 * 00214 * @param int alt_meter Altitude in meters above Mean Sea Level (MSL) for current pressure 00215 * The getAltitude() reading will be 'alt_meter' m for the current pressure. 00216 */ 00217 void setAltitude(int alt_meter = 0); 00218 00219 00220 /** Set QNH Altitude in feet to calibrate sensor 00221 * 00222 * @param int alt_feet Altitude in meters above Mean Sea Level (MSL) for current pressure 00223 * The getAltitudeFt() reading will be 'alt_feet' ft for the current pressure. 00224 */ 00225 void setAltitudeFt(int alt_feet = 0); 00226 00227 00228 /** Convert Temperature from °Celsius into °Fahrenheit 00229 * 00230 * @param float celsius in °Celsius 00231 * @return float temperature in °Fahrenheit 00232 */ 00233 float celsiusToFahrenheit(float celsius); 00234 00235 private: 00236 00237 /** Init HP03SA device 00238 * 00239 * @return none 00240 */ 00241 void _init(); 00242 00243 /** Read ADC value (either pressure or temperature depending on Control Register setting) 00244 * 00245 * @return int pressure or temperature 00246 */ 00247 int _readADC (void); 00248 00249 /** Read Pressure and Temperature 00250 * 00251 * @return none 00252 */ 00253 void _readTempPres(void); 00254 00255 /** Calculate Pressure and Temperature 00256 * 00257 * @return none 00258 */ 00259 void _calcTempPres(void); 00260 00261 /** Calculate Altitude 00262 * 00263 * @return none 00264 */ 00265 void _calcAlt(void); 00266 00267 //I2C interface and ADC control 00268 I2C *_i2c; 00269 DigitalOut _xclr; 00270 00271 //Raw values, computed values 00272 int _D1, _D2; // measured values: pressure,temperature. 00273 int _dUT, _off; // auxiliary variables 00274 int _sens, _x; // auxiliary variables 00275 int _temp_x10; // temperature in Celsius x 10 00276 int _pres_x10; // pressure in hPa x 10 00277 int _alt; // altitude in m 00278 float _pres_base_x10; 00279 float _temp_base_x10; 00280 00281 //Calibration coefficients 00282 int _C1, //Sensitivity coefficient 00283 _C2, //Offset coefficient 00284 _C3, //Temp coefficient of sensitivity 00285 _C4, //Temp coefficient of offset 00286 _C5, //Reference temperature 00287 _C6, //Temp coefficient of temperrature 00288 _C7; //Offset fine tuning 00289 //Sensor correction-parameters A, B, C, D 00290 int _A, _B, _C, _D; 00291 }; 00292 00293 #endif
Generated on Wed Jul 13 2022 10:14:21 by
1.7.2
HP03SA pressure sensor and altimeter