interface library to support TI hdc1080 humidity and temperature sensor

Dependents:   xj-Nucleo-F303K8-hdc1080-test HelloWorld_NFC02A1laatste

hdc1080.h

Committer:
joeata2wh
Date:
2016-09-14
Revision:
1:dd3a07b44fe2
Parent:
0:36666c79a60f

File content as of revision 1:dd3a07b44fe2:

/*
  By Joseph Ellsworth CTO of A2WH
  Take a look at A2WH.com Producing Water from Air using Solar Energy
  March-2016 License: https://developer.mbed.org/handbook/MIT-Licence
  Please contact us http://a2wh.com for help with custom design projects.

  See Also:
    http://www.ti.com/lit/ds/symlink/hdc1080.pdf
    https://github.com/closedcube/ClosedCube_HDC1080_Arduino/blob/master/src/ClosedCube_HDC1080.cpp
    http://e.pavlin.si/2016/06/04/hdlc-like-data-link-via-rs485/
*/

/**
#include "mbed.h"
#include <stdint.h>

//Pin Defines for I2C Bus
#define D_SDA                  PB_7 // specific for Nucleo-F303K8
#define D_SCL                  PB_6 // specific for Nucleo-F303K8
I2C hdc_i2c(D_SDA, D_SCL);
#include "hdc1080.h"

// Host PC Communication channels
Serial pc(USBTX, USBRX); // tx, rx
DigitalOut myled(LED1);

int main()
{
    pc.baud(9600);
    while(1) {
        printf("\r\\nHDC1080 Test\r\n");
        myled = !myled;
        hdc_begin();
        uint16_t manId = hdc_readManufactId();
        float tempC = hdc_readTemp();     
        float humid = hdc_readHumid();  
        unsigned long  serNum = hdc_readSerial();
        printf("manId=x%x, tempC=%0.3f humid=%0.3f serfNum=%ld\r\n",
          manId, tempC, humid, serNum);
        wait(3.0f);
    }
}
**/



#ifndef hdc1080_h
#define hdc1080_h
#include "mbed.h"

#define hdc_chip_addr (0x40 << 1) // Page #8.5.1.1 - 1000000
// left shift 1 bit for 7 bit address required by
// I2C library
//#define hdc_chip_addr 0x40 // Page #8.5.1.1 - 1000000
const int hdc_off_temp  = 0x00;
const int hdc_off_humid = 0x01;
const int hdc_off_config = 0x02;
const int hdc_off_man_id = 0xFE;
const int hdc_off_serial_first = 0xFB;
const int hdc_off_serial_mid = 0xFC;
const int hdc_off_serial_last = 0xFD;
char hdc_comm = hdc_off_man_id;
const float hdc_chip_error = -255;
const unsigned long hdc_chip_err_l = 0;
char hdc_buff[5];

void hdc_begin()
{
    //printf("hdc_begin\r\n");
    memset(hdc_buff,0,3);
    hdc_buff[0] = hdc_off_config;
    int res = hdc_i2c.write(hdc_chip_addr, hdc_buff, 2);
    #ifdef DEBUG3
    printf("hdc_begin write res=%d\r\n", res);
    #endif
}

uint16_t hdc_readData16(int chip_addr, int offset)
{
    memset(hdc_buff,0,3);
    // send chip address onto buss
    hdc_buff[0] = offset;
    int res = hdc_i2c.write(chip_addr, hdc_buff, 1);
    if (res != 0) {
        #ifdef DEBUG3
        printf("error talking to chip %d offst=%d\r\n", chip_addr, offset);
        #endif
        return 0;
    }
    // read data from chip
    wait(0.015);
    memset(hdc_buff,0,3);
    res = hdc_i2c.read(hdc_chip_addr, hdc_buff,2);
    if (res != 0) {
        #ifdef DEBUG3
        printf("error reading chip %d offst=%d\r\n", chip_addr, offset);
        #endif
        return 0;
    }
    return  hdc_buff[0] << 8 | hdc_buff[1];
}

/* Read temperature from hdc_1080 chip.  Returns float
containing the Celcius temperature or hdc_chip_error if
error occurs reading the sensor */
float hdc_readTemp()
{
    uint16_t  rawT = hdc_readData16(hdc_chip_addr, hdc_off_temp);
    if (rawT == 0) {
        #ifdef DEBUG3
        printf("error reading hdc chip temp\r\n");
        #endif
        return hdc_chip_error;
    } else {
        float temp = ((float) rawT / pow(2.0f, 16.0f)) * 165.0f - 40.0f;
        #ifdef DEBUG3
        printf("temp=%0.3f\r\n", temp);
        #endif
        return temp;
    }
}

/* Read humidity from hdc_1080 chip.  Returns a float
containing the humidity or hdc_chip_error if error 
occurs reading the sensor */
float hdc_readHumid()
{
    uint16_t  rawH = hdc_readData16(hdc_chip_addr, hdc_off_humid);
    if (rawH == 0) {
        #ifdef DEBUG3
        printf("error reading hdc chip humid\r\n");
        #endif
        return hdc_chip_error;
    } else {
        float humid = ((float) rawH / pow(2.0f, 16.0f)) * 100.0f;
        #ifdef DEBUG3
        printf("humid humid=%0.3f\r\n", humid);
        #endif
        return humid;
    }
}

int hdc_readManufactId()
{   
    uint16_t  rawid = hdc_readData16(hdc_chip_addr, hdc_off_man_id);
    if (rawid == 0) {
        #ifdef DEBUG3
        printf("error reading hdc chip manId\r\n");
        #endif
        return (int) hdc_chip_error;
    } else {  
        #ifdef DEBUG3      
        printf("man id=%x\r\n", (int) rawid);
        #endif
        return rawid;
    }    
}

unsigned long hdc_readSerial()
{    
    wait(0.015);
    memset(hdc_buff,0,4);
    hdc_buff[0] = hdc_off_man_id;
    int res = hdc_i2c.write(hdc_chip_addr, hdc_buff, 1);
    if (res != 0) {      
      #ifdef DEBUG3
      printf("Error writing chip addr res=%d\r\n", res);
      #endif
      return (unsigned long) hdc_chip_err_l;
    }      

    wait(0.015);
    memset(hdc_buff,0,4);
    res = hdc_i2c.read(hdc_chip_addr, hdc_buff,4);
    if (res != 0) {
      #ifdef DEBUG3
      printf("Errot reading chip serial res=%d#\r\n", res);
      #endif
      return (unsigned long) hdc_chip_err_l;
    }
      
    unsigned long rawser = hdc_buff[0] << 16 | hdc_buff[1] << 8 | hdc_buff[0];
    #ifdef DEBUG3
    printf("ser=%lu\r\n", rawser);
    #endif
    return rawser;
}

#endif