Thermistor to Temperature library, using Steinhart-Hart algorithm
This is a Thermistor to Temperature conversion library
Much thanks to @Adafruit for this tutorial: https://learn.adafruit.com/thermistor/using-a-thermistor
The 100K Thermistor is configured with a 4.7k series resistor tied to vcc (3.3v) like this:
+3.3v
\ / 4.7k series resistor \ /
.---O To Anlog pin on FRDM board
\ / Thermistor 100k Nominal \ /
-
GND
author Michael J. Ball unix_guru at hotmail.com @unix_guru on Twitter March 2016
Thermistor.cpp@1:601e1435dfb8, 2016-03-09 (annotated)
- Committer:
- unix_guru
- Date:
- Wed Mar 09 13:56:37 2016 +0000
- Revision:
- 1:601e1435dfb8
- Parent:
- 0:000a8be2414d
Updated documentation
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
unix_guru | 0:000a8be2414d | 1 | /* |
unix_guru | 0:000a8be2414d | 2 | * Thermistor Temperature library |
unix_guru | 0:000a8be2414d | 3 | * Licensed under the Apache License, Version 2.0 (the "License"); |
unix_guru | 0:000a8be2414d | 4 | * you may not use this file except in compliance with the License. |
unix_guru | 0:000a8be2414d | 5 | * You may obtain a copy of the License at |
unix_guru | 0:000a8be2414d | 6 | * |
unix_guru | 0:000a8be2414d | 7 | * http://www.apache.org/licenses/LICENSE-2.0 |
unix_guru | 0:000a8be2414d | 8 | * |
unix_guru | 0:000a8be2414d | 9 | * Unless required by applicable law or agreed to in writing, software |
unix_guru | 0:000a8be2414d | 10 | * distributed under the License is distributed on an "AS IS" BASIS, |
unix_guru | 0:000a8be2414d | 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
unix_guru | 0:000a8be2414d | 12 | * See the License for the specific language governing permissions and |
unix_guru | 0:000a8be2414d | 13 | * limitations under the License. |
unix_guru | 0:000a8be2414d | 14 | */ |
unix_guru | 0:000a8be2414d | 15 | #include "mbed.h" |
unix_guru | 0:000a8be2414d | 16 | #include "Thermistor.h" |
unix_guru | 0:000a8be2414d | 17 | |
unix_guru | 0:000a8be2414d | 18 | |
unix_guru | 0:000a8be2414d | 19 | Thermistor::Thermistor(PinName pin) : _pin(pin) { // _pin(pin) means pass pin to the AnalogIn constructor |
unix_guru | 0:000a8be2414d | 20 | init(); |
unix_guru | 0:000a8be2414d | 21 | } |
unix_guru | 0:000a8be2414d | 22 | |
unix_guru | 0:000a8be2414d | 23 | void Thermistor::init() { |
unix_guru | 0:000a8be2414d | 24 | ThermistorNominal = THERMISTORNOMINAL; |
unix_guru | 0:000a8be2414d | 25 | TemperatureNominal = TEMPERATURENOMINAL; |
unix_guru | 0:000a8be2414d | 26 | BCoefficient = BCOEFFICIENT; |
unix_guru | 0:000a8be2414d | 27 | SeriesResistor = SERIESRESISTOR; |
unix_guru | 0:000a8be2414d | 28 | } |
unix_guru | 0:000a8be2414d | 29 | |
unix_guru | 0:000a8be2414d | 30 | // This is the workhorse routine that calculates the temperature |
unix_guru | 0:000a8be2414d | 31 | // using the Steinhart-Hart equation for thermistors |
unix_guru | 0:000a8be2414d | 32 | // https://en.wikipedia.org/wiki/Steinhart%E2%80%93Hart_equation |
unix_guru | 0:000a8be2414d | 33 | float Thermistor::get_temperature() |
unix_guru | 0:000a8be2414d | 34 | { |
unix_guru | 0:000a8be2414d | 35 | float temperature =0, resistance =0; |
unix_guru | 0:000a8be2414d | 36 | float steinhart =0; |
unix_guru | 0:000a8be2414d | 37 | double a=0; |
unix_guru | 0:000a8be2414d | 38 | int smooth = 5; // Number of samples to smooth |
unix_guru | 0:000a8be2414d | 39 | |
unix_guru | 0:000a8be2414d | 40 | for(int i=0;i<smooth;i++) { |
unix_guru | 0:000a8be2414d | 41 | a += _pin.read_u16(); // Read 16bit Analog value |
unix_guru | 0:000a8be2414d | 42 | } |
unix_guru | 0:000a8be2414d | 43 | a = a/smooth; // Get average of samples |
unix_guru | 0:000a8be2414d | 44 | // pc.printf("Raw Analog Value for Thermistor = %d\r\n",a); |
unix_guru | 0:000a8be2414d | 45 | |
unix_guru | 0:000a8be2414d | 46 | /* Calculate the resistance of the thermistor from analog votage read. */ |
unix_guru | 0:000a8be2414d | 47 | resistance = (float) SeriesResistor / ((65536.0 / a) - 1); |
unix_guru | 0:000a8be2414d | 48 | // pc.printf("Resistance for Thermistor = %f\r\n",resistance); |
unix_guru | 0:000a8be2414d | 49 | |
unix_guru | 0:000a8be2414d | 50 | steinhart = resistance / ThermistorNominal; // (R/Ro) |
unix_guru | 0:000a8be2414d | 51 | steinhart = log(steinhart); // ln(R/Ro) |
unix_guru | 0:000a8be2414d | 52 | steinhart /= BCoefficient; // 1/B * ln(R/Ro) |
unix_guru | 0:000a8be2414d | 53 | steinhart += 1.0 / (TemperatureNominal + 273.15); // + (1/To) |
unix_guru | 0:000a8be2414d | 54 | steinhart = 1.0 / steinhart; // Invert |
unix_guru | 0:000a8be2414d | 55 | temperature = steinhart - 273.15; // convert to C |
unix_guru | 0:000a8be2414d | 56 | |
unix_guru | 0:000a8be2414d | 57 | return temperature; |
unix_guru | 0:000a8be2414d | 58 | } |
unix_guru | 0:000a8be2414d | 59 | |
unix_guru | 0:000a8be2414d | 60 | void Thermistor::set_ThermistorNominal(float thermnom) { |
unix_guru | 0:000a8be2414d | 61 | ThermistorNominal = thermnom; |
unix_guru | 0:000a8be2414d | 62 | } |
unix_guru | 0:000a8be2414d | 63 | void Thermistor::set_TemperatureNominal(float tempnom){ |
unix_guru | 0:000a8be2414d | 64 | TemperatureNominal = tempnom; |
unix_guru | 0:000a8be2414d | 65 | } |
unix_guru | 0:000a8be2414d | 66 | void Thermistor::set_BCoefficient(float bcoefficient){ |
unix_guru | 0:000a8be2414d | 67 | BCoefficient = bcoefficient; |
unix_guru | 0:000a8be2414d | 68 | } |
unix_guru | 0:000a8be2414d | 69 | void Thermistor::set_SeriesResistor(float resistor){ |
unix_guru | 0:000a8be2414d | 70 | SeriesResistor = resistor; |
unix_guru | 0:000a8be2414d | 71 | } |
unix_guru | 0:000a8be2414d | 72 | |
unix_guru | 0:000a8be2414d | 73 | |
unix_guru | 0:000a8be2414d | 74 | |
unix_guru | 0:000a8be2414d | 75 |