I2C Temprature Sensor Progemm MPL3115A2
Dependents: I2C_Temprature_raspiboard
Fork of MPL3115A2 by
MPL3115A2.h
- Committer:
- sophtware
- Date:
- 2014-04-01
- Revision:
- 0:beb43bc3d6d4
- Child:
- 1:a011ae93a350
File content as of revision 0:beb43bc3d6d4:
/* MPL3115A2 Barometric Pressure and Tempurature Sensor Library By: Michael Lange Date: March 31, 2014 License: This code is public domain. This class wraps the functions of the MPL3115A2 sensor into a usable class that exposes most functions to your project. Functions that are not exposed can easily be added using the existing functions in this library. Specifically, I did not add any funtions to handle FIFO logging or the use of either of the pin interrupts. This should not be too difficult to add if you need those features. The motivation here was to get a set of support classes together that supported the chip and could be expanded on. With this library you can extract all relevant data from the sensor. Be sure to download the DATASHEET and the App Note AN4519. This libraray was created using the mbed NXP LPC11U24. Pins p27 and p28 were used for the I2C functions. Be sure to install 1K pull-up resistors on both lines. Also, if you're not using the SparkFun breakout board, be sure to use the right caps on the power pin. If you don't, the jitter can cause problems. This library was inspired by the similar library available for the Arduino written by Nathan Seidle at SparkFun. I copied some of the number crunching routines and tried to follow his style of coding for the library. That way users of Arduinos cound step into this library a little easier. */ #ifndef MPL3115A2_H #define MPL3115A2_H #include "mbed.h" #include "Altitude.h" // Our classes to handle compressed data from the sensor. #include "Temperature.h" #include "Pressure.h" #define MPL3115A2_ADDRESS 0xC0 // Shifted 7-bit I2C address for sensor #define READ_ACK 1 // For mbed I2C Read method. #define READ_NAK 0 #define MAX_DATA_READY_ATTEMPTS 512 // How many times we loop waiting for data before giving up. // DEFINE |REGISTER |RESET |RESET |TYPE |AUTO-INC |NAME/COMMENT // | | |STBY2ACT | |ADDRESS | #define STATUS 0x00 // | 0x00 | Yes | R | 0x01 | Sensor Status Register (Alias for DR_STATUS or F_STATUS) #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) #define OUT_P_CSB 0x02 // | 0x00 | Yes | R | 0x03 | Pressure Data out CSB (Bits 0-3 of 20-bit real-time Pressure sample) #define OUT_P_LSB 0x03 // | 0x00 | | | 0x | #define OUT_T_MSB 0x04 // | 0x00 | | | 0x | #define OUT_T_LSB 0x05 // | 0x00 | | | 0x | #define DR_STATUS 0x06 // | 0x00 | | | 0x | #define OUT_P_DELTA_MSB 0x07 // | 0x00 | | | 0x | #define OUT_P_DELTA_CSB 0x08 // | 0x00 | | | 0x | #define OUT_P_DELTA_LSB 0x09 // | 0x00 | | | 0x | #define OUT_T_DELTA_MSB 0x0A // | 0x00 | | | 0x | #define OUT_T_DELTA_LSB 0x0B // | 0x00 | | | 0x | #define WHO_AM_I 0x0C // | 0xC4 | | | 0x | #define F_STATUS 0x0D // | 0x00 | | | 0x | #define F_DATA 0x0E // | 0x00 | | | 0x | #define F_SETUP 0x0F // | 0x00 | | | 0x | #define TIME_DLY 0x10 // | 0x00 | | | 0x | #define SYSMOD 0x11 // | 0x00 | | | 0x | #define INT_SOURCE 0x12 // | 0x00 | | | 0x | #define PT_DATA_CFG 0x13 // | 0x00 | | | 0x | #define BAR_IN_MSB 0x14 // | 0xC5 | | | 0x | #define BAR_IN_LSB 0x15 // | 0xE7 | | | 0x | #define P_TGT_MSB 0x16 // | 0x00 | | | 0x | #define P_TGT_LSB 0x17 // | 0x00 | | | 0x | #define T_TGT 0x18 // | 0x00 | | | 0x | #define P_WND_MSB 0x19 // | 0x00 | | | 0x | #define P_WND_LSB 0x1A // | 0x00 | | | 0x | #define T_WND 0x1B // | 0x00 | | | 0x | #define P_MIN_MSB 0x1C // | 0x00 | | | 0x | #define P_MIN_CSB 0x1D // | 0x00 | | | 0x | #define P_MIN_LSB 0x1E // | 0x00 | | | 0x | #define T_MIN_MSB 0x1F // | 0x00 | | | 0x | #define T_MIN_LSB 0x20 // | 0x00 | | | 0x | #define P_MAX_MSB 0x21 // | 0x00 | | | 0x | #define P_MAX_CSB 0x22 // | 0x00 | | | 0x | #define P_MAX_LSB 0x23 // | 0x00 | | | 0x | #define T_MAX_MSB 0x24 // | 0x00 | | | 0x | #define T_MAX_LSB 0x25 // | 0x00 | | | 0x | #define CTRL_REG1 0x26 // | 0x00 | | | 0x | #define CTRL_REG2 0x27 // | 0x00 | | | 0x | #define CTRL_REG3 0x28 // | 0x00 | | | 0x | #define CTRL_REG4 0x29 // | 0x00 | | | 0x | #define CTRL_REG5 0x2A // | 0x00 | | | 0x | #define OFF_P 0x2B // | 0x00 | | | 0x | #define OFF_T 0x2C // | 0x00 | | | 0x | #define OFF_H 0x2D // | 0x00 | | | 0x | class MPL3115A2 { public: MPL3115A2(I2C *i2c, Serial *pc = NULL); // Call this method in main to initialize the sensor. void init(); // Returns the fixed device ID number (usually equal to 0xC4). char whoAmI() { return i2cRead(WHO_AM_I); } Altitude* readAltitude(Altitude* a); // Returns the altitude object with altitude Pressure* readPressure(Pressure* p); // Returns the pressure object with barometric pressure Temperature* readTemperature(Temperature* t); // Returns the temperature object with temperature // Use these methods to set the sensor's offsets to increase its accuracy. You can generally // find your current altitude with a smart phone or GPS. Same goes for the temperature. For // the current pressure where you are, you may need an accurate weather station. Getting the // pressure from the web for your area is generally not close enough to help with calibration. // You may need to play with the setting to achieve good accuracy. I found the offset steps // were not 100% accurate to the datasheet and had to adjust accordingly. char offsetAltitude() { return i2cRead(OFF_H); } void setOffsetAltitude(const char offset) { i2cWrite(OFF_H, offset); } // -128 to 127 meters char offsetPressure() { return i2cRead(OFF_P); } void setOffsetPressure(const char offset) { i2cWrite(OFF_P, offset); } // 4 Pa per LSB char offsetTemperature() { return i2cRead(OFF_T); } void setOffsetTemperature(const char offset) { i2cWrite(OFF_T, offset); } // 0.0625ºC per LSB void setModeStandby(); // Puts the sensor into Standby mode. Required when using methods below. void setModeActive(); // Activates the sensor to start taking measurements. // When calling any of these methods, be sure to put the sensor in standby mode first. void setModeBarometer(); // Puts the sensor into barometric mode void setModeAltimeter(); // Puts the sensor into altimeter mode void setOversampleRate(char); // Sets the number of samples from 1 to 128. void enableEventFlags(); // Sets the all event flags. private: I2C *_i2c; // The I2C object we use to communicate with the sensor. It is not part // of the class so that it can be shared with other peripherals on the // bus. Serial *_debug; // Set this in the constructor if you want the class to output debug messages. // If you need to pair down your code, you can remove this and all the // references to it in the code. // Debug method that mimics the printf function, but will output nothing if _debug has not // been set. This means you can safely us it in your code and nothing will happen if you don't // assign the _debug object. void debugOut(const char * format, ...); // These are helper functions to SET or CLEAR bits. The mask should contain 1s in the position // where the bits need to be set or cleared. One or more bits can be set or cleared this way. void clearRegisterBit(const char regAddr, const char bitMask); void setRegisterBit(const char regAddr, const char bitMask); // Helper functions to check if data is ready in a register for either temperature or pressure. // The pressureDataReady function works for both altitude and barometric pressure depending on // the mode the sensor is in. int dataReady(const char mask); int pressureDataReady() { return dataReady(0x04); } int temperatureDataReady() { return dataReady(0x02); } // Called to force the sensor to take another sample void toggleOneShot(); // Helper functions to read and write one value from the I2C bus using the sensor's address. char i2cRead(char regAddr); void i2cWrite(char regAddr, char value); }; #endif // MPL3115A2_H