BASIC LIBRARY TO INTERFACE WITH HTU21D TEMPERATURE AND HUMIDITY SENSOR
Dependents: Natural_Calamities_Monitoring_System Nucleo_HTU21D-F Nucleo_motors lpc1768_blinky ... more
HTU21D/HTU21D.cpp@0:db86ad1b4459, 2014-03-28 (annotated)
- Committer:
- hwing91
- Date:
- Fri Mar 28 14:55:03 2014 +0000
- Revision:
- 0:db86ad1b4459
INITIAL COMMIT
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hwing91 | 0:db86ad1b4459 | 1 | /** |
hwing91 | 0:db86ad1b4459 | 2 | * @author Alan Lai & Nelson Diaz |
hwing91 | 0:db86ad1b4459 | 3 | * The Georgia Institute of Technology |
hwing91 | 0:db86ad1b4459 | 4 | * ECE 4180 Embeded Systems |
hwing91 | 0:db86ad1b4459 | 5 | * Professor Hamblen |
hwing91 | 0:db86ad1b4459 | 6 | * 03/28/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): |
hwing91 | 0:db86ad1b4459 | 11 | * <alanhlai91@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); |
hwing91 | 0:db86ad1b4459 | 48 | wait_ms(1); |
hwing91 | 0:db86ad1b4459 | 49 | |
hwing91 | 0:db86ad1b4459 | 50 | // Reads triggered measure |
hwing91 | 0:db86ad1b4459 | 51 | i2c_->read((HTU21D_I2C_ADDRESS << 1) | 0x01, rx, 2); |
hwing91 | 0:db86ad1b4459 | 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); |
hwing91 | 0:db86ad1b4459 | 89 | wait_ms(1); |
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 |