#include "clock.hpp" #include #include #include #include "flash/flash.hpp" #include "io/io.hpp" #include "uart/uart.hpp" #define ADC_INT_VECTOR #include "adc/adc.hpp" #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; } int main() { uart::Uart0<> serial; serial.init(); serial << F("Thermistor reader\r\n"); using adc_conf = adc::Config; adc::Adc adcPin; adcPin.init(); while (true) { const auto adcSample = sampleAdc(adcPin, 1000); const auto thermistorResistance = getResistance(adcSample); const auto temperature = getTemperature(thermistorResistance); char floatBuffer[16]; sprintf(floatBuffer, "%.2f", adcSample); serial << F("Read ADC: ") << floatBuffer << F("\r\n"); sprintf(floatBuffer, "%.2f", thermistorResistance); serial << F("Resistance: ") << floatBuffer << F("\r\n"); sprintf(floatBuffer, "%.2f", temperature); serial << F("Temperature: ") << floatBuffer << F(" C \r\n"); _delay_ms(1000); } serial.flushTx(); return 0; }