The playground is a publicly-editable wiki about Arduino.

Manuals and Curriculum

Arduino StackExchange

Board Setup and Configuration

Development Tools

Arduino on other Chips

Interfacing With Hardware

- Output
- Input
- User Interface
- Storage
- Communication
- Power supplies
- General

Interfacing with Software

User Code Library

- Snippets and Sketches
- Libraries
- Tutorials

Suggestions & Bugs

Electronics Technique

Sources for Electronic Parts

Related Hardware and Initiatives

Arduino People/Groups & Sites

Exhibition

Project Ideas

Languages

Participate

- Formatting guidelines
- All recent changes
- PmWiki
- WikiSandBox training
- Basic Editing
- Documentation index

The LM35 is a common TO-92 temperature sensor. It is often used with the equation

temp = (5.0 * analogRead(tempPin) * 100.0) / 1024;
[Get Code]

However, this does not yield high resolution. This can easily be avoided, however. The LM35 only produces voltages from 0 to +1V. The ADC uses 5V as the highest possible value. This is wasting 80% of the possible range. If you change aRef to 1.1V, you will get almost the highest resolution possible.

The original equation came from taking the reading, finding what percentage of the range (1024) it is, multiplying that by the range itself(aRef, or 5000 mV), and dividing by ten (10 mV per degree Celcius, according to the datasheet: http://www.ti.com/lit/ds/symlink/lm35.pdf

However, if you use 1.1V as aRef, the equation changes entirely. If you divide 1.1V over 1024, each step up in the analog reading is equal to approximately 0.001074V = 1.0742 mV. If 10mV is equal to 1 degree Celcius, 10 / 1.0742 = ~9.31. So, for every change of 9.31 in the analog reading, there is one degree of temperature change.

To change aRef to 1.1V, you use the command "analogReference(INTERNAL);"

Here's an example sketch using 1.1 as aRef:

float tempC;
int reading;
int tempPin = 0;
void setup()
{
analogReference(INTERNAL);
Serial.begin(9600);
}
void loop()
{
reading = analogRead(tempPin);
tempC = reading / 9.31;
Serial.println(tempC);
delay(1000);
}
[Get Code]

With this sketch, approximately a tenth of a degree resolution is possible. Of course, such small numbers are going to be somewhat inaccurate because aRef will not be exactly 1.1V. Also, the LM35 is only guaranteed to be within 0.5 degrees of the actual temperature. However, it does yield higher resolution, if only for appearances' sake.

A side note: with aRef at 1.1V, the temperature range of the LM35 is limited to 0 to 110 degrees Celcius.