I2C Temprature Sensor Progemm MPL3115A2

Dependents:   I2C_Temprature_raspiboard

Fork of MPL3115A2 by Michael Lange

Revision:
0:beb43bc3d6d4
Child:
1:a011ae93a350
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MPL3115A2.h	Tue Apr 01 21:35:23 2014 +0000
@@ -0,0 +1,172 @@
+/*
+    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