MPL115A2 (I2C) Pressure sensor interface
Dependents: MPL115A2Sample dataloger_for_modelrocket ARLISS2012_Hidaka
MPL115A2.h@0:4df6d69700fa, 2011-04-26 (annotated)
- Committer:
- yamaguch
- Date:
- Tue Apr 26 11:26:18 2011 +0000
- Revision:
- 0:4df6d69700fa
0.9
Who changed what in which revision?
User | Revision | Line number | New 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 |