-
Fork of HygroClip2 by
HygroClip2.cpp@2:b41e36e81711, 2016-05-02 (annotated)
- Committer:
- wolfsberger
- Date:
- Mon May 02 14:09:30 2016 +0000
- Revision:
- 2:b41e36e81711
- Parent:
- 1:810b9b0dd9a4
-
Who changed what in which revision?
User | Revision | Line number | New 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 | } |