AT&T IoT hackster.io contest entry: Carpal2

Dependencies:   FXOS8700CQ Pubnub_mbed2_sync WNCInterface mbed-rtos mbed

Committer:
cswiger
Date:
Sat Dec 24 17:31:00 2016 +0000
Revision:
2:fe8e935b9342
Parent:
0:d2425a595807
added Ignition awareness so Carpal2 will resume working after car has been turned off and back on.

Who changed what in which revision?

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