add Dewpoint
Fork of AM2321 by
AM2321.cpp
- Committer:
- HB9GAA
- Date:
- 2015-08-11
- Revision:
- 1:f42b99c425e8
- Parent:
- 0:d1c0dbf5e5a6
- Child:
- 2:dd902435d402
File content as of revision 1:f42b99c425e8:
/* * 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; } 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; }