#include "clock.hpp" #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" #include "pwm.hpp" #include "thermistor.hpp" template T clamp(double value, T lower, T upper) { if (value < lower) return lower; if (value > upper) return upper; return static_cast(value); } uint8_t temperatureCurve(double temperature) { double fanSpeed = (10 * temperature - 200) / 3; return clamp(fanSpeed, 0, 100); } int main() { uart::Uart0> serial; serial.init(); serial << F("Thermistor reader\r\n"); using adc_conf = adc::Config; adc::Adc adcPin; adcPin.init(); Thermistor temp; pwm::init(); pwm::setDuty(100); while (true) { const auto adcSample = temp.sampleAdc(adcPin, 1000); const auto thermistorResistance = temp.getResistance(adcSample); const auto temperature = temp.getTemperature(thermistorResistance); const auto fanSpeed = temperatureCurve(temperature); 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"); serial << F("Fan speed: ") << fanSpeed << F("%\r\n"); pwm::setDuty(fanSpeed); _delay_ms(1000); } serial.flushTx(); return 0; }