-

Fork of HygroClip2 by Jan Wolfsberger

Committer:
wolfsberger
Date:
Mon May 02 14:09:30 2016 +0000
Revision:
2:b41e36e81711
Parent:
1:810b9b0dd9a4
-

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 2:b41e36e81711 15 uint8_t data = LPC_UART3->RBR;
wolfsberger 2:b41e36e81711 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 0:0f5101a649db 50 uart_.printf("{F00RDD}\r");
wolfsberger 0:0f5101a649db 51 }
wolfsberger 0:0f5101a649db 52
wolfsberger 0:0f5101a649db 53 float HygroClip2::getHumidity()
wolfsberger 0:0f5101a649db 54 {
wolfsberger 0:0f5101a649db 55 return humidity_;
wolfsberger 0:0f5101a649db 56 }
wolfsberger 0:0f5101a649db 57 float HygroClip2::getTemperature()
wolfsberger 0:0f5101a649db 58 {
wolfsberger 0:0f5101a649db 59 return temperature_;
wolfsberger 0:0f5101a649db 60 }
wolfsberger 0:0f5101a649db 61 float HygroClip2::getDewPoint()
wolfsberger 0:0f5101a649db 62 {
wolfsberger 0:0f5101a649db 63 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 64 }
wolfsberger 0:0f5101a649db 65 float HygroClip2::getAbsolutHumidity()
wolfsberger 0:0f5101a649db 66 {
wolfsberger 0:0f5101a649db 67 float saturationPressure = 611.2f * exp((17.62f * getTemperature()) / (243.12f + getTemperature()));
wolfsberger 0:0f5101a649db 68 float partialPressure = (getHumidity() * saturationPressure) / 100.0f;
wolfsberger 0:0f5101a649db 69 float absoluteHumidity = partialPressure / (461.51f * (getTemperature() + 273.15f));
wolfsberger 0:0f5101a649db 70 return absoluteHumidity*1000;
wolfsberger 0:0f5101a649db 71 }
wolfsberger 1:810b9b0dd9a4 72 bool HygroClip2::isDataValid()
wolfsberger 1:810b9b0dd9a4 73 {
wolfsberger 2:b41e36e81711 74 if (humidity_ == NAN || humidity_ == 0.0f)
wolfsberger 2:b41e36e81711 75 return false;
wolfsberger 2:b41e36e81711 76 if (temperature_ == NAN || temperature_ == 0.0f)
wolfsberger 2:b41e36e81711 77 return false;
wolfsberger 1:810b9b0dd9a4 78 return isDataValid_;
wolfsberger 1:810b9b0dd9a4 79 }