O termistor NTC é um componente simples e barato que pode ser utilizado para a medição de temperaturas. Sendo assim, neste post, veremos algumas de suas características e como utilizá-lo com o Arduino (sem bibliotecas).

O termistor

O que é o NTC

O termistor é um componente eletrônico (semicondutor) que pode ser representado como uma resistência que varia de acordo com a temperatura. No caso do NTC, sua resistência interna varia inversamente à temperatura. Isto é, quanto maior a temperatura, menor é sua resistência. É daí que vem o nome NTC (Negative Temperature Coeficiente – Coeficiente de Temperatura Negativo), que indica esta relação inversa.

Por meio dessa propriedade do termistor NTC, podemos utilizá-lo como um medidor de temperatura, conforme veremos mais à frente. Veja um exemplo de NTC na imagem abaixo. Na esquerda está ele sozinho e, na direita, ele está ligado em um módulo (KY-013).

Termistor NTC

Aplicações

Ele pode ser usado para:

  • Medir a temperatura de um ambiente.
    • Pode ser utilizado, por exemplo, em uma mini estação meteorológica.
  • Medir a temperatura de um objeto.
    • Verificar se um equipamento está sobreaquecendo.
  • Medir a temperatura de um líquido.
    • Isto pode ser útil em um processo industrial.

Característica do NTC

O termistor NTC pode vir em alguns formatos diferentes, incluindo em encapsulamentos SMD ou PTH, mas todos eles possuem algumas características em comum. A primeira delas é uma curva característica que mostra a relação entre sua resistência interna e a temperatura. Conforme dito, esta relação é inversa, assim como mostra a imagem abaixo:

Outra característica importante é a resistência do NTC à 25ºC, que é um valor conhecido. No caso, ela é uma das especificações comuns na hora de se comprar um termistor NTC. Entretanto, esta resistência à 25ºC não é 100% exata e existe uma margem de erro pro valor, que é especificada no datasheet do componente. Um valor comum de encontrar no mercado é um NTC de 10kΩ à 25ºC, como é o caso da curva da imagem anterior.

Além desses aspectos, o termistor NTC possui alguns outros:

  • A faixa de temperatura suportada pode variar um pouco, mas é comum ser algo como de -40 a 125ºC.
  • Em alguns casos, é preciso ficar atento à máxima tensão aplicada ao NTC.
  • Constantes pertinentes para a conversão da resistência em temperatura.
    • Serão discutidas no tópico seguinte.

Por fim é importante mencionar que alguns datasheets fornecem uma tabela com algumas equivalências entre os valores de temperatura e de resistência do NTC em questão. Veja um exemplo aqui (página 16) e aqui (página 3).

Ao invés das tabelas, pode ser mais fácil calcular o valor utilizando algumas fórmulas conforme veremos no tópico adiante.

Fórmulas

Existem 3 formas principais de se converter o valor da resistência em temperatura:

  • Aproximação de primeira ordem:

Neste cenário, você considera que a variação de temperatura com a resistência é linear. Por exemplo:

T = k \times R

Esta aproximação simplifica consideravelmente o cálculo, entretanto ela é bastante imprecisa, pois a variação da temperatura não é nada linear conforme a curva de exemplo do tópico anterior.

  • Utilizando a equação “Beta”:

Existe uma fórmula chamada de “equação Beta” que permite o cálculo da temperatura com precisões de +-1% ao longo da faixa de 0 a 100ºC (Fonte: eepower).

Ela recebe este nome, pois depende apenas do parâmetro “Beta” (β) do termistor, que é encontrado no datasheet. Veja abaixo um formato da equação:

T = \frac{T_0 \times B}{T_0\ \times ln(\frac{R_t}{R_0}) + B}

Onde T é a temperatura (em Kelvin) para uma dada resistência Rt; R0 é a resistência a 25ºC; T0 é a temperatura de 25ºC em Kelvin (298,15K) e B é a constante “Beta” do termistor.

  • Utilizando a equação de Steinhart-Hart:

Esta é a terceira e mais precisa forma de se obter a temperatura. O erro desta equação é bem pequeno, podendo ser menor que 0,02ºC para uma ampla faixa de medição da temperatura (200ºC). (Fonte: Wikipedia).

A equação está indicada adiante:

\frac{1}{T} = a + b \times ln(R) + c \times (ln(R))^2 + d \times (ln(R))^3

Onde T é a temperatura (em Kelvin) para uma dada resistência R; a, b e c são coeficientes específicos do NTC em questão obtidos experimentalmente e idealmente expostos no datasheet do componente (veremos mais à frente).

Obs: É comum ver essa formula simplificada sem o termo elevado ao quadrado, mas esse é seu formato original.

PTC

Existe outro tipo de termistor, que é chamado de termistor PTC (Positive Temperature Coeficient – Coeficiente de Temperatura Positivo). Como o PTC possui um coeficiente positivo, sua resistência interna aumenta à medida que sua temperatura também aumenta. Ou seja, seu comportamento é o oposto do NTC.

Por conta disso, ele pode ser utilizado em uma aplicação extremamente útil: fúsivel auto-resetável. Isso, porque o objetivo de um fusível é impedir que ocorra curto-circuito em um circuito. Então, se o PTC for instalado em série com um circuito em curto, o aumento na corrente que passa por ele faz com que sua temperatura interna aumente e, consequentemente, sua resistência. E, se sua resistência aumenta, ele automaticamente faz a corrente que passa por ele diminuir impedindo que o curto ocorra.

Ao contrário do fusível normal, ele não abre o circuito em caso de curto, mas impede que uma grande corrente passe pelo circuito. E, assim que o curto é removido, a corrente do circuito diminui para seu valor padrão, a temperatura do PTC diminui e sua resistência também. Ou seja, o circuito volta ao normal sem precisar trocar o PTC. Por isso ele é “auto-resetável”.

Módulo KY-013

Normalmente os módulos “para Arduino” tem o propósito de facilitar a ligação com os componentes utilizados. No contexto de termistores, a ligação sem o módulo já é bem simples e direta, então o módulo não é tão vantajoso assim em relação à utilização direta do NTC.

O circuito do módulo é constituído de um NTC 3mm e um resistor de 10kΩ. E os dois ficam ligados na configuração de divisor de tensão.

Sobre a pinagem do KY-013, ele possui 3 pinos (veja novamente na imagem abaixo):

  • S (sinal) – Ligação central do divisor de tensão.
  • Vcc – Pino de alimentação (5V normalmente).
    • Não fica indicado na placa, mas é o pino do meio.
  • – (negativo) – Pino de alimentação negativa (GND).

Termistor NTC

Utilizando o termistor NTC com o Arduino

Circuito

O objetivo do código é obter a temperatura a partir da variação da resistência do NTC. Sendo assim, uma forma de medir a resistência, é ligando ela em série com um resistor na configuração de divisor de tensão. Desta forma, variações na resistência provocarão variações de tensão. E estas variações da tensão podem ser lidas por meio dos pinos analógicos do Arduino. Portanto, uma forma de fazer isso está mostrada abaixo:

Ligação com o termistor NTC

O NTC foi ligado em série com um resistor de 10kΩ. Em uma ponta, o resistor foi ligado aos 5V e na outra ponta o NTC foi ligado ao GND. No meio deles, foi feita uma ligação para o pino A0 do Arduino.

Convertendo resistência em temperatura

Para converter a resistência em temperatura, vou utilizar a equação de Steinhart-Hart, que foi comentada no tópico “Fórmulas”. Como não achei os valores dos coeficientes no datasheet do NTC que tenho (MF52 – 10k à 25ºC), vou utilizar os que estão neste link:

A = 0.00102192985237609

B = 0.000241453242427025

C = -0.000000247620754758454

D = 0.000000165394923419592

Não sei dizer se é de fato necessário utilizar tantas casas decimais, mas acredito que ajude na precisão.

Ao invés de pegar os coeficientes “prontos”, você pode calculá-los e, neste link, é possível encontrar uma planilha para ajudar nisso.

Código de exemplo (Steinhart-Hart)

O código de exemplo utiliza a fórmulas discutidas anteriormente. Sendo assim, não pretendo explicá-lo, mas você pode ler os comentários para entender o procedimento corretamente.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <math.h>

// Constantes do termistor
#define A   0.00102192985237609
#define B   0.000241453242427025
#define C   -0.000000247620754758454
#define D   0.000000165394923419592

// Pino analógico para ler o NTC
#define NTC_PIN     A0
// Valor do resistor ligado em série com o NTC
#define RES_SERIE   10000.0

void setup()
{
  // Inicia a comunicação serial (monitor serial)
  Serial.begin(9600);
}

void loop()
{
  float res, temp;

  // Mede o pino analógico e converte em resistência
  // A fórmula está simplificada, mas o passo a passo seria:
  // Converter leitura analógica em tensão -> converter tensão em resistência
  res = RES_SERIE/(1023.0/((float)analogRead(NTC_PIN)) - 1.0);

  // Calcula o ln da resistência para agilizar o cálculo seguinte
  res = log(res);

  // Converte a resistência em temperatura por meio da equação de Steinhart-Hart
  temp = A + B*res + C*res*res + D*res*res*res;
  // Inverte, pois a equação acima é 1/T
  temp = 1.0/temp;
  // Converte de Kelvin para ºC
  temp -= 273.15;
 
  // Imprime o valor
  Serial.print("Temperatura: ");
  Serial.print(temp, 2);
  Serial.println("ºC");
 
  delay(1000);
}

Código de exemplo (Beta)

Resolvi colocar um código de exemplo utilizando a equação “Beta”. O valor de beta foi extraído do datasheet do NTC MF52 (meu caso). Leia os comentários para entender o procedimento.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <math.h>

// Constante do termistor
#define BETA   3950.0

// Pino analógico para ler o NTC
#define NTC_PIN     A0
// Valor do resistor ligado em série com o NTC
#define RES_SERIE   10000.0

void setup()
{
  // Inicia a comunicação serial (monitor serial)
  Serial.begin(9600);
}

void loop()
{
  float res, temp;

  // Mede o pino analógico e converte em resistência
  // A fórmula está simplificada, mas o passo a passo seria:
  // Converter leitura analógica em tensão -> converter tensão em resistência
  res = RES_SERIE/(1023.0/((float)analogRead(NTC_PIN)) - 1.0);

  // Calcula o ln de Rt/R0
  res = log(res/RES_SERIE);

  // Converte a resistência em temperatura por meio da "equação Beta"
  temp = 298.15*BETA/(298.15*res + BETA);
  // Converte de Kelvin para ºC
  temp -= 273.15;
 
  // Imprime o valor
  Serial.print("Temperatura: ");
  Serial.print(temp, 2);
  Serial.println("ºC");
 
  delay(1000);
}