-

Dependents:   Sensor

Committer:
wolfsberger
Date:
Tue Mar 15 07:45:31 2016 +0000
Revision:
1:810b9b0dd9a4
Parent:
0:0f5101a649db
If no communication was possible the functions now return NaN

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wolfsberger 0:0f5101a649db 1 #include "HygroClip2.h"
wolfsberger 1:810b9b0dd9a4 2 #include <cmath>
wolfsberger 0:0f5101a649db 3
wolfsberger 0:0f5101a649db 4 HygroClip2::HygroClip2(PinName tx, PinName rx)
wolfsberger 0:0f5101a649db 5 : uart_(tx, rx), temperature_(0.0f), humidity_(0.0f), dataReadyToPars_(false)
wolfsberger 0:0f5101a649db 6 {
wolfsberger 0:0f5101a649db 7 buffer_[HYGROCLIP_BUFFER_SIZE] = 0;
wolfsberger 0:0f5101a649db 8 uart_.baud(19200);
wolfsberger 0:0f5101a649db 9 uart_.attach(this, &HygroClip2::uartCallback);
wolfsberger 0:0f5101a649db 10 }
wolfsberger 0:0f5101a649db 11
wolfsberger 0:0f5101a649db 12 void HygroClip2::uartCallback()
wolfsberger 0:0f5101a649db 13 {
wolfsberger 0:0f5101a649db 14 static size_t index = 0;
wolfsberger 0:0f5101a649db 15 uint8_t data = uart_.getc();
wolfsberger 1:810b9b0dd9a4 16
wolfsberger 0:0f5101a649db 17 if (dataReadyToPars_) {
wolfsberger 0:0f5101a649db 18 return;
wolfsberger 0:0f5101a649db 19 }
wolfsberger 0:0f5101a649db 20
wolfsberger 0:0f5101a649db 21 if (data == '{') {
wolfsberger 0:0f5101a649db 22 index = 0;
wolfsberger 0:0f5101a649db 23 } else if (data == '\r') {
wolfsberger 0:0f5101a649db 24 dataReadyToPars_ = true;
wolfsberger 0:0f5101a649db 25 } else {
wolfsberger 0:0f5101a649db 26 buffer_[index] = data;
wolfsberger 0:0f5101a649db 27 index++;
wolfsberger 0:0f5101a649db 28 }
wolfsberger 0:0f5101a649db 29
wolfsberger 0:0f5101a649db 30 if (index >= HYGROCLIP_BUFFER_SIZE) {
wolfsberger 0:0f5101a649db 31 index = 0;
wolfsberger 0:0f5101a649db 32 }
wolfsberger 0:0f5101a649db 33 }
wolfsberger 0:0f5101a649db 34
wolfsberger 0:0f5101a649db 35 void HygroClip2::update()
wolfsberger 0:0f5101a649db 36 {
wolfsberger 0:0f5101a649db 37 if (dataReadyToPars_)
wolfsberger 0:0f5101a649db 38 {
wolfsberger 0:0f5101a649db 39 dataReadyToPars_ = false;
wolfsberger 0:0f5101a649db 40 humidity_ = atof(reinterpret_cast<char *>(&buffer_[11]));
wolfsberger 0:0f5101a649db 41 temperature_ = atof(reinterpret_cast<char *>(&buffer_[29]));
wolfsberger 1:810b9b0dd9a4 42 isDataValid_ = true;
wolfsberger 0:0f5101a649db 43 }
wolfsberger 0:0f5101a649db 44 else
wolfsberger 0:0f5101a649db 45 {
wolfsberger 1:810b9b0dd9a4 46 humidity_ = NAN;
wolfsberger 1:810b9b0dd9a4 47 temperature_ = NAN;
wolfsberger 1:810b9b0dd9a4 48 isDataValid_ = false;
wolfsberger 0:0f5101a649db 49 }
wolfsberger 1:810b9b0dd9a4 50
wolfsberger 0:0f5101a649db 51 uart_.printf("{F00RDD}\r");
wolfsberger 0:0f5101a649db 52 }
wolfsberger 0:0f5101a649db 53
wolfsberger 0:0f5101a649db 54 float HygroClip2::getHumidity()
wolfsberger 0:0f5101a649db 55 {
wolfsberger 0:0f5101a649db 56 return humidity_;
wolfsberger 0:0f5101a649db 57 }
wolfsberger 0:0f5101a649db 58 float HygroClip2::getTemperature()
wolfsberger 0:0f5101a649db 59 {
wolfsberger 0:0f5101a649db 60 return temperature_;
wolfsberger 0:0f5101a649db 61 }
wolfsberger 0:0f5101a649db 62 float HygroClip2::getDewPoint()
wolfsberger 0:0f5101a649db 63 {
wolfsberger 0:0f5101a649db 64 return 243.04f*(log(getHumidity()/100)+((17.625*getTemperature())/(243.04+getTemperature())))/(17.625-log(getHumidity()/100)-((17.625*getTemperature())/(243.04+getTemperature())));
wolfsberger 0:0f5101a649db 65 }
wolfsberger 0:0f5101a649db 66 float HygroClip2::getAbsolutHumidity()
wolfsberger 0:0f5101a649db 67 {
wolfsberger 0:0f5101a649db 68 float saturationPressure = 611.2f * exp((17.62f * getTemperature()) / (243.12f + getTemperature()));
wolfsberger 0:0f5101a649db 69 float partialPressure = (getHumidity() * saturationPressure) / 100.0f;
wolfsberger 0:0f5101a649db 70 float absoluteHumidity = partialPressure / (461.51f * (getTemperature() + 273.15f));
wolfsberger 0:0f5101a649db 71 return absoluteHumidity*1000;
wolfsberger 0:0f5101a649db 72 }
wolfsberger 1:810b9b0dd9a4 73 bool HygroClip2::isDataValid()
wolfsberger 1:810b9b0dd9a4 74 {
wolfsberger 1:810b9b0dd9a4 75 return isDataValid_;
wolfsberger 1:810b9b0dd9a4 76 }