Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: TestBenchSerenity-proto_F429ZI TestBenchFlow HSPFLOW1 TestBenchFlow1 ... more
keller_pressure.cpp@4:c298ec31dd93, 2017-06-05 (annotated)
- Committer:
- dmwahl
- Date:
- Mon Jun 05 21:01:56 2017 +0000
- Revision:
- 4:c298ec31dd93
- Parent:
- 3:1a0add40e308
- Child:
- 5:3ac90d95062a
Increased wait time between attempts to read out measurement values
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dmwahl | 3:1a0add40e308 | 1 | // Sample code |
dmwahl | 3:1a0add40e308 | 2 | //#include <mbed.h> |
dmwahl | 3:1a0add40e308 | 3 | //#include "keller_pressure.h" |
dmwahl | 3:1a0add40e308 | 4 | // |
dmwahl | 3:1a0add40e308 | 5 | //DigitalOut myled(LED1); |
dmwahl | 3:1a0add40e308 | 6 | //Serial pc(SERIAL_TX, SERIAL_RX); |
dmwahl | 3:1a0add40e308 | 7 | // |
dmwahl | 3:1a0add40e308 | 8 | //// an I2C sub-class that provides a constructed default |
dmwahl | 3:1a0add40e308 | 9 | //class I2CPreInit : public I2C |
dmwahl | 3:1a0add40e308 | 10 | //{ |
dmwahl | 3:1a0add40e308 | 11 | //public: |
dmwahl | 3:1a0add40e308 | 12 | // I2CPreInit(PinName sda, PinName scl, int freq) : I2C(sda, scl) { |
dmwahl | 3:1a0add40e308 | 13 | // frequency(freq); |
dmwahl | 3:1a0add40e308 | 14 | // }; |
dmwahl | 3:1a0add40e308 | 15 | //}; |
dmwahl | 3:1a0add40e308 | 16 | ////I2CPreInit gI2C1(I2C_SDA, I2C_SCL, I2C frequency); |
dmwahl | 3:1a0add40e308 | 17 | //I2CPreInit i2c(PB_9, PB_8, 400000); |
dmwahl | 3:1a0add40e308 | 18 | //KELLER_PRESSURE pumpP(i2c, 0x40); |
dmwahl | 3:1a0add40e308 | 19 | // |
dmwahl | 3:1a0add40e308 | 20 | //int main() |
dmwahl | 3:1a0add40e308 | 21 | //{ |
dmwahl | 3:1a0add40e308 | 22 | // pc.baud(250000); |
dmwahl | 3:1a0add40e308 | 23 | // pc.printf("Starting up...\n\r"); |
dmwahl | 3:1a0add40e308 | 24 | // if (pumpP.isAvailable()) { |
dmwahl | 3:1a0add40e308 | 25 | // pc.printf("ACK\r\n"); |
dmwahl | 3:1a0add40e308 | 26 | // pumpP.readPT(); |
dmwahl | 3:1a0add40e308 | 27 | // pc.printf("Pmin: %.03f Pmax: %.03f\r\n", pumpP.pmin, pumpP.pmax); |
dmwahl | 3:1a0add40e308 | 28 | // pc.printf("Year: %d Month: %d Day: %d Mode: %d\r\n", pumpP.year, pumpP.month, pumpP.day, pumpP.mode); |
dmwahl | 3:1a0add40e308 | 29 | // pc.printf("Status: 0x%x\r\n", pumpP.getStatus()); |
dmwahl | 3:1a0add40e308 | 30 | // pc.printf("%.02fkPa %.02fpsi %.02fC\r\n", pumpP.pressureKPA, pumpP.pressurePSI, pumpP.temperatureC); |
dmwahl | 3:1a0add40e308 | 31 | // } |
dmwahl | 3:1a0add40e308 | 32 | // while (1) { |
dmwahl | 3:1a0add40e308 | 33 | // // Main loop |
dmwahl | 3:1a0add40e308 | 34 | // if (pumpP.isAvailable()) { |
dmwahl | 3:1a0add40e308 | 35 | // pumpP.readPT(); |
dmwahl | 3:1a0add40e308 | 36 | // pc.printf("%.02fkPa %.02fpsi %.02fC\r\n", pumpP.pressureKPA, pumpP.pressurePSI, pumpP.temperatureC); |
dmwahl | 3:1a0add40e308 | 37 | // } |
dmwahl | 3:1a0add40e308 | 38 | // wait(1); |
dmwahl | 3:1a0add40e308 | 39 | // } |
dmwahl | 3:1a0add40e308 | 40 | // |
dmwahl | 3:1a0add40e308 | 41 | //} |
dmwahl | 3:1a0add40e308 | 42 | // |
dmwahl | 3:1a0add40e308 | 43 | // End sample code |
dmwahl | 3:1a0add40e308 | 44 | |
dmwahl | 0:fc5c10fc5a05 | 45 | #include "keller_pressure.h" |
dmwahl | 3:1a0add40e308 | 46 | union { |
dmwahl | 3:1a0add40e308 | 47 | char c[4]; |
dmwahl | 3:1a0add40e308 | 48 | float f; |
dmwahl | 3:1a0add40e308 | 49 | } u; |
dmwahl | 0:fc5c10fc5a05 | 50 | |
dmwahl | 3:1a0add40e308 | 51 | //=========================================================================== |
dmwahl | 0:fc5c10fc5a05 | 52 | // Default constructor, input is the I2C address followed by min/max pressures (psi) |
dmwahl | 0:fc5c10fc5a05 | 53 | KELLER_PRESSURE::KELLER_PRESSURE(I2C &i2c, int i2cAddress) : i2c(i2c), mi2cAddress(i2cAddress << 1) |
dmwahl | 3:1a0add40e308 | 54 | //=========================================================================== |
dmwahl | 0:fc5c10fc5a05 | 55 | { |
dmwahl | 0:fc5c10fc5a05 | 56 | readUserInfo(); |
dmwahl | 0:fc5c10fc5a05 | 57 | }; |
dmwahl | 0:fc5c10fc5a05 | 58 | |
dmwahl | 3:1a0add40e308 | 59 | //=========================================================================== |
dmwahl | 0:fc5c10fc5a05 | 60 | KELLER_PRESSURE::~KELLER_PRESSURE() |
dmwahl | 3:1a0add40e308 | 61 | //=========================================================================== |
dmwahl | 0:fc5c10fc5a05 | 62 | { |
dmwahl | 0:fc5c10fc5a05 | 63 | } |
dmwahl | 0:fc5c10fc5a05 | 64 | |
dmwahl | 3:1a0add40e308 | 65 | //=========================================================================== |
dmwahl | 0:fc5c10fc5a05 | 66 | // Write out a single address byte to I2C bus, if the sensor returns an ACK the function returns true. |
dmwahl | 0:fc5c10fc5a05 | 67 | bool KELLER_PRESSURE::isAvailable() |
dmwahl | 3:1a0add40e308 | 68 | //=========================================================================== |
dmwahl | 0:fc5c10fc5a05 | 69 | { |
dmwahl | 0:fc5c10fc5a05 | 70 | uint8_t i = false; |
dmwahl | 0:fc5c10fc5a05 | 71 | i2c.start(); |
dmwahl | 0:fc5c10fc5a05 | 72 | i = i2c.write(mi2cAddress|I2C_WRITE); |
dmwahl | 0:fc5c10fc5a05 | 73 | i2c.stop(); |
dmwahl | 0:fc5c10fc5a05 | 74 | if (i == 1) { |
dmwahl | 0:fc5c10fc5a05 | 75 | return true; |
dmwahl | 0:fc5c10fc5a05 | 76 | } else { |
dmwahl | 0:fc5c10fc5a05 | 77 | return false; |
dmwahl | 0:fc5c10fc5a05 | 78 | } |
dmwahl | 0:fc5c10fc5a05 | 79 | } |
dmwahl | 0:fc5c10fc5a05 | 80 | |
dmwahl | 3:1a0add40e308 | 81 | //=========================================================================== |
dmwahl | 3:1a0add40e308 | 82 | // Read out status byte from sensor. First byte after any read request is status, |
dmwahl | 3:1a0add40e308 | 83 | // following bytes are pressure/temperature. |
dmwahl | 0:fc5c10fc5a05 | 84 | char KELLER_PRESSURE::getStatus() |
dmwahl | 3:1a0add40e308 | 85 | //=========================================================================== |
dmwahl | 0:fc5c10fc5a05 | 86 | { |
dmwahl | 0:fc5c10fc5a05 | 87 | char result = 0xFF; |
dmwahl | 0:fc5c10fc5a05 | 88 | i2c.start(); |
dmwahl | 0:fc5c10fc5a05 | 89 | i2c.write(mi2cAddress|I2C_READ); |
dmwahl | 0:fc5c10fc5a05 | 90 | result = i2c.read(0); |
dmwahl | 0:fc5c10fc5a05 | 91 | i2c.stop(); |
dmwahl | 0:fc5c10fc5a05 | 92 | return result; |
dmwahl | 0:fc5c10fc5a05 | 93 | } |
dmwahl | 0:fc5c10fc5a05 | 94 | |
dmwahl | 3:1a0add40e308 | 95 | //=========================================================================== |
dmwahl | 3:1a0add40e308 | 96 | // Read pressure and temperature. Return 1 if error, 0 if OK. |
dmwahl | 3:1a0add40e308 | 97 | // Byte 1: status, Bytes 2-3: pressure, Bytes 4-5: temperature |
dmwahl | 3:1a0add40e308 | 98 | char KELLER_PRESSURE::readPT() |
dmwahl | 3:1a0add40e308 | 99 | //=========================================================================== |
dmwahl | 0:fc5c10fc5a05 | 100 | { |
dmwahl | 3:1a0add40e308 | 101 | char error = 0; |
dmwahl | 0:fc5c10fc5a05 | 102 | char data[5]; |
dmwahl | 3:1a0add40e308 | 103 | |
dmwahl | 3:1a0add40e308 | 104 | error |= _read_multibyte(KELLER_PRESSURE_REQUEST_MEASUREMENT, data, 5); |
dmwahl | 0:fc5c10fc5a05 | 105 | status = data[0]; |
dmwahl | 0:fc5c10fc5a05 | 106 | pressure = (data[1] << 8) | data[2]; |
dmwahl | 0:fc5c10fc5a05 | 107 | temperature = (data[3] << 8) | data[4]; |
dmwahl | 1:805ee7853062 | 108 | |
dmwahl | 0:fc5c10fc5a05 | 109 | pressureBAR = ((pressure - 16384)*(pmax-pmin))/32768+pmin; |
dmwahl | 0:fc5c10fc5a05 | 110 | pressurePSI = pressureBAR*14.5038; |
dmwahl | 0:fc5c10fc5a05 | 111 | pressureKPA = pressureBAR*100; |
dmwahl | 1:805ee7853062 | 112 | |
dmwahl | 0:fc5c10fc5a05 | 113 | temperatureC = (temperature - 384)*0.003125-50; |
dmwahl | 0:fc5c10fc5a05 | 114 | temperatureF = (temperatureC*1.8+32); |
dmwahl | 3:1a0add40e308 | 115 | return error; |
dmwahl | 0:fc5c10fc5a05 | 116 | } |
dmwahl | 0:fc5c10fc5a05 | 117 | |
dmwahl | 3:1a0add40e308 | 118 | //=========================================================================== |
dmwahl | 3:1a0add40e308 | 119 | char KELLER_PRESSURE::readUserInfo() |
dmwahl | 3:1a0add40e308 | 120 | //=========================================================================== |
dmwahl | 0:fc5c10fc5a05 | 121 | { |
dmwahl | 3:1a0add40e308 | 122 | char error = 0; |
dmwahl | 0:fc5c10fc5a05 | 123 | char data[3]; |
dmwahl | 4:c298ec31dd93 | 124 | |
dmwahl | 3:1a0add40e308 | 125 | error |= _read_multibyte(KELLER_PRESSURE_CUST_ID0, data, 3); |
dmwahl | 0:fc5c10fc5a05 | 126 | Cust_ID0 = (data[1] << 8) | data[2]; |
dmwahl | 0:fc5c10fc5a05 | 127 | |
dmwahl | 3:1a0add40e308 | 128 | error |= _read_multibyte(KELLER_PRESSURE_CUST_ID1, data, 3); |
dmwahl | 0:fc5c10fc5a05 | 129 | Cust_ID1 = (data[1] << 8) | data[2]; |
dmwahl | 0:fc5c10fc5a05 | 130 | |
dmwahl | 1:805ee7853062 | 131 | // Scaling0 contains date/mode information |
dmwahl | 3:1a0add40e308 | 132 | error |= _read_multibyte(KELLER_PRESSURE_SCALING0, data, 3); |
dmwahl | 0:fc5c10fc5a05 | 133 | Scaling0 = (data[1] << 8) | data[2]; |
dmwahl | 0:fc5c10fc5a05 | 134 | |
dmwahl | 1:805ee7853062 | 135 | //Scaling1 and Scaling2 contain lower pressure limit |
dmwahl | 3:1a0add40e308 | 136 | error |= _read_multibyte(KELLER_PRESSURE_SCALING1, data, 3); |
dmwahl | 0:fc5c10fc5a05 | 137 | Scaling1 = (data[1] << 8) | data[2]; |
dmwahl | 1:805ee7853062 | 138 | u.c[3] = data[1]; |
dmwahl | 1:805ee7853062 | 139 | u.c[2] = data[2]; |
dmwahl | 0:fc5c10fc5a05 | 140 | |
dmwahl | 3:1a0add40e308 | 141 | error |= _read_multibyte(KELLER_PRESSURE_SCALING2, data, 3); |
dmwahl | 0:fc5c10fc5a05 | 142 | Scaling2 = (data[1] << 8) | data[2]; |
dmwahl | 1:805ee7853062 | 143 | u.c[1] = data[1]; |
dmwahl | 1:805ee7853062 | 144 | u.c[0] = data[2]; |
dmwahl | 1:805ee7853062 | 145 | pmin = u.f; |
dmwahl | 0:fc5c10fc5a05 | 146 | |
dmwahl | 1:805ee7853062 | 147 | //Scaling3 and Scaling4 contain upper pressure limit |
dmwahl | 3:1a0add40e308 | 148 | error |= _read_multibyte(KELLER_PRESSURE_SCALING3, data, 3); |
dmwahl | 0:fc5c10fc5a05 | 149 | Scaling3 = (data[1] << 8) | data[2]; |
dmwahl | 1:805ee7853062 | 150 | u.c[3] = data[1]; |
dmwahl | 1:805ee7853062 | 151 | u.c[2] = data[2]; |
dmwahl | 0:fc5c10fc5a05 | 152 | |
dmwahl | 3:1a0add40e308 | 153 | error |= _read_multibyte(KELLER_PRESSURE_SCALING4, data, 3); |
dmwahl | 0:fc5c10fc5a05 | 154 | Scaling4 = (data[1] << 8) | data[2]; |
dmwahl | 1:805ee7853062 | 155 | u.c[1] = data[1]; |
dmwahl | 1:805ee7853062 | 156 | u.c[0] = data[2]; |
dmwahl | 1:805ee7853062 | 157 | pmax = u.f; |
dmwahl | 0:fc5c10fc5a05 | 158 | |
dmwahl | 1:805ee7853062 | 159 | // Read out date of manufacture information and sensor mode |
dmwahl | 0:fc5c10fc5a05 | 160 | year = ((Scaling0 & KELLER_PRESSURE_SCALING0_YEAR_MASK) >> 11) + 2010; |
dmwahl | 0:fc5c10fc5a05 | 161 | month = (Scaling0 & KELLER_PRESSURE_SCALING0_MONTH_MASK) >> 7; |
dmwahl | 0:fc5c10fc5a05 | 162 | day = (Scaling0 & KELLER_PRESSURE_SCALING0_DAY_MASK) >> 2; |
dmwahl | 0:fc5c10fc5a05 | 163 | mode = (Scaling0 & KELLER_PRESSURE_SCALING0_MODE_MASK); |
dmwahl | 0:fc5c10fc5a05 | 164 | |
dmwahl | 3:1a0add40e308 | 165 | return error; |
dmwahl | 0:fc5c10fc5a05 | 166 | } |
dmwahl | 0:fc5c10fc5a05 | 167 | |
dmwahl | 3:1a0add40e308 | 168 | //=========================================================================== |
dmwahl | 3:1a0add40e308 | 169 | char KELLER_PRESSURE::_write(char regAddress, char data) |
dmwahl | 3:1a0add40e308 | 170 | //=========================================================================== |
dmwahl | 0:fc5c10fc5a05 | 171 | { |
dmwahl | 3:1a0add40e308 | 172 | char error = 0; |
dmwahl | 3:1a0add40e308 | 173 | char data_write[2] = {regAddress, data}; |
dmwahl | 3:1a0add40e308 | 174 | error |= i2c.write(mi2cAddress|I2C_WRITE, data_write, 1, false); |
dmwahl | 3:1a0add40e308 | 175 | return error; |
dmwahl | 0:fc5c10fc5a05 | 176 | } |
dmwahl | 0:fc5c10fc5a05 | 177 | |
dmwahl | 3:1a0add40e308 | 178 | //=========================================================================== |
dmwahl | 3:1a0add40e308 | 179 | char KELLER_PRESSURE::_read_multibyte(char regAddress, char* data, char count) |
dmwahl | 3:1a0add40e308 | 180 | //=========================================================================== |
dmwahl | 0:fc5c10fc5a05 | 181 | { |
dmwahl | 3:1a0add40e308 | 182 | char error = 0; |
dmwahl | 3:1a0add40e308 | 183 | error |= i2c.write(mi2cAddress|I2C_WRITE, ®Address, 1, false); |
dmwahl | 3:1a0add40e308 | 184 | for (int i = 0; i < 50; i++) { |
dmwahl | 3:1a0add40e308 | 185 | if(getStatus() == KELLER_PRESSURE_MEASUREMENT_DONE) { |
dmwahl | 3:1a0add40e308 | 186 | break; |
dmwahl | 3:1a0add40e308 | 187 | } |
dmwahl | 4:c298ec31dd93 | 188 | wait_us(200); |
dmwahl | 3:1a0add40e308 | 189 | if (i == 49) { |
dmwahl | 4:c298ec31dd93 | 190 | error |= 1; // Timout after 50 attempts |
dmwahl | 3:1a0add40e308 | 191 | } |
dmwahl | 0:fc5c10fc5a05 | 192 | } |
dmwahl | 3:1a0add40e308 | 193 | error |= i2c.read(mi2cAddress|I2C_READ, data, count, false); |
dmwahl | 3:1a0add40e308 | 194 | return error; |
dmwahl | 0:fc5c10fc5a05 | 195 | } |