Kenji Arai / HDC1000

Dependents:   AmbientExampleLPC1768 HumidifierController_LPC824 TYBLE16_mbedlized_Thermometer

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers HDC1000.cpp Source File

HDC1000.cpp

00001 /*
00002  * mbed library program
00003  *  Low Power, High Accuracy Digital Humidity Sensor with Integrated Temperature Sensor
00004  *  HDC1000 Texas Instruments
00005  *
00006  * Copyright (c) 2015,'17 Kenji Arai / JH1PJL
00007  *  http://www.page.sannet.ne.jp/kenjia/index.html
00008  *  http://mbed.org/users/kenjiArai/
00009  *      Created: Feburary   9th, 2015
00010  *      Revised: AAugust   21st, 2017
00011  */
00012 
00013 #include "HDC1000.h"
00014 
00015 HDC1000::HDC1000 (PinName p_sda, PinName p_scl) :
00016  _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p)
00017 {
00018     HDC1000_addr = HDC1000ADDR;
00019     init();
00020 }
00021 
00022 HDC1000::HDC1000 (PinName p_sda, PinName p_scl, uint8_t addr) :
00023  _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p)
00024 {
00025     HDC1000_addr = addr;
00026     init();
00027 }
00028 
00029 HDC1000::HDC1000 (I2C& p_i2c) : _i2c(p_i2c)
00030 {
00031     HDC1000_addr = HDC1000ADDR;
00032     init();
00033 }
00034 
00035 HDC1000::HDC1000 (I2C& p_i2c, uint8_t addr) : _i2c(p_i2c)
00036 {
00037     HDC1000_addr = addr;
00038     init();
00039 }
00040 
00041 /////////////// Start conv. and gwt all data //////////////
00042 void HDC1000::get()
00043 {
00044 
00045     dt[0] = HDC1000_REG_TEMP;
00046     _i2c.write((int)HDC1000_addr, (char *)dt, 1, true);
00047     wait_ms(15);
00048     _i2c.read((int)HDC1000_addr, (char *)dt, 4, false);
00049     temp = dt[0] << 8 | dt[1];
00050     humi = dt[2] << 8 | dt[3];
00051 }
00052 
00053 /////////////// Read data from sensor /////////////////////
00054 float HDC1000::temperature()
00055 {
00056     return (float)temp * 165 / 65536 - 40;
00057 }
00058 
00059 /////////////// Read data from sensor /////////////////////
00060 float HDC1000::humidity()
00061 {
00062     return (float)humi * 100 / 65536;
00063 }
00064 
00065 /////////////// Initialize ////////////////////////////////
00066 void HDC1000::init()
00067 {
00068     _i2c.frequency(100000);
00069     get_IDs();
00070     set_config(BOTH_T_14_H_14);
00071 }
00072 
00073 /////////////// ID ////////////////////////////////////////
00074 uint16_t HDC1000::read_M_ID()
00075 {
00076     return manufacturer_id_number;
00077 }
00078 
00079 uint16_t HDC1000::read_D_ID()
00080 {
00081     return device_id_number;
00082 }
00083 
00084 uint8_t HDC1000::who_am_i()
00085 {
00086     if (device_id_number == I_AM_HDC1000) {
00087         return 1;
00088     } else {
00089         return 0;
00090     }
00091 }
00092 
00093 /////////////// Configration //////////////////////////////
00094 uint16_t HDC1000::set_config(uint16_t cfg)
00095 {
00096     dt[0] = HDC1000_REG_CONFIG;
00097     dt[1] = (uint8_t)(cfg >> 8);
00098     dt[2] = (uint8_t)(cfg & 0xff);
00099     _i2c.write((int)HDC1000_addr, (char *)dt, 3, false);
00100     return read_config();
00101 }
00102 
00103 uint16_t HDC1000::read_config(void)
00104 {
00105     dt[0] = HDC1000_REG_CONFIG;
00106     _i2c.write((int)HDC1000_addr, (char *)dt, 1, true);
00107     _i2c.read(HDC1000_addr, (char *)dt, 2, false);
00108     return (uint16_t)(dt[0] << 8 | dt[1]);
00109 }
00110 
00111 /////////////// I2C Freq. /////////////////////////////////
00112 void HDC1000::frequency(int hz)
00113 {
00114     _i2c.frequency(hz);
00115 }
00116 
00117 /////////////// Read ID ///////////////////////////////////
00118 void HDC1000::get_IDs()
00119 {
00120     // Manufacturer ID
00121     dt[0] = HDC1000_REG_M_ID;
00122     _i2c.write((int)HDC1000_addr, (char *)dt, 1, true);
00123     _i2c.read(HDC1000_addr, (char *)dt, 2, false);
00124     manufacturer_id_number = dt[0] << 8 | dt[1];
00125     // Device ID
00126     dt[0] = HDC1000_REG_D_ID;
00127     _i2c.write((int)HDC1000_addr, (char *)dt, 1, true);
00128     _i2c.read(HDC1000_addr, (char *)dt, 2, false);
00129     device_id_number = dt[0] << 8 | dt[1];
00130 }