Mobile Life IoT project using the AT&T IoT Starter Kit Software and files for my device to monitor the status or our Airstream travel trailer RV. A full description of the project is at Hackster.IO here as part of the Realtime AT&T IoT Starter Kit Challenge: https://www.hackster.io/Anubus/mobile-life-iot-9c10be

Dependencies:   FXOS8700CQ MODSERIAL mbed

Committer:
Anubus
Date:
Sun Apr 02 12:28:21 2017 +0000
Revision:
0:bd276b1f1249
public version commit

Who changed what in which revision?

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