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.
Committer:
tomozh
Date:
Tue May 06 10:21:11 2014 +0000
Revision:
0:d1c0dbf5e5a6
1st release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tomozh 0:d1c0dbf5e5a6 1 /*
tomozh 0:d1c0dbf5e5a6 2 * AM2321 (Aosong Guangzhou Electronics)
tomozh 0:d1c0dbf5e5a6 3 * Temperature and Humidity Sensor mbed library
tomozh 0:d1c0dbf5e5a6 4 *
tomozh 0:d1c0dbf5e5a6 5 * Copyright (c) 2014 tomozh <tomozh@gmail.com>
tomozh 0:d1c0dbf5e5a6 6 *
tomozh 0:d1c0dbf5e5a6 7 * This software is released under the MIT License.
tomozh 0:d1c0dbf5e5a6 8 * http://opensource.org/licenses/mit-license.php
tomozh 0:d1c0dbf5e5a6 9 *
tomozh 0:d1c0dbf5e5a6 10 * Last update : 2014/05/06
tomozh 0:d1c0dbf5e5a6 11 */
tomozh 0:d1c0dbf5e5a6 12
tomozh 0:d1c0dbf5e5a6 13 #include "mbed.h"
tomozh 0:d1c0dbf5e5a6 14 #include "AM2321.h"
tomozh 0:d1c0dbf5e5a6 15
tomozh 0:d1c0dbf5e5a6 16 const int AM2321_I2C_ADDR = 0xB8;
tomozh 0:d1c0dbf5e5a6 17
tomozh 0:d1c0dbf5e5a6 18 AM2321::AM2321(PinName sda, PinName scl)
tomozh 0:d1c0dbf5e5a6 19 : _i2c(sda, scl)
tomozh 0:d1c0dbf5e5a6 20 {
tomozh 0:d1c0dbf5e5a6 21 _result.temperature = 0.0f;
tomozh 0:d1c0dbf5e5a6 22 _result.humidity = 0.0f;
tomozh 0:d1c0dbf5e5a6 23 }
tomozh 0:d1c0dbf5e5a6 24
tomozh 0:d1c0dbf5e5a6 25 float AM2321::getLogicalValue(uint16_t regVal) const
tomozh 0:d1c0dbf5e5a6 26 {
tomozh 0:d1c0dbf5e5a6 27 if(regVal & 0x8000)
tomozh 0:d1c0dbf5e5a6 28 {
tomozh 0:d1c0dbf5e5a6 29 regVal &= ~0x8000;
tomozh 0:d1c0dbf5e5a6 30 return (float)regVal / -10.0;
tomozh 0:d1c0dbf5e5a6 31 }
tomozh 0:d1c0dbf5e5a6 32 else
tomozh 0:d1c0dbf5e5a6 33 {
tomozh 0:d1c0dbf5e5a6 34 return (float)regVal / 10.0;
tomozh 0:d1c0dbf5e5a6 35 }
tomozh 0:d1c0dbf5e5a6 36 }
tomozh 0:d1c0dbf5e5a6 37
tomozh 0:d1c0dbf5e5a6 38 uint16_t AM2321::calcCRC16(const uint8_t* src, int len) const
tomozh 0:d1c0dbf5e5a6 39 {
tomozh 0:d1c0dbf5e5a6 40 uint16_t crc = 0xFFFF;
tomozh 0:d1c0dbf5e5a6 41
tomozh 0:d1c0dbf5e5a6 42 while(len--)
tomozh 0:d1c0dbf5e5a6 43 {
tomozh 0:d1c0dbf5e5a6 44 crc ^= *(src++);
tomozh 0:d1c0dbf5e5a6 45
tomozh 0:d1c0dbf5e5a6 46 for(uint8_t i = 0; i < 8; i++)
tomozh 0:d1c0dbf5e5a6 47 {
tomozh 0:d1c0dbf5e5a6 48 if(crc & 0x01)
tomozh 0:d1c0dbf5e5a6 49 {
tomozh 0:d1c0dbf5e5a6 50 crc >>= 1;
tomozh 0:d1c0dbf5e5a6 51 crc ^= 0xA001;
tomozh 0:d1c0dbf5e5a6 52 }
tomozh 0:d1c0dbf5e5a6 53 else
tomozh 0:d1c0dbf5e5a6 54 {
tomozh 0:d1c0dbf5e5a6 55 crc >>= 1;
tomozh 0:d1c0dbf5e5a6 56 }
tomozh 0:d1c0dbf5e5a6 57 }
tomozh 0:d1c0dbf5e5a6 58 }
tomozh 0:d1c0dbf5e5a6 59
tomozh 0:d1c0dbf5e5a6 60 return crc;
tomozh 0:d1c0dbf5e5a6 61 }
tomozh 0:d1c0dbf5e5a6 62
tomozh 0:d1c0dbf5e5a6 63 bool AM2321::poll(void)
tomozh 0:d1c0dbf5e5a6 64 {
tomozh 0:d1c0dbf5e5a6 65 bool success = false;
tomozh 0:d1c0dbf5e5a6 66 uint8_t data[8];
tomozh 0:d1c0dbf5e5a6 67
tomozh 0:d1c0dbf5e5a6 68 const static uint8_t READ_REGISTER_CMD[] = {
tomozh 0:d1c0dbf5e5a6 69 0x03 // Read register command
tomozh 0:d1c0dbf5e5a6 70 , 0x00 // start addrress
tomozh 0:d1c0dbf5e5a6 71 , 0x04 // read length
tomozh 0:d1c0dbf5e5a6 72 };
tomozh 0:d1c0dbf5e5a6 73
tomozh 0:d1c0dbf5e5a6 74 // wakeup
tomozh 0:d1c0dbf5e5a6 75 _i2c.write(AM2321_I2C_ADDR, NULL, 0);
tomozh 0:d1c0dbf5e5a6 76
tomozh 0:d1c0dbf5e5a6 77 // read data
tomozh 0:d1c0dbf5e5a6 78 _i2c.write(AM2321_I2C_ADDR, (char*)READ_REGISTER_CMD, 3);
tomozh 0:d1c0dbf5e5a6 79 wait_us(1600);
tomozh 0:d1c0dbf5e5a6 80
tomozh 0:d1c0dbf5e5a6 81 if(_i2c.read(AM2321_I2C_ADDR, (char*)data, 8) == 0)
tomozh 0:d1c0dbf5e5a6 82 {
tomozh 0:d1c0dbf5e5a6 83 uint8_t cmd = data[0];
tomozh 0:d1c0dbf5e5a6 84 uint8_t dataLen = data[1];
tomozh 0:d1c0dbf5e5a6 85 uint16_t humiVal = (data[2] * 256) + data[3];
tomozh 0:d1c0dbf5e5a6 86 uint16_t tempVal = (data[4] * 256) + data[5];
tomozh 0:d1c0dbf5e5a6 87 uint16_t recvCRC = data[6] + (data[7] * 256);
tomozh 0:d1c0dbf5e5a6 88 uint16_t chkCRC = calcCRC16(&data[0], 6);
tomozh 0:d1c0dbf5e5a6 89
tomozh 0:d1c0dbf5e5a6 90 if(dataLen == 4)
tomozh 0:d1c0dbf5e5a6 91 {
tomozh 0:d1c0dbf5e5a6 92 if(recvCRC == chkCRC)
tomozh 0:d1c0dbf5e5a6 93 {
tomozh 0:d1c0dbf5e5a6 94 if(cmd == 0x03)
tomozh 0:d1c0dbf5e5a6 95 {
tomozh 0:d1c0dbf5e5a6 96 _result.temperature = getLogicalValue(tempVal);
tomozh 0:d1c0dbf5e5a6 97 _result.humidity = getLogicalValue(humiVal);
tomozh 0:d1c0dbf5e5a6 98
tomozh 0:d1c0dbf5e5a6 99 success = true;
tomozh 0:d1c0dbf5e5a6 100 }
tomozh 0:d1c0dbf5e5a6 101 }
tomozh 0:d1c0dbf5e5a6 102 }
tomozh 0:d1c0dbf5e5a6 103 }
tomozh 0:d1c0dbf5e5a6 104
tomozh 0:d1c0dbf5e5a6 105 return success;
tomozh 0:d1c0dbf5e5a6 106 }
tomozh 0:d1c0dbf5e5a6 107
tomozh 0:d1c0dbf5e5a6 108 float AM2321::getTemperature(void) const
tomozh 0:d1c0dbf5e5a6 109 {
tomozh 0:d1c0dbf5e5a6 110 return _result.temperature;
tomozh 0:d1c0dbf5e5a6 111 }
tomozh 0:d1c0dbf5e5a6 112
tomozh 0:d1c0dbf5e5a6 113 float AM2321::getHumidity(void) const
tomozh 0:d1c0dbf5e5a6 114 {
tomozh 0:d1c0dbf5e5a6 115 return _result.humidity;
tomozh 0:d1c0dbf5e5a6 116 }