Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
TemperatureSensor.cpp@10:b0fd262a0679, 2016-06-20 (annotated)
- Committer:
- mariosimaremare
- Date:
- Mon Jun 20 22:47:42 2016 +0000
- Revision:
- 10:b0fd262a0679
- Parent:
- 7:46e65aeb4df2
- Child:
- 13:142a142a7ac5
Update TemperatureSensor to improve accuracy.
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| mariosimaremare | 0:ad9362f18797 | 1 | /* |
| mariosimaremare | 0:ad9362f18797 | 2 | * G3: WATERPLAY |
| mariosimaremare | 0:ad9362f18797 | 3 | */ |
| mariosimaremare | 0:ad9362f18797 | 4 | |
| mariosimaremare | 0:ad9362f18797 | 5 | #include "TemperatureSensor.h" |
| mariosimaremare | 3:7c648d1d8802 | 6 | #include <algorithm> |
| mariosimaremare | 0:ad9362f18797 | 7 | #include "mbed.h" |
| mariosimaremare | 0:ad9362f18797 | 8 | |
| mariosimaremare | 0:ad9362f18797 | 9 | TemperatureSensor::TemperatureSensor( |
| mariosimaremare | 3:7c648d1d8802 | 10 | Printer &printer, |
| mariosimaremare | 5:4cbe44452889 | 11 | PinName pin |
| mariosimaremare | 0:ad9362f18797 | 12 | ): |
| mariosimaremare | 3:7c648d1d8802 | 13 | _printer(printer), |
| mariosimaremare | 0:ad9362f18797 | 14 | _analog_in(pin), |
| mariosimaremare | 2:ed17e258da0d | 15 | _reading(0.0), |
| mariosimaremare | 2:ed17e258da0d | 16 | _voltage(0.0), |
| mariosimaremare | 1:f448c12d2c5b | 17 | _temperature(0.0), |
| mariosimaremare | 2:ed17e258da0d | 18 | _status(0.0), |
| mariosimaremare | 5:4cbe44452889 | 19 | _strStatus("OK") |
| mariosimaremare | 0:ad9362f18797 | 20 | { |
| mariosimaremare | 2:ed17e258da0d | 21 | this->reload(); |
| mariosimaremare | 0:ad9362f18797 | 22 | } |
| mariosimaremare | 0:ad9362f18797 | 23 | |
| mariosimaremare | 2:ed17e258da0d | 24 | void TemperatureSensor::reload() |
| mariosimaremare | 0:ad9362f18797 | 25 | { |
| mariosimaremare | 5:4cbe44452889 | 26 | double readings[SAMPLING_NUMBER]; |
| mariosimaremare | 5:4cbe44452889 | 27 | for(int counter = 0; counter < SAMPLING_NUMBER; ++counter){ |
| mariosimaremare | 3:7c648d1d8802 | 28 | readings[counter] = _analog_in.read(); |
| mariosimaremare | 3:7c648d1d8802 | 29 | } |
| mariosimaremare | 3:7c648d1d8802 | 30 | |
| mariosimaremare | 5:4cbe44452889 | 31 | sort(readings, readings + SAMPLING_NUMBER); |
| mariosimaremare | 3:7c648d1d8802 | 32 | |
| mariosimaremare | 5:4cbe44452889 | 33 | this->_reading = readings[SAMPLING_NUMBER / 2]; |
| mariosimaremare | 5:4cbe44452889 | 34 | this->_voltage = this->_reading * VIN * CONVERTER; |
| mariosimaremare | 5:4cbe44452889 | 35 | double RT = (this->_voltage * RESISTANCE) / (VIN - this->_voltage); |
| mariosimaremare | 1:f448c12d2c5b | 36 | double logRT = log(RT); |
| mariosimaremare | 5:4cbe44452889 | 37 | double k0 = K0; |
| mariosimaremare | 5:4cbe44452889 | 38 | double k1 = K1 * logRT; |
| mariosimaremare | 5:4cbe44452889 | 39 | double k2 = K2 * pow(logRT, 3.0); |
| mariosimaremare | 5:4cbe44452889 | 40 | double kelvin = 1.0 / (k0 + k1 + k2); |
| mariosimaremare | 7:46e65aeb4df2 | 41 | this->_temperature = (kelvin + KELVIN_TO_CELCIUS); |
| mariosimaremare | 7:46e65aeb4df2 | 42 | |
| mariosimaremare | 7:46e65aeb4df2 | 43 | if(this->_temperature > KELVIN_TO_CELCIUS){ |
| mariosimaremare | 7:46e65aeb4df2 | 44 | this->_temperature += VARIANCE; |
| mariosimaremare | 10:b0fd262a0679 | 45 | this->_temperature += 0.21*this->_temperature - 6.09; |
| mariosimaremare | 7:46e65aeb4df2 | 46 | } |
| mariosimaremare | 1:f448c12d2c5b | 47 | |
| mariosimaremare | 2:ed17e258da0d | 48 | this->_status = 0.0; |
| mariosimaremare | 3:7c648d1d8802 | 49 | this->_strStatus = "OK"; |
| mariosimaremare | 5:4cbe44452889 | 50 | if(this->_temperature < LOWER_BOUNDARY){ |
| mariosimaremare | 5:4cbe44452889 | 51 | this->_status = this->_temperature - LOWER_BOUNDARY; |
| mariosimaremare | 3:7c648d1d8802 | 52 | this->_strStatus = "LW"; |
| mariosimaremare | 5:4cbe44452889 | 53 | } else if(this->_temperature > UPPER_BOUNDARY){ |
| mariosimaremare | 5:4cbe44452889 | 54 | this->_status = this->_temperature - UPPER_BOUNDARY; |
| mariosimaremare | 3:7c648d1d8802 | 55 | this->_strStatus = "HI"; |
| mariosimaremare | 2:ed17e258da0d | 56 | } |
| mariosimaremare | 2:ed17e258da0d | 57 | } |
| mariosimaremare | 2:ed17e258da0d | 58 | |
| mariosimaremare | 2:ed17e258da0d | 59 | double TemperatureSensor::getReading() |
| mariosimaremare | 2:ed17e258da0d | 60 | { |
| mariosimaremare | 1:f448c12d2c5b | 61 | return(this->_reading); |
| mariosimaremare | 0:ad9362f18797 | 62 | } |
| mariosimaremare | 0:ad9362f18797 | 63 | |
| mariosimaremare | 2:ed17e258da0d | 64 | |
| mariosimaremare | 0:ad9362f18797 | 65 | double TemperatureSensor::getVoltage() |
| mariosimaremare | 0:ad9362f18797 | 66 | { |
| mariosimaremare | 1:f448c12d2c5b | 67 | return(this->_voltage); |
| mariosimaremare | 0:ad9362f18797 | 68 | } |
| mariosimaremare | 0:ad9362f18797 | 69 | |
| mariosimaremare | 0:ad9362f18797 | 70 | double TemperatureSensor::getTemperature() |
| mariosimaremare | 0:ad9362f18797 | 71 | { |
| mariosimaremare | 1:f448c12d2c5b | 72 | return(this->_temperature); |
| mariosimaremare | 0:ad9362f18797 | 73 | } |
| mariosimaremare | 2:ed17e258da0d | 74 | |
| mariosimaremare | 2:ed17e258da0d | 75 | double TemperatureSensor::getStatus() |
| mariosimaremare | 2:ed17e258da0d | 76 | { |
| mariosimaremare | 2:ed17e258da0d | 77 | return(this->_status); |
| mariosimaremare | 3:7c648d1d8802 | 78 | } |
| mariosimaremare | 3:7c648d1d8802 | 79 | |
| mariosimaremare | 3:7c648d1d8802 | 80 | char* TemperatureSensor::getStrStatus() |
| mariosimaremare | 3:7c648d1d8802 | 81 | { |
| mariosimaremare | 3:7c648d1d8802 | 82 | return(this->_strStatus); |
| mariosimaremare | 2:ed17e258da0d | 83 | } |