Join 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. | 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. |
Make Your Own!
Parts & Products:
Product Name | UK Part No | US Part No | Part Link |
---|---|---|---|
Arduino Micro | 2285194 | 63W3544 | Buy NowBuy Now |
Thermistor | 2112935 | 10M5320 | Buy NowBuy Now |
For this project, DaftMike will use an Arduino MicroArduino 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 thermistorthermistor 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 int readings[numReadings]; // array to store thermistor readings 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.