MPL115A2 (I2C) Pressure sensor interface

Dependents:   MPL115A2Sample dataloger_for_modelrocket ARLISS2012_Hidaka

Committer:
yamaguch
Date:
Tue Apr 26 11:26:18 2011 +0000
Revision:
0:4df6d69700fa
0.9

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yamaguch 0:4df6d69700fa 1 #ifndef MPL115A2
yamaguch 0:4df6d69700fa 2 #define MPL115A
yamaguch 0:4df6d69700fa 3
yamaguch 0:4df6d69700fa 4 #include "mbed.h"
yamaguch 0:4df6d69700fa 5
yamaguch 0:4df6d69700fa 6 /**
yamaguch 0:4df6d69700fa 7 * MPL115A2 (I2C) pressure sensor
yamaguch 0:4df6d69700fa 8 */
yamaguch 0:4df6d69700fa 9
yamaguch 0:4df6d69700fa 10 class MPL115A2 {
yamaguch 0:4df6d69700fa 11 public:
yamaguch 0:4df6d69700fa 12 /**
yamaguch 0:4df6d69700fa 13 * Create an MPL115A(I2C) interface with specified pins
yamaguch 0:4df6d69700fa 14 *
yamaguch 0:4df6d69700fa 15 * @param PinName sda SDA pin (default = p9)
yamaguch 0:4df6d69700fa 16 * @param PinName scl SCL pin (default = p10)
yamaguch 0:4df6d69700fa 17 */
yamaguch 0:4df6d69700fa 18 MPL115A2(PinName sda = p9, PinName scl = p10) : i2c(sda, scl) {
yamaguch 0:4df6d69700fa 19 }
yamaguch 0:4df6d69700fa 20
yamaguch 0:4df6d69700fa 21 /**
yamaguch 0:4df6d69700fa 22 * Read current pressure and/or temperature
yamaguch 0:4df6d69700fa 23 *
yamaguch 0:4df6d69700fa 24 * @param puressure pointer to an int area to receive pressure
yamaguch 0:4df6d69700fa 25 * @param temperature pointer to a float area to receive temperature
yamaguch 0:4df6d69700fa 26 *
yamaguch 0:4df6d69700fa 27 * @returns 0 (success), or -1 (I2C error)
yamaguch 0:4df6d69700fa 28 */
yamaguch 0:4df6d69700fa 29
yamaguch 0:4df6d69700fa 30 int read(int *pressure, float *temperature) {
yamaguch 0:4df6d69700fa 31 const char id = 0x60 << 1;
yamaguch 0:4df6d69700fa 32 char cmd[2] = {0x12, 0x01}; // read both
yamaguch 0:4df6d69700fa 33 char buf[16];
yamaguch 0:4df6d69700fa 34
yamaguch 0:4df6d69700fa 35 if (i2c.write(id, cmd, 2) != 0)
yamaguch 0:4df6d69700fa 36 return -1;
yamaguch 0:4df6d69700fa 37
yamaguch 0:4df6d69700fa 38 wait_ms(1);
yamaguch 0:4df6d69700fa 39
yamaguch 0:4df6d69700fa 40 cmd[0] = 0;
yamaguch 0:4df6d69700fa 41
yamaguch 0:4df6d69700fa 42 if (i2c.write(id, cmd, 1, true) != 0)
yamaguch 0:4df6d69700fa 43 return -1;
yamaguch 0:4df6d69700fa 44
yamaguch 0:4df6d69700fa 45 if (i2c.read(id, buf, 16) == 0) {
yamaguch 0:4df6d69700fa 46 int padc = short((buf[0] << 8 | buf[1]) >> 6);
yamaguch 0:4df6d69700fa 47 int tadc = short((buf[2] << 8 | buf[3]) >> 6);
yamaguch 0:4df6d69700fa 48 int a0 = short(buf[4] << 8 | buf[5]);
yamaguch 0:4df6d69700fa 49 int b1 = short(buf[6] << 8 | buf[7]);
yamaguch 0:4df6d69700fa 50 int b2 = short(buf[8] << 8 | buf[9]);
yamaguch 0:4df6d69700fa 51 int c12 = short(buf[10] << 8 | buf[11]);
yamaguch 0:4df6d69700fa 52 int c11 = short(buf[12] << 8 | buf[13]);
yamaguch 0:4df6d69700fa 53 int c22 = short(buf[14] << 8 | buf[15]);
yamaguch 0:4df6d69700fa 54 int pcomp = ((a0 << 10) + b1 * padc + (b2 * tadc >> 1) +
yamaguch 0:4df6d69700fa 55 (c11 * padc * padc >> 14) + (c12 * tadc * padc >> 11) + (c22 * tadc * tadc >> 17)) >> 13;
yamaguch 0:4df6d69700fa 56
yamaguch 0:4df6d69700fa 57 if (temperature != 0)
yamaguch 0:4df6d69700fa 58 *temperature = 25.0 - (tadc - 472) / 5.35;
yamaguch 0:4df6d69700fa 59
yamaguch 0:4df6d69700fa 60 if (pressure != 0)
yamaguch 0:4df6d69700fa 61 *pressure = (650 * pcomp + 512) / 1023 + 500;
yamaguch 0:4df6d69700fa 62
yamaguch 0:4df6d69700fa 63 return 0;
yamaguch 0:4df6d69700fa 64 }
yamaguch 0:4df6d69700fa 65
yamaguch 0:4df6d69700fa 66 return -1;
yamaguch 0:4df6d69700fa 67 }
yamaguch 0:4df6d69700fa 68
yamaguch 0:4df6d69700fa 69 /**
yamaguch 0:4df6d69700fa 70 * Read current pressure
yamaguch 0:4df6d69700fa 71 *
yamaguch 0:4df6d69700fa 72 * @returns current pressure (in hPa)
yamaguch 0:4df6d69700fa 73 */
yamaguch 0:4df6d69700fa 74 int readPressure() {
yamaguch 0:4df6d69700fa 75 int pressure;
yamaguch 0:4df6d69700fa 76 return read(&pressure, 0) == 0 ? pressure : 0;
yamaguch 0:4df6d69700fa 77 }
yamaguch 0:4df6d69700fa 78
yamaguch 0:4df6d69700fa 79 /**
yamaguch 0:4df6d69700fa 80 * Read current temperature
yamaguch 0:4df6d69700fa 81 *
yamaguch 0:4df6d69700fa 82 * @returns current temperature (in Celcius)
yamaguch 0:4df6d69700fa 83 */
yamaguch 0:4df6d69700fa 84 float readTemperature() {
yamaguch 0:4df6d69700fa 85 float temperature;
yamaguch 0:4df6d69700fa 86 return read(0, &temperature) == 0 ? temperature : -273.15;
yamaguch 0:4df6d69700fa 87 }
yamaguch 0:4df6d69700fa 88
yamaguch 0:4df6d69700fa 89 /**
yamaguch 0:4df6d69700fa 90 * Operator shorthand for readPressure()
yamaguch 0:4df6d69700fa 91 */
yamaguch 0:4df6d69700fa 92 operator int() {
yamaguch 0:4df6d69700fa 93 return readPressure();
yamaguch 0:4df6d69700fa 94 }
yamaguch 0:4df6d69700fa 95
yamaguch 0:4df6d69700fa 96 /**
yamaguch 0:4df6d69700fa 97 * Operator shorthand for readTemperature()
yamaguch 0:4df6d69700fa 98 */
yamaguch 0:4df6d69700fa 99 operator float() {
yamaguch 0:4df6d69700fa 100 return readTemperature();
yamaguch 0:4df6d69700fa 101 }
yamaguch 0:4df6d69700fa 102
yamaguch 0:4df6d69700fa 103 private:
yamaguch 0:4df6d69700fa 104 I2C i2c;
yamaguch 0:4df6d69700fa 105 };
yamaguch 0:4df6d69700fa 106
yamaguch 0:4df6d69700fa 107 #endif