An updated, basic library to interface with the HTU21D digital temperature and humidity sensor

Dependents:   HTU21D_HELLOWORLD HTU21D-F_Nucleo_F411RE Bicycl_Computer_NUCLEO-F411RE Bicycl_Computer_NUCLEO-L476RG ... more

Fork of HTU21D by Alan Lai

Committer:
alipford3
Date:
Sun Oct 19 19:27:19 2014 +0000
Revision:
2:4fd07be6bad8
Parent:
1:d7568a103ef5
An updated, basic library to interface with the HTU21D temperature and humidity sensor

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hwing91 0:db86ad1b4459 1 /**
alipford3 2:4fd07be6bad8 2 * @author Alex Lipford
alipford3 2:4fd07be6bad8 3 * Georgia Institute of Technology
alipford3 2:4fd07be6bad8 4 * ECE 4180 Embeded Systems Design
hwing91 0:db86ad1b4459 5 * Professor Hamblen
alipford3 2:4fd07be6bad8 6 * 10/19/2014
hwing91 0:db86ad1b4459 7 *
hwing91 0:db86ad1b4459 8 * @section LICENSE
hwing91 0:db86ad1b4459 9 * ----------------------------------------------------------------------------
hwing91 0:db86ad1b4459 10 * "THE BEER-WARE LICENSE" (Revision 42):
alipford3 2:4fd07be6bad8 11 * <alexlipford@gmail.com> wrote this file. As long as you retain this notice you
hwing91 0:db86ad1b4459 12 * can do whatever you want with this stuff. If we meet some day, and you think
hwing91 0:db86ad1b4459 13 * this stuff is worth it, you can buy me a beer in return.
hwing91 0:db86ad1b4459 14 * ----------------------------------------------------------------------------
hwing91 0:db86ad1b4459 15 *
hwing91 0:db86ad1b4459 16 *
hwing91 0:db86ad1b4459 17 * @section DESCRIPTION
hwing91 0:db86ad1b4459 18 *
hwing91 0:db86ad1b4459 19 * HTU21D Humidity and Temperature sensor.
hwing91 0:db86ad1b4459 20 *
hwing91 0:db86ad1b4459 21 * Datasheet, specs, and information:
hwing91 0:db86ad1b4459 22 *
hwing91 0:db86ad1b4459 23 * https://www.sparkfun.com/products/12064
hwing91 0:db86ad1b4459 24 */
hwing91 0:db86ad1b4459 25
hwing91 0:db86ad1b4459 26 /**
hwing91 0:db86ad1b4459 27 * Includes
hwing91 0:db86ad1b4459 28 */
hwing91 0:db86ad1b4459 29 #include "HTU21D.h"
hwing91 0:db86ad1b4459 30
hwing91 0:db86ad1b4459 31 HTU21D::HTU21D(PinName sda, PinName scl) {
hwing91 0:db86ad1b4459 32
hwing91 0:db86ad1b4459 33 i2c_ = new I2C(sda, scl);
hwing91 0:db86ad1b4459 34 //400KHz, as specified by the datasheet.
hwing91 0:db86ad1b4459 35 i2c_->frequency(400000);
hwing91 0:db86ad1b4459 36
hwing91 0:db86ad1b4459 37
hwing91 0:db86ad1b4459 38
hwing91 0:db86ad1b4459 39 }
hwing91 0:db86ad1b4459 40
hwing91 0:db86ad1b4459 41 int HTU21D::sample_ctemp(void) {
hwing91 0:db86ad1b4459 42
hwing91 0:db86ad1b4459 43 char tx[1];
hwing91 0:db86ad1b4459 44 char rx[2];
hwing91 0:db86ad1b4459 45
hwing91 0:db86ad1b4459 46 tx[0] = TRIGGER_TEMP_MEASURE; // Triggers a temperature measure by feeding correct opcode.
hwing91 0:db86ad1b4459 47 i2c_->write((HTU21D_I2C_ADDRESS << 1) & 0xFE, tx, 1);
alipford3 2:4fd07be6bad8 48 wait_ms(50); // Per datasheet, wait long enough for device to sample temperature
hwing91 0:db86ad1b4459 49
hwing91 0:db86ad1b4459 50 // Reads triggered measure
hwing91 0:db86ad1b4459 51 i2c_->read((HTU21D_I2C_ADDRESS << 1) | 0x01, rx, 2);
alipford3 2:4fd07be6bad8 52 wait_ms(1);
hwing91 0:db86ad1b4459 53
hwing91 0:db86ad1b4459 54 // Algorithm from datasheet to compute temperature.
hwing91 0:db86ad1b4459 55 unsigned int rawTemperature = ((unsigned int) rx[0] << 8) | (unsigned int) rx[1];
hwing91 0:db86ad1b4459 56 rawTemperature &= 0xFFFC;
hwing91 0:db86ad1b4459 57
hwing91 0:db86ad1b4459 58 float tempTemperature = rawTemperature / (float)65536; //2^16 = 65536
hwing91 0:db86ad1b4459 59 float realTemperature = -46.85 + (175.72 * tempTemperature); //From page 14
hwing91 0:db86ad1b4459 60
hwing91 0:db86ad1b4459 61 return (int)realTemperature;
hwing91 0:db86ad1b4459 62
hwing91 0:db86ad1b4459 63 }
hwing91 0:db86ad1b4459 64
hwing91 0:db86ad1b4459 65 int HTU21D::sample_ftemp(void){
hwing91 0:db86ad1b4459 66 int temptemp = sample_ctemp();
hwing91 0:db86ad1b4459 67 int ftemp = temptemp * 1.8 + 32;
hwing91 0:db86ad1b4459 68
hwing91 0:db86ad1b4459 69 return ftemp;
hwing91 0:db86ad1b4459 70 }
hwing91 0:db86ad1b4459 71
hwing91 0:db86ad1b4459 72 int HTU21D::sample_ktemp(void){
hwing91 0:db86ad1b4459 73 int temptemp = sample_ctemp();
hwing91 0:db86ad1b4459 74 int ktemp = temptemp + 274;
hwing91 0:db86ad1b4459 75
hwing91 0:db86ad1b4459 76 return ktemp;
hwing91 0:db86ad1b4459 77
hwing91 0:db86ad1b4459 78
hwing91 0:db86ad1b4459 79 }
hwing91 0:db86ad1b4459 80
hwing91 0:db86ad1b4459 81 int HTU21D::sample_humid(void) {
hwing91 0:db86ad1b4459 82
hwing91 0:db86ad1b4459 83 char tx[1];
hwing91 0:db86ad1b4459 84 char rx[2];
hwing91 0:db86ad1b4459 85
hwing91 0:db86ad1b4459 86
hwing91 0:db86ad1b4459 87 tx[0] = TRIGGER_HUMD_MEASURE; // Triggers a humidity measure by feeding correct opcode.
hwing91 0:db86ad1b4459 88 i2c_->write((HTU21D_I2C_ADDRESS << 1) & 0xFE, tx, 1);
alipford3 2:4fd07be6bad8 89 wait_ms(16); // Per datasheet, wait long enough for device to sample humidity
hwing91 0:db86ad1b4459 90
hwing91 0:db86ad1b4459 91 // Reads triggered measure
hwing91 0:db86ad1b4459 92 i2c_->read((HTU21D_I2C_ADDRESS << 1) | 0x01, rx, 2);
hwing91 0:db86ad1b4459 93 wait_ms(1);
hwing91 0:db86ad1b4459 94
hwing91 0:db86ad1b4459 95 //Algorithm from datasheet.
hwing91 0:db86ad1b4459 96 unsigned int rawHumidity = ((unsigned int) rx[0] << 8) | (unsigned int) rx[1];
hwing91 0:db86ad1b4459 97
hwing91 0:db86ad1b4459 98 rawHumidity &= 0xFFFC; //Zero out the status bits but keep them in place
hwing91 0:db86ad1b4459 99
hwing91 0:db86ad1b4459 100 //Given the raw humidity data, calculate the actual relative humidity
hwing91 0:db86ad1b4459 101 float tempRH = rawHumidity / (float)65536; //2^16 = 65536
hwing91 0:db86ad1b4459 102 float rh = -6 + (125 * tempRH); //From page 14
hwing91 0:db86ad1b4459 103
hwing91 0:db86ad1b4459 104
hwing91 0:db86ad1b4459 105 return (int)rh;
hwing91 0:db86ad1b4459 106
hwing91 0:db86ad1b4459 107 }
hwing91 0:db86ad1b4459 108