test

Fork of MPL3115A2 by Michael Lange

Committer:
pyonta2017
Date:
Tue Sep 05 14:54:16 2017 +0000
Revision:
4:249d5270511d
Parent:
3:7c7c1ea6fc33
test

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 1:a011ae93a350 22 This library 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 1:a011ae93a350 32 could 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 2:2ebc9c0d4a54 102 //! MPL3115A2 I2C Barometric Pressure and Tempurature Sensor Library
sophtware 2:2ebc9c0d4a54 103 //! This class wraps most of the function in the MPL3115A2 sensor leaving out the FIFO and interrupt system.
sophtware 0:beb43bc3d6d4 104 class MPL3115A2
sophtware 0:beb43bc3d6d4 105 {
sophtware 0:beb43bc3d6d4 106 public:
sophtware 2:2ebc9c0d4a54 107 //! Constructs an MPL3115A2 object and associates an I2C and optional Serial debug object.
sophtware 3:7c7c1ea6fc33 108 //! @param *i2c The I2C object to use for the sensor.
sophtware 3:7c7c1ea6fc33 109 //! @param *pc An optional serial debug connection object.
sophtware 0:beb43bc3d6d4 110 MPL3115A2(I2C *i2c, Serial *pc = NULL);
sophtware 0:beb43bc3d6d4 111
sophtware 3:7c7c1ea6fc33 112 //! Initializes the sensor, defaulting to Altitude mode. This should be called before using
sophtware 3:7c7c1ea6fc33 113 //! the sensor for the first time.
sophtware 0:beb43bc3d6d4 114 void init();
sophtware 0:beb43bc3d6d4 115
sophtware 3:7c7c1ea6fc33 116 //! Queries the value from the WHO_AM_I register (usually equal to 0xC4).
sophtware 3:7c7c1ea6fc33 117 //! @return The fixed device ID from the sensor.
sophtware 0:beb43bc3d6d4 118 char whoAmI() { return i2cRead(WHO_AM_I); }
sophtware 0:beb43bc3d6d4 119
sophtware 3:7c7c1ea6fc33 120 //! Reads Altitude data from the sensor and returns it in the Altitude object passed in. If
sophtware 3:7c7c1ea6fc33 121 //! no data could be read, the Altitude object is left as is.
sophtware 3:7c7c1ea6fc33 122 //! @param a A pointer to an Altitude object that will receive the sensor data.
sophtware 3:7c7c1ea6fc33 123 //! @returns The Altitude pointer that was passed in.
sophtware 2:2ebc9c0d4a54 124 Altitude* readAltitude(Altitude* a);
sophtware 3:7c7c1ea6fc33 125 //! Reads Pressure data from the sensor and returns it in the Pressure object passed in. If
sophtware 3:7c7c1ea6fc33 126 //! no data could be read, the Pressure object is left as is.
sophtware 3:7c7c1ea6fc33 127 //! @param a A pointer to a Pressure object that will receive the sensor data.
sophtware 3:7c7c1ea6fc33 128 //! @returns The Pressure pointer that was passed in.
sophtware 2:2ebc9c0d4a54 129 Pressure* readPressure(Pressure* p);
sophtware 3:7c7c1ea6fc33 130 //! Reads Temperature data from the sensor and returns it in the Temperature object passed in. If
sophtware 3:7c7c1ea6fc33 131 //! no data could be read, the Temperature object is left as is.
sophtware 3:7c7c1ea6fc33 132 //! @param a A pointer to an Temperature object that will receive the sensor data.
sophtware 3:7c7c1ea6fc33 133 //! @returns The Temperature pointer that was passed in.
sophtware 2:2ebc9c0d4a54 134 Temperature* readTemperature(Temperature* t);
sophtware 0:beb43bc3d6d4 135
sophtware 0:beb43bc3d6d4 136 // Use these methods to set the sensor's offsets to increase its accuracy. You can generally
sophtware 0:beb43bc3d6d4 137 // find your current altitude with a smart phone or GPS. Same goes for the temperature. For
sophtware 0:beb43bc3d6d4 138 // the current pressure where you are, you may need an accurate weather station. Getting the
sophtware 0:beb43bc3d6d4 139 // pressure from the web for your area is generally not close enough to help with calibration.
sophtware 0:beb43bc3d6d4 140 // You may need to play with the setting to achieve good accuracy. I found the offset steps
sophtware 0:beb43bc3d6d4 141 // were not 100% accurate to the datasheet and had to adjust accordingly.
sophtware 3:7c7c1ea6fc33 142
sophtware 2:2ebc9c0d4a54 143 //! Returns the altitude offset stored in the sensor.
sophtware 0:beb43bc3d6d4 144 char offsetAltitude() { return i2cRead(OFF_H); }
sophtware 2:2ebc9c0d4a54 145 //! Sets the altitude offset stored in the sensor. The allowed offset range is from -128 to 127 meters.
sophtware 2:2ebc9c0d4a54 146 void setOffsetAltitude(const char offset) { i2cWrite(OFF_H, offset); }
sophtware 2:2ebc9c0d4a54 147 //! Returns the pressure offset stored in the sensor.
sophtware 0:beb43bc3d6d4 148 char offsetPressure() { return i2cRead(OFF_P); }
sophtware 2:2ebc9c0d4a54 149 //! Sets the pressure offset stored in the sensor. The allowed offset range is from -128 to 127 where each LSB represents 4 Pa.
sophtware 2:2ebc9c0d4a54 150 void setOffsetPressure(const char offset) { i2cWrite(OFF_P, offset); }
sophtware 2:2ebc9c0d4a54 151 //! Returns the temperature offset stored in the sensor.
sophtware 0:beb43bc3d6d4 152 char offsetTemperature() { return i2cRead(OFF_T); }
sophtware 2:2ebc9c0d4a54 153 //! Sets the temperature offset stored in the sensor. The allowed offset range is from -128 to 127 where each LSB represents 0.0625ºC.
sophtware 2:2ebc9c0d4a54 154 void setOffsetTemperature(const char offset) { i2cWrite(OFF_T, offset); }
sophtware 0:beb43bc3d6d4 155
sophtware 2:2ebc9c0d4a54 156 //! Puts the sensor into Standby mode. Required when using methods below.
sophtware 2:2ebc9c0d4a54 157 void setModeStandby();
sophtware 2:2ebc9c0d4a54 158 //! Activates the sensor to start taking measurements.
sophtware 2:2ebc9c0d4a54 159 void setModeActive();
sophtware 0:beb43bc3d6d4 160
sophtware 2:2ebc9c0d4a54 161 //! Puts the sensor into barometric mode, be sure to put the sensor in standby mode first.
sophtware 2:2ebc9c0d4a54 162 void setModeBarometer();
sophtware 2:2ebc9c0d4a54 163 //! Puts the sensor into altimeter mode, be sure to put the sensor in standby mode first.
sophtware 2:2ebc9c0d4a54 164 void setModeAltimeter();
sophtware 2:2ebc9c0d4a54 165 //! Sets the number of samples from 1 to 128, be sure to put the sensor in standby mode first.
sophtware 2:2ebc9c0d4a54 166 void setOversampleRate(char rate);
sophtware 2:2ebc9c0d4a54 167 //! Sets all the event flags, be sure to put the sensor in standby mode first.
sophtware 2:2ebc9c0d4a54 168 void enableEventFlags();
sophtware 0:beb43bc3d6d4 169
sophtware 0:beb43bc3d6d4 170 private:
sophtware 2:2ebc9c0d4a54 171 //! The I2C object we use to communicate with the sensor. It is not part
sophtware 2:2ebc9c0d4a54 172 //! of the class so that it can be shared with other peripherals on the
sophtware 2:2ebc9c0d4a54 173 //! bus.
sophtware 2:2ebc9c0d4a54 174 I2C *_i2c;
sophtware 2:2ebc9c0d4a54 175
sophtware 2:2ebc9c0d4a54 176 //! Set this in the constructor if you want the class to output debug messages.
sophtware 2:2ebc9c0d4a54 177 //! If you need to pair down your code, you can remove this and all the
sophtware 2:2ebc9c0d4a54 178 //! references to it in the code.
sophtware 2:2ebc9c0d4a54 179 Serial *_debug;
sophtware 0:beb43bc3d6d4 180
sophtware 2:2ebc9c0d4a54 181 //! Debug method that mimics the printf function, but will output nothing if _debug has not
sophtware 2:2ebc9c0d4a54 182 //! been set. This means you can safely us it in your code and nothing will happen if you don't
sophtware 2:2ebc9c0d4a54 183 //! assign the _debug object.
sophtware 0:beb43bc3d6d4 184 void debugOut(const char * format, ...);
sophtware 0:beb43bc3d6d4 185
sophtware 2:2ebc9c0d4a54 186 //! This helper function is used to CLEAR bits. The mask should contain 1s in the position
sophtware 2:2ebc9c0d4a54 187 //! where the bits need to be cleared. One or more bits can be cleared this way.
sophtware 0:beb43bc3d6d4 188 void clearRegisterBit(const char regAddr, const char bitMask);
sophtware 2:2ebc9c0d4a54 189 //! This helper function is used to SET bits. The mask should contain 1s in the position
sophtware 2:2ebc9c0d4a54 190 //! where the bits need to be set. One or more bits can be set this way.
sophtware 0:beb43bc3d6d4 191 void setRegisterBit(const char regAddr, const char bitMask);
sophtware 0:beb43bc3d6d4 192
sophtware 2:2ebc9c0d4a54 193 //! Helper functions to check if data is ready in a register for either temperature or pressure.
sophtware 2:2ebc9c0d4a54 194 //! The mask passed in determines which register bit to look at.
sophtware 0:beb43bc3d6d4 195 int dataReady(const char mask);
sophtware 2:2ebc9c0d4a54 196 //! Blocks for about 1/2 a second while checking the data ready bit. Returns 0 on sucees.
sophtware 2:2ebc9c0d4a54 197 //! This function works for both altitude and barometric pressure depending on the mode the sensor is in.
sophtware 0:beb43bc3d6d4 198 int pressureDataReady() { return dataReady(0x04); }
sophtware 2:2ebc9c0d4a54 199 //! Blocks for about 1/2 a second while checking the data ready bit. Returns 0 on sucees.
sophtware 0:beb43bc3d6d4 200 int temperatureDataReady() { return dataReady(0x02); }
sophtware 0:beb43bc3d6d4 201
sophtware 2:2ebc9c0d4a54 202 //! Called to force the sensor to take another sample
sophtware 0:beb43bc3d6d4 203 void toggleOneShot();
sophtware 0:beb43bc3d6d4 204
sophtware 2:2ebc9c0d4a54 205 //! Helper functions to read one value from the I2C bus using the sensor's address.
sophtware 0:beb43bc3d6d4 206 char i2cRead(char regAddr);
sophtware 2:2ebc9c0d4a54 207 //! Helper functions to write one value from the I2C bus using the sensor's address.
sophtware 0:beb43bc3d6d4 208 void i2cWrite(char regAddr, char value);
sophtware 0:beb43bc3d6d4 209 };
sophtware 0:beb43bc3d6d4 210
sophtware 0:beb43bc3d6d4 211 #endif // MPL3115A2_H