Simple temperature and humidity program example for Hexiwear featuring UART

Fork of HTU21D by Alex Lipford

This project demonstrates the use of the HTU21D temperature and humidity sensor embedded in Hexiwear

Open a Hyperterminal tool on your computer and connect it to the "mbed Serial port (COMxx)" with Baud rate "9600bps"

Compile the project and copy the binary "Hexi_Humid_Temp_Example_HEXIWEAR.bin" in the DAP-LINK drive from your computer file explorer Press the K64F-RESET button on the docking station to start the program on your board

Every 500ms the value of the Temperature and Humidity will be displayed in the Hyperterminal window and the LED will blink Green

Committer:
GregC
Date:
Mon Oct 17 03:03:07 2016 +0000
Revision:
3:caccf1879f14
Parent:
2:4fd07be6bad8
Simple temperature and humidity program example for Hexiwear featuring UART

Who changed what in which revision?

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