Echando un vistazo al manual de los manual de los ATtiny25/45/85 (página 122) descubrí el conectado al ADC hay un sensor de temperatura.
Está conectado a ADC4, y puede conectarse a él cambiado los 4 primeros bits de MUX3 a “1”, y la medida se debe hacer tomando de referencia los 1.1v del voltaje interno de referencia.
No es nada preciso, puede desplazarse hasta ±10 grados. Es muy sensible al ruido eléctrico, por lo que no se pueden realizar medidas cuando se opere alguno de los GPIO, así que es mejor hacerse con un DS18B20.
Éste es un ejemplo de código para hacer una lectura:
int chipTempRaw(void) {
ADCSRA |= _BV(ADSC); // Start conversion
while((ADCSRA & _BV(ADSC))); // Wait until conversion is finished
return(ADCL | (ADCH << 8));
}
float chipTemp() {
float tmp,avg;
ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(MUX3); // Set internal 1.1V reference, temperature reading
delay(10); // wait for analog reference to stabilize
for (int 0; i < 10; i++){ // Discard the first 10 samples
chipTempRaw();
}
avg = chipTempRaw(); // use next sample as initial average
// average 500 samples
for (int i=1; i<500; i++) {
tmp = chipTempRaw(); // get next sample
avg = avg + (tmp - avg)/float(i); // calculate running average
}
return avg; // return averaged temperature reading
}
chipTempRaw lee los bits del ADC. chipTemp conecta ADC4, selecciona los 1.1v, rechaza las 10 primeras medidas y calcula la media móvil de la temperatura de 500 muestras.