Llibrary for the WiGo MPL3115A2, I2C Precision Altimeter sensor. This is a temp fork

Dependents:   sensor AerCloud_MutliTech_Socket_Modem_Example Freescale_Multi-Sensor_Shield 2lemetry_Sensor_Example ... more

Fork of MPL3115A2 by clemente di caprio

Committer:
screamer
Date:
Fri Jul 25 11:34:09 2014 +0000
Revision:
11:8c90a97b1036
Parent:
10:82ac06669316
Change the constructor to accept Int1 and Int2 interrupts as params and removed dependency on Freescale specific pin naming

Who changed what in which revision?

UserRevisionLine numberNew contents of line
clemente 0:cfecfabc5e23 1 #ifndef MPL3115A2_H
clemente 0:cfecfabc5e23 2 #define MPL3115A2_H
clemente 0:cfecfabc5e23 3
clemente 0:cfecfabc5e23 4 #include "mbed.h"
clemente 0:cfecfabc5e23 5
clemente 3:a2f1752add9a 6 // Oversampling value and minimum time between sample
clemente 3:a2f1752add9a 7 #define OVERSAMPLE_RATIO_1 0 // 6 ms
clemente 3:a2f1752add9a 8 #define OVERSAMPLE_RATIO_2 1 // 10 ms
clemente 3:a2f1752add9a 9 #define OVERSAMPLE_RATIO_4 2 // 18 ms
clemente 3:a2f1752add9a 10 #define OVERSAMPLE_RATIO_8 3 // 34 ms
clemente 3:a2f1752add9a 11 #define OVERSAMPLE_RATIO_16 4 // 66 ms
clemente 3:a2f1752add9a 12 #define OVERSAMPLE_RATIO_32 5 // 130 ms
clemente 3:a2f1752add9a 13 #define OVERSAMPLE_RATIO_64 6 // 258 ms
clemente 3:a2f1752add9a 14 #define OVERSAMPLE_RATIO_128 7 // 512 ms
clemente 0:cfecfabc5e23 15
clemente 0:cfecfabc5e23 16 /* Mode */
clemente 0:cfecfabc5e23 17 #define ALTIMETER_MODE 1
clemente 0:cfecfabc5e23 18 #define BAROMETRIC_MODE 2
clemente 0:cfecfabc5e23 19
clemente 0:cfecfabc5e23 20 /**
clemente 0:cfecfabc5e23 21 * MPL3115A2 Altimeter example
clemente 0:cfecfabc5e23 22 *
clemente 0:cfecfabc5e23 23 * @code
clemente 0:cfecfabc5e23 24 * #include "mbed.h"
clemente 0:cfecfabc5e23 25 * #include "MPL3115A2.h"
clemente 0:cfecfabc5e23 26 *
clemente 0:cfecfabc5e23 27 * #define MPL3115A2_I2C_ADDRESS (0x60<<1)
clemente 1:30a04f651efe 28 * MPL3115A2 wigo_sensor1(PTE0, PTE1, MPL3115A2_I2C_ADDRESS);
clemente 0:cfecfabc5e23 29 * Serial pc(USBTX, USBRX);
clemente 0:cfecfabc5e23 30 *
clemente 1:30a04f651efe 31 * // pos [0] = altitude or pressure value
clemente 1:30a04f651efe 32 * // pos [1] = temperature value
clemente 1:30a04f651efe 33 * float sensor_data[2];
clemente 1:30a04f651efe 34 *
clemente 0:cfecfabc5e23 35 * int main(void) {
clemente 0:cfecfabc5e23 36 *
clemente 0:cfecfabc5e23 37 * pc.baud( 230400);
clemente 0:cfecfabc5e23 38 * pc.printf("MPL3115A2 Altimeter mode. [%d]\r\n", wigo_sensor1.getDeviceID());
clemente 0:cfecfabc5e23 39 *
clemente 0:cfecfabc5e23 40 * wigo_sensor1.Oversample_Ratio( OVERSAMPLE_RATIO_32);
clemente 0:cfecfabc5e23 41 *
clemente 0:cfecfabc5e23 42 * while(1) {
clemente 0:cfecfabc5e23 43 * //
clemente 0:cfecfabc5e23 44 * if ( wigo_sensor1.isDataAvailable()) {
clemente 0:cfecfabc5e23 45 * wigo_sensor1.getAllData( &sensor_data[0]);
clemente 1:30a04f651efe 46 * pc.printf("\tAltitude: %f\tTemperature: %f\r\n", sensor_data[0], sensor_data[1]);
clemente 0:cfecfabc5e23 47 * }
clemente 0:cfecfabc5e23 48 * //
clemente 0:cfecfabc5e23 49 * wait( 0.001);
clemente 0:cfecfabc5e23 50 * }
clemente 0:cfecfabc5e23 51 *
clemente 0:cfecfabc5e23 52 * }
clemente 0:cfecfabc5e23 53 * @endcode
clemente 0:cfecfabc5e23 54 */
clemente 0:cfecfabc5e23 55 class MPL3115A2
clemente 0:cfecfabc5e23 56 {
clemente 0:cfecfabc5e23 57 public:
clemente 2:a2fcfb7ff611 58 /**
screamer 11:8c90a97b1036 59 * MPL3115A2 constructor
screamer 11:8c90a97b1036 60 *
screamer 11:8c90a97b1036 61 * @param sda SDA pin
screamer 11:8c90a97b1036 62 * @param sdl SCL pin
screamer 11:8c90a97b1036 63 * @param addr addr of the I2C peripheral
screamer 11:8c90a97b1036 64 * @param int1 InterruptIn
screamer 11:8c90a97b1036 65 * @param int2 InterruptIn
screamer 11:8c90a97b1036 66 *
screamer 11:8c90a97b1036 67 * Interrupt schema:
screamer 11:8c90a97b1036 68 *
screamer 11:8c90a97b1036 69 * * The Altitude Trigger use the IRQ1 - Altitude Trigger -> MPL3115A2_Int1.fall -> AltitudeTrg_IRQ -> MPL3115A2_usr1_fptr
screamer 11:8c90a97b1036 70 *
screamer 11:8c90a97b1036 71 * * The Data ready use the IRQ2 - Data Ready -> MPL3115A2_Int2.fall -> DataReady_IRQ -> MPL3115A2_usr2_fptr
screamer 11:8c90a97b1036 72 */
screamer 11:8c90a97b1036 73 MPL3115A2(PinName sda, PinName scl, int addr, PinName int1, PinName int2);
clemente 2:a2fcfb7ff611 74
clemente 2:a2fcfb7ff611 75 /**
clemente 2:a2fcfb7ff611 76 * Get the value of the WHO_AM_I register
clemente 2:a2fcfb7ff611 77 *
clemente 2:a2fcfb7ff611 78 * @returns DEVICE_ID value == 0xC4
clemente 2:a2fcfb7ff611 79 */
clemente 2:a2fcfb7ff611 80 uint8_t getDeviceID();
clemente 2:a2fcfb7ff611 81
clemente 2:a2fcfb7ff611 82 /**
clemente 2:a2fcfb7ff611 83 * Return the STATUS register value
clemente 2:a2fcfb7ff611 84 *
clemente 2:a2fcfb7ff611 85 * @returns STATUS register value
clemente 2:a2fcfb7ff611 86 */
clemente 2:a2fcfb7ff611 87 unsigned char getStatus( void);
clemente 2:a2fcfb7ff611 88
clemente 2:a2fcfb7ff611 89 /**
clemente 2:a2fcfb7ff611 90 * Get the altimeter value
clemente 2:a2fcfb7ff611 91 *
clemente 2:a2fcfb7ff611 92 * @returns altimeter value as float
clemente 2:a2fcfb7ff611 93 */
clemente 2:a2fcfb7ff611 94 float getAltimeter( void);
clemente 5:9edec5ee8bf4 95
clemente 5:9edec5ee8bf4 96 /**
clemente 5:9edec5ee8bf4 97 * Get the altimeter value in raw mode
clemente 5:9edec5ee8bf4 98 *
clemente 5:9edec5ee8bf4 99 * @param dt pointer to unsigned char array
clemente 6:03c24251e500 100 * @returns 1 if data are available, 0 if not.
clemente 5:9edec5ee8bf4 101 */
clemente 5:9edec5ee8bf4 102 unsigned int getAltimeterRaw( unsigned char *dt);
clemente 2:a2fcfb7ff611 103
clemente 2:a2fcfb7ff611 104 /**
clemente 2:a2fcfb7ff611 105 * Get the pressure value
clemente 2:a2fcfb7ff611 106 *
clemente 2:a2fcfb7ff611 107 * @returns pressure value as float
clemente 2:a2fcfb7ff611 108 */
clemente 2:a2fcfb7ff611 109 float getPressure( void);
clemente 5:9edec5ee8bf4 110
clemente 5:9edec5ee8bf4 111 /**
clemente 5:9edec5ee8bf4 112 * Get the pressure value in raw mode
clemente 5:9edec5ee8bf4 113 *
clemente 5:9edec5ee8bf4 114 * @param dt pointer to unsigned char array
clemente 6:03c24251e500 115 * @returns 1 if data are available, 0 if not.
clemente 5:9edec5ee8bf4 116 */
clemente 5:9edec5ee8bf4 117 unsigned int getPressureRaw( unsigned char *dt);
clemente 2:a2fcfb7ff611 118
clemente 2:a2fcfb7ff611 119 /**
clemente 2:a2fcfb7ff611 120 * Get the temperature value
clemente 2:a2fcfb7ff611 121 *
clemente 2:a2fcfb7ff611 122 * @returns temperature value as float
clemente 2:a2fcfb7ff611 123 */
clemente 2:a2fcfb7ff611 124 float getTemperature( void);
clemente 5:9edec5ee8bf4 125
clemente 5:9edec5ee8bf4 126 /**
clemente 5:9edec5ee8bf4 127 * Get the temperature value in raw mode
clemente 5:9edec5ee8bf4 128 *
clemente 5:9edec5ee8bf4 129 * @param dt pointer to unsigned char array
clemente 6:03c24251e500 130 * @returns 1 if data are available, 0 if not.
clemente 5:9edec5ee8bf4 131 */
clemente 5:9edec5ee8bf4 132 unsigned int getTemperatureRaw( unsigned char *dt);
clemente 2:a2fcfb7ff611 133
clemente 2:a2fcfb7ff611 134 /**
clemente 2:a2fcfb7ff611 135 * Set the Altimeter Mode
clemente 2:a2fcfb7ff611 136 *
clemente 2:a2fcfb7ff611 137 * @returns none
clemente 2:a2fcfb7ff611 138 */
clemente 2:a2fcfb7ff611 139 void Altimeter_Mode( void);
clemente 2:a2fcfb7ff611 140
clemente 2:a2fcfb7ff611 141 /**
clemente 2:a2fcfb7ff611 142 * Set the Barometric Mode
clemente 2:a2fcfb7ff611 143 *
clemente 2:a2fcfb7ff611 144 * @returns none
clemente 2:a2fcfb7ff611 145 */
clemente 2:a2fcfb7ff611 146 void Barometric_Mode( void);
clemente 2:a2fcfb7ff611 147
clemente 2:a2fcfb7ff611 148 /**
clemente 5:9edec5ee8bf4 149 * Get the altimeter or pressure and temperature values
clemente 2:a2fcfb7ff611 150 *
clemente 5:9edec5ee8bf4 151 * @param array of float f[2]
clemente 6:03c24251e500 152 * @returns 0 no data available, 1 for data available
clemente 2:a2fcfb7ff611 153 */
clemente 6:03c24251e500 154 unsigned int getAllData( float *f);
clemente 5:9edec5ee8bf4 155
clemente 5:9edec5ee8bf4 156 /**
clemente 10:82ac06669316 157 * Get the altimeter or pressure and temperature values and the delta values
clemente 10:82ac06669316 158 *
clemente 10:82ac06669316 159 * @param array of float f[2], array of float d[2]
clemente 10:82ac06669316 160 * @returns 0 no data available, 1 for data available
clemente 10:82ac06669316 161 */
clemente 10:82ac06669316 162 unsigned int getAllData( float *f, float *d);
clemente 10:82ac06669316 163
clemente 10:82ac06669316 164 /**
clemente 9:75a5960adf5c 165 * Get the altimeter or pressure and temperature captured maximum value
clemente 9:75a5960adf5c 166 *
clemente 9:75a5960adf5c 167 * @param array of float f[2]
clemente 9:75a5960adf5c 168 * @returns 0 no data available, 1 for data available
clemente 9:75a5960adf5c 169 */
clemente 9:75a5960adf5c 170 void getAllMaximumData( float *f);
clemente 9:75a5960adf5c 171
clemente 9:75a5960adf5c 172 /**
clemente 9:75a5960adf5c 173 * Get the altimeter or pressure and temperature captured minimum value
clemente 9:75a5960adf5c 174 *
clemente 9:75a5960adf5c 175 * @param array of float f[2]
clemente 9:75a5960adf5c 176 * @returns 0 no data available, 1 for data available
clemente 9:75a5960adf5c 177 */
clemente 9:75a5960adf5c 178 void getAllMinimumData( float *f);
clemente 9:75a5960adf5c 179
clemente 9:75a5960adf5c 180 /**
clemente 5:9edec5ee8bf4 181 * Get the altimeter or pressure, and temperature values in raw mode
clemente 5:9edec5ee8bf4 182 *
clemente 5:9edec5ee8bf4 183 * @param array of unsigned char[5]
clemente 6:03c24251e500 184 * @returns 1 if data are available, 0 if not.
clemente 5:9edec5ee8bf4 185 */
clemente 5:9edec5ee8bf4 186 unsigned int getAllDataRaw( unsigned char *dt);
clemente 2:a2fcfb7ff611 187
clemente 2:a2fcfb7ff611 188 /**
clemente 2:a2fcfb7ff611 189 * Return if there are date available
clemente 2:a2fcfb7ff611 190 *
clemente 6:03c24251e500 191 * @return 0 for no data available, bit0 set for Temp data available, bit1 set for Press/Alti data available
clemente 6:03c24251e500 192 * bit2 set for both Temp and Press/Alti data available
clemente 2:a2fcfb7ff611 193 */
clemente 2:a2fcfb7ff611 194 unsigned int isDataAvailable( void);
clemente 2:a2fcfb7ff611 195
clemente 2:a2fcfb7ff611 196 /**
clemente 2:a2fcfb7ff611 197 * Set the oversampling rate value
clemente 2:a2fcfb7ff611 198 *
clemente 2:a2fcfb7ff611 199 * @param oversampling values. See MPL3115A2.h
clemente 2:a2fcfb7ff611 200 * @return none
clemente 2:a2fcfb7ff611 201 */
clemente 2:a2fcfb7ff611 202 void Oversample_Ratio( unsigned int ratio);
clemente 0:cfecfabc5e23 203
clemente 2:a2fcfb7ff611 204 /**
clemente 2:a2fcfb7ff611 205 * Configure the sensor to streaming data using Interrupt
clemente 2:a2fcfb7ff611 206 *
clemente 2:a2fcfb7ff611 207 * @param user functin callback, oversampling values. See MPL3115A2.h
clemente 2:a2fcfb7ff611 208 * @return none
clemente 2:a2fcfb7ff611 209 */
clemente 2:a2fcfb7ff611 210 void DataReady( void(*fptr)(void), unsigned char OS);
clemente 3:a2f1752add9a 211
clemente 3:a2f1752add9a 212 /**
clemente 4:fdf14a259af8 213 * Configure the sensor to generate an Interrupt crossing the center threshold
clemente 3:a2f1752add9a 214 *
clemente 4:fdf14a259af8 215 * @param user functin callback, level in meter
clemente 3:a2f1752add9a 216 * @return none
clemente 3:a2f1752add9a 217 */
clemente 3:a2f1752add9a 218 void AltitudeTrigger( void(*fptr)(void), unsigned short level);
clemente 2:a2fcfb7ff611 219
clemente 2:a2fcfb7ff611 220 /**
clemente 2:a2fcfb7ff611 221 * Soft Reset
clemente 2:a2fcfb7ff611 222 *
clemente 2:a2fcfb7ff611 223 * @param none
clemente 2:a2fcfb7ff611 224 * @return none
clemente 2:a2fcfb7ff611 225 */
clemente 2:a2fcfb7ff611 226 void Reset( void);
clemente 0:cfecfabc5e23 227
clemente 8:89ed6aeb5dbb 228 /**
clemente 8:89ed6aeb5dbb 229 * Configure the Pressure offset.
clemente 8:89ed6aeb5dbb 230 * Pressure user accessible offset trim value expressed as an 8-bit 2's complement number.
clemente 8:89ed6aeb5dbb 231 * The user offset registers may be adjusted to enhance accuracy and optimize the system performance.
clemente 8:89ed6aeb5dbb 232 * Range is from -512 to +508 Pa, 4 Pa per LSB.
clemente 8:89ed6aeb5dbb 233 * In RAW output mode no scaling or offsets will be applied in the digital domain
clemente 8:89ed6aeb5dbb 234 *
clemente 8:89ed6aeb5dbb 235 * @param offset
clemente 8:89ed6aeb5dbb 236 * @return none
clemente 8:89ed6aeb5dbb 237 */
clemente 8:89ed6aeb5dbb 238 void SetPressureOffset( char offset);
clemente 8:89ed6aeb5dbb 239
clemente 8:89ed6aeb5dbb 240 /**
clemente 8:89ed6aeb5dbb 241 * Configure the Temperature offset.
clemente 8:89ed6aeb5dbb 242 * Temperature user accessible offset trim value expressed as an 8-bit 2's complement number.
clemente 8:89ed6aeb5dbb 243 * The user offset registers may be adjusted to enhance accuracy and optimize the system performance.
clemente 8:89ed6aeb5dbb 244 * Range is from -8 to +7.9375°C 0.0625°C per LSB.
clemente 8:89ed6aeb5dbb 245 * In RAW output mode no scaling or offsets will be applied in the digital domain
clemente 8:89ed6aeb5dbb 246 *
clemente 8:89ed6aeb5dbb 247 * @param offset
clemente 8:89ed6aeb5dbb 248 * @return none
clemente 8:89ed6aeb5dbb 249 */
clemente 8:89ed6aeb5dbb 250 void SetTemperatureOffset( char offset);
clemente 8:89ed6aeb5dbb 251
clemente 8:89ed6aeb5dbb 252 /**
clemente 8:89ed6aeb5dbb 253 * Configure the Altitude offset.
clemente 8:89ed6aeb5dbb 254 * Altitude Data User Offset Register (OFF_H) is expressed as a 2’s complement number in meters.
clemente 8:89ed6aeb5dbb 255 * The user offset register provides user adjustment to the vertical height of the Altitude output.
clemente 8:89ed6aeb5dbb 256 * The range of values are from -128 to +127 meters.
clemente 8:89ed6aeb5dbb 257 * In RAW output mode no scaling or offsets will be applied in the digital domain
clemente 8:89ed6aeb5dbb 258 *
clemente 8:89ed6aeb5dbb 259 * @param offset
clemente 8:89ed6aeb5dbb 260 * @return none
clemente 8:89ed6aeb5dbb 261 */
clemente 8:89ed6aeb5dbb 262 void SetAltitudeOffset( char offset);
clemente 8:89ed6aeb5dbb 263
clemente 0:cfecfabc5e23 264 private:
clemente 2:a2fcfb7ff611 265 I2C m_i2c;
clemente 2:a2fcfb7ff611 266 int m_addr;
screamer 11:8c90a97b1036 267 InterruptIn MPL3115A2_Int1;
screamer 11:8c90a97b1036 268 InterruptIn MPL3115A2_Int2;
screamer 11:8c90a97b1036 269
clemente 2:a2fcfb7ff611 270 unsigned char MPL3115A2_mode;
clemente 2:a2fcfb7ff611 271 unsigned char MPL3115A2_oversampling;
clemente 2:a2fcfb7ff611 272 void DataReady_IRQ( void);
clemente 3:a2f1752add9a 273 void AltitudeTrg_IRQ( void);
clemente 2:a2fcfb7ff611 274
clemente 2:a2fcfb7ff611 275 /** Set the device in active mode
clemente 2:a2fcfb7ff611 276 */
clemente 2:a2fcfb7ff611 277 void Active( void);
clemente 2:a2fcfb7ff611 278
clemente 2:a2fcfb7ff611 279 /** Set the device in standby mode
clemente 2:a2fcfb7ff611 280 */
clemente 2:a2fcfb7ff611 281 void Standby( void);
clemente 2:a2fcfb7ff611 282
clemente 9:75a5960adf5c 283 /** Get the altimiter value from the sensor.
clemente 9:75a5960adf5c 284 *
clemente 9:75a5960adf5c 285 * @param reg the register from which read the data.
clemente 9:75a5960adf5c 286 * Can be: REG_ALTIMETER_MSB for altimeter value
clemente 9:75a5960adf5c 287 * REG_ALTI_MIN_MSB for the minimum value captured
clemente 9:75a5960adf5c 288 * REG_ALTI_MAX_MSB for the maximum value captured
clemente 9:75a5960adf5c 289 */
clemente 9:75a5960adf5c 290 float getAltimeter( unsigned char reg);
clemente 9:75a5960adf5c 291
clemente 9:75a5960adf5c 292 /** Get the pressure value from the sensor.
clemente 9:75a5960adf5c 293 *
clemente 9:75a5960adf5c 294 * @param reg the register from which read the data.
clemente 9:75a5960adf5c 295 * Can be: REG_PRESSURE_MSB for altimeter value
clemente 9:75a5960adf5c 296 * REG_PRES_MIN_MSB for the minimum value captured
clemente 9:75a5960adf5c 297 * REG_PRES_MAX_MSB for the maximum value captured
clemente 9:75a5960adf5c 298 */
clemente 9:75a5960adf5c 299 float getPressure( unsigned char reg);
clemente 9:75a5960adf5c 300
clemente 9:75a5960adf5c 301 /** Get the altimiter value from the sensor.
clemente 9:75a5960adf5c 302 *
clemente 9:75a5960adf5c 303 * @param reg the register from which read the data.
clemente 9:75a5960adf5c 304 * Can be: REG_TEMP_MSB for altimeter value
clemente 9:75a5960adf5c 305 * REG_TEMP_MIN_MSB for the minimum value captured
clemente 9:75a5960adf5c 306 * REG_TEMP_MAX_MSB for the maximum value captured
clemente 9:75a5960adf5c 307 */
clemente 9:75a5960adf5c 308 float getTemperature( unsigned char reg);
clemente 9:75a5960adf5c 309
clemente 2:a2fcfb7ff611 310 void readRegs(int addr, uint8_t * data, int len);
clemente 2:a2fcfb7ff611 311 void writeRegs(uint8_t * data, int len);
clemente 0:cfecfabc5e23 312
clemente 0:cfecfabc5e23 313 };
clemente 0:cfecfabc5e23 314
clemente 0:cfecfabc5e23 315 #endif