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