MCP9808 Digital temperature sensor

MCP9808.cpp

Committer:
Jmfox24
Date:
2017-01-20
Revision:
2:4f8e1fb852d3
Parent:
0:f06580426072

File content as of revision 2:4f8e1fb852d3:

#include <stdint.h>
#include "mbed.h"
#include "MCP9808.hpp"

MCP9808::MCP9808(PinName sda, PinName scl, int addr) :
    _i2c(sda, scl), _addr(addr) {}

MCP9808:: ~MCP9808() {}

bool MCP9808::is_detected()
{
    uint16_t v = 0;

    /* check MFG ID */
    if (reg_read(MCP9808_REG_MFG_ID, &v)) {
        return false;
    }
    if (v != MCP9808_MFG_ID) {
        return false;
    }

    /* check DEV ID */
    if (reg_read(MCP9808_REG_DEV_ID, &v)) {
        return false;
    }
    if (v != MCP9808_DEV_ID) {
        return false;
    }

    return true;
}

int MCP9808::sleep()
{
    return set_cfg_flag(MCP9808_CFG_FLAG_SHDN_ENABLED, true);
}

int MCP9808::wake()
{
    return set_cfg_flag(MCP9808_CFG_FLAG_SHDN_ENABLED, false);
}

float MCP9808::get_temperature()
{
    uint16_t v = 0;
    float t = 0.0f;

    reg_read(MCP9808_REG_TEMP, &v);
    t = v & 0x0FFF;
    t /= 16.0f;
    if (v & 0x1000) {
        t -= 256.0f;
    }
    return t;
}

int MCP9808::reg_read(uint8_t reg, uint16_t *value)
{
    uint8_t buffer[sizeof(*value)] = { reg, 0x00 };
    _i2c.write(_addr, (const char *)buffer, 1, true);
    _i2c.read(_addr, (char *)buffer, sizeof(buffer), false);
    *value = (buffer[0] << 8) | buffer[1];
    return 0;
}

int MCP9808::reg_write(uint8_t reg, uint16_t value)
{
    uint8_t buffer[] = { reg, (value >> 8), (value & 0xFF) };
    _i2c.write(_addr, (const char *)buffer, sizeof(buffer), false);
    return 0;
}

int MCP9808::set_cfg_flag(uint16_t flag, bool v)
{
    uint16_t value = 0x00;
    reg_read(MCP9808_REG_CFG, &value);
    if (v) {
        value |= flag;
    } else {
        value &= ~flag;
    }
    return reg_write(MCP9808_REG_CFG, value);
}