Arduino Nano v3 internal temperature sensor

Calibration data:Download data & formulas in excel.
Atmega documentation says:The voltage sensitivity is approximately 1 mV/°C and the accuracy of the temperature measurement is +/- 10°C.
Measured temperature is a sum of ambient temperature and chip’s TDP. In fact it rises up for few minutes after the chip is powered and may change in base of load.

8 Responses to Arduino Nano v3 internal temperature sensor

Hey I am using this micro. i saw that i could use the internal temp sensor to save space in our board. I don’t really understand how to read the conversion…meaning the number we get. I looked at your excel sheet but how do you compare the numbers to the C degrees?…i did use your same formula which is the same supplied in the datasheet.

So at the moment what my micro does is to take a force sensor readoing from pin 28 an ADC reading and I send it through BT to my PC. I want to read the temp to send that through BT also. So far I can send both. I see it on my screen. Problem is that when the pressure is too high the readings from the temp will not show and sort of skip over it then go to the force readings. Hope that makes sense.

Hi Lopez! I do not understand your question. That kind of pressure you have?
Please note that this is very approximate temperature sensor!
This sensor was made to detect the cpu overtemperature!
Would make sense to use a more accurate sensor like LM35 or DS18

Thank You Too.
Or the manufacturer wanted to get wide on the specifications because the temperature depends on the load of the MCU. The factors such as the working frequency and the amount of current, vary the temperature of the MCU. The measuring the environment temperature with internal sensor under different loads produces a considerable measurement error. It is practically almost unusable for measuring the ambient temperature. At most it can detect overheating or excessive cooling.
Did you try the freezer?

I was also confronted that the code won’t work below zero ‘C.
To solve this, I am reading the ADCL register and use this value instead of the ADCW.
You should change the offset and the formula. The offset I used is now 89.
When I ignored to read the ADCH, it didn’t work either, so I left this in.

double GetTemp(void)
{
long 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.

// Detect end-of-conversion
while (bit_is_set(ADCSRA,ADSC));
t0 = ADCL;
t1 = ADCH; //apparently you need to read ADCH too to get results in t0
// Reading register “ADCW” takes care of how to read ADCL and ADCH.
// The offset of 324.31 could be wrong. It is just an indication.
// t = (ADCW – tempOffset ) / 1.22; this didn’t work below zero! Now reading ADCL only with the following formula. The tempoffset in my case is 89.
t = (t0 – tempOffset) * 0.82;