Die meisten neueren AVR-Chips (welche auch auf dem Arduino verbaut sind) haben einen internen Temperatursensor. Dieser wird eher selten verwendet, weil er nicht besonders genau ist. Allerdings kann er in bestimmten Situationen nützliche Werte liefern.
Chip | Temp.-Sensor vorhanden |
---|---|
ATmega8 | nein |
ATmega8L | nein |
ATmega8A | nein |
ATmega168 | nein |
ATmega168A | ja |
ATmega168P | ja |
ATmega328 | ja |
ATmega328P | ja |
ATmega1280 (Arduino Mega) | nein |
ATmega2560 (Arduino Mega 2560) | nein |
ATmega32U4 (Arduino Leonardo) | ja |
Der interne Temperatursensor ist direkt im Chip verbaut ähnlich wie bei einem PC. Während der Arduino arbeitet/rechnet oder wenn Strom durch die PINs fließt, steigt die Temperatur des Chips an. Daher lässt sich mit dem internen Sensor nicht die Umgebungstemperatur der Luft messen, außer wenn man den Arduino gerade einschaltet (er muss dafür aber mindestens 10 min. ausgeschaltet gewesen sein)
void setup()
{
Serial.begin(9600);
Serial.println(F("Internal temperature sensor"));
}
void loop()
{
Serial.println(getTemp(), 2);
delay(2000);
}
double getTemp(void)
{
unsigned int wADC;
double t;
// The internal temperature has to be used with the internal reference of 1.1V.
// Channel 8 can not be selected with the analogRead function yet.
// Set the internal reference and mux.
ADMUX = (_BV(REFS1) | _BV(REFS0) | _BV(MUX3));
ADCSRA |= _BV(ADEN); // enable the ADC
// wait for voltages to become stable.
delay(20);
// Start the ADC
ADCSRA |= _BV(ADSC);
// Detect end-of-conversion
while (bit_is_set(ADCSRA,ADSC));
// Reading register "ADCW" takes care of how to read ADCL and ADCH.
wADC = ADCW;
// The offset of 324.31 could be wrong. It is just an indication.
t = (wADC - 324.31 ) / 1.22;
// The returned temperature is in degrees Celsius.
return (t);
}
zurück