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@7:6bca43eedca6, 2018-04-05 (annotated)
- Committer:
- dmwahl
- Date:
- Thu Apr 05 16:04:45 2018 +0000
- Revision:
- 7:6bca43eedca6
- Parent:
- 6:deb4008b136e
- Child:
- 8:0d45e94faf0f
Added readP function
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dmwahl | 6:deb4008b136e | 1 | ///----------------------------------------------------------------- |
dmwahl | 6:deb4008b136e | 2 | /// Description: Read from Keller-Druck I2C pressure sensor |
dmwahl | 6:deb4008b136e | 3 | /// Author: David Wahl |
dmwahl | 6:deb4008b136e | 4 | /// Date: 28-FEB-2018 |
dmwahl | 6:deb4008b136e | 5 | /// Notes: Initial release |
dmwahl | 6:deb4008b136e | 6 | /// |
dmwahl | 6:deb4008b136e | 7 | /// Revision History: |
dmwahl | 6:deb4008b136e | 8 | /// Name: Date: Description: |
dmwahl | 6:deb4008b136e | 9 | ///----------------------------------------------------------------- |
dmwahl | 6:deb4008b136e | 10 | |
dmwahl | 6:deb4008b136e | 11 | |
dmwahl | 3:1a0add40e308 | 12 | // Sample code |
dmwahl | 5:3ac90d95062a | 13 | /* |
dmwahl | 5:3ac90d95062a | 14 | #include <mbed.h> |
dmwahl | 5:3ac90d95062a | 15 | #include "keller_pressure.h" |
dmwahl | 5:3ac90d95062a | 16 | |
dmwahl | 5:3ac90d95062a | 17 | DigitalOut myled(LED1); |
dmwahl | 5:3ac90d95062a | 18 | Serial pc(SERIAL_TX, SERIAL_RX); |
dmwahl | 5:3ac90d95062a | 19 | |
dmwahl | 5:3ac90d95062a | 20 | // an I2C sub-class that provides a constructed default |
dmwahl | 5:3ac90d95062a | 21 | class I2CPreInit : public I2C |
dmwahl | 5:3ac90d95062a | 22 | { |
dmwahl | 5:3ac90d95062a | 23 | public: |
dmwahl | 5:3ac90d95062a | 24 | I2CPreInit(PinName sda, PinName scl, int freq) : I2C(sda, scl) { |
dmwahl | 5:3ac90d95062a | 25 | frequency(freq); |
dmwahl | 5:3ac90d95062a | 26 | }; |
dmwahl | 5:3ac90d95062a | 27 | }; |
dmwahl | 5:3ac90d95062a | 28 | //I2CPreInit gI2C1(I2C_SDA, I2C_SCL, I2C frequency); |
dmwahl | 6:deb4008b136e | 29 | I2CPreInit i2c(PB_9, PB_8, 100000); |
dmwahl | 5:3ac90d95062a | 30 | KELLER_PRESSURE pumpP(i2c, 0x40); |
dmwahl | 5:3ac90d95062a | 31 | |
dmwahl | 5:3ac90d95062a | 32 | int main() |
dmwahl | 5:3ac90d95062a | 33 | { |
dmwahl | 6:deb4008b136e | 34 | pc.baud(115200); |
dmwahl | 5:3ac90d95062a | 35 | pc.printf("Starting up...\n\r"); |
dmwahl | 5:3ac90d95062a | 36 | if (pumpP.isAvailable()) { |
dmwahl | 5:3ac90d95062a | 37 | pc.printf("ACK\r\n"); |
dmwahl | 5:3ac90d95062a | 38 | pumpP.readPT(); |
dmwahl | 5:3ac90d95062a | 39 | pc.printf("Pmin: %.03f Pmax: %.03f\r\n", pumpP.pmin, pumpP.pmax); |
dmwahl | 5:3ac90d95062a | 40 | pc.printf("Year: %d Month: %d Day: %d Mode: %d\r\n", pumpP.year, pumpP.month, pumpP.day, pumpP.mode); |
dmwahl | 5:3ac90d95062a | 41 | pc.printf("Status: 0x%x\r\n", pumpP.getStatus()); |
dmwahl | 5:3ac90d95062a | 42 | pc.printf("%.02fkPa %.02fpsi %.02fC\r\n", pumpP.pressureKPA, pumpP.pressurePSI, pumpP.temperatureC); |
dmwahl | 5:3ac90d95062a | 43 | } |
dmwahl | 5:3ac90d95062a | 44 | while (1) { |
dmwahl | 5:3ac90d95062a | 45 | // Main loop |
dmwahl | 5:3ac90d95062a | 46 | if (pumpP.isAvailable()) { |
dmwahl | 5:3ac90d95062a | 47 | pumpP.readPT(); |
dmwahl | 5:3ac90d95062a | 48 | pc.printf("%.02fkPa %.02fpsi %.02fC\r\n", pumpP.pressureKPA, pumpP.pressurePSI, pumpP.temperatureC); |
dmwahl | 5:3ac90d95062a | 49 | } |
dmwahl | 5:3ac90d95062a | 50 | wait(1); |
dmwahl | 5:3ac90d95062a | 51 | } |
dmwahl | 5:3ac90d95062a | 52 | } |
dmwahl | 5:3ac90d95062a | 53 | */ |
dmwahl | 3:1a0add40e308 | 54 | // End sample code |
dmwahl | 3:1a0add40e308 | 55 | |
dmwahl | 0:fc5c10fc5a05 | 56 | #include "keller_pressure.h" |
dmwahl | 3:1a0add40e308 | 57 | union { |
dmwahl | 3:1a0add40e308 | 58 | char c[4]; |
dmwahl | 3:1a0add40e308 | 59 | float f; |
dmwahl | 3:1a0add40e308 | 60 | } u; |
dmwahl | 0:fc5c10fc5a05 | 61 | |
dmwahl | 3:1a0add40e308 | 62 | //=========================================================================== |
dmwahl | 0:fc5c10fc5a05 | 63 | // Default constructor, input is the I2C address followed by min/max pressures (psi) |
dmwahl | 0:fc5c10fc5a05 | 64 | KELLER_PRESSURE::KELLER_PRESSURE(I2C &i2c, int i2cAddress) : i2c(i2c), mi2cAddress(i2cAddress << 1) |
dmwahl | 3:1a0add40e308 | 65 | //=========================================================================== |
dmwahl | 0:fc5c10fc5a05 | 66 | { |
dmwahl | 0:fc5c10fc5a05 | 67 | readUserInfo(); |
dmwahl | 0:fc5c10fc5a05 | 68 | }; |
dmwahl | 0:fc5c10fc5a05 | 69 | |
dmwahl | 3:1a0add40e308 | 70 | //=========================================================================== |
dmwahl | 0:fc5c10fc5a05 | 71 | KELLER_PRESSURE::~KELLER_PRESSURE() |
dmwahl | 3:1a0add40e308 | 72 | //=========================================================================== |
dmwahl | 0:fc5c10fc5a05 | 73 | { |
dmwahl | 0:fc5c10fc5a05 | 74 | } |
dmwahl | 0:fc5c10fc5a05 | 75 | |
dmwahl | 3:1a0add40e308 | 76 | //=========================================================================== |
dmwahl | 0:fc5c10fc5a05 | 77 | // Write out a single address byte to I2C bus, if the sensor returns an ACK the function returns true. |
dmwahl | 0:fc5c10fc5a05 | 78 | bool KELLER_PRESSURE::isAvailable() |
dmwahl | 3:1a0add40e308 | 79 | //=========================================================================== |
dmwahl | 0:fc5c10fc5a05 | 80 | { |
dmwahl | 0:fc5c10fc5a05 | 81 | uint8_t i = false; |
dmwahl | 0:fc5c10fc5a05 | 82 | i2c.start(); |
dmwahl | 0:fc5c10fc5a05 | 83 | i = i2c.write(mi2cAddress|I2C_WRITE); |
dmwahl | 0:fc5c10fc5a05 | 84 | i2c.stop(); |
dmwahl | 0:fc5c10fc5a05 | 85 | if (i == 1) { |
dmwahl | 0:fc5c10fc5a05 | 86 | return true; |
dmwahl | 0:fc5c10fc5a05 | 87 | } else { |
dmwahl | 0:fc5c10fc5a05 | 88 | return false; |
dmwahl | 0:fc5c10fc5a05 | 89 | } |
dmwahl | 0:fc5c10fc5a05 | 90 | } |
dmwahl | 0:fc5c10fc5a05 | 91 | |
dmwahl | 3:1a0add40e308 | 92 | //=========================================================================== |
dmwahl | 3:1a0add40e308 | 93 | // Read out status byte from sensor. First byte after any read request is status, |
dmwahl | 3:1a0add40e308 | 94 | // following bytes are pressure/temperature. |
dmwahl | 0:fc5c10fc5a05 | 95 | char KELLER_PRESSURE::getStatus() |
dmwahl | 3:1a0add40e308 | 96 | //=========================================================================== |
dmwahl | 0:fc5c10fc5a05 | 97 | { |
dmwahl | 0:fc5c10fc5a05 | 98 | char result = 0xFF; |
dmwahl | 0:fc5c10fc5a05 | 99 | i2c.start(); |
dmwahl | 0:fc5c10fc5a05 | 100 | i2c.write(mi2cAddress|I2C_READ); |
dmwahl | 0:fc5c10fc5a05 | 101 | result = i2c.read(0); |
dmwahl | 0:fc5c10fc5a05 | 102 | i2c.stop(); |
dmwahl | 0:fc5c10fc5a05 | 103 | return result; |
dmwahl | 0:fc5c10fc5a05 | 104 | } |
dmwahl | 0:fc5c10fc5a05 | 105 | |
dmwahl | 3:1a0add40e308 | 106 | //=========================================================================== |
dmwahl | 3:1a0add40e308 | 107 | // Read pressure and temperature. Return 1 if error, 0 if OK. |
dmwahl | 3:1a0add40e308 | 108 | // Byte 1: status, Bytes 2-3: pressure, Bytes 4-5: temperature |
dmwahl | 3:1a0add40e308 | 109 | char KELLER_PRESSURE::readPT() |
dmwahl | 3:1a0add40e308 | 110 | //=========================================================================== |
dmwahl | 0:fc5c10fc5a05 | 111 | { |
dmwahl | 3:1a0add40e308 | 112 | char error = 0; |
dmwahl | 0:fc5c10fc5a05 | 113 | char data[5]; |
dmwahl | 3:1a0add40e308 | 114 | |
dmwahl | 3:1a0add40e308 | 115 | error |= _read_multibyte(KELLER_PRESSURE_REQUEST_MEASUREMENT, data, 5); |
dmwahl | 0:fc5c10fc5a05 | 116 | status = data[0]; |
dmwahl | 0:fc5c10fc5a05 | 117 | pressure = (data[1] << 8) | data[2]; |
dmwahl | 0:fc5c10fc5a05 | 118 | temperature = (data[3] << 8) | data[4]; |
dmwahl | 1:805ee7853062 | 119 | |
dmwahl | 0:fc5c10fc5a05 | 120 | pressureBAR = ((pressure - 16384)*(pmax-pmin))/32768+pmin; |
dmwahl | 0:fc5c10fc5a05 | 121 | pressurePSI = pressureBAR*14.5038; |
dmwahl | 0:fc5c10fc5a05 | 122 | pressureKPA = pressureBAR*100; |
dmwahl | 1:805ee7853062 | 123 | |
dmwahl | 0:fc5c10fc5a05 | 124 | temperatureC = (temperature - 384)*0.003125-50; |
dmwahl | 0:fc5c10fc5a05 | 125 | temperatureF = (temperatureC*1.8+32); |
dmwahl | 3:1a0add40e308 | 126 | return error; |
dmwahl | 0:fc5c10fc5a05 | 127 | } |
dmwahl | 0:fc5c10fc5a05 | 128 | |
dmwahl | 3:1a0add40e308 | 129 | //=========================================================================== |
dmwahl | 7:6bca43eedca6 | 130 | // Read pressure only. Return 1 if error, 0 if OK. |
dmwahl | 7:6bca43eedca6 | 131 | // Byte 1: status, Bytes 2-3: pressure |
dmwahl | 7:6bca43eedca6 | 132 | char KELLER_PRESSURE::readP() |
dmwahl | 7:6bca43eedca6 | 133 | //=========================================================================== |
dmwahl | 7:6bca43eedca6 | 134 | { |
dmwahl | 7:6bca43eedca6 | 135 | char error = 0; |
dmwahl | 7:6bca43eedca6 | 136 | char data[3]; |
dmwahl | 7:6bca43eedca6 | 137 | |
dmwahl | 7:6bca43eedca6 | 138 | error |= _read_multibyte(KELLER_PRESSURE_REQUEST_MEASUREMENT, data, 3); |
dmwahl | 7:6bca43eedca6 | 139 | status = data[0]; |
dmwahl | 7:6bca43eedca6 | 140 | pressure = (data[1] << 8) | data[2]; |
dmwahl | 7:6bca43eedca6 | 141 | |
dmwahl | 7:6bca43eedca6 | 142 | pressureBAR = ((pressure - 16384)*(pmax-pmin))/32768+pmin; |
dmwahl | 7:6bca43eedca6 | 143 | pressurePSI = pressureBAR*14.5038; |
dmwahl | 7:6bca43eedca6 | 144 | pressureKPA = pressureBAR*100; |
dmwahl | 7:6bca43eedca6 | 145 | |
dmwahl | 7:6bca43eedca6 | 146 | return error; |
dmwahl | 7:6bca43eedca6 | 147 | } |
dmwahl | 7:6bca43eedca6 | 148 | |
dmwahl | 7:6bca43eedca6 | 149 | //=========================================================================== |
dmwahl | 3:1a0add40e308 | 150 | char KELLER_PRESSURE::readUserInfo() |
dmwahl | 3:1a0add40e308 | 151 | //=========================================================================== |
dmwahl | 0:fc5c10fc5a05 | 152 | { |
dmwahl | 3:1a0add40e308 | 153 | char error = 0; |
dmwahl | 0:fc5c10fc5a05 | 154 | char data[3]; |
dmwahl | 4:c298ec31dd93 | 155 | |
dmwahl | 3:1a0add40e308 | 156 | error |= _read_multibyte(KELLER_PRESSURE_CUST_ID0, data, 3); |
dmwahl | 0:fc5c10fc5a05 | 157 | Cust_ID0 = (data[1] << 8) | data[2]; |
dmwahl | 0:fc5c10fc5a05 | 158 | |
dmwahl | 3:1a0add40e308 | 159 | error |= _read_multibyte(KELLER_PRESSURE_CUST_ID1, data, 3); |
dmwahl | 0:fc5c10fc5a05 | 160 | Cust_ID1 = (data[1] << 8) | data[2]; |
dmwahl | 0:fc5c10fc5a05 | 161 | |
dmwahl | 1:805ee7853062 | 162 | // Scaling0 contains date/mode information |
dmwahl | 3:1a0add40e308 | 163 | error |= _read_multibyte(KELLER_PRESSURE_SCALING0, data, 3); |
dmwahl | 0:fc5c10fc5a05 | 164 | Scaling0 = (data[1] << 8) | data[2]; |
dmwahl | 0:fc5c10fc5a05 | 165 | |
dmwahl | 1:805ee7853062 | 166 | //Scaling1 and Scaling2 contain lower pressure limit |
dmwahl | 3:1a0add40e308 | 167 | error |= _read_multibyte(KELLER_PRESSURE_SCALING1, data, 3); |
dmwahl | 0:fc5c10fc5a05 | 168 | Scaling1 = (data[1] << 8) | data[2]; |
dmwahl | 1:805ee7853062 | 169 | u.c[3] = data[1]; |
dmwahl | 1:805ee7853062 | 170 | u.c[2] = data[2]; |
dmwahl | 0:fc5c10fc5a05 | 171 | |
dmwahl | 3:1a0add40e308 | 172 | error |= _read_multibyte(KELLER_PRESSURE_SCALING2, data, 3); |
dmwahl | 0:fc5c10fc5a05 | 173 | Scaling2 = (data[1] << 8) | data[2]; |
dmwahl | 1:805ee7853062 | 174 | u.c[1] = data[1]; |
dmwahl | 1:805ee7853062 | 175 | u.c[0] = data[2]; |
dmwahl | 1:805ee7853062 | 176 | pmin = u.f; |
dmwahl | 0:fc5c10fc5a05 | 177 | |
dmwahl | 1:805ee7853062 | 178 | //Scaling3 and Scaling4 contain upper pressure limit |
dmwahl | 3:1a0add40e308 | 179 | error |= _read_multibyte(KELLER_PRESSURE_SCALING3, data, 3); |
dmwahl | 0:fc5c10fc5a05 | 180 | Scaling3 = (data[1] << 8) | data[2]; |
dmwahl | 1:805ee7853062 | 181 | u.c[3] = data[1]; |
dmwahl | 1:805ee7853062 | 182 | u.c[2] = data[2]; |
dmwahl | 0:fc5c10fc5a05 | 183 | |
dmwahl | 3:1a0add40e308 | 184 | error |= _read_multibyte(KELLER_PRESSURE_SCALING4, data, 3); |
dmwahl | 0:fc5c10fc5a05 | 185 | Scaling4 = (data[1] << 8) | data[2]; |
dmwahl | 1:805ee7853062 | 186 | u.c[1] = data[1]; |
dmwahl | 1:805ee7853062 | 187 | u.c[0] = data[2]; |
dmwahl | 1:805ee7853062 | 188 | pmax = u.f; |
dmwahl | 0:fc5c10fc5a05 | 189 | |
dmwahl | 1:805ee7853062 | 190 | // Read out date of manufacture information and sensor mode |
dmwahl | 0:fc5c10fc5a05 | 191 | year = ((Scaling0 & KELLER_PRESSURE_SCALING0_YEAR_MASK) >> 11) + 2010; |
dmwahl | 0:fc5c10fc5a05 | 192 | month = (Scaling0 & KELLER_PRESSURE_SCALING0_MONTH_MASK) >> 7; |
dmwahl | 0:fc5c10fc5a05 | 193 | day = (Scaling0 & KELLER_PRESSURE_SCALING0_DAY_MASK) >> 2; |
dmwahl | 0:fc5c10fc5a05 | 194 | mode = (Scaling0 & KELLER_PRESSURE_SCALING0_MODE_MASK); |
dmwahl | 0:fc5c10fc5a05 | 195 | |
dmwahl | 3:1a0add40e308 | 196 | return error; |
dmwahl | 0:fc5c10fc5a05 | 197 | } |
dmwahl | 0:fc5c10fc5a05 | 198 | |
dmwahl | 3:1a0add40e308 | 199 | //=========================================================================== |
dmwahl | 3:1a0add40e308 | 200 | char KELLER_PRESSURE::_write(char regAddress, char data) |
dmwahl | 3:1a0add40e308 | 201 | //=========================================================================== |
dmwahl | 0:fc5c10fc5a05 | 202 | { |
dmwahl | 3:1a0add40e308 | 203 | char error = 0; |
dmwahl | 3:1a0add40e308 | 204 | char data_write[2] = {regAddress, data}; |
dmwahl | 3:1a0add40e308 | 205 | error |= i2c.write(mi2cAddress|I2C_WRITE, data_write, 1, false); |
dmwahl | 3:1a0add40e308 | 206 | return error; |
dmwahl | 0:fc5c10fc5a05 | 207 | } |
dmwahl | 0:fc5c10fc5a05 | 208 | |
dmwahl | 3:1a0add40e308 | 209 | //=========================================================================== |
dmwahl | 3:1a0add40e308 | 210 | char KELLER_PRESSURE::_read_multibyte(char regAddress, char* data, char count) |
dmwahl | 3:1a0add40e308 | 211 | //=========================================================================== |
dmwahl | 0:fc5c10fc5a05 | 212 | { |
dmwahl | 3:1a0add40e308 | 213 | char error = 0; |
dmwahl | 3:1a0add40e308 | 214 | error |= i2c.write(mi2cAddress|I2C_WRITE, ®Address, 1, false); |
dmwahl | 3:1a0add40e308 | 215 | for (int i = 0; i < 50; i++) { |
dmwahl | 3:1a0add40e308 | 216 | if(getStatus() == KELLER_PRESSURE_MEASUREMENT_DONE) { |
dmwahl | 3:1a0add40e308 | 217 | break; |
dmwahl | 3:1a0add40e308 | 218 | } |
dmwahl | 4:c298ec31dd93 | 219 | wait_us(200); |
dmwahl | 3:1a0add40e308 | 220 | if (i == 49) { |
dmwahl | 4:c298ec31dd93 | 221 | error |= 1; // Timout after 50 attempts |
dmwahl | 3:1a0add40e308 | 222 | } |
dmwahl | 0:fc5c10fc5a05 | 223 | } |
dmwahl | 3:1a0add40e308 | 224 | error |= i2c.read(mi2cAddress|I2C_READ, data, count, false); |
dmwahl | 3:1a0add40e308 | 225 | return error; |
dmwahl | 0:fc5c10fc5a05 | 226 | } |