AM2321 Temperature and Humidity Sensor mbed library

Dependents:   AM2321_Example mbed_vfd_thermometer

/media/uploads/tomozh/am2321_1.png/media/uploads/tomozh/p5061476.jpg

Import programAM2321_Example

AM2321 Temperature and Humidity Sensor mbed library Example

Import library

Public Member Functions

AM2321 (PinName sda, PinName scl)
Constructor.
bool poll ()
Read current temperature and humidity from AM2321 .
float getTemperature (void) const
Get last read temperature value.
float getHumidity (void) const
Get last read humidity value.

AM2321.cpp

Committer:
tomozh
Date:
2014-05-06
Revision:
0:d1c0dbf5e5a6

File content as of revision 0:d1c0dbf5e5a6:

/*
 *  AM2321 (Aosong Guangzhou Electronics)
 *  Temperature and Humidity Sensor mbed library
 * 
 *  Copyright (c) 2014 tomozh <tomozh@gmail.com>
 *  
 *  This software is released under the MIT License.
 *  http://opensource.org/licenses/mit-license.php
 *
 *  Last update : 2014/05/06
 */

#include "mbed.h"
#include "AM2321.h"

const int AM2321_I2C_ADDR = 0xB8;

AM2321::AM2321(PinName sda, PinName scl)
: _i2c(sda, scl)
{
    _result.temperature = 0.0f;
    _result.humidity    = 0.0f;        
}

float AM2321::getLogicalValue(uint16_t regVal) const
{
    if(regVal & 0x8000)
    {
        regVal &= ~0x8000;
        return (float)regVal / -10.0;
    }
    else
    {
        return (float)regVal / 10.0;    
    }
}

uint16_t AM2321::calcCRC16(const uint8_t* src, int len) const
{
    uint16_t crc = 0xFFFF;

    while(len--)
    {
        crc ^= *(src++);
        
        for(uint8_t i = 0; i < 8; i++)
        {
            if(crc & 0x01)
            {
                crc >>= 1;
                crc ^= 0xA001;
            }
            else
            {
                crc >>= 1;
            }
        }
    }
    
    return crc; 
}

bool AM2321::poll(void)
{
    bool    success = false;
    uint8_t data[8];
    
    const static uint8_t READ_REGISTER_CMD[] = {
           0x03     // Read register command
         , 0x00     // start addrress
         , 0x04     // read length
          };

    // wakeup
    _i2c.write(AM2321_I2C_ADDR, NULL, 0);

    // read data
    _i2c.write(AM2321_I2C_ADDR, (char*)READ_REGISTER_CMD, 3);
    wait_us(1600);

    if(_i2c.read(AM2321_I2C_ADDR, (char*)data, 8) == 0)
    {
        uint8_t  cmd     = data[0];
        uint8_t  dataLen = data[1];
        uint16_t humiVal = (data[2] * 256) + data[3];
        uint16_t tempVal = (data[4] * 256) + data[5];
        uint16_t recvCRC = data[6] + (data[7] * 256);
        uint16_t chkCRC  = calcCRC16(&data[0], 6);

        if(dataLen == 4)
        {
            if(recvCRC == chkCRC)
            {
                if(cmd == 0x03)
                {
                    _result.temperature = getLogicalValue(tempVal);
                    _result.humidity    = getLogicalValue(humiVal);

                    success = true;
                }
            }
        }
    }
    
    return success;
}

float AM2321::getTemperature(void) const
{
    return _result.temperature;
}

float AM2321::getHumidity(void) const
{
    return _result.humidity;
}