Library for Silicon Labs Si7006 digital temperature and humidity chip.
Dependents: acd52832_Humidity_Temp_Example iBeacon acnsensa acnSENSA
Si7006A20.cpp
- Committer:
- jurica238814
- Date:
- 2017-09-26
- Revision:
- 2:7c3c7db34528
- Parent:
- 1:155934570c14
File content as of revision 2:7c3c7db34528:
/*******************************************************************************
* Copyright (C) 2015 Maxim Integrated Products, Inc., All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
*
*******************************************************************************
*/
/*
* The library is modified to suite Si7006A20 Humidity and Temperature Sensor
* by Jurica Resetar @ aconno
* More info and contact: aconno.de
* jurica_resetar@yahoo.com
*
*/
#include "Si7006A20.h"
#include "aconno_i2c.h"
#define TEMPERATURE_DELAY_MS (10)
#define HUMIDITY_DELAY_MS (20)
char cmd_meas_humid = 0xE5;
char cmd_meas_humid_no_hold = 0xF5;
char cmd_meas_temp = 0xE3;
char cmd_meas_temp_no_hold = 0xF3;
char cmd_meas_prev_temp = 0xE0;
char cmd_rst = 0xFE;
char cmd_write_user1 = 0xE6;
char cmd_read_user1 = 0xE7;
char cmd_id_1[] = {0xFA, 0x0F};
char cmd_id_2[] = {0xFC, 0xC9};
char cmd_fw_ver[] = {0x84, 0xB8};
Si7006::Si7006(I2C *i2c) : i2c(i2c, char(I2C_ADDR)){
}
uint8_t Si7006::getElectronicId(char* id){
uint8_t success;
success = i2c.sendCommand(cmd_id_1, sizeof(cmd_id_1), id, 4);
success = i2c.sendCommand(cmd_id_2, sizeof(cmd_id_2), (id+4), 4);
return success;
}
int Si7006::configResolution(Si7006::resolution_t resolution){
char data;
// Read User1 Register
i2c.readFromReg(cmd_read_user1, &data, 1);
switch (resolution) {
case RH_12b_TEMP_14b:
data &= ~0x81;
break;
case RH_8b_TEMP_12b:
data = (data & ~0x80) | 0x01;
break;
case RH_10b_TEMP_13b:
data = (data & ~0x01) | 0x80;
break;
case RH_11b_TEMP_11b:
data |= 0x81;
break;
default:
return -1;
}
return i2c.writeToReg(cmd_write_user1, &data, 1);
}
float Si7006::getTemperature(){
char temper[2];
i2c.sendCommand(&cmd_meas_temp_no_hold, sizeof(cmd_meas_temp_no_hold));
wait_ms(TEMPERATURE_DELAY_MS);
i2c.readBus(temper, 2);
return calculateTemperature(temper);
}
float Si7006::calculateTemperature(char *rawTemp){
float temperature;
int16_t code;
code = (uint16_t)((*(rawTemp+0)<<8) + (*(rawTemp+1)<<0));
temperature = (((float)175.72 * code) / 65536.0f) - 46.85;
//return temperature;
return temperature;
}
float Si7006::getHumidity(){
char humid[2];
i2c.sendCommand(&cmd_meas_humid, sizeof(cmd_meas_humid));
wait_ms(HUMIDITY_DELAY_MS);
i2c.readBus(humid, 2);
return checkHumidity(humid);
}
float Si7006::checkHumidity(char *rawHumidity){
float humidity;
uint16_t code;
// Get 16-bit value from bytes read
code = (uint16_t)((*(rawHumidity+0)<<8) + (*(rawHumidity+1)<<0));
// Calculate the humidity using the formula from the datasheet
humidity = ((((float)125 * code)) / 65536.0f) - 6;
return humidity;
}
int Si7006::getPrevTemperature(float *tempC) {
/*
if (i2c.write(i2cADDR, cmd_meas_prev_temp, sizeof(cmd_meas_prev_temp)) != 0) {
return -1;
}
if(checkTemperature(tempC) != 0) {
return -1;
}
return 0;
*/
}
int Si7006::getPrevTemperature(int16_t *tempCx10) {
/*
if (i2c.write(i2cADDR, cmd_meas_prev_temp, sizeof(cmd_meas_prev_temp)) != 0) {
return -1;
}
if(checkTemperature(tempCx10) != 0) {
return -1;
}
return 0;
*/
}
int Si7006::getRev(char *rev){
/*
if (i2c.write(i2cADDR, cmd_fw_ver, sizeof(cmd_fw_ver)) != 0) {
return -1;
}
if (i2c.read(i2cADDR, rev, 1) != 0) {
return -1;
}
return 0;
*/
}
int Si7006::heater(bool enable){
char data[2];
/*
if (i2c.write(i2cADDR, cmd_read_user1, sizeof(cmd_read_user1)) != 0) {
return -1;
}
if (i2c.read(i2cADDR, &data[1], 1) != 0) {
return -1;
}
if (enable) {
data[1] |= 0x04;
} else {
data[1] &= ~0x04;
}
data[0] = cmd_write_user1[0];
if (i2c.write(i2cADDR, data, 2) != 0) {
return -1;
}
return 0;
*/
}
char Si7006::crc8(char value, char seed){
int i;
for (i = 0; i < 8; i++) {
if ((value ^ seed) & 0x80) {
seed <<= 1;
seed ^= POLYVAL;
} else {
seed <<= 1;
}
value <<= 1;
}
return seed;
}