enter image description hereI've setup four thermistors and a known resistor in series and connected them to the 3.3V output (as I've heard it's cleaner than the 5V) of an Arduino Uno (with the 3.3V also connected to ARef to increase accuracy), with the four analog inputs testing the voltage drop across each thermistor to determine its resistance, and hence temperature.

But even with no change in the thermistor temperatures, the voltages I get from the arduino vary significantly. See below an example readout of the four arduino inputs (with thermistor temperatures/resistances same throughout):

230 424 634 849

212 412 597 819

241 415 611 857

204 413 654 845

The accuracy I come out with is around 5-10 degrees - way more than I expected. Why is this? And what can I do to get it down to less than one degree? Many thanks

UPDATE: A MASSIVE THANKYOU to all those who helped me on this, particularly @NickGammon, @Talk2 and most of all @JRobert for the brilliantly clear and simple to follow circuit instructions to follow, all of which helped to thoroughly solve my problem! The sensor works great now, many thanks!!

  • 1
    Have you check your thermistor specs for their rated accuracy ? Also your 3.3v Vref how stable is it ? Maybe attach a schematic and thermistor p/n may help providing a better answer. Dec 19 '16 at 1:25
  • 1
    Perhaps if you post your code? And the thermistor model? Are those analog input readings? If so, a reading of around 200 is only 20% of the range of the ADC (which can go up to 1023) so any errors are going to be amplified by 5.
    – Nick Gammon
    Dec 19 '16 at 6:26
  • 1
    Please do show a schematic - or at the very least a photograph of your setup.
    – Majenko
    Dec 19 '16 at 15:16
  • 1
    Wouldn't it be better to connect the themistors individually, instead of all in series? Inaccuracies in one sensor, will influence the others. Also, since you can only read one analog pin at a time, the value of the previously read themistor could have changed, when reading the next. I think you are also losing some range, as you have to share the range between 4 readings.
    – Gerben
    Dec 19 '16 at 19:43
  • 2
    What I would like you to do is remove the "thermistors in series" effect. Take a single thermistor, and your 100k resistor, and take some readings. ie. +5V --- 100k --(A0)-- thermistor --- Gnd - see if a) It gives the desired temperature; and b) Do they vary by such a large amount?
    – Nick Gammon
    Dec 20 '16 at 4:30

Why are you using the voltage divider and measuring by parts? As @nickgammon points out, you are measuring only a 1/5 of full scale at each measurement, meaning your resolution is down by 5:1 over what the A/D is capable of. Also, the divider network comes to around 500KOhms. Work out the current through that and you get a very feeble <7 microAmps. The wires are antennas that could well be contributing noise at a significant fraction of that level.

Is there a reason for the divider circuit? Could you use a single thermistor from Vcc to Gnd plus a resistor in a 2-way divider? That will have the advantages of:

  • Using (more of) the full range of A/D;
  • Taking only one reading instead of several (and the several are necessarily skewed in time since you're multiplexing the one A/D);
  • A larger current (ok, only 33 microAmps, but 5x better than before);
  • Presumably less pickup into the network than with 5 leads. Keeping the measurement lead as short as possible may help, too.


Then you probably want a 2-component divider for each temperature you need to measure, paralleled between the power rails. I just guessed, not calculated, the resistances of R1, R3, R5, & R7. You'll want to estimate the maximum and minimum temperatures of interest in each channel and pick values that will give you the best ranges without drawing excessive currents when the thermistor values are low.


simulate this circuit – Schematic created using CircuitLab

  • No I need four temperature sensors for purpose. Could using smaller resistance thermistors help? Dec 19 '16 at 22:27
  • 1
    I still think that by connecting the thermistors in series you are summing the errors. So if the first one has a 1% error (or some jitter) then that will vary the voltage being received by the second one, and so on. I'm testing with a thermistor and a 100k resistor (not your thermistor exactly) and I am seeing a couple of mV jitter (probably noise being picked up).
    – Nick Gammon
    Dec 20 '16 at 0:32

Without exactly knowing part names, models and source code is difficult to tell what to expect. But a few techniques can be used to improve the stability of an analog reading. Here a few things you might want to consider:

  1. Use INTERNAL vref of 1.1V, this is a very stable voltage reference
  2. Use a stable/good quality series resistor, with little tolerance, like 1%
  3. Add a 22pF capacitor, connecting the analog input to ground. This helps stabilizing the signal
  4. Perform multiple consecutive readings, let's say 5 readings, and use the average. You might also want to remove the biggest and lowest values before averaging.
  • Hi Talk2, thanks very much for the suggestions. The parts are Arduino Uno SMD A000073 Board Rev3, ATC Semitec 104GT-2 Gt Thermistor 100k 3%, and Vishay CNS020 Series Radial Thin Film Resistor 100kΩ ±0.02% 0.5W ±10ppm/°C. Dec 19 '16 at 13:09
  • The values above are literally printouts of analog inputs (using Aref again), so the source code doesn't explain the variance in values there. Dec 19 '16 at 13:10
  • I do use an average in the main code, but it doesn't really help as the intial inputs are so variable. Dec 19 '16 at 13:11
  • What exactly do you mean by adding a 22pf capacitor between input and gnd? Do you mean wire the thermistors to the analog inputs and then from there to GND across the capacitor? Dec 19 '16 at 13:13
  • 1
    From 10bits to 12bits you only going to get more resolution. The Arduino analog ports are quite good for what you need. Why are you chain all the sensors? Have you tried with a single one? The capacitor needs to be between the Analog port and ground, so it works like a "buffer" to stabilize the voltage output from the voltage divider made of the Thermstor and the Resistor.
    – Talk2
    Dec 20 '16 at 0:09

I may be mistaking, but what you did is a voltage divisor where you read the voltage across resistors in series (your thermistors).

When resistors are in series as you know you add their value. So A4 is reading the value across TR1+TR2+TR3+TR4. A3 is reading the value across TR1+TR2+TR3 and so forth.

  • Yes Andre I had worked that out - my code takes this into account. By taking the differential between voltage readings all the resistance values can be worked out. But I don't think any of this is relevant unfortuately as the analog readings themselves, before even being processed by the code at all, are so instable as you can see. Dec 19 '16 at 18:47
  • You did look at this reference right : arduino.cc/en/Reference/AnalogReference Dec 19 '16 at 18:50

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.