# The Learning Circuit 15: Make Your Own Thermometer!

Version 12
 element14's The Ben Heck ShowJoin Karen as she shares her enthusiasm for teaching STEM subjects, gives you what you need to know to get started on electronics projects, and more.Back to The Ben Heck Show homepage The Learning Circuit Featured Bonus Content See All Episodes

 DaftMike builds a thermometer using an Arduino and a thermistor.  He’ll write some Arduino code, build a circuit, and then convert the values into a temperature reading.  He’ll use an NTC thermistor as a sensor. This is a special type of resistor whose resistance changes with temperature. In order to read it with an Arduino he’s going to build a circuit on a breadboard.  This will require some wire and a 100K resistor.

Parts & Products:

Product Name

UK Part No

US Part No

For this project, DaftMike will use an Arduino Micro because it plugs directly into the breadboard but you can use any Arduino you like. He uses wire to connect 5 volts to the top power rail and ground to the bottom power rail. There are usually multiple ground pins (marked ‘GND’).  You can connect to any of these.  He connects the thermistor to 5V and in the same column he connects the resistor to ground.  It doesn’t matter which way around these components go, they work either way.  Finally, you connect midpoint to analog pin p0.   You can now write some code:

```*********************************************
element14.com/thelearningcircuit
Episode 15: Make Your Own Thermometer
*********************************************/

// Parameters for the voltage divider equation
const int Vin = 1023;
const long R2 = 100000;                         // measure this resistor and update this value for better accuracy

// Parameters for the Steinhart?Hart equation
const float T0 = 298.15;
const int B = 3974;
const long R0 = 100000;

const int thermistorPin = A0;

const int numReadings = 10;                     // number of readings to average

void setup() {
Serial.begin(9600);                           // setup serial monitor
}

void loop() {

float Vout;
for (int i = 0; i < numReadings; i++) {
readings[i] = analogRead(thermistorPin);    // read from the thermistorPin into the array
Vout += readings[i];                        // sum the readings so far
delay(10);                                  // allow the ADC to settle between loops
}

Vout /= numReadings;        // divide the running total by the number of readings to get an average

// Voltage Divider equation to calculate R1
float R1;
R1 = (R2 * (Vin - Vout)) / Vout;

// ? parameter equation: https://en.wikipedia.org/wiki/Thermistor#B_or_%CE%B2_parameter_equation
float T;
T = (1.0 / ((1.0 / T0) + (log((R1 / R0)) / B))) - 273.15;     // T is in Celcius

// Celcius to Farenheit conversion
float Tf;
Tf = (T * 9.0) / 5.0 + 32;

// Print the temperature in Celcius and Farenheit to the serial monitor
Serial.print(T); Serial.print("C | ");   Serial.print(Tf); Serial.println("F");

delay(10);

}```

He names the thermistor pin and sets up an array to store a bunch of readings so that you can take an average to sort out the data.  He uses a line to set up the serial monitor.  In the main code he declares the output as a float and then uses a for loop to calculate the average.  A thermistor reading is stored in the array, added to a running total, and then delayed for a while to give the ADC a chance to settle before it runs through the loop again.  ADC stands for analog to digital convertor.  It converts voltage on the analog pin into a discrete signal.  Outside that loop, the code divides the running total by the number of readings to get an average.  You can then print it to the terminal.

DaftMike gives a diagram of the circuit. It’s a voltage divider where R1 is the thermistor and R2 is 100K. The equation for voltage dividers is Vout = Vin *R2/(R1+R2).  Vout is what we measured in the code, Vin is 5 volts, R2 is 100K, and R1 is what we are solving for.