В некоторых микроконтроллерах серии ATmega является встроенный датчик температуры, показания которого можно прочитать, используя внутренний АЦП.
К сожалению показания внутреннего датчика температуры не могут быть использована для измерения температуры окружающей среды в связи с прогревом микроконтроллера во время работы, но показания внутреннего датчика температуры могут быть использованы как элемент защиты микроконтроллера от перегрева. Так же при измерении температуры с внутреннего датчика следует учесть что показания могут быть занижены на 10 градусов Цельсия (потребуется смещение), а точность измерения будет в пределах 2 градусов Цельсия.
Для точных температур каждый отдельный чип должен быть откалиброван.
Ниже показан скетч позволяющий считать показания внутреннего датчика температуры и вывести эти показания в монитор порта:
void setup(){ Serial.begin(9600); ADMUX |= (1 << REFS1)|(1 << REFS0); // внутренний источник опорного напряжения на 1.1 вольт ADMUX |= (1 << MUX3); // датчик температуры ADCSRA |= (1 << ADEN); // включение АЦП ADCSRA |= (1 << ADPS2); // CLK/16 } void loop(){ ADCSRA |= (1 << ADSC); // начало преобразования while (bit_is_set(ADCSRA, ADSC)); // ожидание завершения преобразования double t = (ADCW - 314) / 1.22; // расчет температуры ADCW = (ADCH << 8) | ADCL Serial.println(t,1); _delay_ms(1000); }