smaerd
International Hazard
![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif)
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).
![Untitled.png - 11kB Untitled.png - 11kB](https://www.sciencemadness.org/whisper/files.php?pid=417695&aid=43140)
(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.
![DSCF0069.JPG - 389kB](https://www.sciencemadness.org/whisper/files.php?pid=417695&aid=43138)
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
-
![](https://upload.wikimedia.org/math/c/e/d/cedf1c04ed4f50c7768650d77a92557a.png)
where ![](https://upload.wikimedia.org/math/1/f/5/1f54d7129f43572d9ce00adc773a7b4c.png)
(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 1205 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
![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif)
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
![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif)
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
![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif)
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
![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif)
Posts: 7030
Registered: 25-3-2014
Member Is Offline
|
|
grad school ?
What's that ?
|
|
smaerd
International Hazard
![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif)
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
![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif)
Posts: 7030
Registered: 25-3-2014
Member Is Offline
|
|
Wooo ! Sounds good.
Please show.
|
|
Harristotle
Hazard to Others
![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif)
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:
![2015-09-01_1758.png - 13kB](https://www.sciencemadness.org/whisper/files.php?pid=417952&aid=43216)
So then your thermometer looks like this:
![2015-09-01_1800.png - 39kB](https://www.sciencemadness.org/whisper/files.php?pid=417952&aid=43218)
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"><</font><b><font
color="#d35400">EEPROM</font></b><font color="#434f54">.</font><font color="#000000">h</font><font
color="#434f54">></font>
<font color="#000000">#include</font> <font color="#434f54"><</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">></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>
<font color="#00979c">float</font> <font color="#000000">slope</font><font color="#000000">;</font>
<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>
<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>
<font color="#00979c">float</font> <font color="#000000">temp</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"><</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>
<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>
<font color="#000000">}</font>
<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>
<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>
<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>
<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>
<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>
<font color="#d35400">delay</font><font color="#000000">(</font><font
color="#000000">1000</font><font color="#000000"> </font><font color="#000000">;</font>
<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>
<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"><</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>
<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>
<font color="#000000">}</font>
<font color="#000000">}</font>
<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>
<font color="#434f54">// start calibration routine</font>
<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>
<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>
<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>
<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>
<font color="#000000">}</font>
<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>
<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>
<font color="#000000">}</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">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"><</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>
<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>
<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>
<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>
<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>
<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>
<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>
<font color="#000000">}</font>
<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>
<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>
<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">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"><</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>
<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>
<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">"#
#"</font><f
ont 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">"# 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="#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">println</font><font color="#000000">(</font><font color="#00979c">"
#"</fon
t><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">"# Offset= "</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">offset</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>
<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
![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif)
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
![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif)
Posts: 1262
Registered: 23-1-2010
Member Is Offline
Mood: hmm...
|
|
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
![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif)
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
![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif)
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
![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif)
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
![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif)
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
![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif)
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
![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif)
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 ![](images/xpblue/lastpost.gif) | 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
![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif)
Posts: 2004
Registered: 23-2-2010
Location: Connecticut
Member Is Offline
Mood: Estrified
|
|
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
![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif) ![*](images/xpblue/star.gif)
Posts: 3631
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
|
Thread Moved 27-11-2023 at 11:23 |