a

Dependents:   FM_integration_off

Fork of MPL3115A2 by Michael Lange

Committer:
sophtware
Date:
Tue Apr 01 21:35:23 2014 +0000
Revision:
0:beb43bc3d6d4
Child:
1:a011ae93a350
Initial Checkin

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sophtware 0:beb43bc3d6d4 1 /*
sophtware 0:beb43bc3d6d4 2 MPL3115A2 Barometric Pressure and Tempurature Sensor Library
sophtware 0:beb43bc3d6d4 3 By: Michael Lange
sophtware 0:beb43bc3d6d4 4 Date: March 31, 2014
sophtware 0:beb43bc3d6d4 5 License: This code is public domain.
sophtware 0:beb43bc3d6d4 6
sophtware 0:beb43bc3d6d4 7 This class wraps the functions of the MPL3115A2 sensor into
sophtware 0:beb43bc3d6d4 8 a usable class that exposes most functions to your project.
sophtware 0:beb43bc3d6d4 9 Functions that are not exposed can easily be added using the
sophtware 0:beb43bc3d6d4 10 existing functions in this library. Specifically, I did not
sophtware 0:beb43bc3d6d4 11 add any funtions to handle FIFO logging or the use of either
sophtware 0:beb43bc3d6d4 12 of the pin interrupts. This should not be too difficult to
sophtware 0:beb43bc3d6d4 13 add if you need those features.
sophtware 0:beb43bc3d6d4 14
sophtware 0:beb43bc3d6d4 15 The motivation here was to get a set of support classes
sophtware 0:beb43bc3d6d4 16 together that supported the chip and could be expanded on.
sophtware 0:beb43bc3d6d4 17 With this library you can extract all relevant data from the
sophtware 0:beb43bc3d6d4 18 sensor.
sophtware 0:beb43bc3d6d4 19
sophtware 0:beb43bc3d6d4 20 Be sure to download the DATASHEET and the App Note AN4519.
sophtware 0:beb43bc3d6d4 21
sophtware 0:beb43bc3d6d4 22 This libraray was created using the mbed NXP LPC11U24. Pins
sophtware 0:beb43bc3d6d4 23 p27 and p28 were used for the I2C functions. Be sure to install
sophtware 0:beb43bc3d6d4 24 1K pull-up resistors on both lines. Also, if you're not using
sophtware 0:beb43bc3d6d4 25 the SparkFun breakout board, be sure to use the right caps on
sophtware 0:beb43bc3d6d4 26 the power pin. If you don't, the jitter can cause problems.
sophtware 0:beb43bc3d6d4 27
sophtware 0:beb43bc3d6d4 28 This library was inspired by the similar library available for
sophtware 0:beb43bc3d6d4 29 the Arduino written by Nathan Seidle at SparkFun. I copied
sophtware 0:beb43bc3d6d4 30 some of the number crunching routines and tried to follow his
sophtware 0:beb43bc3d6d4 31 style of coding for the library. That way users of Arduinos
sophtware 0:beb43bc3d6d4 32 cound step into this library a little easier.
sophtware 0:beb43bc3d6d4 33
sophtware 0:beb43bc3d6d4 34 */
sophtware 0:beb43bc3d6d4 35
sophtware 0:beb43bc3d6d4 36
sophtware 0:beb43bc3d6d4 37 #ifndef MPL3115A2_H
sophtware 0:beb43bc3d6d4 38 #define MPL3115A2_H
sophtware 0:beb43bc3d6d4 39
sophtware 0:beb43bc3d6d4 40 #include "mbed.h"
sophtware 0:beb43bc3d6d4 41
sophtware 0:beb43bc3d6d4 42 #include "Altitude.h" // Our classes to handle compressed data from the sensor.
sophtware 0:beb43bc3d6d4 43 #include "Temperature.h"
sophtware 0:beb43bc3d6d4 44 #include "Pressure.h"
sophtware 0:beb43bc3d6d4 45
sophtware 0:beb43bc3d6d4 46 #define MPL3115A2_ADDRESS 0xC0 // Shifted 7-bit I2C address for sensor
sophtware 0:beb43bc3d6d4 47
sophtware 0:beb43bc3d6d4 48 #define READ_ACK 1 // For mbed I2C Read method.
sophtware 0:beb43bc3d6d4 49 #define READ_NAK 0
sophtware 0:beb43bc3d6d4 50
sophtware 0:beb43bc3d6d4 51 #define MAX_DATA_READY_ATTEMPTS 512 // How many times we loop waiting for data before giving up.
sophtware 0:beb43bc3d6d4 52
sophtware 0:beb43bc3d6d4 53 // DEFINE |REGISTER |RESET |RESET |TYPE |AUTO-INC |NAME/COMMENT
sophtware 0:beb43bc3d6d4 54 // | | |STBY2ACT | |ADDRESS |
sophtware 0:beb43bc3d6d4 55 #define STATUS 0x00 // | 0x00 | Yes | R | 0x01 | Sensor Status Register (Alias for DR_STATUS or F_STATUS)
sophtware 0:beb43bc3d6d4 56 #define OUT_P_MSB 0x01 // | 0x00 | Yes | R | 0x02 | 0x01 | Pressure Data Out MSB (Bits 12-19 of 20-bit real-time Pressure sample | Root pointer t oPressure and Tempurature FIFO data)
sophtware 0:beb43bc3d6d4 57 #define OUT_P_CSB 0x02 // | 0x00 | Yes | R | 0x03 | Pressure Data out CSB (Bits 0-3 of 20-bit real-time Pressure sample)
sophtware 0:beb43bc3d6d4 58 #define OUT_P_LSB 0x03 // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 59 #define OUT_T_MSB 0x04 // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 60 #define OUT_T_LSB 0x05 // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 61 #define DR_STATUS 0x06 // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 62 #define OUT_P_DELTA_MSB 0x07 // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 63 #define OUT_P_DELTA_CSB 0x08 // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 64 #define OUT_P_DELTA_LSB 0x09 // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 65 #define OUT_T_DELTA_MSB 0x0A // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 66 #define OUT_T_DELTA_LSB 0x0B // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 67 #define WHO_AM_I 0x0C // | 0xC4 | | | 0x |
sophtware 0:beb43bc3d6d4 68 #define F_STATUS 0x0D // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 69 #define F_DATA 0x0E // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 70 #define F_SETUP 0x0F // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 71 #define TIME_DLY 0x10 // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 72 #define SYSMOD 0x11 // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 73 #define INT_SOURCE 0x12 // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 74 #define PT_DATA_CFG 0x13 // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 75 #define BAR_IN_MSB 0x14 // | 0xC5 | | | 0x |
sophtware 0:beb43bc3d6d4 76 #define BAR_IN_LSB 0x15 // | 0xE7 | | | 0x |
sophtware 0:beb43bc3d6d4 77 #define P_TGT_MSB 0x16 // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 78 #define P_TGT_LSB 0x17 // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 79 #define T_TGT 0x18 // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 80 #define P_WND_MSB 0x19 // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 81 #define P_WND_LSB 0x1A // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 82 #define T_WND 0x1B // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 83 #define P_MIN_MSB 0x1C // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 84 #define P_MIN_CSB 0x1D // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 85 #define P_MIN_LSB 0x1E // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 86 #define T_MIN_MSB 0x1F // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 87 #define T_MIN_LSB 0x20 // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 88 #define P_MAX_MSB 0x21 // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 89 #define P_MAX_CSB 0x22 // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 90 #define P_MAX_LSB 0x23 // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 91 #define T_MAX_MSB 0x24 // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 92 #define T_MAX_LSB 0x25 // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 93 #define CTRL_REG1 0x26 // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 94 #define CTRL_REG2 0x27 // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 95 #define CTRL_REG3 0x28 // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 96 #define CTRL_REG4 0x29 // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 97 #define CTRL_REG5 0x2A // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 98 #define OFF_P 0x2B // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 99 #define OFF_T 0x2C // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 100 #define OFF_H 0x2D // | 0x00 | | | 0x |
sophtware 0:beb43bc3d6d4 101
sophtware 0:beb43bc3d6d4 102 class MPL3115A2
sophtware 0:beb43bc3d6d4 103 {
sophtware 0:beb43bc3d6d4 104 public:
sophtware 0:beb43bc3d6d4 105 MPL3115A2(I2C *i2c, Serial *pc = NULL);
sophtware 0:beb43bc3d6d4 106
sophtware 0:beb43bc3d6d4 107 // Call this method in main to initialize the sensor.
sophtware 0:beb43bc3d6d4 108 void init();
sophtware 0:beb43bc3d6d4 109
sophtware 0:beb43bc3d6d4 110 // Returns the fixed device ID number (usually equal to 0xC4).
sophtware 0:beb43bc3d6d4 111 char whoAmI() { return i2cRead(WHO_AM_I); }
sophtware 0:beb43bc3d6d4 112
sophtware 0:beb43bc3d6d4 113 Altitude* readAltitude(Altitude* a); // Returns the altitude object with altitude
sophtware 0:beb43bc3d6d4 114 Pressure* readPressure(Pressure* p); // Returns the pressure object with barometric pressure
sophtware 0:beb43bc3d6d4 115 Temperature* readTemperature(Temperature* t); // Returns the temperature object with temperature
sophtware 0:beb43bc3d6d4 116
sophtware 0:beb43bc3d6d4 117 // Use these methods to set the sensor's offsets to increase its accuracy. You can generally
sophtware 0:beb43bc3d6d4 118 // find your current altitude with a smart phone or GPS. Same goes for the temperature. For
sophtware 0:beb43bc3d6d4 119 // the current pressure where you are, you may need an accurate weather station. Getting the
sophtware 0:beb43bc3d6d4 120 // pressure from the web for your area is generally not close enough to help with calibration.
sophtware 0:beb43bc3d6d4 121 // You may need to play with the setting to achieve good accuracy. I found the offset steps
sophtware 0:beb43bc3d6d4 122 // were not 100% accurate to the datasheet and had to adjust accordingly.
sophtware 0:beb43bc3d6d4 123 char offsetAltitude() { return i2cRead(OFF_H); }
sophtware 0:beb43bc3d6d4 124 void setOffsetAltitude(const char offset) { i2cWrite(OFF_H, offset); } // -128 to 127 meters
sophtware 0:beb43bc3d6d4 125 char offsetPressure() { return i2cRead(OFF_P); }
sophtware 0:beb43bc3d6d4 126 void setOffsetPressure(const char offset) { i2cWrite(OFF_P, offset); } // 4 Pa per LSB
sophtware 0:beb43bc3d6d4 127 char offsetTemperature() { return i2cRead(OFF_T); }
sophtware 0:beb43bc3d6d4 128 void setOffsetTemperature(const char offset) { i2cWrite(OFF_T, offset); } // 0.0625ºC per LSB
sophtware 0:beb43bc3d6d4 129
sophtware 0:beb43bc3d6d4 130 void setModeStandby(); // Puts the sensor into Standby mode. Required when using methods below.
sophtware 0:beb43bc3d6d4 131 void setModeActive(); // Activates the sensor to start taking measurements.
sophtware 0:beb43bc3d6d4 132
sophtware 0:beb43bc3d6d4 133 // When calling any of these methods, be sure to put the sensor in standby mode first.
sophtware 0:beb43bc3d6d4 134 void setModeBarometer(); // Puts the sensor into barometric mode
sophtware 0:beb43bc3d6d4 135 void setModeAltimeter(); // Puts the sensor into altimeter mode
sophtware 0:beb43bc3d6d4 136 void setOversampleRate(char); // Sets the number of samples from 1 to 128.
sophtware 0:beb43bc3d6d4 137 void enableEventFlags(); // Sets the all event flags.
sophtware 0:beb43bc3d6d4 138
sophtware 0:beb43bc3d6d4 139 private:
sophtware 0:beb43bc3d6d4 140 I2C *_i2c; // The I2C object we use to communicate with the sensor. It is not part
sophtware 0:beb43bc3d6d4 141 // of the class so that it can be shared with other peripherals on the
sophtware 0:beb43bc3d6d4 142 // bus.
sophtware 0:beb43bc3d6d4 143 Serial *_debug; // Set this in the constructor if you want the class to output debug messages.
sophtware 0:beb43bc3d6d4 144 // If you need to pair down your code, you can remove this and all the
sophtware 0:beb43bc3d6d4 145 // references to it in the code.
sophtware 0:beb43bc3d6d4 146
sophtware 0:beb43bc3d6d4 147 // Debug method that mimics the printf function, but will output nothing if _debug has not
sophtware 0:beb43bc3d6d4 148 // been set. This means you can safely us it in your code and nothing will happen if you don't
sophtware 0:beb43bc3d6d4 149 // assign the _debug object.
sophtware 0:beb43bc3d6d4 150 void debugOut(const char * format, ...);
sophtware 0:beb43bc3d6d4 151
sophtware 0:beb43bc3d6d4 152 // These are helper functions to SET or CLEAR bits. The mask should contain 1s in the position
sophtware 0:beb43bc3d6d4 153 // where the bits need to be set or cleared. One or more bits can be set or cleared this way.
sophtware 0:beb43bc3d6d4 154 void clearRegisterBit(const char regAddr, const char bitMask);
sophtware 0:beb43bc3d6d4 155 void setRegisterBit(const char regAddr, const char bitMask);
sophtware 0:beb43bc3d6d4 156
sophtware 0:beb43bc3d6d4 157 // Helper functions to check if data is ready in a register for either temperature or pressure.
sophtware 0:beb43bc3d6d4 158 // The pressureDataReady function works for both altitude and barometric pressure depending on
sophtware 0:beb43bc3d6d4 159 // the mode the sensor is in.
sophtware 0:beb43bc3d6d4 160 int dataReady(const char mask);
sophtware 0:beb43bc3d6d4 161 int pressureDataReady() { return dataReady(0x04); }
sophtware 0:beb43bc3d6d4 162 int temperatureDataReady() { return dataReady(0x02); }
sophtware 0:beb43bc3d6d4 163
sophtware 0:beb43bc3d6d4 164 // Called to force the sensor to take another sample
sophtware 0:beb43bc3d6d4 165 void toggleOneShot();
sophtware 0:beb43bc3d6d4 166
sophtware 0:beb43bc3d6d4 167 // Helper functions to read and write one value from the I2C bus using the sensor's address.
sophtware 0:beb43bc3d6d4 168 char i2cRead(char regAddr);
sophtware 0:beb43bc3d6d4 169 void i2cWrite(char regAddr, char value);
sophtware 0:beb43bc3d6d4 170 };
sophtware 0:beb43bc3d6d4 171
sophtware 0:beb43bc3d6d4 172 #endif // MPL3115A2_H