zurück

Temperatursensor des Arduino

07.09.2018
AVR ATmega168P Chip
Abb.: AVR ATmega168P Chip

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

Verwendung

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 Umgebungstemperature der Luft messen, außer wenn man den Arduino gerade einschaltet (er muss dafür aber mindestens 10 min. ausgeschaltet gewesen sein)

Verwendete Bauteile

Sketch

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);
}