Library to wrapper most of the functions on the MPL3115A2 pressure and temperature sensor.

Dependents:   WeatherBalloon4180 WeatherBalloon4180 mbed_rifletool Smart_Watch_4180_Final_Design ... more

MPL3115A2 Precision Altimeter

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 functions 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 library 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 could step into this library a little easier.

Below is some sample code that outputs the sensor data to a serial debug terminal window. If you have a logic analyzer, like the Saleae Logic, then you might not need the debug terminal window. If you still need the serial driver for your mbed, you can get it here.

Sample Code

#include "mbed.h"
#include "MPL3115A2.h"

I2C i2c(p28, p27);       // sda, scl

// Comment out all of the references to 'pc' on this page if you don't have the 
// serial debug driver for your mbed board installed on your computer. If you do,
// I personally like to use Putty as the terminal window to capture debug messages.
Serial pc(USBTX, USBRX); // tx, rx

// Again, remove the '&pc' parameter is you're not debugging.
MPL3115A2 sensor(&i2c, &pc);

DigitalOut myled(LED1);     // Sanity check to make sure the program is working.
DigitalOut powerPin(p21);   // <-- I powered the sensor from a pin. You don't have to.

int main() {
    
    powerPin = 1;
    wait_ms(300);

    pc.printf("** MPL3115A2 SENSOR **\r\n");

    sensor.init();

    pc.printf("Who Am I: 0x%X\r\n", sensor.whoAmI());

    Altitude a;
    Temperature t;
    Pressure p;
    
    // Offsets for Dacula, GA
    sensor.setOffsetAltitude(83);
    sensor.setOffsetTemperature(20);
    sensor.setOffsetPressure(-32);
    
    while(1) 
    {
        sensor.readAltitude(&a);
        sensor.readTemperature(&t);
        
        sensor.setModeStandby();
        sensor.setModeBarometer();
        sensor.setModeActive();
        sensor.readPressure(&p);
        
        pc.printf("Altitude: %sft, Temp: %sºF, Pressure: %sPa\r\n", a.print(), t.print(), p.print());
        pc.printf("OFF_H: 0x%X, OFF_T: 0x%X, OFF_P: 0x%X\r\n", sensor.offsetAltitude(), sensor.offsetTemperature(), sensor.offsetPressure());
    
        myled = 1;
        wait(5);
        myled = 0;
        wait(5);

        sensor.setModeStandby();
        sensor.setModeAltimeter();
        sensor.setModeActive();
    }
}
Committer:
sophtware
Date:
Wed Apr 02 12:59:44 2014 +0000
Revision:
3:7c7c1ea6fc33
Parent:
2:2ebc9c0d4a54
Updated documentation.

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 encapsulates an altitude reading from the sensor.
sophtware 0:beb43bc3d6d4 8
sophtware 0:beb43bc3d6d4 9 */
sophtware 0:beb43bc3d6d4 10
sophtware 0:beb43bc3d6d4 11
sophtware 0:beb43bc3d6d4 12 #ifndef ALTITUDE_H
sophtware 0:beb43bc3d6d4 13 #define ALTITUDE_H
sophtware 0:beb43bc3d6d4 14
sophtware 0:beb43bc3d6d4 15 #include "mbed.h"
sophtware 0:beb43bc3d6d4 16
sophtware 3:7c7c1ea6fc33 17 //! Casting a float to a char truncates, therefore negative numbers become positive.
sophtware 3:7c7c1ea6fc33 18 //! This will properly cast a float in the range -128 to 127 to a char.
sophtware 0:beb43bc3d6d4 19 #define float_to_char(x) (((x)<0)?(-(char)(x)):((char)(x)))
sophtware 0:beb43bc3d6d4 20
sophtware 2:2ebc9c0d4a54 21 //! Altitude provides a wrapper around altitude data coming from the sensor. The class handles
sophtware 2:2ebc9c0d4a54 22 //! working with compressed data from the sensor and provides convenient functions for retreiving
sophtware 2:2ebc9c0d4a54 23 //! the data in various units (with room to add more if needed).
sophtware 0:beb43bc3d6d4 24 class Altitude
sophtware 0:beb43bc3d6d4 25 {
sophtware 0:beb43bc3d6d4 26 public:
sophtware 0:beb43bc3d6d4 27
sophtware 2:2ebc9c0d4a54 28 //! The size of the compressed data buffer from the sensor. Used in an I2C read.
sophtware 0:beb43bc3d6d4 29 static const int size = 3;
sophtware 2:2ebc9c0d4a54 30
sophtware 2:2ebc9c0d4a54 31 //! The units we support converting the sensor data to.
sophtware 0:beb43bc3d6d4 32 enum unitsType { METERS, FEET };
sophtware 0:beb43bc3d6d4 33
sophtware 0:beb43bc3d6d4 34 Altitude();
sophtware 0:beb43bc3d6d4 35 Altitude(float a, unitsType units = FEET);
sophtware 0:beb43bc3d6d4 36 Altitude(const char* compressed);
sophtware 0:beb43bc3d6d4 37 Altitude(const char msb, const char csb, const char lsb);
sophtware 0:beb43bc3d6d4 38
sophtware 2:2ebc9c0d4a54 39 //! Allows using the object directly in an I2C read operation.
sophtware 0:beb43bc3d6d4 40 operator char*(void) { return _compressed; }
sophtware 2:2ebc9c0d4a54 41 //! Same as calling altitude with METERS as the parameter.
sophtware 0:beb43bc3d6d4 42 operator float(void) { return _altitude; }
sophtware 0:beb43bc3d6d4 43
sophtware 2:2ebc9c0d4a54 44 //! Returns the altitude in the units you specifiy, defaulting to FEET if none specified.
sophtware 0:beb43bc3d6d4 45 float altitude(unitsType units = FEET);
sophtware 2:2ebc9c0d4a54 46 //! Call to decompress the sensor data after an I2C read.
sophtware 0:beb43bc3d6d4 47 void setAltitude();
sophtware 0:beb43bc3d6d4 48 void setAltitude(const char* compressed);
sophtware 0:beb43bc3d6d4 49 void setAltitude(const char msb, const char csb, const char lsb);
sophtware 0:beb43bc3d6d4 50 void setAltitude(float a, unitsType units = FEET);
sophtware 0:beb43bc3d6d4 51
sophtware 2:2ebc9c0d4a54 52 //! Returns the altitude as a string in the units specified, defaulting to FEET if none specified.
sophtware 0:beb43bc3d6d4 53 const char* print(unitsType units = FEET);
sophtware 0:beb43bc3d6d4 54
sophtware 2:2ebc9c0d4a54 55 //! Converts meters to feet.
sophtware 0:beb43bc3d6d4 56 static float MetersToFeet(float meters) { return meters * 3.28084; }
sophtware 2:2ebc9c0d4a54 57 //! Converts feet to meters.
sophtware 0:beb43bc3d6d4 58 static float FeetToMeters(float feet) { return feet / 3.28084; }
sophtware 0:beb43bc3d6d4 59
sophtware 0:beb43bc3d6d4 60 private:
sophtware 0:beb43bc3d6d4 61 float _altitude;
sophtware 0:beb43bc3d6d4 62 char _compressed[3];
sophtware 0:beb43bc3d6d4 63 char _printBuffer[9];
sophtware 0:beb43bc3d6d4 64 };
sophtware 0:beb43bc3d6d4 65
sophtware 0:beb43bc3d6d4 66 #endif // ALTITUDE_H