David Wahl / KellerDruck_pressure

Dependents:   TestBenchSerenity-proto_F429ZI TestBenchFlow HSPFLOW1 TestBenchFlow1 ... more

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?

UserRevisionLine numberNew 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 }