fantemp/thermistor/main.cpp

76 lines
1.6 KiB
C++

#include "clock.hpp"
#include <stdio.h>
#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 <typename T>
T clamp(double value, T lower, T upper)
{
if (value < lower)
return lower;
if (value > upper)
return upper;
return static_cast<T>(value);
}
uint8_t temperatureCurve(double temperature)
{
double fanSpeed = (10 * temperature - 200) / 3;
return clamp<uint8_t>(fanSpeed, 0, 100);
}
int main()
{
uart::Uart0<uart::Config<115200>> serial;
serial.init();
serial << F("Thermistor reader\r\n");
using adc_conf = adc::Config<adc::SingleMode>;
adc::Adc<adc_conf, io::P, io::P::C0> 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;
}