add Dewpoint
Fork of AM2321 by
AM2321.cpp@1:f42b99c425e8, 2015-08-11 (annotated)
- Committer:
- HB9GAA
- Date:
- Tue Aug 11 09:13:23 2015 +0000
- Revision:
- 1:f42b99c425e8
- Parent:
- 0:d1c0dbf5e5a6
- Child:
- 2:dd902435d402
ELcon
Who changed what in which revision?
User | Revision | Line number | New 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 | |
HB9GAA | 1:f42b99c425e8 | 18 | AM2321::AM2321(PinName sda, PinName scl): _i2c(sda, scl) |
HB9GAA | 1:f42b99c425e8 | 19 | { |
tomozh | 0:d1c0dbf5e5a6 | 20 | _result.temperature = 0.0f; |
tomozh | 0:d1c0dbf5e5a6 | 21 | _result.humidity = 0.0f; |
HB9GAA | 1:f42b99c425e8 | 22 | } |
tomozh | 0:d1c0dbf5e5a6 | 23 | |
tomozh | 0:d1c0dbf5e5a6 | 24 | float AM2321::getLogicalValue(uint16_t regVal) const |
HB9GAA | 1:f42b99c425e8 | 25 | { |
tomozh | 0:d1c0dbf5e5a6 | 26 | if(regVal & 0x8000) |
HB9GAA | 1:f42b99c425e8 | 27 | { |
tomozh | 0:d1c0dbf5e5a6 | 28 | regVal &= ~0x8000; |
tomozh | 0:d1c0dbf5e5a6 | 29 | return (float)regVal / -10.0; |
HB9GAA | 1:f42b99c425e8 | 30 | } |
tomozh | 0:d1c0dbf5e5a6 | 31 | else |
HB9GAA | 1:f42b99c425e8 | 32 | { |
tomozh | 0:d1c0dbf5e5a6 | 33 | return (float)regVal / 10.0; |
HB9GAA | 1:f42b99c425e8 | 34 | } |
tomozh | 0:d1c0dbf5e5a6 | 35 | } |
tomozh | 0:d1c0dbf5e5a6 | 36 | |
tomozh | 0:d1c0dbf5e5a6 | 37 | uint16_t AM2321::calcCRC16(const uint8_t* src, int len) const |
HB9GAA | 1:f42b99c425e8 | 38 | { |
tomozh | 0:d1c0dbf5e5a6 | 39 | uint16_t crc = 0xFFFF; |
tomozh | 0:d1c0dbf5e5a6 | 40 | |
tomozh | 0:d1c0dbf5e5a6 | 41 | while(len--) |
HB9GAA | 1:f42b99c425e8 | 42 | { |
tomozh | 0:d1c0dbf5e5a6 | 43 | crc ^= *(src++); |
tomozh | 0:d1c0dbf5e5a6 | 44 | |
tomozh | 0:d1c0dbf5e5a6 | 45 | for(uint8_t i = 0; i < 8; i++) |
HB9GAA | 1:f42b99c425e8 | 46 | { |
tomozh | 0:d1c0dbf5e5a6 | 47 | if(crc & 0x01) |
HB9GAA | 1:f42b99c425e8 | 48 | { |
tomozh | 0:d1c0dbf5e5a6 | 49 | crc >>= 1; |
tomozh | 0:d1c0dbf5e5a6 | 50 | crc ^= 0xA001; |
HB9GAA | 1:f42b99c425e8 | 51 | } |
tomozh | 0:d1c0dbf5e5a6 | 52 | else |
HB9GAA | 1:f42b99c425e8 | 53 | { |
tomozh | 0:d1c0dbf5e5a6 | 54 | crc >>= 1; |
HB9GAA | 1:f42b99c425e8 | 55 | } |
tomozh | 0:d1c0dbf5e5a6 | 56 | } |
HB9GAA | 1:f42b99c425e8 | 57 | } |
HB9GAA | 1:f42b99c425e8 | 58 | return crc; |
tomozh | 0:d1c0dbf5e5a6 | 59 | } |
HB9GAA | 1:f42b99c425e8 | 60 | |
tomozh | 0:d1c0dbf5e5a6 | 61 | |
tomozh | 0:d1c0dbf5e5a6 | 62 | bool AM2321::poll(void) |
HB9GAA | 1:f42b99c425e8 | 63 | { |
tomozh | 0:d1c0dbf5e5a6 | 64 | bool success = false; |
tomozh | 0:d1c0dbf5e5a6 | 65 | uint8_t data[8]; |
tomozh | 0:d1c0dbf5e5a6 | 66 | |
tomozh | 0:d1c0dbf5e5a6 | 67 | const static uint8_t READ_REGISTER_CMD[] = { |
tomozh | 0:d1c0dbf5e5a6 | 68 | 0x03 // Read register command |
tomozh | 0:d1c0dbf5e5a6 | 69 | , 0x00 // start addrress |
tomozh | 0:d1c0dbf5e5a6 | 70 | , 0x04 // read length |
tomozh | 0:d1c0dbf5e5a6 | 71 | }; |
tomozh | 0:d1c0dbf5e5a6 | 72 | |
tomozh | 0:d1c0dbf5e5a6 | 73 | // wakeup |
tomozh | 0:d1c0dbf5e5a6 | 74 | _i2c.write(AM2321_I2C_ADDR, NULL, 0); |
tomozh | 0:d1c0dbf5e5a6 | 75 | |
tomozh | 0:d1c0dbf5e5a6 | 76 | // read data |
tomozh | 0:d1c0dbf5e5a6 | 77 | _i2c.write(AM2321_I2C_ADDR, (char*)READ_REGISTER_CMD, 3); |
tomozh | 0:d1c0dbf5e5a6 | 78 | wait_us(1600); |
tomozh | 0:d1c0dbf5e5a6 | 79 | |
tomozh | 0:d1c0dbf5e5a6 | 80 | if(_i2c.read(AM2321_I2C_ADDR, (char*)data, 8) == 0) |
HB9GAA | 1:f42b99c425e8 | 81 | { |
tomozh | 0:d1c0dbf5e5a6 | 82 | uint8_t cmd = data[0]; |
tomozh | 0:d1c0dbf5e5a6 | 83 | uint8_t dataLen = data[1]; |
tomozh | 0:d1c0dbf5e5a6 | 84 | uint16_t humiVal = (data[2] * 256) + data[3]; |
tomozh | 0:d1c0dbf5e5a6 | 85 | uint16_t tempVal = (data[4] * 256) + data[5]; |
tomozh | 0:d1c0dbf5e5a6 | 86 | uint16_t recvCRC = data[6] + (data[7] * 256); |
tomozh | 0:d1c0dbf5e5a6 | 87 | uint16_t chkCRC = calcCRC16(&data[0], 6); |
tomozh | 0:d1c0dbf5e5a6 | 88 | |
tomozh | 0:d1c0dbf5e5a6 | 89 | if(dataLen == 4) |
HB9GAA | 1:f42b99c425e8 | 90 | { |
tomozh | 0:d1c0dbf5e5a6 | 91 | if(recvCRC == chkCRC) |
HB9GAA | 1:f42b99c425e8 | 92 | { |
tomozh | 0:d1c0dbf5e5a6 | 93 | if(cmd == 0x03) |
HB9GAA | 1:f42b99c425e8 | 94 | { |
tomozh | 0:d1c0dbf5e5a6 | 95 | _result.temperature = getLogicalValue(tempVal); |
tomozh | 0:d1c0dbf5e5a6 | 96 | _result.humidity = getLogicalValue(humiVal); |
tomozh | 0:d1c0dbf5e5a6 | 97 | |
tomozh | 0:d1c0dbf5e5a6 | 98 | success = true; |
HB9GAA | 1:f42b99c425e8 | 99 | } |
tomozh | 0:d1c0dbf5e5a6 | 100 | } |
tomozh | 0:d1c0dbf5e5a6 | 101 | } |
HB9GAA | 1:f42b99c425e8 | 102 | } |
HB9GAA | 1:f42b99c425e8 | 103 | return success; |
tomozh | 0:d1c0dbf5e5a6 | 104 | } |
tomozh | 0:d1c0dbf5e5a6 | 105 | |
tomozh | 0:d1c0dbf5e5a6 | 106 | float AM2321::getTemperature(void) const |
HB9GAA | 1:f42b99c425e8 | 107 | { |
tomozh | 0:d1c0dbf5e5a6 | 108 | return _result.temperature; |
HB9GAA | 1:f42b99c425e8 | 109 | } |
tomozh | 0:d1c0dbf5e5a6 | 110 | |
tomozh | 0:d1c0dbf5e5a6 | 111 | float AM2321::getHumidity(void) const |
HB9GAA | 1:f42b99c425e8 | 112 | { |
tomozh | 0:d1c0dbf5e5a6 | 113 | return _result.humidity; |
HB9GAA | 1:f42b99c425e8 | 114 | } |
HB9GAA | 1:f42b99c425e8 | 115 | |
HB9GAA | 1:f42b99c425e8 | 116 | float AM2321::getDewpoint(void) const |
HB9GAA | 1:f42b99c425e8 | 117 | { |
HB9GAA | 1:f42b99c425e8 | 118 | float H, Dp; |
HB9GAA | 1:f42b99c425e8 | 119 | |
HB9GAA | 1:f42b99c425e8 | 120 | H = (log(_result.humidity) - 2) / 0.4343 + (17.62 * _result.temperature) / (243.12 + _result.temperature); |
HB9GAA | 1:f42b99c425e8 | 121 | Dp = 243.12 * H / (17.62 - H); //das ist der Taupunkt in Celsius |
HB9GAA | 1:f42b99c425e8 | 122 | return Dp/10; |
HB9GAA | 1:f42b99c425e8 | 123 | } |