Medindo temperatura com Arduino: Como usar um Termistor NTC 6

Existem várias opções de sensores para medir temperatura. Neste tutorial vamos conhecer o mais simples deles – o termistor NTC- e como usá-lo junto com um Arduino.

Material necessário

No projeto exemplo deste tutorial utilizamos os seguintes componentes:

Conhecendo o Termistor NTC

Um termistor é um resistor cuja resistência muda conforme a temperatura ambiente. A rigor todo resistor tem o seu valor afetado pela temperatura, mas no termistor queremos que esta variação seja mensurável e previsível. Existem dois tipos de Termistor:

  • O termistor PTC (Positive Temperature Coefficient) é aquele onde aumento da temperatura provoca aumento na resistência; e
  • O termistor NTC (Negative Temperature Coefficient) é aquele onde aumento da temperatura provoca diminuição na resistência.

Para medir temperatura são normalmente utilizados os termistores do tipo NTC. A medição de temperatura requer:

  • A medição da resistência do termistor
  • A conversão da resistência em temperatura

Medição de Resistência com um Arduino

Para medirmos uma resistência com o Arduino vamos convertê-la em uma tensão, que será medida pelo ADC (usando o analogRead()). Para isto montamos um “divisor de tensão” colocando o termistor em série com um resistor de resistência R conhecida (e praticamente fixa na faixa de temperatura a medir):

Medição de Resistência com um Arduino
Medição de Resistência com um Arduino

A corrente que passa pelo termistor é a mesma que passa pelo resistor conhecido (considerando que a corrente que vai para o ADC é muito pequena): I = VCC / (RT + R).  A tensão medida pelo ADC será V = R * I. Resolvendo estas equações para a resistência do termistor:

RT = R * (VCC – V) / V

Conversão da Resistência do Termistor NTC em Temperatura

Infelizmente, a variação de resistência de um termistor com a temperatura não é controlada por uma fórmula simples. O que se utilizam são equações que produzem resultados aproximados (dentro de uma faixa de temperatura) com base em parâmetros específicos para cada componente.

A equação abaixo é a mais comumente usada, e se baseia em um único parâmetro (ß) que costuma ser informado pelo fabricante do termistor:

T = ß * ln (R / RX)

Onde ln é o “logaritmo natural” e RX é obtido a partir de ß e uma equivalência conhecida de resistência (R0) a temperatura(T0):

RX = R0 * exp (- ß / T0)

Nestas fórmulas a temperatura está em graus Kelvin. Para converter para Celsius é necessário subtrair 273.

A Montagem

Nesta montagem foi usado um resistor de 20K com precisão de 1%, sendo possível usar um outro valor na faixa de 10K a 100K, alterando este valor no código. Se você não estiver muito preocupado com precisão, pode usar um resistor comum com 5% de precisão.

O Código

O exemplo abaixo envia as leituras de temperatura para o monitor da IDE. Os parâmetros do termistor no código abaixo foram extraídos do datasheet do termistor para o modelo MF521033600. Para um melhor precisão é usada uma média de várias leituras da tensão.

/*
 * Leitura de temperatura usando um termistor
 */

// Conexão do termistor
const int pinTermistor = A0;

// Parâmetros do termistor
const double beta = 3600.0;
const double r0 = 10000.0;
const double t0 = 273.0 + 25.0;
const double rx = r0 * exp(-beta/t0);

// Parâmetros do circuito
const double vcc = 5.0;
const double R = 20000.0;

// Numero de amostras na leitura
const int nAmostras = 5;

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

// Laço perpétuo
void loop() {
  // Le o sensor algumas vezes
  int soma = 0;
  for (int i = 0; i < nAmostras; i++) {
    soma += analogRead(pinTermistor);
    delay (10);
  }

  // Determina a resistência do termistor
  double v = (vcc*soma)/(nAmostras*1024.0);
  double rt = (vcc*R)/v - R;

  // Calcula a temperatura
  double t = beta / log(rt/rx);
  Serial.println (t-273.0);

  // Dá um tempo entre leituras
  delay (10000);
}

Gostou deste tutorial? Ajude-nos a melhorar o blog comentando abaixo sobre ele.

Faça seu comentário

Acesse sua conta e participe

6 Comentários

  1. Excelente, porém, falta nomear cada linha de codigo, ou seja, funcoes: //
    /*
    const
    void setup
    void loop

  2. boa tarde professor
    tenho o seguinte circuito
    ntc ligado par terra, o outro lado ligado num resistor de 50K, 1%, que esta ligado a uma fonte de 5v de precisão, entre o ntc e o resistor de 50 k, um capacitor de de 100 nF, e a saida para processodor em paralelo com o capacitor, ligando num adc e 12 bits.
    pois estou trabalhando com STM32F103RBT6.

    Então mudei o vcc para 3.3v, numero de divisões de 1024 para 4096, por que o adc é de 12 bits
    e o resistro de 20k para 50k.

    Esta certo ou não?

    1. Benedito, se eu entendi direito a sua montagem, você está medindo a tensão sobre o termistor ao invés de sobre o resistor de valor conhecido. Se for isso mesmo, você precisa acertar as equações:
      V = RT * I
      RT = V*R/(VCC-V)

  3. Gostei do artigo, o resistor fixo deve ser o mais preciso possível

  4. No texto fala que foi usado um resistor de 20k, mas no sketch esta 2000. Qual é o certo?

    const double R = 2000.0;

    1. Sílvio,

      Faltou um zero no código, pode adicionar.

      Abraços!
      Diogo – Equipe MakerHero