Sciencemadness Discussion Board » Engineering and Equipment » Electronics » NTC Thermistor and Arduino brief tutorial Select A Forum Fundamentals   » Chemistry in General   » Organic Chemistry   » Beginnings   » Responsible Practices   » Miscellaneous Engineering and Equipment   » Reagents and Apparatus Acquisition   » Electronics   » Process Engineering   » Materials and Metallurgy Special Topics   » Analytical Chemistry   » Electrochemistry   » Energetic Materials   » Biochemistry   » Radiochemistry   » Computational Models and Techniques Literature and Documentation   » Sciencemadness Wiki   » Prepublication Non-science   » Forum Matters   » Legal and Societal Issues

Author: Subject: NTC Thermistor and Arduino brief tutorial
smaerd
International Hazard

Posts: 1262
Registered: 23-1-2010
Member Is Offline

Mood: hmm...

NTC Thermistor and Arduino brief tutorial

Sorry I haven't been around I've been super busy. So this is a very small project but I figured it might help someone out. I won't dive into the theory or anything as it's not that hard. This is an entry level tutorial, if you want more then learn it and share it.

I purchased a NTC thermistor for about 1-2$USD not long ago. It didn't come with documentation but the specifications were listed as -  Quote: Stainless steel sheath and waterproof Measurement range: -40 to 120 °C Type: NTC Resistance: 10k B-constant : 3435K -/+ 1% The most important thing here is knowing the maximum resistance(10K ohm) for purposes of having the arduino make a measurement. The arduino's ADC measures counts based on voltages which are easily converted to voltages. But it does not measure resistances so the simplest way to turn a varying resistance into a measurable voltage is what is called a voltage divider circuit(https://en.wikipedia.org/wiki/Voltage_divider). (image courtesy of wikipedia page) A resistive DC voltage divider can be expressed as this equation: (image courtesy of wikipedia page) Because the thermistor has a 10k Ohm resistance I selected R1 to be ~10k Ohm as well. Which is sensible looking at the equation. It's important to actually measure the resistance of your R1 resistor to get a more accurate value. As resistors vary from their package description. 1% resistors are ideal and cheap. It's also important to measure the voltage of the 5V power from the arduino or whatever external power source you use. The ADC counts depend on that. To physically create the circuit connect a 5V line from the arduino to the voltage divider and lead that back to the ground. Put an analog pin(I chose A0) where the resistor and thermistor meet in series. I have attached an image which is of horrendous quality(I artificially sharpened it) of the bread board I used. Now the thermistor does not operate in a linear manner by any means. The B or beta parameter is given which can be used in a simplified way to retrieve temperature measurements (https://en.wikipedia.org/wiki/Thermistor). Thankfully the arduino can handle logarithm's and powers because the equation turns out to be this one - where (images courtesy of wikipedia page) For all intensive purposes the Rinfinite can be regarded as a constant and implemented as such in the code. For a more accurate rendering of a thermistor the use of the Stienhart-Hart equation is advised. The arduino code is attached below. If there's any errors with it just let me know I tidied it up without compiling before uploading. Attachment: thermometer2.ino (1kB) This file has been downloaded 1116 times -------------- How well does it work? Well, I don't have anything to test it against at the moment. However, Icey tap water reads about 1.5-2.0*C. (A little high maybe) Tap water shortly after being boiled is around 95*C. (A little low maybe) Room temperature with air conditioning is about 26*C. (A little high maybe) Body temperature read 37.1-37.3*C (A little high but close if not accurate) The readings are probably not absolute. For a 2 USD thermistor and a 5 USD microcontroller (if you purchase a clone), the head-way into temperature measurements, automation, (basic) calorimetry, or data logging is very accessible and easily implementable. Hope this "tutorial" helps people understand the basic premise of how to use a NTC Thermistor and encourages some tinkering. I mostly made it so if I get sick I can take my temperature, and because it was a very cheap fun way to spend an hour. [Edited on 30-8-2015 by smaerd] aga Forum Drunkard Posts: 7030 Registered: 25-3-2014 Member Is Offline For non-critical stuff, the good old y = mx + c works pretty well despite sensor non-linear behaviour. Pretty sure i implemented that in the Smelty code somewhere. Glad to see you back smaerd. m1tanker78 National Hazard Posts: 685 Registered: 5-1-2011 Member Is Offline Mood: No Mood These thermistors are great to have on hand and provide a robust way (once calibrated) to monitor instrument temperature and put the unused analog pins to good use. Nice tutorial Chemical CURIOSITY KILLED THE CATalyst. smaerd International Hazard Posts: 1262 Registered: 23-1-2010 Member Is Offline Mood: hmm... @aga - thanks, grad school has been eating a lot of my time! Oo I had never seen the smelty before awesome job on that! I see, yes thermistors are very non-linear whereas the thermocouple you used is quite linear so y=mx+b is fine. I actually tried a similar route before reading about thermistors and was getting some very peculiar values. @m1tanker78 - That's a smart idea I'll definitely be thinking about that for some future projects. aga Forum Drunkard Posts: 7030 Registered: 25-3-2014 Member Is Offline grad school ? What's that ? smaerd International Hazard Posts: 1262 Registered: 23-1-2010 Member Is Offline Mood: hmm... It's the college after college to contribute to the scientific community and earn a doctoral or masters degree. Bright Spark Harmless Posts: 23 Registered: 1-3-2015 Member Is Offline Mood: No Mood Nice tutorial and I am impressed with both your programming and your maths skills When I use thermistors in the commercial world I always model them as a polynomial, usually the manufacturers of the thermistors give the resistance across the range and it can be within 1% so a polynomial defined with macros means that is can be so easy to change the thermistor to a totally different one and only have to change a few macros The Steinhart equation isn't very accurate over a wide range, IIRC its accurate over a range about 50C Don't take this as me being negative, thats not the case I am just explaining another way this can be done I can show you what I mean if you are interested, the voltage can be eliminated from the equations if the ADC reference voltage is the same as the thermistor bridge supply voltage and this means better accuracy Regards [Edited on 1-9-2015 by Bright Spark] [Edited on 1-9-2015 by Bright Spark] aga Forum Drunkard Posts: 7030 Registered: 25-3-2014 Member Is Offline Wooo ! Sounds good. Please show. Harristotle Hazard to Others Posts: 138 Registered: 30-10-2011 Location: Tinkerville Member Is Offline Mood: I tink therefore I am There is an even cheaper way to do this. A silicon diode has a negative temperature coefficient of approximately -2mv per degree celsius. Thus a 1c diode (1n4001 bought in bulk from ebay) makes quite a good thermometer, with callibration. You don't even need to buy a resistor, if you program the analog pins as pullup. Like this: So then your thermometer looks like this: A bit of code to convert the analog reading to degrees, and you are good to go. I also write mine so that if the arduino sees an X on its serial port, it enters calibration mode and stores the calibration in eeprom. This way you can calibrate on new diodes, or just plug it in and run <pre> <font color="#434f54">// a functioning diode thermometer with stored calibration</font> <font color="#434f54">// To recalibrate, open the serial console and hold down the letter x a few times, then press return, within 1 second of starting</font> <font color="#434f54">// Then expose the diode to two different, known temperatures. The classic way is with ice water and boiling water, but you</font> <font color="#434f54">// can use a known thermometer and any two temperatures to callibrate.</font> <font color="#434f54">//Leon Harris, 2014</font> <font color="#434f54">// Version: 0.2</font> <font color="#434f54">// Fully working, but not cleaned up</font> <font color="#000000">#include</font> <font color="#434f54">&lt;</font><b><font color="#d35400">EEPROM</font></b><font color="#434f54">.</font><font color="#000000">h</font><font color="#434f54">&gt;</font> <font color="#000000">#include</font> <font color="#434f54">&lt;</font><font color="#000000">avr</font><font color="#434f54">/</font><font color="#000000">eeprom</font><font color="#434f54">.</font><font color="#000000">h</font><font color="#434f54">&gt;</font> <font color="#434f54">//needed for eeprom_read_block function</font> <font color="#5e6d03">struct</font> <font color="#000000">calib_t</font> <font color="#000000">{</font> &nbsp;<font color="#00979c">float</font> <font color="#000000">slope</font><font color="#000000">;</font> &nbsp;<font color="#00979c">float</font> <font color="#000000">offset</font><font color="#000000">;</font> <font color="#000000">}</font> <font color="#000000">calib</font><font color="#000000">;</font> <font color="#00979c">float</font> <font color="#000000">Temperature</font><font color="#434f54">=</font><font color="#000000">0</font><font color="#000000">;</font> <font color="#00979c">float</font> <font color="#000000">Slope</font><font color="#434f54">,</font> <font color="#000000">Offset</font><font color="#000000">;</font> <font color="#00979c">char</font> <font color="#000000">junk</font><font color="#000000">;</font> <font color="#434f54">// Callibration data goes into Temp[] and Raw[]</font> <font color="#00979c">float</font> <font color="#000000">Temp</font><font color="#000000">[</font><font color="#000000">2</font><font color="#000000">]</font><font color="#434f54">=</font><font color="#000000">{</font><font color="#000000">0</font><font color="#000000">}</font><font color="#000000">;</font> <font color="#00979c">int</font> <font color="#000000">Raw</font><font color="#000000">[</font><font color="#000000">2</font><font color="#000000">]</font><font color="#434f54">=</font><font color="#000000">{</font><font color="#000000">0</font><font color="#000000">}</font><font color="#000000">;</font> <font color="#00979c">float</font> <font color="#000000">readTemp</font><font color="#000000">(</font><font color="#000000"></font> <font color="#000000">{</font> &nbsp;<font color="#00979c">float</font> <font color="#000000">raw</font><font color="#434f54">=</font><font color="#000000">0</font><font color="#000000">;</font><font color="#000000">;</font> &nbsp;<font color="#00979c">float</font> <font color="#000000">temp</font><font color="#000000">;</font> &nbsp;<font color="#5e6d03">for</font> <font color="#000000">(</font><font color="#00979c">int</font> <font color="#000000">i</font><font color="#434f54">=</font><font color="#000000">0</font><font color="#000000">;</font> <font color="#000000">i</font> <font color="#434f54">&lt;</font> <font color="#000000">5</font><font color="#000000">;</font> <font color="#000000">i</font><font color="#434f54">++</font><font color="#000000"></font> <font color="#000000">{</font> &nbsp;&nbsp;&nbsp;<font color="#000000">raw</font><font color="#434f54">+=</font><font color="#000000">(</font><font color="#00979c">float</font><font color="#000000"></font><font color="#d35400">analogRead</font><font color="#000000">(</font><font color="#000000">0</font><font color="#000000"></font><font color="#000000">;</font> &nbsp;&nbsp;&nbsp; &nbsp;<font color="#000000">}</font> &nbsp;<font color="#000000">raw</font><font color="#434f54">=</font><font color="#000000">raw</font><font color="#434f54">/</font><font color="#000000">5</font><font color="#000000">;</font> &nbsp;<font color="#000000">temp</font><font color="#434f54">=</font> <font color="#000000">(</font><font color="#000000">raw</font> <font color="#434f54">*</font> <font color="#000000">Slope</font><font color="#000000"></font> <font color="#434f54">+</font> <font color="#000000">Offset</font><font color="#000000">;</font> &nbsp;<font color="#5e6d03">return</font> <font color="#000000">temp</font><font color="#000000">;</font> <font color="#000000">}</font> <font color="#00979c">void</font> <font color="#5e6d03">setup</font><font color="#000000">(</font><font color="#000000"></font> <font color="#000000">{</font> &nbsp;<font color="#434f54">// configure the circuit</font> <font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#000000">A0</font><font color="#434f54">,</font><font color="#00979c">INPUT_PULLUP</font><font color="#000000"></font><font color="#000000">;</font> <font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#000000">A1</font><font color="#434f54">,</font><font color="#00979c">OUTPUT</font><font color="#000000"></font><font color="#000000">;</font> <font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#000000">A1</font><font color="#434f54">,</font><font color="#00979c">LOW</font><font color="#000000"></font><font color="#000000">;</font> &nbsp;<b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">begin</font><font color="#000000">(</font><font color="#000000">9600</font><font color="#000000"></font><font color="#000000">;</font> <b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">println</font><font color="#000000">(</font><font color="#00979c">"Arduino Thermometer"</font><font color="#000000"></font><font color="#000000">;</font> <b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">println</font><font color="#000000">(</font><font color="#00979c">"type xxx [enter] within a second to callibrate"</font><font color="#000000"></font><font color="#000000">;</font> <b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">flush</font><font color="#000000">(</font><font color="#000000"></font><font color="#000000">;</font> &nbsp;<font color="#d35400">delay</font><font color="#000000">(</font><font color="#000000">1000</font><font color="#000000"></font><font color="#000000">;</font> &nbsp;<font color="#5e6d03">if</font> <font color="#000000">(</font><font color="#000000">(</font><font color="#00979c">char</font><font color="#000000"></font><b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">read</font><font color="#000000">(</font><font color="#000000"></font><font color="#434f54">==</font><font color="#00979c">'x'</font><font color="#000000"></font><font color="#000000">{</font> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<font color="#5e6d03">for</font> <font color="#000000">(</font><font color="#00979c">int</font> <font color="#000000">i</font><font color="#434f54">=</font><font color="#000000">0</font><font color="#000000">;</font> <font color="#000000">i</font> <font color="#434f54">&lt;</font> <font color="#000000">512</font><font color="#000000">;</font> <font color="#000000">i</font><font color="#434f54">++</font><font color="#000000"></font><font color="#000000">{</font> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#d35400">EEPROM</font></b><font color="#434f54">.</font><font color="#d35400">write</font><font color="#000000">(</font><font color="#000000">i</font><font color="#434f54">,</font><font color="#000000">0</font><font color="#000000"></font><font color="#000000">;</font> &nbsp;&nbsp;&nbsp;<font color="#000000">}</font> &nbsp;<font color="#000000">}</font> &nbsp; &nbsp; &nbsp;<font color="#434f54">// check for callibration data</font> <font color="#000000">eeprom_read_block</font><font color="#000000">(</font><font color="#000000">(</font><font color="#00979c">void</font><font color="#434f54">*</font><font color="#000000"></font><font color="#434f54">&</font><font color="#000000">calib</font><font color="#434f54">,</font> <font color="#000000">(</font><font color="#00979c">void</font><font color="#434f54">*</font><font color="#000000"></font><font color="#000000">0</font><font color="#434f54">,</font> <font color="#5e6d03">sizeof</font><font color="#000000">(</font><font color="#000000">calib</font><font color="#000000"></font><font color="#000000"></font><font color="#000000">;</font> <b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">print</font><font color="#000000">(</font><font color="#000000">calib</font><font color="#434f54">.</font><font color="#000000">slope</font><font color="#000000"></font><font color="#000000">;</font> <b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">print</font><font color="#000000">(</font><font color="#00979c">" "</font><font color="#000000"></font><font color="#000000">;</font> <b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">println</font><font color="#000000">(</font><font color="#000000">calib</font><font color="#434f54">.</font><font color="#000000">offset</font><font color="#000000"></font><font color="#000000">;</font> <font color="#5e6d03">if</font> <font color="#000000">(</font> <font color="#000000">calib</font><font color="#434f54">.</font><font color="#000000">slope</font> <font color="#434f54">==</font> <font color="#000000">0</font> <font color="#000000"></font> <font color="#000000">{</font> <font color="#434f54">//no slope, no calibration</font> &nbsp;<font color="#434f54">// start calibration routine</font> &nbsp;<b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">println</font><font color="#000000">(</font><font color="#00979c">"Enter first temperature on the serial console"</font><font color="#000000"></font><font color="#000000">;</font> &nbsp; &nbsp;<b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">flush</font><font color="#000000">(</font><font color="#000000"></font><font color="#000000">;</font> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5e6d03">while</font> <font color="#000000">(</font><b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">available</font><font color="#000000">(</font><font color="#000000"></font> <font color="#434f54">&gt;</font> <font color="#000000">0</font><font color="#000000"></font> <font color="#000000">{</font> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#000000">junk</font><font color="#434f54">=</font><b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">read</font><font color="#000000">(</font><font color="#000000"></font><font color="#000000">;</font> &nbsp;&nbsp;&nbsp;&nbsp;<font color="#000000">}</font> &nbsp;<font color="#5e6d03">while</font> <font color="#000000">(</font><b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">available</font><font color="#000000">(</font><font color="#000000"></font> <font color="#434f54">==</font> <font color="#000000">0</font><font color="#000000"></font> <font color="#000000">{</font> &nbsp;&nbsp;<font color="#000000">Temp</font><font color="#000000">[</font><font color="#000000">0</font><font color="#000000">]</font><font color="#434f54">=</font><b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">parseFloat</font><font color="#000000">(</font><font color="#000000"></font><font color="#000000">;</font> &nbsp;<font color="#000000">}</font> &nbsp;<font color="#000000">Raw</font><font color="#000000">[</font><font color="#000000">0</font><font color="#000000">]</font><font color="#434f54">=</font><font color="#000000">0</font><font color="#000000">;</font> <font color="#5e6d03">for</font> <font color="#000000">(</font><font color="#00979c">int</font> <font color="#000000">i</font><font color="#434f54">=</font><font color="#000000">0</font><font color="#000000">;</font> <font color="#000000">i</font> <font color="#434f54">&lt;</font> <font color="#000000">10</font><font color="#000000">;</font> <font color="#000000">i</font><font color="#434f54">++</font><font color="#000000"></font><font color="#000000">{</font> &nbsp;&nbsp;<font color="#000000">Raw</font><font color="#000000">[</font><font color="#000000">0</font><font color="#000000">]</font><font color="#434f54">+=</font><font color="#d35400">analogRead</font><font color="#000000">(</font><font color="#000000">0</font><font color="#000000"></font><font color="#000000">;</font> <font color="#000000">}</font> &nbsp;<font color="#000000">Raw</font><font color="#000000">[</font><font color="#000000">0</font><font color="#000000">]</font><font color="#434f54">=</font><font color="#000000">Raw</font><font color="#000000">[</font><font color="#000000">0</font><font color="#000000">]</font><font color="#434f54">/</font><font color="#000000">10</font><font color="#000000">;</font> &nbsp;<b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">println</font><font color="#000000">(</font><font color="#00979c">"Enter second temperature on the serial console"</font><font color="#000000"></font><font color="#000000">;</font> &nbsp;<b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">flush</font><font color="#000000">(</font><font color="#000000"></font><font color="#000000">;</font> &nbsp;&nbsp;&nbsp;&nbsp;<font color="#5e6d03">while</font> <font color="#000000">(</font><b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">available</font><font color="#000000">(</font><font color="#000000"></font> <font color="#434f54">&gt;</font> <font color="#000000">0</font><font color="#000000"></font> <font color="#000000">{</font> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#000000">junk</font><font color="#434f54">=</font><b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">read</font><font color="#000000">(</font><font color="#000000"></font><font color="#000000">;</font> &nbsp;&nbsp;&nbsp;&nbsp;<font color="#000000">}</font> &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<font color="#5e6d03">while</font> <font color="#000000">(</font><b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">available</font><font color="#000000">(</font><font color="#000000"></font> <font color="#434f54">==</font> &nbsp;<font color="#000000">0</font><font color="#000000"></font> <font color="#000000">{</font> &nbsp;&nbsp;&nbsp;<font color="#000000">Temp</font><font color="#000000">[</font><font color="#000000">1</font><font color="#000000">]</font><font color="#434f54">=</font><b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">parseFloat</font><font color="#000000">(</font><font color="#000000"></font><font color="#000000">;</font> &nbsp;<font color="#000000">}</font> &nbsp;&nbsp;&nbsp;<font color="#000000">Raw</font><font color="#000000">[</font><font color="#000000">1</font><font color="#000000">]</font><font color="#434f54">=</font><font color="#000000">0</font><font color="#000000">;</font> <font color="#5e6d03">for</font> <font color="#000000">(</font><font color="#00979c">int</font> <font color="#000000">i</font><font color="#434f54">=</font><font color="#000000">0</font><font color="#000000">;</font> <font color="#000000">i</font> <font color="#434f54">&lt;</font> <font color="#000000">10</font><font color="#000000">;</font> <font color="#000000">i</font><font color="#434f54">++</font><font color="#000000"></font><font color="#000000">{</font> &nbsp;&nbsp;<font color="#000000">Raw</font><font color="#000000">[</font><font color="#000000">1</font><font color="#000000">]</font><font color="#434f54">+=</font><font color="#d35400">analogRead</font><font color="#000000">(</font><font color="#000000">0</font><font color="#000000"></font><font color="#000000">;</font> <font color="#000000">}</font> &nbsp;<font color="#000000">Raw</font><font color="#000000">[</font><font color="#000000">1</font><font color="#000000">]</font><font color="#434f54">=</font><font color="#000000">Raw</font><font color="#000000">[</font><font color="#000000">1</font><font color="#000000">]</font><font color="#434f54">/</font><font color="#000000">10</font><font color="#000000">;</font> <font color="#434f54">// slope and intercept calculations go here</font> <font color="#000000">Slope</font><font color="#434f54">=</font> <font color="#000000">(</font><font color="#000000">Temp</font><font color="#000000">[</font><font color="#000000">1</font><font color="#000000">]</font> <font color="#434f54">-</font> <font color="#000000">Temp</font><font color="#000000">[</font><font color="#000000">0</font><font color="#000000">]</font><font color="#000000"></font><font color="#434f54">/</font> <font color="#000000">(</font><font color="#000000">Raw</font><font color="#000000">[</font><font color="#000000">1</font><font color="#000000">]</font> <font color="#434f54">-</font> <font color="#000000">Raw</font><font color="#000000">[</font><font color="#000000">0</font><font color="#000000">]</font><font color="#000000"></font><font color="#000000">;</font> <font color="#000000">Offset</font><font color="#434f54">=</font> <font color="#000000">Temp</font><font color="#000000">[</font><font color="#000000">1</font><font color="#000000">]</font> <font color="#434f54">-</font> <font color="#000000">(</font> <font color="#000000">Slope</font> <font color="#434f54">*</font> <font color="#000000">Raw</font><font color="#000000">[</font><font color="#000000">1</font><font color="#000000">]</font><font color="#000000"></font> <font color="#000000">;</font> <font color="#000000">calib</font><font color="#434f54">.</font><font color="#000000">slope</font><font color="#434f54">=</font><font color="#000000">Slope</font><font color="#000000">;</font> <font color="#000000">calib</font><font color="#434f54">.</font><font color="#000000">offset</font><font color="#434f54">=</font><font color="#000000">Offset</font><font color="#000000">;</font> <b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">println</font><font color="#000000">(</font><font color="#00979c">"#############################################################"</font><font color="#000000"></font><font color="#000000">;</font> <b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">println</font><font color="#000000">(</font><font color="#00979c">"# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#"</font><f ont color="#000000"></font><font color="#000000">;</font> &nbsp;<b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">print</font><font color="#000000">(</font><font color="#00979c">"# Slope= "</font><font color="#000000"></font><font color="#000000">;</font> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">print</font><font color="#000000">(</font><font color="#000000">calib</font><font color="#434f54">.</font><font color="#000000">slope</font><font color="#000000"></font><font color="#000000">;</font> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b> <font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">println</font><font color="#000000">(</font><font color="#00979c">" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#"</fon t><font color="#000000"></font><font color="#000000">;</font> &nbsp;<b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">print</font><font color="#000000">(</font><font color="#00979c">"# Offset= "</font><font color="#000000"></font><font color="#000000">;</font> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">print</font><font color="#000000">(</font><font color="#000000">calib</font><font color="#434f54">.</font><font color="#000000">offset</font><font color="#000000"></font><font color="#000000">;</font> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp ;&nbsp;<b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">println</font><font color="#000000">(</font><font color="#00979c">" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#"</font><font color="#000000"></font><font color="#000000">;</font> <b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">println</font><font color="#000000">(</font><font color="#00979c">"#############################################################"</font><font color="#000000"></font><font color="#000000">;</font> <font color="#000000">eeprom_write_block</font><font color="#000000">(</font><font color="#000000">(</font><font color="#00979c">const</font> <font color="#00979c">void</font><font color="#434f54">*</font><font color="#000000"></font><font color="#434f54">&</font><font color="#000000">calib</font><font color="#434f54">,</font> <font color="#000000">(</font><font color="#00979c">void</font><font color="#434f54">*</font><font color="#000000"></font><font color="#000000">0</font><font color="#434f54">,</font> <font color="#5e6d03">sizeof</font><font color="#000000">(</font><font color="#000000">calib</font><font color="#000000"></font><font color="#000000"></font><font color="#000000">;</font> <font color="#000000">}</font> <font color="#434f54">//end if</font> <font color="#5e6d03">else</font> <font color="#000000">{</font> <font color="#000000">Slope</font><font color="#434f54">=</font><font color="#000000">calib</font><font color="#434f54">.</font><font color="#000000">slope</font><font color="#000000">;</font> <font color="#000000">Offset</font><font color="#434f54">=</font><font color="#000000">calib</font><font color="#434f54">.</font><font color="#000000">offset</font><font color="#000000">;</font> <font color="#000000">}</font> <font color="#000000">}</font> <font color="#00979c">void</font> <font color="#5e6d03">loop</font><font color="#000000">(</font><font color="#000000"></font> <font color="#000000">{</font> <font color="#d35400">delay</font><font color="#000000">(</font><font color="#000000">1000</font><font color="#000000"></font><font color="#000000">;</font> <font color="#000000">Temperature</font><font color="#434f54">=</font><font color="#000000">readTemp</font><font color="#000000">(</font><font color="#000000"></font><font color="#000000">;</font> <b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">println</font><font color="#000000">(</font><font color="#000000">Temperature</font><font color="#000000"></font><font color="#000000">;</font> <font color="#000000">}</font> </pre> [Edited on 1-9-2015 by Harristotle] aga Forum Drunkard Posts: 7030 Registered: 25-3-2014 Member Is Offline  Quote: eeprom_read_block((void*)&calib, (void*)0, sizeof(calib)); Wooo ! Didn't know the EEPROM library had a block read/write function. A+ for cheapest, easiest temperature sensor. I get the feeling that we're wanting accuracy over a greater range of temperatures though. smaerd International Hazard Posts: 1262 Registered: 23-1-2010 Member Is Offline Mood: hmm...  Quote: Originally posted by Bright Spark The Steinhart equation isn't very accurate over a wide range, IIRC its accurate over a range about 50C Brightspark that's really good to know. I'd love to see how thermistors are handled in a professional context. It's interesting you use a polynomial model but why not! I think I see what you mean about ripping out the voltages. Anything you want to share I'd love to read. @Haristotle I am really impressed with this. It's one of those backwoods solutions I probably would have never considered yet have them(diodes) sitting on my shelf. 2mv increment per degree celsius is quite nice for a wider temperature range sacrificing some resolution(depending on the circumstance). It's also a lot quicker once calibrated which is great for a cheap and dirty on board temperature measurement. For external sensing a little thermowell could be made without any issue and very cheaply I am sure as well. Thanks for providing your code. I also didn't know about the EEPROM commands but I never dabbled much with EEPROM. aga Forum Drunkard Posts: 7030 Registered: 25-3-2014 Member Is Offline Amazing, I thought i'd seen the diode thing before. Page 139 of the Microchip PIC16F1823 manual shows the schematic of the die-temperature sensor, and it's two or 4 diodes. Edit: Got the part code wrong [Edited on 1-9-2015 by aga] Harristotle Hazard to Others Posts: 138 Registered: 30-10-2011 Location: Tinkerville Member Is Offline Mood: I tink therefore I am one last trick one last qute trick that I normally use, but for some reason did not put in that example: you can increase your resolution 5x by using: AnalogReference(INTERNAL); this sets your adc to read 0-1.1volt. So your diode will give you about 630 counts at room temp, instead of only 140 counts. ie 0.9 bits per millivolt instead of 0.2 volts per mv. In other words, about +/- 0.5 a degree resolution, if you use the internal reference, which is 1.1 volt. Cheers, H. smaerd International Hazard Posts: 1262 Registered: 23-1-2010 Member Is Offline Mood: hmm... Very nice! I had no idea that the ADC potential range could be changed like that. When I looked into it some more I read in other places that the arduino ADC isn't exactly a gold standard by simply using analogread() due to supply voltage fluctuations, etc. A circuit based solution - http://www.skillbank.co.uk/arduino/measure.htm A 'low-level' code based solution - http://hacking.majenko.co.uk/making-accurate-adc-readings-on... IrC International Hazard Posts: 2710 Registered: 7-3-2005 Location: Eureka Member Is Offline Mood: Discovering Just wanted to share a couple sites I have been spending much time at lately which can aid in using your Arduino for many complex tasks involving automation. Tutorials useful in learning how to monitor sensors and performing various functions in the lab. This thread seemed to be an appropriate place to share these links for those who have not already found them. http://howtomechatronics.com/ https://processing.org/ "Science is the belief in the ignorance of the experts" Richard Feynman annaandherdad Hazard to Others Posts: 387 Registered: 17-9-2011 Member Is Offline Mood: No Mood Thanks, everyone, for this thread. It's things like this that keep me coming back to SM. Any other SF Bay chemists? aga Forum Drunkard Posts: 7030 Registered: 25-3-2014 Member Is Offline It's things like your QM posts that keep me coming back ! Do you have a specific Arduino project in mind ? Junaid_Shahid Harmless Posts: 1 Registered: 20-5-2017 Member Is Offline Mood: No Mood  Quote: Originally posted by IrC Just wanted to share a couple sites I have been spending much time at lately which can aid in using your Arduino for many complex tasks involving automation. Tutorials useful in learning how to monitor sensors and performing various functions in the lab. This thread seemed to be an appropriate place to share these links for those who have not already found them. http://howtomechatronics.com/ https://processing.org/ That's really nice, But I will like to add some more right below your suggestions. https://www.theengineeringprojects.com http://www.instructables.com/tag/type-id/category-technology... Melgar Anti-Spam Agent Posts: 2004 Registered: 23-2-2010 Location: Connecticut Member Is Offline Mood: Estrified Quote: Originally posted by Junaid_Shahid  Quote: Originally posted by IrC Just wanted to share a couple sites I have been spending much time at lately which can aid in using your Arduino for many complex tasks involving automation. Tutorials useful in learning how to monitor sensors and performing various functions in the lab. This thread seemed to be an appropriate place to share these links for those who have not already found them. http://howtomechatronics.com/ https://processing.org/ That's really nice, But I will like to add some more right below your suggestions. https://www.theengineeringprojects.com http://www.instructables.com/tag/type-id/category-technology... Really, this entire thread is pretty much obsolete. You can get a MAX 6675 thermocouple reader from China for about$2, and the corresponding K-type thermocouple for about \$1.50. Then you just download the library, and you can measure virtually any temperature up to the melting point of the shielding on the thermocouple wires, and more accurately than a thermistor as well.
Sulaiman
International Hazard

Posts: 3506
Registered: 8-2-2015
Location: 3rd rock from the sun
Member Is Offline

Or you could buy a rex c100 temperature controller
£6.99 rex-c100 http://www.ebay.co.uk/itm/382084805756?_trksid=p2060353.m143...
£8.29 rex-c100 + 40A ssr + thermocouple probe http://www.ebay.co.uk/itm/Digital-PID-Temperature-Control-40...

or a four channel temperature meter with four thermocouples £16.62 http://www.ebay.co.uk/itm/Digital-Thermometer-4-Channel-200-...

or just a thermistor probe with digital panel meter £0.99 http://www.ebay.co.uk/itm/DIGITAL-DISPLAY-FRIDGE-FREEZER-PRO...

CAUTION : Hobby Chemist, not Professional or even Amateur
Texium