Dependencies:   BLE_API mbed nRF51822

Fork of SensorModulePIR by ModoSmart

Committer:
MisterGiet
Date:
Wed Jun 06 14:53:43 2018 +0000
Revision:
22:88b6e11eb8d5
Parent:
0:eb280529b0ef
Modification for Window Sensor Module for the Agile IoT final review.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
waltercolitti 0:eb280529b0ef 1 /*******************************************************************************
waltercolitti 0:eb280529b0ef 2 * Copyright (C) 2015 Maxim Integrated Products, Inc., All Rights Reserved.
waltercolitti 0:eb280529b0ef 3 *
waltercolitti 0:eb280529b0ef 4 * Permission is hereby granted, free of charge, to any person obtaining a
waltercolitti 0:eb280529b0ef 5 * copy of this software and associated documentation files (the "Software"),
waltercolitti 0:eb280529b0ef 6 * to deal in the Software without restriction, including without limitation
waltercolitti 0:eb280529b0ef 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
waltercolitti 0:eb280529b0ef 8 * and/or sell copies of the Software, and to permit persons to whom the
waltercolitti 0:eb280529b0ef 9 * Software is furnished to do so, subject to the following conditions:
waltercolitti 0:eb280529b0ef 10 *
waltercolitti 0:eb280529b0ef 11 * The above copyright notice and this permission notice shall be included
waltercolitti 0:eb280529b0ef 12 * in all copies or substantial portions of the Software.
waltercolitti 0:eb280529b0ef 13 *
waltercolitti 0:eb280529b0ef 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
waltercolitti 0:eb280529b0ef 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
waltercolitti 0:eb280529b0ef 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
waltercolitti 0:eb280529b0ef 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
waltercolitti 0:eb280529b0ef 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
waltercolitti 0:eb280529b0ef 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
waltercolitti 0:eb280529b0ef 20 * OTHER DEALINGS IN THE SOFTWARE.
waltercolitti 0:eb280529b0ef 21 *
waltercolitti 0:eb280529b0ef 22 * Except as contained in this notice, the name of Maxim Integrated
waltercolitti 0:eb280529b0ef 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
waltercolitti 0:eb280529b0ef 24 * Products, Inc. Branding Policy.
waltercolitti 0:eb280529b0ef 25 *
waltercolitti 0:eb280529b0ef 26 * The mere transfer of this software does not imply any licenses
waltercolitti 0:eb280529b0ef 27 * of trade secrets, proprietary technology, copyrights, patents,
waltercolitti 0:eb280529b0ef 28 * trademarks, maskwork rights, or any other form of intellectual
waltercolitti 0:eb280529b0ef 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
waltercolitti 0:eb280529b0ef 30 * ownership rights.
waltercolitti 0:eb280529b0ef 31 *******************************************************************************
waltercolitti 0:eb280529b0ef 32 */
waltercolitti 0:eb280529b0ef 33
waltercolitti 0:eb280529b0ef 34 #include "Si7020.h"
waltercolitti 0:eb280529b0ef 35
waltercolitti 0:eb280529b0ef 36 /***** Definitions *****/
waltercolitti 0:eb280529b0ef 37 #define I2C_ADDR (0x80) // 1000000x
waltercolitti 0:eb280529b0ef 38 #define POLYVAL (0x131)
waltercolitti 0:eb280529b0ef 39
waltercolitti 0:eb280529b0ef 40 /***** File Scope Data *****/
waltercolitti 0:eb280529b0ef 41 static const char cmd_meas_humid[] = { 0xE5 };
waltercolitti 0:eb280529b0ef 42 static const char cmd_meas_humid_no_hold[] = { 0xF5 };
waltercolitti 0:eb280529b0ef 43 static const char cmd_meas_temp[] = { 0xE3 };
waltercolitti 0:eb280529b0ef 44 static const char cmd_meas_temp_no_hold[] = { 0xF3 };
waltercolitti 0:eb280529b0ef 45 static const char cmd_meas_prev_temp[] = { 0xE0 };
waltercolitti 0:eb280529b0ef 46 static const char cmd_rst[] = { 0xFE };
waltercolitti 0:eb280529b0ef 47 static const char cmd_write_user1[] = { 0xE6 };
waltercolitti 0:eb280529b0ef 48 static const char cmd_read_user1[] = { 0xE7 };
waltercolitti 0:eb280529b0ef 49 static const char cmd_id_1[] = { 0xFA, 0x0F };
waltercolitti 0:eb280529b0ef 50 static const char cmd_id_2[] = { 0xFC, 0xC9 };
waltercolitti 0:eb280529b0ef 51 static const char cmd_fw_ver[] = { 0x84, 0xB8 };
waltercolitti 0:eb280529b0ef 52
waltercolitti 0:eb280529b0ef 53 //******************************************************************************
waltercolitti 0:eb280529b0ef 54 Si7020::Si7020(PinName sda, PinName scl)
waltercolitti 0:eb280529b0ef 55 {
waltercolitti 0:eb280529b0ef 56 i2c_ = new I2C(sda, scl);
waltercolitti 0:eb280529b0ef 57 i2c_owner = true;
waltercolitti 0:eb280529b0ef 58
waltercolitti 0:eb280529b0ef 59 // 400KHz, as specified by the datasheet.
waltercolitti 0:eb280529b0ef 60 i2c_->frequency(400000);
waltercolitti 0:eb280529b0ef 61 }
waltercolitti 0:eb280529b0ef 62
waltercolitti 0:eb280529b0ef 63 //******************************************************************************
waltercolitti 0:eb280529b0ef 64 Si7020::Si7020(I2C *i2c) :
waltercolitti 0:eb280529b0ef 65 i2c_(i2c)
waltercolitti 0:eb280529b0ef 66 {
waltercolitti 0:eb280529b0ef 67 i2c_owner = false;
waltercolitti 0:eb280529b0ef 68 }
waltercolitti 0:eb280529b0ef 69
waltercolitti 0:eb280529b0ef 70 //******************************************************************************
waltercolitti 0:eb280529b0ef 71 Si7020::~Si7020()
waltercolitti 0:eb280529b0ef 72 {
waltercolitti 0:eb280529b0ef 73 if(i2c_owner) {
waltercolitti 0:eb280529b0ef 74 delete i2c_;
waltercolitti 0:eb280529b0ef 75 }
waltercolitti 0:eb280529b0ef 76 }
waltercolitti 0:eb280529b0ef 77
waltercolitti 0:eb280529b0ef 78 //******************************************************************************
waltercolitti 0:eb280529b0ef 79 int Si7020::reset(void)
waltercolitti 0:eb280529b0ef 80 {
waltercolitti 0:eb280529b0ef 81 if (i2c_->write(I2C_ADDR, cmd_rst, sizeof(cmd_rst)) != 0) {
waltercolitti 0:eb280529b0ef 82 return -1;
waltercolitti 0:eb280529b0ef 83 }
waltercolitti 0:eb280529b0ef 84
waltercolitti 0:eb280529b0ef 85 return 0;
waltercolitti 0:eb280529b0ef 86 }
waltercolitti 0:eb280529b0ef 87
waltercolitti 0:eb280529b0ef 88 //******************************************************************************
waltercolitti 0:eb280529b0ef 89 int Si7020::getElectronicId(char* id)
waltercolitti 0:eb280529b0ef 90 {
waltercolitti 0:eb280529b0ef 91 // Send cmd with repeated start
waltercolitti 0:eb280529b0ef 92 if (i2c_->write(I2C_ADDR, cmd_id_1, sizeof(cmd_id_1), true) != 0) {
waltercolitti 0:eb280529b0ef 93 return -1;
waltercolitti 0:eb280529b0ef 94 }
waltercolitti 0:eb280529b0ef 95
waltercolitti 0:eb280529b0ef 96 // Read first portion of ID
waltercolitti 0:eb280529b0ef 97 char temp[8];
waltercolitti 0:eb280529b0ef 98 if (i2c_->read(I2C_ADDR, temp, 8, false) != 0) {
waltercolitti 0:eb280529b0ef 99 return -1;
waltercolitti 0:eb280529b0ef 100 }
waltercolitti 0:eb280529b0ef 101
waltercolitti 0:eb280529b0ef 102 // Check the CRC
waltercolitti 0:eb280529b0ef 103 char crc = 0;
waltercolitti 0:eb280529b0ef 104 int i;
waltercolitti 0:eb280529b0ef 105 for(i = 0; i < 4; i++) {
waltercolitti 0:eb280529b0ef 106 crc = crc8(temp[2*i], crc);
waltercolitti 0:eb280529b0ef 107 if(crc != temp[2*i +1]) {
waltercolitti 0:eb280529b0ef 108 return -1;
waltercolitti 0:eb280529b0ef 109 }
waltercolitti 0:eb280529b0ef 110 }
waltercolitti 0:eb280529b0ef 111
waltercolitti 0:eb280529b0ef 112 // Save top portion of ID
waltercolitti 0:eb280529b0ef 113 id[7] = temp [0];
waltercolitti 0:eb280529b0ef 114 id[6] = temp [2];
waltercolitti 0:eb280529b0ef 115 id[5] = temp [4];
waltercolitti 0:eb280529b0ef 116 id[4] = temp [6];
waltercolitti 0:eb280529b0ef 117
waltercolitti 0:eb280529b0ef 118 // Send cmd with repeated start
waltercolitti 0:eb280529b0ef 119 if (i2c_->write(I2C_ADDR, cmd_id_2, sizeof(cmd_id_2), true) != 0) {
waltercolitti 0:eb280529b0ef 120 return -1;
waltercolitti 0:eb280529b0ef 121 }
waltercolitti 0:eb280529b0ef 122
waltercolitti 0:eb280529b0ef 123 // Read rest of ID
waltercolitti 0:eb280529b0ef 124 if (i2c_->read(I2C_ADDR, temp, 6, false) != 0) {
waltercolitti 0:eb280529b0ef 125 return -1;
waltercolitti 0:eb280529b0ef 126 }
waltercolitti 0:eb280529b0ef 127
waltercolitti 0:eb280529b0ef 128 // Check the CRC
waltercolitti 0:eb280529b0ef 129 crc = 0;
waltercolitti 0:eb280529b0ef 130 for(i = 0; i < 2; i++) {
waltercolitti 0:eb280529b0ef 131 crc = crc8(temp[3*i], crc);
waltercolitti 0:eb280529b0ef 132 crc = crc8(temp[3*i + 1], crc);
waltercolitti 0:eb280529b0ef 133 if(crc != temp[3*i + 2]) {
waltercolitti 0:eb280529b0ef 134 return -1;
waltercolitti 0:eb280529b0ef 135 }
waltercolitti 0:eb280529b0ef 136 }
waltercolitti 0:eb280529b0ef 137
waltercolitti 0:eb280529b0ef 138 // Save bottom portion of ID
waltercolitti 0:eb280529b0ef 139 id[3] = temp [0];
waltercolitti 0:eb280529b0ef 140 id[2] = temp [1];
waltercolitti 0:eb280529b0ef 141 id[1] = temp [3];
waltercolitti 0:eb280529b0ef 142 id[0] = temp [4];
waltercolitti 0:eb280529b0ef 143
waltercolitti 0:eb280529b0ef 144 return 0;
waltercolitti 0:eb280529b0ef 145 }
waltercolitti 0:eb280529b0ef 146
waltercolitti 0:eb280529b0ef 147 //******************************************************************************
waltercolitti 0:eb280529b0ef 148 int Si7020::configResolution(Si7020::resolution_t resolution)
waltercolitti 0:eb280529b0ef 149 {
waltercolitti 0:eb280529b0ef 150 char data[2];
waltercolitti 0:eb280529b0ef 151
waltercolitti 0:eb280529b0ef 152 if (i2c_->write(I2C_ADDR, cmd_read_user1, sizeof(cmd_read_user1)) != 0) {
waltercolitti 0:eb280529b0ef 153 return -1;
waltercolitti 0:eb280529b0ef 154 }
waltercolitti 0:eb280529b0ef 155
waltercolitti 0:eb280529b0ef 156 if (i2c_->read(I2C_ADDR, &data[1], 1) != 0) {
waltercolitti 0:eb280529b0ef 157 return -1;
waltercolitti 0:eb280529b0ef 158 }
waltercolitti 0:eb280529b0ef 159
waltercolitti 0:eb280529b0ef 160 switch (resolution) {
waltercolitti 0:eb280529b0ef 161 case RH_12b_TEMP_14b:
waltercolitti 0:eb280529b0ef 162 data[1] &= ~0x81;
waltercolitti 0:eb280529b0ef 163 break;
waltercolitti 0:eb280529b0ef 164 case RH_8b_TEMP_12b:
waltercolitti 0:eb280529b0ef 165 data[1] = (data[1] & ~0x80) | 0x01;
waltercolitti 0:eb280529b0ef 166 break;
waltercolitti 0:eb280529b0ef 167 case RH_10b_TEMP_13b:
waltercolitti 0:eb280529b0ef 168 data[1] = (data[1] & ~0x01) | 0x80;
waltercolitti 0:eb280529b0ef 169 break;
waltercolitti 0:eb280529b0ef 170 case RH_11b_TEMP_11b:
waltercolitti 0:eb280529b0ef 171 data[1] |= 0x81;
waltercolitti 0:eb280529b0ef 172 break;
waltercolitti 0:eb280529b0ef 173 default:
waltercolitti 0:eb280529b0ef 174 return -1;
waltercolitti 0:eb280529b0ef 175 }
waltercolitti 0:eb280529b0ef 176
waltercolitti 0:eb280529b0ef 177 data[0] = cmd_write_user1[0];
waltercolitti 0:eb280529b0ef 178
waltercolitti 0:eb280529b0ef 179 if (i2c_->write(I2C_ADDR, data, 2) != 0) {
waltercolitti 0:eb280529b0ef 180 return -1;
waltercolitti 0:eb280529b0ef 181 }
waltercolitti 0:eb280529b0ef 182
waltercolitti 0:eb280529b0ef 183 return 0;
waltercolitti 0:eb280529b0ef 184 }
waltercolitti 0:eb280529b0ef 185
waltercolitti 0:eb280529b0ef 186 //******************************************************************************
waltercolitti 0:eb280529b0ef 187 int Si7020::getTemperature(int16_t *tempCx10)
waltercolitti 0:eb280529b0ef 188 {
waltercolitti 0:eb280529b0ef 189 if (i2c_->write(I2C_ADDR, cmd_meas_temp, sizeof(cmd_meas_temp)) != 0) {
waltercolitti 0:eb280529b0ef 190 return -1;
waltercolitti 0:eb280529b0ef 191 }
waltercolitti 0:eb280529b0ef 192
waltercolitti 0:eb280529b0ef 193 return checkTemperature(tempCx10);
waltercolitti 0:eb280529b0ef 194 }
waltercolitti 0:eb280529b0ef 195
waltercolitti 0:eb280529b0ef 196 //******************************************************************************
waltercolitti 0:eb280529b0ef 197 int Si7020::getTemperature(float *tempC)
waltercolitti 0:eb280529b0ef 198 {
waltercolitti 0:eb280529b0ef 199 if (i2c_->write(I2C_ADDR, cmd_meas_temp, sizeof(cmd_meas_temp)) != 0) {
waltercolitti 0:eb280529b0ef 200 return -1;
waltercolitti 0:eb280529b0ef 201 }
waltercolitti 0:eb280529b0ef 202
waltercolitti 0:eb280529b0ef 203 return checkTemperature(tempC);
waltercolitti 0:eb280529b0ef 204 }
waltercolitti 0:eb280529b0ef 205
waltercolitti 0:eb280529b0ef 206 //******************************************************************************
waltercolitti 0:eb280529b0ef 207 int Si7020::startTemperature(void)
waltercolitti 0:eb280529b0ef 208 {
waltercolitti 0:eb280529b0ef 209 if (i2c_->write(I2C_ADDR, cmd_meas_temp_no_hold, sizeof(cmd_meas_temp_no_hold)) != 0) {
waltercolitti 0:eb280529b0ef 210 return -1;
waltercolitti 0:eb280529b0ef 211 }
waltercolitti 0:eb280529b0ef 212
waltercolitti 0:eb280529b0ef 213 return 0;
waltercolitti 0:eb280529b0ef 214 }
waltercolitti 0:eb280529b0ef 215
waltercolitti 0:eb280529b0ef 216 //******************************************************************************
waltercolitti 0:eb280529b0ef 217 int Si7020::checkTemperature(int16_t *tempCx10)
waltercolitti 0:eb280529b0ef 218 {
waltercolitti 0:eb280529b0ef 219 char data[3];
waltercolitti 0:eb280529b0ef 220 uint16_t code;
waltercolitti 0:eb280529b0ef 221 int temp;
waltercolitti 0:eb280529b0ef 222
waltercolitti 0:eb280529b0ef 223 if (i2c_->read(I2C_ADDR, data, 3) != 0) {
waltercolitti 0:eb280529b0ef 224 return -1;
waltercolitti 0:eb280529b0ef 225 }
waltercolitti 0:eb280529b0ef 226
waltercolitti 0:eb280529b0ef 227 // Get 16-bit value from bytes read
waltercolitti 0:eb280529b0ef 228 code = ((uint16_t)data[0] << 8) + data[1];
waltercolitti 0:eb280529b0ef 229
waltercolitti 0:eb280529b0ef 230 // Calculate the temperature using the formula from the datasheet
waltercolitti 0:eb280529b0ef 231 // Scaled by 100
waltercolitti 0:eb280529b0ef 232 temp = ((((int)17572 * code) + 0x8000) >> 16) - 4685;
waltercolitti 0:eb280529b0ef 233
waltercolitti 0:eb280529b0ef 234 // Return value is to be scaled by 10
waltercolitti 0:eb280529b0ef 235 *tempCx10 = (temp + 5) / 10;
waltercolitti 0:eb280529b0ef 236
waltercolitti 0:eb280529b0ef 237 return 0;
waltercolitti 0:eb280529b0ef 238 }
waltercolitti 0:eb280529b0ef 239
waltercolitti 0:eb280529b0ef 240 //******************************************************************************
waltercolitti 0:eb280529b0ef 241 int Si7020::checkTemperature(float *tempC)
waltercolitti 0:eb280529b0ef 242 {
waltercolitti 0:eb280529b0ef 243 char data[3];
waltercolitti 0:eb280529b0ef 244 uint16_t code;
waltercolitti 0:eb280529b0ef 245
waltercolitti 0:eb280529b0ef 246 if (i2c_->read(I2C_ADDR, data, 3) != 0) {
waltercolitti 0:eb280529b0ef 247 return -1;
waltercolitti 0:eb280529b0ef 248 }
waltercolitti 0:eb280529b0ef 249
waltercolitti 0:eb280529b0ef 250 // Get 16-bit value from bytes read
waltercolitti 0:eb280529b0ef 251 code = ((uint16_t)data[0] << 8) + data[1];
waltercolitti 0:eb280529b0ef 252
waltercolitti 0:eb280529b0ef 253 // Calculate the temperature using the formula from the datasheet
waltercolitti 0:eb280529b0ef 254 // Scaled by 100
waltercolitti 0:eb280529b0ef 255 *tempC = ((175.72f * (float)code) / 65536.0f) - 46.85f;
waltercolitti 0:eb280529b0ef 256
waltercolitti 0:eb280529b0ef 257 return 0;
waltercolitti 0:eb280529b0ef 258 }
waltercolitti 0:eb280529b0ef 259
waltercolitti 0:eb280529b0ef 260 //******************************************************************************
waltercolitti 0:eb280529b0ef 261 int Si7020::getHumidity(int16_t *humidx10)
waltercolitti 0:eb280529b0ef 262 {
waltercolitti 0:eb280529b0ef 263 if (i2c_->write(I2C_ADDR, cmd_meas_humid, sizeof(cmd_meas_humid), true) != 0) {
waltercolitti 0:eb280529b0ef 264 return -1;
waltercolitti 0:eb280529b0ef 265 }
waltercolitti 0:eb280529b0ef 266
waltercolitti 0:eb280529b0ef 267 return checkHumidity(humidx10);
waltercolitti 0:eb280529b0ef 268 }
waltercolitti 0:eb280529b0ef 269
waltercolitti 0:eb280529b0ef 270 //******************************************************************************
waltercolitti 0:eb280529b0ef 271 int Si7020::getHumidity(float *humid)
waltercolitti 0:eb280529b0ef 272 {
waltercolitti 0:eb280529b0ef 273 if (i2c_->write(I2C_ADDR, cmd_meas_humid, sizeof(cmd_meas_humid)) != 0) {
waltercolitti 0:eb280529b0ef 274 return -1;
waltercolitti 0:eb280529b0ef 275 }
waltercolitti 0:eb280529b0ef 276
waltercolitti 0:eb280529b0ef 277 return checkHumidity(humid);
waltercolitti 0:eb280529b0ef 278 }
waltercolitti 0:eb280529b0ef 279
waltercolitti 0:eb280529b0ef 280 //******************************************************************************
waltercolitti 0:eb280529b0ef 281 int Si7020::startHumidity(void)
waltercolitti 0:eb280529b0ef 282 {
waltercolitti 0:eb280529b0ef 283 if (i2c_->write(I2C_ADDR, cmd_meas_humid_no_hold, sizeof(cmd_meas_humid_no_hold)) != 0) {
waltercolitti 0:eb280529b0ef 284 return -1;
waltercolitti 0:eb280529b0ef 285 }
waltercolitti 0:eb280529b0ef 286
waltercolitti 0:eb280529b0ef 287 return 0;
waltercolitti 0:eb280529b0ef 288 }
waltercolitti 0:eb280529b0ef 289
waltercolitti 0:eb280529b0ef 290 //******************************************************************************
waltercolitti 0:eb280529b0ef 291 int Si7020::checkHumidity(int16_t *humidx10)
waltercolitti 0:eb280529b0ef 292 {
waltercolitti 0:eb280529b0ef 293 char data[3];
waltercolitti 0:eb280529b0ef 294 uint16_t code;
waltercolitti 0:eb280529b0ef 295
waltercolitti 0:eb280529b0ef 296 if (i2c_->read(I2C_ADDR, data, 3) != 0) {
waltercolitti 0:eb280529b0ef 297 return -1;
waltercolitti 0:eb280529b0ef 298 }
waltercolitti 0:eb280529b0ef 299
waltercolitti 0:eb280529b0ef 300 // Get 16-bit value from bytes read
waltercolitti 0:eb280529b0ef 301 code = ((uint16_t)data[0] << 8) + data[1];
waltercolitti 0:eb280529b0ef 302
waltercolitti 0:eb280529b0ef 303 // Calculate the humidity using the formula from the datasheet
waltercolitti 0:eb280529b0ef 304 // Scaled by 10
waltercolitti 0:eb280529b0ef 305 *humidx10 = ((((int)1250 * code) + 0x8000) >> 16) - 60;
waltercolitti 0:eb280529b0ef 306
waltercolitti 0:eb280529b0ef 307 // Check the crc
waltercolitti 0:eb280529b0ef 308 char crc = crc8(data[0], 0x00);
waltercolitti 0:eb280529b0ef 309 crc = crc8(data[1], crc);
waltercolitti 0:eb280529b0ef 310 if(crc != data[2]) {
waltercolitti 0:eb280529b0ef 311 return -1;
waltercolitti 0:eb280529b0ef 312 }
waltercolitti 0:eb280529b0ef 313
waltercolitti 0:eb280529b0ef 314 return 0;
waltercolitti 0:eb280529b0ef 315 }
waltercolitti 0:eb280529b0ef 316
waltercolitti 0:eb280529b0ef 317 //******************************************************************************
waltercolitti 0:eb280529b0ef 318 int Si7020::checkHumidity(float *humid)
waltercolitti 0:eb280529b0ef 319 {
waltercolitti 0:eb280529b0ef 320 char data[3];
waltercolitti 0:eb280529b0ef 321 uint16_t code;
waltercolitti 0:eb280529b0ef 322
waltercolitti 0:eb280529b0ef 323 if (i2c_->read(I2C_ADDR, data, 3) != 0) {
waltercolitti 0:eb280529b0ef 324 return -1;
waltercolitti 0:eb280529b0ef 325 }
waltercolitti 0:eb280529b0ef 326
waltercolitti 0:eb280529b0ef 327 // Get 16-bit value from bytes read
waltercolitti 0:eb280529b0ef 328 code = ((uint16_t)data[0] << 8) + data[1];
waltercolitti 0:eb280529b0ef 329
waltercolitti 0:eb280529b0ef 330 // Calculate the humidity using the formula from the datasheet
waltercolitti 0:eb280529b0ef 331 *humid = ((125.0f * (float)code) / 65536.0f) - 6.0f;
waltercolitti 0:eb280529b0ef 332
waltercolitti 0:eb280529b0ef 333 return 0;
waltercolitti 0:eb280529b0ef 334 }
waltercolitti 0:eb280529b0ef 335
waltercolitti 0:eb280529b0ef 336 //******************************************************************************
waltercolitti 0:eb280529b0ef 337 int Si7020::getPrevTemperature(float *tempC) {
waltercolitti 0:eb280529b0ef 338
waltercolitti 0:eb280529b0ef 339 if (i2c_->write(I2C_ADDR, cmd_meas_prev_temp, sizeof(cmd_meas_prev_temp)) != 0) {
waltercolitti 0:eb280529b0ef 340 return -1;
waltercolitti 0:eb280529b0ef 341 }
waltercolitti 0:eb280529b0ef 342
waltercolitti 0:eb280529b0ef 343 if(checkTemperature(tempC) != 0) {
waltercolitti 0:eb280529b0ef 344 return -1;
waltercolitti 0:eb280529b0ef 345 }
waltercolitti 0:eb280529b0ef 346
waltercolitti 0:eb280529b0ef 347 return 0;
waltercolitti 0:eb280529b0ef 348 }
waltercolitti 0:eb280529b0ef 349
waltercolitti 0:eb280529b0ef 350 //******************************************************************************
waltercolitti 0:eb280529b0ef 351 int Si7020::getPrevTemperature(int16_t *tempCx10) {
waltercolitti 0:eb280529b0ef 352
waltercolitti 0:eb280529b0ef 353 if (i2c_->write(I2C_ADDR, cmd_meas_prev_temp, sizeof(cmd_meas_prev_temp)) != 0) {
waltercolitti 0:eb280529b0ef 354 return -1;
waltercolitti 0:eb280529b0ef 355 }
waltercolitti 0:eb280529b0ef 356
waltercolitti 0:eb280529b0ef 357 if(checkTemperature(tempCx10) != 0) {
waltercolitti 0:eb280529b0ef 358 return -1;
waltercolitti 0:eb280529b0ef 359 }
waltercolitti 0:eb280529b0ef 360
waltercolitti 0:eb280529b0ef 361 return 0;
waltercolitti 0:eb280529b0ef 362 }
waltercolitti 0:eb280529b0ef 363
waltercolitti 0:eb280529b0ef 364 //******************************************************************************
waltercolitti 0:eb280529b0ef 365 int Si7020::getRev(char *rev)
waltercolitti 0:eb280529b0ef 366 {
waltercolitti 0:eb280529b0ef 367 if (i2c_->write(I2C_ADDR, cmd_fw_ver, sizeof(cmd_fw_ver)) != 0) {
waltercolitti 0:eb280529b0ef 368 return -1;
waltercolitti 0:eb280529b0ef 369 }
waltercolitti 0:eb280529b0ef 370
waltercolitti 0:eb280529b0ef 371 if (i2c_->read(I2C_ADDR, rev, 1) != 0) {
waltercolitti 0:eb280529b0ef 372 return -1;
waltercolitti 0:eb280529b0ef 373 }
waltercolitti 0:eb280529b0ef 374
waltercolitti 0:eb280529b0ef 375 return 0;
waltercolitti 0:eb280529b0ef 376 }
waltercolitti 0:eb280529b0ef 377
waltercolitti 0:eb280529b0ef 378 //******************************************************************************
waltercolitti 0:eb280529b0ef 379 int Si7020::heater(bool enable)
waltercolitti 0:eb280529b0ef 380 {
waltercolitti 0:eb280529b0ef 381 char data[2];
waltercolitti 0:eb280529b0ef 382
waltercolitti 0:eb280529b0ef 383 if (i2c_->write(I2C_ADDR, cmd_read_user1, sizeof(cmd_read_user1)) != 0) {
waltercolitti 0:eb280529b0ef 384 return -1;
waltercolitti 0:eb280529b0ef 385 }
waltercolitti 0:eb280529b0ef 386
waltercolitti 0:eb280529b0ef 387 if (i2c_->read(I2C_ADDR, &data[1], 1) != 0) {
waltercolitti 0:eb280529b0ef 388 return -1;
waltercolitti 0:eb280529b0ef 389 }
waltercolitti 0:eb280529b0ef 390
waltercolitti 0:eb280529b0ef 391 if (enable) {
waltercolitti 0:eb280529b0ef 392 data[1] |= 0x04;
waltercolitti 0:eb280529b0ef 393 } else {
waltercolitti 0:eb280529b0ef 394 data[1] &= ~0x04;
waltercolitti 0:eb280529b0ef 395 }
waltercolitti 0:eb280529b0ef 396
waltercolitti 0:eb280529b0ef 397 data[0] = cmd_write_user1[0];
waltercolitti 0:eb280529b0ef 398
waltercolitti 0:eb280529b0ef 399 if (i2c_->write(I2C_ADDR, data, 2) != 0) {
waltercolitti 0:eb280529b0ef 400 return -1;
waltercolitti 0:eb280529b0ef 401 }
waltercolitti 0:eb280529b0ef 402
waltercolitti 0:eb280529b0ef 403 return 0;
waltercolitti 0:eb280529b0ef 404 }
waltercolitti 0:eb280529b0ef 405
waltercolitti 0:eb280529b0ef 406 //******************************************************************************
waltercolitti 0:eb280529b0ef 407 char Si7020::crc8(char value, char seed)
waltercolitti 0:eb280529b0ef 408 {
waltercolitti 0:eb280529b0ef 409 int i;
waltercolitti 0:eb280529b0ef 410
waltercolitti 0:eb280529b0ef 411 for (i = 0; i < 8; i++) {
waltercolitti 0:eb280529b0ef 412
waltercolitti 0:eb280529b0ef 413 if ((value ^ seed) & 0x80) {
waltercolitti 0:eb280529b0ef 414 seed <<= 1;
waltercolitti 0:eb280529b0ef 415 seed ^= POLYVAL;
waltercolitti 0:eb280529b0ef 416 } else {
waltercolitti 0:eb280529b0ef 417 seed <<= 1;
waltercolitti 0:eb280529b0ef 418 }
waltercolitti 0:eb280529b0ef 419
waltercolitti 0:eb280529b0ef 420 value <<= 1;
waltercolitti 0:eb280529b0ef 421 }
waltercolitti 0:eb280529b0ef 422
waltercolitti 0:eb280529b0ef 423 return seed;
waltercolitti 0:eb280529b0ef 424 }