17 de abril de 2025 - Blog Ryndack Componentes
Rua Jovelina Claudino Buhrer, 440 - São José dos Pinhais - PR (41) 3383-3034

Aprenderemos como fazer a leitura analógica de um sensor de temperatura NTC utilizando uma entrada analógica do Arduino. O objetivo deste tutorial é ensinar como descobrir a temperatura em seu ambiente através de um sensor barato e fácil de usar, o NTC.


O termistor NTC é um sensor de temperatura cuja resistência varia conforme o aumento ou diminuição da temperatura, seguindo uma curva e equação conhecidas ( https://pt.wikipedia.org/wiki/Term%C3%ADstor ). NTC significa do Inglês “negative temperature coefficient” ou coeficiente negativo de temperatura. Quer dizer que quando a temperatura aumenta, a resistência dele diminui e vice-versa.


Uma curva característica de NTC é vista na imagem abaixo, para um termistor NTC de aproximadamente 10k Ohm. Sei que é deste valor pois no gráfico abaixo os 25ºC correspondem aproximadamente a 10k Ohm.


Fonte: https://www.researchgate.net/figure/A-typical-NTC-R-T-curve-10k-25C_fig1_310754304


Veja que a resistência cai quase que linearmente (mas não é linear) com o aumento da temperatura. Existe um valor que indica com que “velocidade” esta curva “cai” ou diminui, este valor se chama Beta e é específico para cada termistor. 


O cálculo da temperatura a partir desta resistência é feito utilizando-se uma equação chamada Steinhart-Hart (mais aqui https://www.northstarsensors.com/calculating-temperature-from-resistance ). Esta equação relaciona pontos de “ajuste de curva” com o logaritmo natural “ln” da resistência lida. Para nossa sorte existe um código para Arduino pronto para uso, basta inserirmos alguns valores do nosso sistema/setup.


Hardware necessário


Para experimentar com o termistor NTC, precisaremos de um Arduino qualquer (eu estou utilizando um RA4M1 da SeeedStudio) com entrada analógica, um resistor comum de 10k Ohm e um termistor NTC. Eu adquiri um termistor NTC em formato SMD 0805, modelo B57421V2103J62 com beta 4000 e resistência a 25ºC 10k Ohm.


O diagrama esquemático do teste é visto abaixo. Note que estou utilizando uma placa Arduino que eu mesmo fiz, mas você pode utilizar qualquer outra conectando inclusive no mesmo pino analógico A0.


Fonte: o autor


Fonte: o autor 


Fonte: o autor

As imagens acima trazem o meu Arduino com microcontrolador RA4M1, com destaque para o extremamente pequeno termistor NTC (próximo á inscrição “U3”) ao lado do “grandão” resistor de 10k Ohm.

O código para testes


Implementando as conexões mostradas acima nós podemos então começar a pensar em software para leitura analógica. O primeiro teste que quero fazer é se algum valor está sendo lido na entrada analógica A0, a fim de validar o hardware. Para isso desenvolvi um código inicial para verificar se existe sinal analógico (0-4095 em 12bit).


Se você estiver utilizando os Arduinos “comuns” (UNO, nano, Pro mini, Pro micro) a linha “analogReadResolution(12)” não vai funcionar, visto que a resolução da entrada analógica destes é apenas 10bit fixos. Isto nos traz valores inteiros da entrada analógica entre 0 e 1023 apenas.


void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  analogReadResolution(12);
}


void loop() {
  // put your main code here, to run repeatedly:
  Serial.println(analogRead(A0));
  delay(1000);
}

Basicamente eu faço uma leitura analógica em A0 e jogo para o monitor serial do software do Arduino (Arduino IDE) a cada 1000 milissegundos (1 segundo). Podemos então observar (no meu caso) um valor entre 0 e 4095 variando ao se colocar por exemplo um dedo sobre o sensor.


O código completo


Agora já sabemos que o sensor funciona, pois no passo anterior vimos a variação de valores no monitor serial da IDE do Arduino. Vamos então para o código completo final deste artigo, onde obteremos a temperatura em graus Celsius a partir da leitura analógica do termistor.


Observe que temos um pouco mais de complexidade, cálculos com exponencial e logaritmo natural. Porém nada que o Arduino não dê conta de resolver ou calcular, bem tranquilamente.

 

// Conexão do termistor
const int pinTermistor = A0;
 
// Parâmetros do termistor
const double beta = 4000.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 = 3.3;
const double R = 10000.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 (100);
  }
 
  // 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 (1000);
}




O código ainda faz cinco (50 amostras e calcula a média para ter um valor um pouco mais “limpo” de temperatura. Já dentro da impressão na porta serial (Serial.println(t-273.0)) fazemos uma subtração de 273 unidades para transformar de Kelvin para Celsius. Outra consideração importante é o valor de Vcc que você precisa entrar, coloque 5,00V no caso de usar um Arduino UNO, Nano, Pro mini ou Pro micro.


O resultado final é visto abaixo, em um print que tirei do meu monitor serial da IDE do Arduino. O valor de temperatura em graus Celsius é mostrado a cada um (1) segundo, com duas casas decimais. 



Fonte: o autor


Considerações


O formato do termistor NTC pouco importa (SMD, THT pequeno ou grande, etc), o que importa é conhecer sua resistência em 25ºC e seu valor Beta. Assim podemos aplicar exatamente o código presente neste artigo. 


A velocidade de leitura pode ser aumentada, coloquei 1 segundo apenas para ficar fácil de ver no monitor serial. Na prática a grandeza “temperatura” é bem lenta, não adianta muito colocar velocidades de leitura muito grandes.

0