add Dewpoint

Fork of AM2321 by Y Tomohara

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?

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
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 }