GSMA version

Dependencies:   FXOS8700CQ mbed

Fork of AvnetATT_shape_hackathon by Rick McConney

Committer:
JMF
Date:
Fri Jul 08 23:52:38 2016 +0000
Revision:
0:9d5134074d84
Child:
1:af7a42f7d465
Initial version of AT&T_Avnet Shape Hackathon WNC Shield board

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JMF 0:9d5134074d84 1
JMF 0:9d5134074d84 2 #include "HTS221.h"
JMF 0:9d5134074d84 3
JMF 0:9d5134074d84 4
JMF 0:9d5134074d84 5 // ------------------------------------------------------------------------------
JMF 0:9d5134074d84 6 //jmf -- define I2C pins and functions to read & write to I2C device
JMF 0:9d5134074d84 7
JMF 0:9d5134074d84 8 #include <string>
JMF 0:9d5134074d84 9 #include "mbed.h"
JMF 0:9d5134074d84 10
JMF 0:9d5134074d84 11 I2C i2c(PTC11, PTC10); //SDA, SCL -- define the I2C pins being used
JMF 0:9d5134074d84 12
JMF 0:9d5134074d84 13 // Read a single unsigned char from addressToRead and return it as a unsigned char
JMF 0:9d5134074d84 14 unsigned char HTS221::readRegister(unsigned char slaveAddress, unsigned char ToRead)
JMF 0:9d5134074d84 15 {
JMF 0:9d5134074d84 16 char data = ToRead;
JMF 0:9d5134074d84 17
JMF 0:9d5134074d84 18 i2c.write(slaveAddress, &data, 1, 0);
JMF 0:9d5134074d84 19 i2c.read(slaveAddress, &data, 1, 0);
JMF 0:9d5134074d84 20 return data;
JMF 0:9d5134074d84 21 }
JMF 0:9d5134074d84 22
JMF 0:9d5134074d84 23 // Writes a single unsigned char (dataToWrite) into regToWrite
JMF 0:9d5134074d84 24 int HTS221::writeRegister(unsigned char slaveAddress, unsigned char regToWrite, unsigned char dataToWrite)
JMF 0:9d5134074d84 25 {
JMF 0:9d5134074d84 26 const char data[] = {regToWrite, dataToWrite};
JMF 0:9d5134074d84 27
JMF 0:9d5134074d84 28 return i2c.write(slaveAddress,data,2,0);
JMF 0:9d5134074d84 29 }
JMF 0:9d5134074d84 30
JMF 0:9d5134074d84 31
JMF 0:9d5134074d84 32 //jmf end
JMF 0:9d5134074d84 33 // ------------------------------------------------------------------------------
JMF 0:9d5134074d84 34
JMF 0:9d5134074d84 35 static inline int humidityReady(uint8_t data) {
JMF 0:9d5134074d84 36 return (data & 0x02);
JMF 0:9d5134074d84 37 }
JMF 0:9d5134074d84 38 static inline int temperatureReady(uint8_t data) {
JMF 0:9d5134074d84 39 return (data & 0x01);
JMF 0:9d5134074d84 40 }
JMF 0:9d5134074d84 41
JMF 0:9d5134074d84 42
JMF 0:9d5134074d84 43 HTS221::HTS221(void) : _address(HTS221_ADDRESS)
JMF 0:9d5134074d84 44 {
JMF 0:9d5134074d84 45 _temperature = 0;
JMF 0:9d5134074d84 46 _humidity = 0;
JMF 0:9d5134074d84 47 }
JMF 0:9d5134074d84 48
JMF 0:9d5134074d84 49
JMF 0:9d5134074d84 50 int HTS221::begin(void)
JMF 0:9d5134074d84 51 {
JMF 0:9d5134074d84 52 uint8_t data;
JMF 0:9d5134074d84 53
JMF 0:9d5134074d84 54 data = readRegister(_address, WHO_AM_I);
JMF 0:9d5134074d84 55 if (data == WHO_AM_I_RETURN){
JMF 0:9d5134074d84 56 if (activate()){
JMF 0:9d5134074d84 57 storeCalibration();
JMF 0:9d5134074d84 58 return data;
JMF 0:9d5134074d84 59 }
JMF 0:9d5134074d84 60 }
JMF 0:9d5134074d84 61
JMF 0:9d5134074d84 62 return 0;
JMF 0:9d5134074d84 63 }
JMF 0:9d5134074d84 64
JMF 0:9d5134074d84 65 int
JMF 0:9d5134074d84 66 HTS221::storeCalibration(void)
JMF 0:9d5134074d84 67 {
JMF 0:9d5134074d84 68 uint8_t data;
JMF 0:9d5134074d84 69 uint16_t tmp;
JMF 0:9d5134074d84 70
JMF 0:9d5134074d84 71 for (int reg=CALIB_START; reg<=CALIB_END; reg++) {
JMF 0:9d5134074d84 72 if ((reg!=CALIB_START+8) && (reg!=CALIB_START+9) && (reg!=CALIB_START+4)) {
JMF 0:9d5134074d84 73
JMF 0:9d5134074d84 74 data = readRegister(HTS221_ADDRESS, reg);
JMF 0:9d5134074d84 75
JMF 0:9d5134074d84 76 switch (reg) {
JMF 0:9d5134074d84 77 case CALIB_START:
JMF 0:9d5134074d84 78 _h0_rH = data;
JMF 0:9d5134074d84 79 break;
JMF 0:9d5134074d84 80 case CALIB_START+1:
JMF 0:9d5134074d84 81 _h1_rH = data;
JMF 0:9d5134074d84 82 break;
JMF 0:9d5134074d84 83 case CALIB_START+2:
JMF 0:9d5134074d84 84 _T0_degC = data;
JMF 0:9d5134074d84 85 break;
JMF 0:9d5134074d84 86 case CALIB_START+3:
JMF 0:9d5134074d84 87 _T1_degC = data;
JMF 0:9d5134074d84 88 break;
JMF 0:9d5134074d84 89
JMF 0:9d5134074d84 90 case CALIB_START+5:
JMF 0:9d5134074d84 91 tmp = _T0_degC;
JMF 0:9d5134074d84 92 _T0_degC = (data&0x3)<<8;
JMF 0:9d5134074d84 93 _T0_degC |= tmp;
JMF 0:9d5134074d84 94
JMF 0:9d5134074d84 95 tmp = _T1_degC;
JMF 0:9d5134074d84 96 _T1_degC = ((data&0xC)>>2)<<8;
JMF 0:9d5134074d84 97 _T1_degC |= tmp;
JMF 0:9d5134074d84 98 break;
JMF 0:9d5134074d84 99 case CALIB_START+6:
JMF 0:9d5134074d84 100 _H0_T0 = data;
JMF 0:9d5134074d84 101 break;
JMF 0:9d5134074d84 102 case CALIB_START+7:
JMF 0:9d5134074d84 103 _H0_T0 |= data<<8;
JMF 0:9d5134074d84 104 break;
JMF 0:9d5134074d84 105 case CALIB_START+0xA:
JMF 0:9d5134074d84 106 _H1_T0 = data;
JMF 0:9d5134074d84 107 break;
JMF 0:9d5134074d84 108 case CALIB_START+0xB:
JMF 0:9d5134074d84 109 _H1_T0 |= data <<8;
JMF 0:9d5134074d84 110 break;
JMF 0:9d5134074d84 111 case CALIB_START+0xC:
JMF 0:9d5134074d84 112 _T0_OUT = data;
JMF 0:9d5134074d84 113 break;
JMF 0:9d5134074d84 114 case CALIB_START+0xD:
JMF 0:9d5134074d84 115 _T0_OUT |= data << 8;
JMF 0:9d5134074d84 116 break;
JMF 0:9d5134074d84 117 case CALIB_START+0xE:
JMF 0:9d5134074d84 118 _T1_OUT = data;
JMF 0:9d5134074d84 119 break;
JMF 0:9d5134074d84 120 case CALIB_START+0xF:
JMF 0:9d5134074d84 121 _T1_OUT |= data << 8;
JMF 0:9d5134074d84 122 break;
JMF 0:9d5134074d84 123
JMF 0:9d5134074d84 124
JMF 0:9d5134074d84 125 case CALIB_START+8:
JMF 0:9d5134074d84 126 case CALIB_START+9:
JMF 0:9d5134074d84 127 case CALIB_START+4:
JMF 0:9d5134074d84 128 //DO NOTHING
JMF 0:9d5134074d84 129 break;
JMF 0:9d5134074d84 130
JMF 0:9d5134074d84 131 // to cover any possible error
JMF 0:9d5134074d84 132 default:
JMF 0:9d5134074d84 133 return false;
JMF 0:9d5134074d84 134 } /* switch */
JMF 0:9d5134074d84 135 } /* if */
JMF 0:9d5134074d84 136 } /* for */
JMF 0:9d5134074d84 137 return true;
JMF 0:9d5134074d84 138 }
JMF 0:9d5134074d84 139
JMF 0:9d5134074d84 140
JMF 0:9d5134074d84 141 int
JMF 0:9d5134074d84 142 HTS221::activate(void)
JMF 0:9d5134074d84 143 {
JMF 0:9d5134074d84 144 uint8_t data;
JMF 0:9d5134074d84 145
JMF 0:9d5134074d84 146 data = readRegister(_address, CTRL_REG1);
JMF 0:9d5134074d84 147 data |= POWER_UP;
JMF 0:9d5134074d84 148 data |= ODR0_SET;
JMF 0:9d5134074d84 149 writeRegister(_address, CTRL_REG1, data);
JMF 0:9d5134074d84 150
JMF 0:9d5134074d84 151 return true;
JMF 0:9d5134074d84 152 }
JMF 0:9d5134074d84 153
JMF 0:9d5134074d84 154
JMF 0:9d5134074d84 155 int HTS221::deactivate(void)
JMF 0:9d5134074d84 156 {
JMF 0:9d5134074d84 157 uint8_t data;
JMF 0:9d5134074d84 158
JMF 0:9d5134074d84 159 data = readRegister(_address, CTRL_REG1);
JMF 0:9d5134074d84 160 data &= ~POWER_UP;
JMF 0:9d5134074d84 161 writeRegister(_address, CTRL_REG1, data);
JMF 0:9d5134074d84 162 return true;
JMF 0:9d5134074d84 163 }
JMF 0:9d5134074d84 164
JMF 0:9d5134074d84 165
JMF 0:9d5134074d84 166 int
JMF 0:9d5134074d84 167 HTS221::bduActivate(void)
JMF 0:9d5134074d84 168 {
JMF 0:9d5134074d84 169 uint8_t data;
JMF 0:9d5134074d84 170
JMF 0:9d5134074d84 171 data = readRegister(_address, CTRL_REG1);
JMF 0:9d5134074d84 172 data |= BDU_SET;
JMF 0:9d5134074d84 173 writeRegister(_address, CTRL_REG1, data);
JMF 0:9d5134074d84 174
JMF 0:9d5134074d84 175 return true;
JMF 0:9d5134074d84 176 }
JMF 0:9d5134074d84 177
JMF 0:9d5134074d84 178
JMF 0:9d5134074d84 179 int
JMF 0:9d5134074d84 180 HTS221::bduDeactivate(void)
JMF 0:9d5134074d84 181 {
JMF 0:9d5134074d84 182 uint8_t data;
JMF 0:9d5134074d84 183
JMF 0:9d5134074d84 184 data = readRegister(_address, CTRL_REG1);
JMF 0:9d5134074d84 185 data &= ~BDU_SET;
JMF 0:9d5134074d84 186 writeRegister(_address, CTRL_REG1, data);
JMF 0:9d5134074d84 187 return true;
JMF 0:9d5134074d84 188 }
JMF 0:9d5134074d84 189
JMF 0:9d5134074d84 190
JMF 0:9d5134074d84 191 int
JMF 0:9d5134074d84 192 HTS221::readHumidity(void)
JMF 0:9d5134074d84 193 {
JMF 0:9d5134074d84 194 uint8_t data = 0;
JMF 0:9d5134074d84 195 uint16_t h_out = 0;
JMF 0:9d5134074d84 196 double h_temp = 0.0;
JMF 0:9d5134074d84 197 double hum = 0.0;
JMF 0:9d5134074d84 198
JMF 0:9d5134074d84 199 data = readRegister(_address, STATUS_REG);
JMF 0:9d5134074d84 200
JMF 0:9d5134074d84 201 if (data & HUMIDITY_READY) {
JMF 0:9d5134074d84 202 data = readRegister(_address, HUMIDITY_H_REG);
JMF 0:9d5134074d84 203 h_out = data << 8; // MSB
JMF 0:9d5134074d84 204 data = readRegister(_address, HUMIDITY_L_REG);
JMF 0:9d5134074d84 205 h_out |= data; // LSB
JMF 0:9d5134074d84 206
JMF 0:9d5134074d84 207 // Decode Humidity
JMF 0:9d5134074d84 208 hum = ((int16_t)(_h1_rH) - (int16_t)(_h0_rH))/2.0; // remove x2 multiple
JMF 0:9d5134074d84 209
JMF 0:9d5134074d84 210 // Calculate humidity in decimal of grade centigrades i.e. 15.0 = 150.
JMF 0:9d5134074d84 211 h_temp = (((int16_t)h_out - (int16_t)_H0_T0) * hum) / ((int16_t)_H1_T0 - (int16_t)_H0_T0);
JMF 0:9d5134074d84 212 hum = ((int16_t)_h0_rH) / 2.0; // remove x2 multiple
JMF 0:9d5134074d84 213 _humidity = (int16_t)((hum + h_temp)); // provide signed % measurement unit
JMF 0:9d5134074d84 214 }
JMF 0:9d5134074d84 215 return _humidity;
JMF 0:9d5134074d84 216 }
JMF 0:9d5134074d84 217
JMF 0:9d5134074d84 218
JMF 0:9d5134074d84 219
JMF 0:9d5134074d84 220 double
JMF 0:9d5134074d84 221 HTS221::readTemperature(void)
JMF 0:9d5134074d84 222 {
JMF 0:9d5134074d84 223 uint8_t data = 0;
JMF 0:9d5134074d84 224 uint16_t t_out = 0;
JMF 0:9d5134074d84 225 double t_temp = 0.0;
JMF 0:9d5134074d84 226 double deg = 0.0;
JMF 0:9d5134074d84 227
JMF 0:9d5134074d84 228 data = readRegister(_address, STATUS_REG);
JMF 0:9d5134074d84 229
JMF 0:9d5134074d84 230 if (data & TEMPERATURE_READY) {
JMF 0:9d5134074d84 231
JMF 0:9d5134074d84 232 data= readRegister(_address, TEMP_H_REG);
JMF 0:9d5134074d84 233 t_out = data << 8; // MSB
JMF 0:9d5134074d84 234 data = readRegister(_address, TEMP_L_REG);
JMF 0:9d5134074d84 235 t_out |= data; // LSB
JMF 0:9d5134074d84 236
JMF 0:9d5134074d84 237 // Decode Temperature
JMF 0:9d5134074d84 238 deg = ((int16_t)(_T1_degC) - (int16_t)(_T0_degC))/8.0; // remove x8 multiple
JMF 0:9d5134074d84 239
JMF 0:9d5134074d84 240 // Calculate Temperature in decimal of grade centigrades i.e. 15.0 = 150.
JMF 0:9d5134074d84 241 t_temp = (((int16_t)t_out - (int16_t)_T0_OUT) * deg) / ((int16_t)_T1_OUT - (int16_t)_T0_OUT);
JMF 0:9d5134074d84 242 deg = ((int16_t)_T0_degC) / 8.0; // remove x8 multiple
JMF 0:9d5134074d84 243 _temperature = deg + t_temp; // provide signed celsius measurement unit
JMF 0:9d5134074d84 244 }
JMF 0:9d5134074d84 245
JMF 0:9d5134074d84 246 return _temperature;
JMF 0:9d5134074d84 247 }