In this lesson, i will show you reading temperature with an esp8266 and a ntc (thermister) sensor.

**Note :**

You need an ESP board having ADC pin. Only ESP8266 - 07 and ESP8266 - 12 boards have ADC pin.

I used :

-ESP8266 - 07

-10k NTC

-150k ohm resistor.

We will use very simple and basic resistor-ntc circuit. Circuit is in figure1.

Figure-1 |

Normally, if you search on internet you will see circuits that uses 10k ntc with a 10k resistor. On my circuit i use 150k resistor. Now i will explain why i am doing it.

In figure-2, there is a graph that explaint resistance and temperature for a ntc sensor.

This sensor says NTC resistor high value is about 18-20k and 3-4k for (room temp).

Figure-2 |

**Assume**:

NTC max resistance = 18kohm

NTC min resistance = 3k ohm

VCC = 3.3V

What is that mean?

That mean is your analog voltage highest value must be 1V. So, for that reason, i will use 150k resistor and wtih 150k resistor maximum and minumum analog values are below.

Theese values are good for our project. You can use a lower resistor for higher temperature resolution. In my project temperature resoulution is not very important.

ESP8266 Analog Resolution per Volts :

1V = 1024

1 / 1024 = 0.00097 V resolution.

0.3535 V / 0.00097 V= 364

0.0647 V / 0.00097 V = 66

That means, we have 298 different temperature values. As i sad this is enough for my project.

Now we have solved hardware problem. But with this solution we have a problem with software. Functions that you can find on internet is for 10k ntc and 10k resistor and there is not enough explaniton about it.

Firstly,

We need to find instantenious resistance of NTC. You can use ESP8266 ADC pin as A0 on Arduino IDE.

Simple analog read code :

*int RawData = analogRead(A0);*

Filtered analog read code :

*int AnalogRead() {*

int val = 0;

for(int i = 0; i < 20; i++) {

val += analogRead(A0);

delay(1);

}

val = val / 20;

return val;

}

int val = 0;

for(int i = 0; i < 20; i++) {

val += analogRead(A0);

delay(1);

}

val = val / 20;

return val;

}

In my project i use filtered analog read code. This is very effective and more stable. We have read analog voltage on NTC. Now we will calculate instantenious resistance of NTC.

*void loop() {*

*double Vcc = 3.3V;*

*unsigned int Rs = 150000;*

double V_NTC = (double)AnalogRead()

double R_NTC = (Rs * V_NTC) / (Vcc - V_NTC);

double V_NTC = (double)AnalogRead()

double R_NTC = (Rs * V_NTC) / (Vcc - V_NTC);

*Serial.println(R_NTC);*

*}*

*We have successfuly completed first step. We have calculated resistance of NTC. You can check your paramters with your multimeter but you need to now that when you touch your ntc sensor, ntc resistance will change instantly.*

Second step is about calculating temperature with using instantenious resistance of ntc .

The

**Steinhart–Hart equation**is a model of the resistance of a semiconductor at different temperatures. The equation is:

T is the temperature (in kelvins)R is the resistance atT (in ohms)A ,B , andC are the**Steinhart–Hart coefficients**which vary depending on the type and model of thermistor and the temperature range of interest. (The most general form of the applied equation contains a(ln(R))2 - term, but this is frequently neglected because it is typically much smaller than the other coefficients, and is therefore not shown above.)

A = 0.001129148

B = 0.000234125

C = 0.0000000876741

Now we are ready for calculate temperature.

**Where**:

Rs = 150000; //150k ohm resistor

Vcc = 3.3;

*double Thermister(int val) {*

double V_NTC = (double)val / 1024;

double R_NTC = (Rs * V_NTC) / (Vcc - V_NTC);

R_NTC = log(R_NTC);

double Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * R_NTC * R_NTC ))* R_NTC );

Temp = Temp - 273.15;

return Temp;

double V_NTC = (double)val / 1024;

double R_NTC = (Rs * V_NTC) / (Vcc - V_NTC);

R_NTC = log(R_NTC);

double Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * R_NTC * R_NTC ))* R_NTC );

Temp = Temp - 273.15;

return Temp;

}

}

#include <math.h>

unsigned int Rs = 150000;

double Vcc = 3.3;

void setup() {

// put your setup code here, to run once:

Serial.begin(115200);

}

void loop() {

// put your main code here, to run repeatedly:

Serial.println(Thermister(AnalogRead()));

delay(1000);

}

int AnalogRead() {

int val = 0;

for(int i = 0; i < 20; i++) {

val += analogRead(A0);

delay(1);

}

val = val / 20;

return val;

}

double Thermister(int val) {

double V_NTC = (double)val / 1024;

double R_NTC = (Rs * V_NTC) / (Vcc - V_NTC);

R_NTC = log(R_NTC);

double Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * R_NTC * R_NTC ))* R_NTC );

Temp = Temp - 273.15;

return Temp;

}

You can change Rs and Vcc paramters with your own values.

**Note (Important !)**: If you want to use different Rs, make sure your instantenious analog input voltage value is lower than 1V.

You can download project on that link.

Download here

Hope it will help you.

See you soon.

You can read that article for analog readings filtering

ReplyDeletehttp://esp8266tutorials.blogspot.com.tr/2016/10/arduino-esp8266-digital-smoothing.html

I checked my esp8266-12 (NodeMCU) and it has correct reference voltage - 3.3V

ReplyDeleteThis tutorial not for NodeMCU or any other development boards. And thank you for interest

DeleteVery nice post. Thank you.

ReplyDeleteHello,

ReplyDeleteYour post help me a lot. The thermistor I'm using is MF52 b=3435 10k at 25°. Any idea how to find the 3 Steinhart-Hart A,B,C values for this thermistor? I'm not sure what information I need to get these. Thank you.

Hello,

ReplyDeleteYou can use this :

http://www.thinksrs.com/downloads/programs/Therm%20Calc/NTCCalibrator/NTCcalculator.htm

hi my friend i try to use this code but have a problem.

ReplyDeletethe termistore at -17,0 C have a value 73.84 C and resistor 1538

Hi,

ReplyDeleteI am using EPCOS B57861S103F40 Thermistor 10kΩ, 2.41 (Dia.) x 6.5mm with the adafruit feather huzzah esp8266, will it work with that program?

Thank you.

anon

Hello,

DeleteYes it should work with that. You can write here if you are having problems.

Thanks for your prompt reply. After uploading your code, the serial monitor output -13.00. No fluctuation in value too. Please help thank you

DeleteI solved the problem. awesome blog thank you!!

DeleteHi,

ReplyDeleteYour program works. However, I want telegram to notify me when the temperature is too high. Also, i can request for the temperature. How do i go about doing this? Hope to hear from you ASAP. Thank you.

Hello, i am sorry because i havent work with Telegram before.

DeleteAnonymous, how did you solve your problem? I'm having the same issue using the Huzzah.

ReplyDeleteHello please share your code. Maybe i can help

Delete