Sometime when we make a project, we have to use sensor that has small voltage output. Small voltage make the arduino less accurate to read the signal. We know that arduino UNO has 10 bits adc resolution. This means arduino can read 0-5V with 1023 steps. So, 5000mv/1024 = 4,88mV. So arduino can only measure signal change in ADC if the voltage increase or decrease about 5mv. How if the sensor has output smaller than 5V?. There are some solution for this, first we can use amplifer for sensor, so sensor output will multiplied and become bigger. And we have the second solution, and this is simpler. We don’t need to amplify the sensor, but instead of it we will derease the voltage reference. 5V is voltage reference.

Decrease the ADC voltage reference
Arduino UNO or atmega328 has internal reference with voltage value 1.1V. We can use this by set the ADC voltage reference to internal. We can set analog reference in setup.
void setup() { analogReference(INTERNAL); }
How about other arduino? Like arduino mega? Taken from arduino.cc website this is the internal reference provided by some arduino :
• DEFAULT: the default analog reference of 5 volts (on 5V Arduino boards) or 3.3 volts (on 3.3V Arduino boards)
• INTERNAL: an built-in reference, equal to 1.1 volts on the ATmega168 or ATmega328 and 2.56 volts on the ATmega8(not available on the Arduino Mega)
• INTERNAL1V1: a built-in 1.1V reference (Arduino Mega only)
• INTERNAL2V56: a built-in 2.56V reference (Arduino Mega only)
• EXTERNAL: the voltage applied to the AREF pin (0 to 5V only) is used as the reference.
ADC External Reference
And the next question maybe, can we use another analogReference that not provided by arduino? Yes, we can do that!. As long as the voltage value is in range 0-5V. Greater than 5V is obvously prohibited, because arduino operating voltage is 5V. So how we can do that?
void setup() { analogReference(EXTERNAL); }
Use above code, and put the voltage in AREF pin. Don’t forget to use common ground for your analog Reference. If not, that will not work.

Example
We use LM35 sensor to read temperature. From datasheet we knew that this sensor will give output 10mV for every °C. For normal analog reference, we can only get half °C reading accuracy (remember what I explain in first paragraph).
For normal analog reference the code will be :
Temperature = (adc*5000/1023)/10;
And if we change the analog reference to 1.1V then the code should change to :
Temperature = (adc*1100/1023)/10;
This will give us more accurate result of temperature read by LM35. The arduino now can read every 0.93mV change in adc input. And we can get about 0.1°C of resolution.
Thank you for sharing.
Can I do 2.1 volt reading while aref 1.1 on Uno. Will this damage the chip?