publish final code

Dependencies:   FXOS8700CQ Pubnub_mbed2_sync2 SoftSerial TinyGPSplus WNCInterface2 mbed-rtos mbed

Committer:
cswiger
Date:
Tue Feb 21 22:28:26 2017 +0000
Revision:
0:1092494506a3
publish final code

Who changed what in which revision?

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