Algunas cosas sobre los ATtiny: ¡Los ATtiny25/45/85 tienen un sensor de temperatura interno (y es una mierda)!

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.