add Dewpoint
Fork of AM2321 by
Diff: AM2321.cpp
- Revision:
- 1:f42b99c425e8
- Parent:
- 0:d1c0dbf5e5a6
- Child:
- 2:dd902435d402
--- a/AM2321.cpp Tue May 06 10:21:11 2014 +0000 +++ b/AM2321.cpp Tue Aug 11 09:13:23 2015 +0000 @@ -15,53 +15,52 @@ const int AM2321_I2C_ADDR = 0xB8; -AM2321::AM2321(PinName sda, PinName scl) -: _i2c(sda, scl) -{ +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; } - - return crc; -} + bool AM2321::poll(void) -{ + { bool success = false; uint8_t data[8]; @@ -79,7 +78,7 @@ 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]; @@ -88,29 +87,37 @@ 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; } - - return success; -} float AM2321::getTemperature(void) const -{ + { return _result.temperature; -} + } float AM2321::getHumidity(void) const -{ + { return _result.humidity; -} + } + +float AM2321::getDewpoint(void) const + { + float H, Dp; + + H = (log(_result.humidity) - 2) / 0.4343 + (17.62 * _result.temperature) / (243.12 + _result.temperature); + Dp = 243.12 * H / (17.62 - H); //das ist der Taupunkt in Celsius + return Dp/10; + }