BLYNK TEST

Dependencies:   mbed Blynk

AM2321.cpp

Committer:
lixianyu
Date:
2016-06-10
Revision:
0:d8f4c441e032
Child:
2:6cd3b0947188

File content as of revision 0:d8f4c441e032:

// 
// AM2321 Temperature & Humidity Sensor library for Arduino
//
// The MIT License (MIT)
//
// Copyright (c) 2013 Wang Dong
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//

#include "AM2321.h"
//#include <Wire.h>
#if 0
#define I2C_ADDR_AM2321                 (0xB8 >> 1)          //AM2321温湿度计I2C地址
#define PARAM_AM2321_READ                0x03                //读寄存器命令
#define REG_AM2321_HUMIDITY_MSB          0x00                //湿度寄存器高位
#define REG_AM2321_HUMIDITY_LSB          0x01                //湿度寄存器低位
#define REG_AM2321_TEMPERATURE_MSB       0x02                //温度寄存器高位
#define REG_AM2321_TEMPERATURE_LSB       0x03                //温度寄存器低位
#define REG_AM2321_DEVICE_ID_BIT_24_31   0x0B                //32位设备ID高8位

template<int I2CADDR, int COMMAND, int REGADDR, int REGCOUNT>
class DataReader {
protected:
    enum { len = 32 };
    uint8_t buf[len];

protected:
    DataReader() {
        memset(buf, 0, len);
    } 
    bool readRaw() {
        //
        // Wakeup
        //
        Wire.beginTransmission(I2CADDR);
        Wire.endTransmission();

        //
        // Read Command
        //
        Wire.beginTransmission(I2CADDR);
        Wire.write(COMMAND);
        Wire.write(REGADDR);
        Wire.write(REGCOUNT);
        Wire.endTransmission();

        //
        // Waiting
        //
        delayMicroseconds(1600); //>1.5ms

        //
        // Read
        //
        Wire.requestFrom(I2CADDR, 2 + REGCOUNT + 2); // COMMAND + REGCOUNT + DATA + CRCLSB + CRCMSB
        int i = 0;
        for (; i < 2 + REGCOUNT; ++i)
            buf[i] = Wire.read();

        unsigned short crc = 0;
        crc  = Wire.read();     //CRC LSB
        crc |= Wire.read() << 8;//CRC MSB

        if (crc == crc16(buf, i))
            return true;
        return false;
    }

private:
    unsigned short crc16(unsigned char *ptr, unsigned char len) {
        unsigned short crc = 0xFFFF; 
        unsigned char  i   = 0;
        while(len--) {
            crc ^= *ptr++; 
            for(i = 0 ; i < 8 ; i++) {
                if(crc & 0x01) {
                    crc >>= 1;
                    crc  ^= 0xA001; 
                }
                else {
                    crc >>= 1;
                } 
            }
        }
        return crc; 
    }
};

class UidReader : public DataReader<I2C_ADDR_AM2321, PARAM_AM2321_READ, REG_AM2321_DEVICE_ID_BIT_24_31, 4>
{
public:
    unsigned int uid;
public:
    bool read() {
        if(!readRaw()) 
            return false;
        uid  = buf[2] << 24;
        uid += buf[3] << 16;
        uid += buf[4] << 8;
        uid += buf[5];
        return true;
    }
};

class AirConditionReader : public DataReader<I2C_ADDR_AM2321, PARAM_AM2321_READ, REG_AM2321_HUMIDITY_MSB, 4>
{
public:
    unsigned int humidity;
    int temperature;
public:
    bool read() {
        if(!readRaw()) 
            return false;
        humidity     = buf[2] << 8;
        humidity    += buf[3];
        temperature  = (buf[4]&0x7F) << 8;
        temperature += buf[5];
		if((buf[4]&0x80) == 0x80)
			temperature = -temperature;
        return true;
    }
};


AM2321::AM2321() {
    Wire.begin();
    temperature = 0;
    humidity    = 0;
}

uint32_t AM2321::uid() {
    UidReader reader;
    if (reader.read())
        return reader.uid;
    return -1;
}


bool AM2321::available() {
    return !(temperature == 0 && humidity == 0);
}

bool AM2321::read() {
    AirConditionReader reader;
    if (reader.read()) {
        temperature = reader.temperature;
        humidity = reader.humidity;
        return true;
    }
    return false;
}
//
// END OF FILE
//

#endif