From eee348d85167157588ba61f01733a7504274fbea Mon Sep 17 00:00:00 2001 From: BlackMark Date: Mon, 30 Mar 2020 17:01:48 +0200 Subject: [PATCH] Refactor thermistor code into static class --- thermistor/main.cpp | 42 +++++------------------------------ thermistor/thermistor.cpp | 19 ++++++++++++++++ thermistor/thermistor.cppproj | 6 +++++ thermistor/thermistor.hpp | 27 ++++++++++++++++++++++ 4 files changed, 58 insertions(+), 36 deletions(-) create mode 100644 thermistor/thermistor.cpp create mode 100644 thermistor/thermistor.hpp diff --git a/thermistor/main.cpp b/thermistor/main.cpp index d8ccdc6..0d9dcc4 100644 --- a/thermistor/main.cpp +++ b/thermistor/main.cpp @@ -1,7 +1,5 @@ #include "clock.hpp" -#include -#include #include #include "flash/flash.hpp" @@ -14,37 +12,7 @@ #define UART0_INT_VECTORS #include "uart/hardware0.hpp" -static constexpr auto SERIES_RESISTOR = 9951; -static constexpr auto THERMISTOR_NOMINAL = 9270; -static constexpr auto BETA_COEFFICIENT = 3212; -static constexpr auto NOMINAL_TEMPERATURE = 25; - -template -double sampleAdc(Adc &adcPin, uint16_t numSamples = 100) -{ - double samples = 0; - - for (uint16_t i = 0; i < numSamples; ++i) - samples += adcPin.read(); - - return samples / numSamples; -} - -double getResistance(double adcSample) -{ - return SERIES_RESISTOR * adcSample / (1023 - adcSample); -} - -double getTemperature(double resistance) -{ - double steinhart = resistance / THERMISTOR_NOMINAL; - steinhart = log(steinhart); - steinhart /= BETA_COEFFICIENT; - steinhart += 1.0 / (NOMINAL_TEMPERATURE + 273.15); - steinhart = 1.0 / steinhart; - steinhart -= 273.15; - return steinhart; -} +#include "thermistor.hpp" int main() { @@ -58,10 +26,12 @@ int main() adc::Adc adcPin; adcPin.init(); + Thermistor temp; + while (true) { - const auto adcSample = sampleAdc(adcPin, 1000); - const auto thermistorResistance = getResistance(adcSample); - const auto temperature = getTemperature(thermistorResistance); + const auto adcSample = temp.sampleAdc(adcPin, 1000); + const auto thermistorResistance = temp.getResistance(adcSample); + const auto temperature = temp.getTemperature(thermistorResistance); char floatBuffer[16]; diff --git a/thermistor/thermistor.cpp b/thermistor/thermistor.cpp new file mode 100644 index 0000000..43d130f --- /dev/null +++ b/thermistor/thermistor.cpp @@ -0,0 +1,19 @@ +#include "thermistor.hpp" + +#include + +double Thermistor::getResistance(double adcSample) +{ + return SERIES_RESISTOR * adcSample / (1023 - adcSample); +} + +double Thermistor::getTemperature(double resistance) +{ + double steinhart = resistance / THERMISTOR_NOMINAL; + steinhart = log(steinhart); + steinhart /= BETA_COEFFICIENT; + steinhart += 1.0 / (NOMINAL_TEMPERATURE + 273.15); + steinhart = 1.0 / steinhart; + steinhart -= 273.15; + return steinhart; +} diff --git a/thermistor/thermistor.cppproj b/thermistor/thermistor.cppproj index ef54085..ebaf5c9 100644 --- a/thermistor/thermistor.cppproj +++ b/thermistor/thermistor.cppproj @@ -212,6 +212,12 @@ compile + + compile + + + compile + compile diff --git a/thermistor/thermistor.hpp b/thermistor/thermistor.hpp new file mode 100644 index 0000000..bb748a4 --- /dev/null +++ b/thermistor/thermistor.hpp @@ -0,0 +1,27 @@ +#pragma once + +#include + +class Thermistor { + public: + template + static double sampleAdc(Adc &adcPin, uint16_t numSamples = 100) + { + double samples = 0; + + for (uint16_t i = 0; i < numSamples; ++i) + samples += adcPin.read(); + + return samples / numSamples; + } + + static double getResistance(double adcSample); + + static double getTemperature(double resistance); + + private: + static constexpr auto SERIES_RESISTOR = 9951; + static constexpr auto THERMISTOR_NOMINAL = 9270; + static constexpr auto BETA_COEFFICIENT = 3212; + static constexpr auto NOMINAL_TEMPERATURE = 25; +};