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@0:fc5c10fc5a05, 2017-05-09 (annotated)
- Committer:
- dmwahl
- Date:
- Tue May 09 21:43:26 2017 +0000
- Revision:
- 0:fc5c10fc5a05
- Child:
- 1:805ee7853062
Basic functions working, reading scales from sensor not yet.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dmwahl | 0:fc5c10fc5a05 | 1 | #include "keller_pressure.h" |
dmwahl | 0:fc5c10fc5a05 | 2 | |
dmwahl | 0:fc5c10fc5a05 | 3 | // Default constructor, input is the I2C address followed by min/max pressures (psi) |
dmwahl | 0:fc5c10fc5a05 | 4 | KELLER_PRESSURE::KELLER_PRESSURE(I2C &i2c, int i2cAddress) : i2c(i2c), mi2cAddress(i2cAddress << 1) |
dmwahl | 0:fc5c10fc5a05 | 5 | { |
dmwahl | 0:fc5c10fc5a05 | 6 | readUserInfo(); |
dmwahl | 0:fc5c10fc5a05 | 7 | }; |
dmwahl | 0:fc5c10fc5a05 | 8 | |
dmwahl | 0:fc5c10fc5a05 | 9 | KELLER_PRESSURE::~KELLER_PRESSURE() |
dmwahl | 0:fc5c10fc5a05 | 10 | { |
dmwahl | 0:fc5c10fc5a05 | 11 | } |
dmwahl | 0:fc5c10fc5a05 | 12 | |
dmwahl | 0:fc5c10fc5a05 | 13 | // Write out a single address byte to I2C bus, if the sensor returns an ACK the function returns true. |
dmwahl | 0:fc5c10fc5a05 | 14 | bool KELLER_PRESSURE::isAvailable() |
dmwahl | 0:fc5c10fc5a05 | 15 | { |
dmwahl | 0:fc5c10fc5a05 | 16 | uint8_t i = false; |
dmwahl | 0:fc5c10fc5a05 | 17 | i2c.start(); |
dmwahl | 0:fc5c10fc5a05 | 18 | i = i2c.write(mi2cAddress|I2C_WRITE); |
dmwahl | 0:fc5c10fc5a05 | 19 | i2c.stop(); |
dmwahl | 0:fc5c10fc5a05 | 20 | if (i == 1) { |
dmwahl | 0:fc5c10fc5a05 | 21 | return true; |
dmwahl | 0:fc5c10fc5a05 | 22 | } else { |
dmwahl | 0:fc5c10fc5a05 | 23 | return false; |
dmwahl | 0:fc5c10fc5a05 | 24 | } |
dmwahl | 0:fc5c10fc5a05 | 25 | } |
dmwahl | 0:fc5c10fc5a05 | 26 | |
dmwahl | 0:fc5c10fc5a05 | 27 | // Check if conversion has completed |
dmwahl | 0:fc5c10fc5a05 | 28 | char KELLER_PRESSURE::getStatus() |
dmwahl | 0:fc5c10fc5a05 | 29 | { |
dmwahl | 0:fc5c10fc5a05 | 30 | char result = 0xFF; |
dmwahl | 0:fc5c10fc5a05 | 31 | i2c.start(); |
dmwahl | 0:fc5c10fc5a05 | 32 | i2c.write(mi2cAddress|I2C_READ); |
dmwahl | 0:fc5c10fc5a05 | 33 | result = i2c.read(0); |
dmwahl | 0:fc5c10fc5a05 | 34 | i2c.stop(); |
dmwahl | 0:fc5c10fc5a05 | 35 | return result; |
dmwahl | 0:fc5c10fc5a05 | 36 | } |
dmwahl | 0:fc5c10fc5a05 | 37 | |
dmwahl | 0:fc5c10fc5a05 | 38 | // Read pressure and temperature |
dmwahl | 0:fc5c10fc5a05 | 39 | bool KELLER_PRESSURE::readPT() |
dmwahl | 0:fc5c10fc5a05 | 40 | { |
dmwahl | 0:fc5c10fc5a05 | 41 | bool result = false; |
dmwahl | 0:fc5c10fc5a05 | 42 | char data[5]; |
dmwahl | 0:fc5c10fc5a05 | 43 | _read_multibyte(KELLER_PRESSURE_REQUEST_MEASUREMENT, data, 5); |
dmwahl | 0:fc5c10fc5a05 | 44 | status = data[0]; |
dmwahl | 0:fc5c10fc5a05 | 45 | pressure = (data[1] << 8) | data[2]; |
dmwahl | 0:fc5c10fc5a05 | 46 | temperature = (data[3] << 8) | data[4]; |
dmwahl | 0:fc5c10fc5a05 | 47 | |
dmwahl | 0:fc5c10fc5a05 | 48 | pressureBAR = ((pressure - 16384)*(pmax-pmin))/32768+pmin; |
dmwahl | 0:fc5c10fc5a05 | 49 | pressurePSI = pressureBAR*14.5038; |
dmwahl | 0:fc5c10fc5a05 | 50 | pressureKPA = pressureBAR*100; |
dmwahl | 0:fc5c10fc5a05 | 51 | |
dmwahl | 0:fc5c10fc5a05 | 52 | temperatureC = (temperature - 384)*0.003125-50; |
dmwahl | 0:fc5c10fc5a05 | 53 | temperatureF = (temperatureC*1.8+32); |
dmwahl | 0:fc5c10fc5a05 | 54 | result = true; |
dmwahl | 0:fc5c10fc5a05 | 55 | return result; |
dmwahl | 0:fc5c10fc5a05 | 56 | } |
dmwahl | 0:fc5c10fc5a05 | 57 | |
dmwahl | 0:fc5c10fc5a05 | 58 | |
dmwahl | 0:fc5c10fc5a05 | 59 | |
dmwahl | 0:fc5c10fc5a05 | 60 | void KELLER_PRESSURE::readUserInfo() |
dmwahl | 0:fc5c10fc5a05 | 61 | { |
dmwahl | 0:fc5c10fc5a05 | 62 | char data[3]; |
dmwahl | 0:fc5c10fc5a05 | 63 | //const uint8_t i = NELEMS(data); |
dmwahl | 0:fc5c10fc5a05 | 64 | // _read_multibyte(char regAddress, char* data, char count) |
dmwahl | 0:fc5c10fc5a05 | 65 | _read_multibyte(KELLER_PRESSURE_CUST_ID0, data, 3); |
dmwahl | 0:fc5c10fc5a05 | 66 | Cust_ID0 = (data[1] << 8) | data[2]; |
dmwahl | 0:fc5c10fc5a05 | 67 | |
dmwahl | 0:fc5c10fc5a05 | 68 | _read_multibyte(KELLER_PRESSURE_CUST_ID1, data, 3); |
dmwahl | 0:fc5c10fc5a05 | 69 | Cust_ID1 = (data[1] << 8) | data[2]; |
dmwahl | 0:fc5c10fc5a05 | 70 | |
dmwahl | 0:fc5c10fc5a05 | 71 | _read_multibyte(KELLER_PRESSURE_SCALING0, data, 3); |
dmwahl | 0:fc5c10fc5a05 | 72 | Scaling0 = (data[1] << 8) | data[2]; |
dmwahl | 0:fc5c10fc5a05 | 73 | |
dmwahl | 0:fc5c10fc5a05 | 74 | _read_multibyte(KELLER_PRESSURE_SCALING1, data, 3); |
dmwahl | 0:fc5c10fc5a05 | 75 | Scaling1 = (data[1] << 8) | data[2]; |
dmwahl | 0:fc5c10fc5a05 | 76 | |
dmwahl | 0:fc5c10fc5a05 | 77 | _read_multibyte(KELLER_PRESSURE_SCALING2, data, 3); |
dmwahl | 0:fc5c10fc5a05 | 78 | Scaling2 = (data[1] << 8) | data[2]; |
dmwahl | 0:fc5c10fc5a05 | 79 | |
dmwahl | 0:fc5c10fc5a05 | 80 | _read_multibyte(KELLER_PRESSURE_SCALING3, data, 3); |
dmwahl | 0:fc5c10fc5a05 | 81 | Scaling3 = (data[1] << 8) | data[2]; |
dmwahl | 0:fc5c10fc5a05 | 82 | |
dmwahl | 0:fc5c10fc5a05 | 83 | _read_multibyte(KELLER_PRESSURE_SCALING4, data, 3); |
dmwahl | 0:fc5c10fc5a05 | 84 | Scaling4 = (data[1] << 8) | data[2]; |
dmwahl | 0:fc5c10fc5a05 | 85 | |
dmwahl | 0:fc5c10fc5a05 | 86 | pmin = ((Scaling1 << 16) | Scaling2)/(0xBF800000)*-1.0; |
dmwahl | 0:fc5c10fc5a05 | 87 | pmax = ((Scaling3 << 16) | Scaling4)/(1092616192.0)*10.0; |
dmwahl | 0:fc5c10fc5a05 | 88 | |
dmwahl | 0:fc5c10fc5a05 | 89 | year = ((Scaling0 & KELLER_PRESSURE_SCALING0_YEAR_MASK) >> 11) + 2010; |
dmwahl | 0:fc5c10fc5a05 | 90 | month = (Scaling0 & KELLER_PRESSURE_SCALING0_MONTH_MASK) >> 7; |
dmwahl | 0:fc5c10fc5a05 | 91 | day = (Scaling0 & KELLER_PRESSURE_SCALING0_DAY_MASK) >> 2; |
dmwahl | 0:fc5c10fc5a05 | 92 | mode = (Scaling0 & KELLER_PRESSURE_SCALING0_MODE_MASK); |
dmwahl | 0:fc5c10fc5a05 | 93 | } |
dmwahl | 0:fc5c10fc5a05 | 94 | |
dmwahl | 0:fc5c10fc5a05 | 95 | void KELLER_PRESSURE::_write(char regAddress, char data) |
dmwahl | 0:fc5c10fc5a05 | 96 | { |
dmwahl | 0:fc5c10fc5a05 | 97 | i2c.start(); |
dmwahl | 0:fc5c10fc5a05 | 98 | i2c.write(mi2cAddress|I2C_WRITE); |
dmwahl | 0:fc5c10fc5a05 | 99 | i2c.write(regAddress); |
dmwahl | 0:fc5c10fc5a05 | 100 | i2c.write(data); |
dmwahl | 0:fc5c10fc5a05 | 101 | i2c.stop(); |
dmwahl | 0:fc5c10fc5a05 | 102 | } |
dmwahl | 0:fc5c10fc5a05 | 103 | |
dmwahl | 0:fc5c10fc5a05 | 104 | char KELLER_PRESSURE::_read(char regAddress) |
dmwahl | 0:fc5c10fc5a05 | 105 | { |
dmwahl | 0:fc5c10fc5a05 | 106 | char result = 0; |
dmwahl | 0:fc5c10fc5a05 | 107 | |
dmwahl | 0:fc5c10fc5a05 | 108 | i2c.start(); |
dmwahl | 0:fc5c10fc5a05 | 109 | i2c.write(mi2cAddress|I2C_WRITE); |
dmwahl | 0:fc5c10fc5a05 | 110 | i2c.write(regAddress); |
dmwahl | 0:fc5c10fc5a05 | 111 | |
dmwahl | 0:fc5c10fc5a05 | 112 | i2c.start(); |
dmwahl | 0:fc5c10fc5a05 | 113 | i2c.write(mi2cAddress|I2C_READ); |
dmwahl | 0:fc5c10fc5a05 | 114 | result = i2c.read(0); |
dmwahl | 0:fc5c10fc5a05 | 115 | |
dmwahl | 0:fc5c10fc5a05 | 116 | i2c.stop(); |
dmwahl | 0:fc5c10fc5a05 | 117 | |
dmwahl | 0:fc5c10fc5a05 | 118 | return result; |
dmwahl | 0:fc5c10fc5a05 | 119 | } |
dmwahl | 0:fc5c10fc5a05 | 120 | |
dmwahl | 0:fc5c10fc5a05 | 121 | void KELLER_PRESSURE::_read_multibyte(char regAddress, char* data, char count) |
dmwahl | 0:fc5c10fc5a05 | 122 | { |
dmwahl | 0:fc5c10fc5a05 | 123 | //char count = (sizeof(data) / sizeof((data)[0]))-1; |
dmwahl | 0:fc5c10fc5a05 | 124 | |
dmwahl | 0:fc5c10fc5a05 | 125 | /*wait_ms(1); |
dmwahl | 0:fc5c10fc5a05 | 126 | char data_write = regAddress; |
dmwahl | 0:fc5c10fc5a05 | 127 | |
dmwahl | 0:fc5c10fc5a05 | 128 | i2c.write(mi2cAddress, &data_write, 1, false); |
dmwahl | 0:fc5c10fc5a05 | 129 | wait_ms(1); |
dmwahl | 0:fc5c10fc5a05 | 130 | i2c.read(mi2cAddress, data, count, false); |
dmwahl | 0:fc5c10fc5a05 | 131 | wait_ms(1);*/ |
dmwahl | 0:fc5c10fc5a05 | 132 | |
dmwahl | 0:fc5c10fc5a05 | 133 | i2c.start(); |
dmwahl | 0:fc5c10fc5a05 | 134 | i2c.write(mi2cAddress|I2C_WRITE); |
dmwahl | 0:fc5c10fc5a05 | 135 | i2c.write(regAddress); |
dmwahl | 0:fc5c10fc5a05 | 136 | i2c.stop(); |
dmwahl | 0:fc5c10fc5a05 | 137 | |
dmwahl | 0:fc5c10fc5a05 | 138 | //wait_us(500); |
dmwahl | 0:fc5c10fc5a05 | 139 | while (getStatus() != 0x40) |
dmwahl | 0:fc5c10fc5a05 | 140 | { |
dmwahl | 0:fc5c10fc5a05 | 141 | wait_us(10); // wait until the status bit indicates conversion has completed |
dmwahl | 0:fc5c10fc5a05 | 142 | } |
dmwahl | 0:fc5c10fc5a05 | 143 | |
dmwahl | 0:fc5c10fc5a05 | 144 | i2c.start(); |
dmwahl | 0:fc5c10fc5a05 | 145 | i2c.write(mi2cAddress|I2C_READ); |
dmwahl | 0:fc5c10fc5a05 | 146 | |
dmwahl | 0:fc5c10fc5a05 | 147 | for(int i = 0; i < count; i++) { |
dmwahl | 0:fc5c10fc5a05 | 148 | data[i] = i2c.read((i == count - 1) ? 0 : 1); |
dmwahl | 0:fc5c10fc5a05 | 149 | } |
dmwahl | 0:fc5c10fc5a05 | 150 | |
dmwahl | 0:fc5c10fc5a05 | 151 | i2c.stop(); |
dmwahl | 0:fc5c10fc5a05 | 152 | } |