-

Dependents:   Sensor

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers HygroClip2.cpp Source File

HygroClip2.cpp

00001 #include "HygroClip2.h"
00002 #include <cmath>
00003 
00004 HygroClip2::HygroClip2(PinName tx, PinName rx)
00005     : uart_(tx, rx), temperature_(0.0f), humidity_(0.0f), dataReadyToPars_(false)
00006 {
00007     buffer_[HYGROCLIP_BUFFER_SIZE] = 0;
00008     uart_.baud(19200);
00009     uart_.attach(this, &HygroClip2::uartCallback);
00010 }
00011 
00012 void HygroClip2::uartCallback()
00013 {
00014     static size_t index = 0;
00015     uint8_t data = uart_.getc();
00016 
00017     if (dataReadyToPars_) {
00018         return;
00019     }
00020 
00021     if (data == '{') {
00022         index = 0;
00023     } else if (data == '\r') {
00024         dataReadyToPars_ = true;
00025     } else {
00026         buffer_[index] = data;
00027         index++;
00028     }
00029 
00030     if (index >= HYGROCLIP_BUFFER_SIZE) {
00031         index = 0;
00032     }
00033 }
00034 
00035 void HygroClip2::update()
00036 {
00037     if (dataReadyToPars_)
00038     {
00039         dataReadyToPars_ = false;
00040         humidity_ = atof(reinterpret_cast<char *>(&buffer_[11]));
00041         temperature_ = atof(reinterpret_cast<char *>(&buffer_[29]));
00042         isDataValid_ = true;
00043     }
00044     else
00045     {
00046         humidity_ = NAN;
00047         temperature_ = NAN;
00048         isDataValid_ = false;
00049     }
00050 
00051     uart_.printf("{F00RDD}\r");
00052 }
00053 
00054 float HygroClip2::getHumidity()
00055 {
00056     return humidity_;
00057 }
00058 float HygroClip2::getTemperature()
00059 {
00060     return temperature_;
00061 }
00062 float HygroClip2::getDewPoint()
00063 {
00064     return 243.04f*(log(getHumidity()/100)+((17.625*getTemperature())/(243.04+getTemperature())))/(17.625-log(getHumidity()/100)-((17.625*getTemperature())/(243.04+getTemperature())));
00065 }
00066 float HygroClip2::getAbsolutHumidity()
00067 {
00068     float saturationPressure = 611.2f * exp((17.62f * getTemperature()) / (243.12f + getTemperature()));
00069     float partialPressure = (getHumidity() * saturationPressure) / 100.0f;
00070     float absoluteHumidity = partialPressure / (461.51f * (getTemperature() + 273.15f));
00071     return absoluteHumidity*1000;
00072 }
00073 bool HygroClip2::isDataValid()
00074 {
00075     return isDataValid_;
00076 }