Componentes · 19 min de leitura

Termistor NTC com Arduino: ligação, Beta e Steinhart-Hart

Como usar um termistor NTC com Arduino: ligação em divisor de tensão, fórmulas Beta (B3950) e Steinhart-Hart, calibração, termômetro com LCD e código para ESP32 e Pico.

O termistor NTC é um sensor de temperatura barato, de dois terminais, cuja resistência diminui conforme ele esquenta. Para usar um termistor NTC com Arduino, você o liga com um resistor fixo de 10 kΩ formando um divisor de tensão, lê o ponto central em um pino analógico (A0), calcula a resistência do termistor a partir dessa leitura e converte o valor em graus Celsius com a equação Beta. Não precisa de biblioteca, um pino analógico basta e, com tudo bem montado, você chega a 0,1 °C de resolução na temperatura ambiente. A mesa e o hotend das impressoras 3D, as baterias de celulares e notebooks, os aparelhos de ar-condicionado, as geladeiras e os termômetros clínicos digitais também medem a temperatura, na maioria das vezes, com termistores NTC.

Neste artigo você vai aprender, passo a passo, como a resistência de um termistor NTC de 10 kΩ varia com a temperatura, como ligar o divisor de tensão e escolher o resistor fixo, a equação Beta com B = 3950, a equação de Steinhart-Hart, mais precisa, e a calibração em três pontos. Depois você vai montar um termômetro com LCD I2C, repetir a medição com o ADC do ESP32 e do Raspberry Pi Pico e ver a diferença entre NTC e PTC, aplicações em impressoras 3D e baterias e os erros mais comuns.

Termistor NTC tipo disco
Termistor NTC tipo disco: não tem polaridade, então os dois terminais podem ser ligados em qualquer sentido. Esses modelos de corpo grande são usados principalmente para limitar a corrente de partida em fontes de alimentação; para medir temperatura, prefere-se NTCs de 10 kΩ pequenos, em gota de epóxi ou em sonda à prova d'água.

O que é um termistor NTC e como ele funciona?

O nome termistor junta “thermal” (térmico) e “resistor”: é um resistor cujo valor muda bastante com a temperatura. NTC significa Negative Temperature Coefficient, ou coeficiente de temperatura negativo. Ele é feito de uma cerâmica semicondutora obtida pela queima (sinterização) de óxidos metálicos como manganês, níquel e cobalto em alta temperatura. À medida que o material esquenta, mais portadores de carga participam da condução, e a resistência cai. A variação é grande: um NTC com B = 3950 perde cerca de 4,4% da resistência a cada grau em torno de 25 °C. Para comparar, um resistor de filme metálico comum varia apenas 50–100 ppm por grau, ou seja, 0,005–0,01%. Essa alta sensibilidade faz do NTC um sensor barato, mas muito sensível; o preço a pagar é que a relação não é linear.

CaracterísticaNTC típico de 10 kΩ (B3950)
Resistência nominal (R25)10 kΩ a 25 °C; tolerância geralmente de ±1%, ±3% ou ±5%
Valor BB25/50 = 3950 K (±1%); modelos de 3435 K e 3380 K também são comuns
SensibilidadeCerca de −4,4%/°C a 25 °C, cerca de −2,8%/°C a 100 °C
Faixa de operaçãoGota de epóxi: cerca de −40 … +125 °C; tipos encapsulados em vidro: até 250–300 °C
Autoaquecimento (constante de dissipação)Tipicamente 1,5–2 mW/°C em ar parado
Constante de tempo térmicaCerca de 10–20 s para uma gota de epóxi em ar parado
PolaridadeNenhuma; os terminais podem ser invertidos
Tipos de encapsulamentoGota de epóxi, vidro (DO-35), sonda à prova d'água de aço inox, SMD (0402, 0603), disco

Resistência x temperatura: por que não é linear?

A resistência do NTC varia de forma exponencial com a temperatura: cai muito rápido no frio e mais devagar no calor. A tabela abaixo mostra a resistência de um NTC de 10 kΩ e B = 3950 calculada com a equação Beta, além da tensão e do valor de analogRead que você verá no pino A0 do Arduino Uno quando esse NTC estiver no braço superior de um divisor de tensão de 10 kΩ alimentado por 5 V (a ligação da próxima seção). A última coluna mostra quantos graus correspondem a um degrau do ADC, ou seja, a resolução da medição. As tabelas reais dos fabricantes podem diferir desses valores em alguns por cento, principalmente nas extremidades da faixa.

TemperaturaResistência do NTCTensão em A0 (5 V)analogReadUm degrau ≈
−20 °C105,4 kΩ0,433 V890,20 °C
0 °C33,6 kΩ1,146 V2350,10 °C
10 °C20,2 kΩ1,657 V3390,09 °C
20 °C12,5 kΩ2,219 V4540,09 °C
25 °C10,0 kΩ2,500 V5120,09 °C
30 °C8,04 kΩ2,772 V5670,09 °C
40 °C5,30 kΩ3,268 V6690,11 °C
50 °C3,59 kΩ3,680 V7530,13 °C
60 °C2,49 kΩ4,004 V8190,17 °C
80 °C1,27 kΩ4,436 V9080,31 °C
100 °C698 Ω4,674 V9560,57 °C
125 °C359 Ω4,827 V9881,17 °C

A tabela leva a duas conclusões importantes. Primeiro, o divisor de tensão é mais sensível quando a resistência do NTC é igual à do resistor fixo, o que neste exemplo acontece por volta de 25 °C: ali, A0 varia cerca de 55 mV por grau e até o Uno de 10 bits mede em degraus de 0,09 °C. Isso é cinco vezes melhor que o LM35, que dá só 0,49 °C de resolução com a referência de 5 V. Segundo, a resolução piora à medida que você se afasta desse ponto; um degrau passa a valer 0,57 °C a 100 °C e 1,2 °C a 125 °C. Por isso, escolha o resistor fixo perto da resistência do NTC na temperatura que você mais vai medir. Para obter a maior excursão de A0 em uma faixa específica, o resistor fixo deve ser a média geométrica das resistências do NTC nas duas extremidades da faixa: para 0–100 °C, √(33,6 kΩ × 0,70 kΩ) ≈ 4,8 kΩ, ou seja, um 4,7 kΩ padrão; para 60–100 °C, cerca de 1,3 kΩ, ou seja, 1,2 kΩ ou 1,5 kΩ.

Ligação do termistor NTC: divisor de tensão (Uno, ESP32, Pico)

As entradas analógicas do Arduino medem tensão, não resistência. Por isso você coloca o NTC em série com um resistor fixo, formando um divisor de tensão: a tensão no ponto onde os dois resistores se encontram varia com a resistência do NTC e, portanto, com a temperatura. É exatamente o mesmo circuito usado com um LDR; a única diferença é que o resistor reage à temperatura em vez da luz. Nos códigos deste artigo, o NTC fica no braço superior (ligado à alimentação) e o resistor de 10 kΩ no braço inferior (ligado ao GND), então a leitura sobe conforme esquenta, o que é intuitivo. Você pode calcular a tensão de saída para diferentes valores de resistor na ferramenta Divisor de tensão e conferir o código de cores do resistor fixo com a ferramenta Código de cores.

LigaçãoArduino UnoESP32Raspberry Pi Pico
Terminal 1 do NTC5V3V33V3(OUT), pino 36
Terminal 2 do NTC + uma ponta do resistor de 10 kΩA0GPIO 34 (ADC1)GP26 / ADC0, pino 31
Outra ponta do resistor de 10 kΩGNDGNDAGND, pino 33
Capacitor de 100 nF (opcional)Entre A0 e GNDEntre GPIO 34 e GNDEntre GP26 e AGND
LigaçãoTensão em A0Resistência do NTC (10 bits)analogRead ao esquentar
NTC em cima: 5V – NTC – A0 – 10 kΩ – GNDVcc × Rs / (Rs + Rntc)Rntc = Rs × (1023 − adc) / adcSobe
NTC embaixo: 5V – 10 kΩ – A0 – NTC – GNDVcc × Rntc / (Rs + Rntc)Rntc = Rs × adc / (1023 − adc)Desce
Os dois erros mais comuns são estes: primeiro, ligar o NTC diretamente entre 5V e A0, sem o resistor fixo; aí A0 lê 1023 seja qual for a temperatura. Segundo, montar o circuito de um jeito e usar a fórmula da outra ligação; nesse caso a temperatura parece cair quando esquenta, ou aparecem valores sem sentido. No ESP32 e no Pico, nunca alimente o divisor pelo 5V: com o NTC no lado de cima, a tensão no pino passa de 3,3 V por volta de 41 °C, e se o NTC entrar em curto, os 5 V inteiros chegam ao pino; as duas situações podem danificar a entrada do ADC de 3,3 V.

Esse circuito tem uma propriedade interessante: ele faz uma medição raciométrica. Por padrão, o ADC do Uno usa a alimentação de 5 V como referência, e o divisor é alimentado pelos mesmos 5 V. Mesmo que o USB entregue 4,8 V em vez de 5,0 V, a saída do divisor e a referência do ADC caem na mesma proporção e o valor de analogRead não muda. Por isso, você não precisa saber a tensão de alimentação para ler um NTC, nem brigar com a tensão de referência como no LM35. Pelo mesmo motivo, não use analogReference(INTERNAL) em um circuito com NTC: com referência de 1,1 V, a proporção se perde e o cálculo dá errado. O que realmente define a precisão é o valor do resistor fixo; um resistor de 5% sozinho pode causar cerca de 1 °C de erro. Então use um resistor de filme metálico de 1%, ou meça o valor real do seu resistor com um multímetro e coloque esse valor no código.

Cálculo da temperatura com a equação Beta (B = 3950)

Os fabricantes descrevem um NTC com dois números: a resistência a 25 °C (R0 = 10 kΩ) e o valor B (Beta). Com esses dois números, a equação Beta dá a temperatura para qualquer resistência: 1/T = 1/T0 + (1/B) × ln(R/R0). Aqui T e T0 estão em kelvin (T0 = 25 + 273,15 = 298,15 K) e ln é o logaritmo natural; para converter o resultado em Celsius, subtraia 273,15. Exemplo: se o NTC medir 5300 Ω, ln(5300/10000) = −0,635; 1/T = 0,003354 − 0,000161 = 0,003193 e T = 313,2 K, ou seja, cerca de 40 °C. Os números pequenos ao lado do valor B indicam entre quais duas temperaturas ele foi medido: B25/50 = 3950 significa que B foi calculado a partir das resistências a 25 °C e 50 °C. Se você não tiver o datasheet, pode descobrir o B por conta própria: meça a resistência em duas temperaturas e use B = ln(R1/R2) / (1/T1 − 1/T2). Por exemplo, se medir 10.000 Ω a 25 °C e 3588 Ω a 50 °C, você obtém B ≈ 3950.

Primeira medição com Arduino, passo a passo

  1. Encaixe o NTC e o resistor de 10 kΩ na protoboard; ligue um terminal do NTC ao 5V e o outro a uma ponta do resistor.
  2. Ligue a outra ponta do resistor ao GND e passe um jumper do ponto onde o NTC e o resistor se encontram até o A0.
  3. Carregue o código abaixo e abra o Monitor Serial a 9600 baud.
  4. Na temperatura ambiente, você deve ver um valor em torno de 20–25 °C. Segure o NTC entre dois dedos; em poucos segundos o valor deve subir em direção a 30 °C.
  5. Se o valor cair quando esquenta, o NTC e o resistor estão trocados: corrija a ligação ou substitua a fórmula do código pela fórmula “NTC embaixo”.
C++ (Arduino IDE)
1const int NTC_PIN = A0;            // NTC ile 10k direncin birleştiği nokta / junction of the NTC and the 10k resistor
2const float SERIES_R = 10000.0;    // sabit direnç, ölçtüğün değeri yaz / fixed resistor, write your measured value
3const float R_NOMINAL = 10000.0;   // NTC'nin 25 °C'deki direnci / NTC resistance at 25 °C
4const float T_NOMINAL_K = 298.15;  // 25 °C kelvin cinsinden / 25 °C in kelvin
5const float BETA_K = 3950.0;       // B25/50 değeri (veri sayfası) / B25/50 value (datasheet)
6const int SAMPLES = 16;            // ortalama için ölçüm sayısı / number of samples to average
7
8void setup() {
9  Serial.begin(9600);
10}
11
12void loop() {
13  long sum = 0;
14  for (int i = 0; i < SAMPLES; i++) {
15    sum += analogRead(NTC_PIN);
16    delay(2);
17  }
18  float adc = sum / (float)SAMPLES;                      // ortalama ham değer / average raw value
19
20  if (adc < 1.0 || adc > 1022.0) {                       // kablo kopuk ya da kısa devre / open or shorted wire
21    Serial.println(F("Sensor hatasi / Sensor error"));
22    delay(1000);
23    return;
24  }
25
26  float rNtc = SERIES_R * (1023.0 - adc) / adc;          // NTC üstte bağlantı / NTC on the high side
27  float tempK = 1.0 / (1.0 / T_NOMINAL_K + log(rNtc / R_NOMINAL) / BETA_K);   // Beta denklemi / Beta equation
28  float tempC = tempK - 273.15;                          // kelvin -> santigrat / kelvin -> Celsius
29
30  Serial.print(F("ADC: "));
31  Serial.print(adc, 1);
32  Serial.print(F("  R: "));
33  Serial.print(rNtc, 0);
34  Serial.print(F(" ohm  Sicaklik / Temp: "));
35  Serial.print(tempC, 2);
36  Serial.println(F(" C"));
37  delay(1000);
38}

A cada medição, o código lê o A0 dezesseis vezes e tira a média; isso suaviza a oscilação de um ou dois degraus do ADC. Se a média ficar abaixo de 1 ou acima de 1022, o fio do NTC está rompido ou em curto, e o código mostra uma mensagem de erro em vez de uma temperatura sem sentido. Em seguida, ele calcula a resistência do NTC a partir da média e, com ela, a temperatura pela equação Beta. No Arduino, a função log() retorna o logaritmo natural (ln); log10() é o logaritmo na base 10, e confundir os dois deixa o resultado completamente errado à medida que você se afasta de 25 °C. No Monitor Serial você verá linhas como “ADC: 512.3 R: 9969 ohm Sicaklik / Temp: 25.07 C”.

A equação de Steinhart-Hart: um resultado mais preciso

A equação Beta é muito boa dentro da faixa em que o B foi medido (geralmente 25–50 °C), mas se desvia à medida que você se afasta dela, porque o valor B de um NTC real varia um pouco com a temperatura. Em uma faixa ampla como 0–100 °C, o erro pode passar de 1 °C. Para um resultado mais preciso, usa-se a equação de Steinhart-Hart, com três coeficientes: 1/T = A + B × ln(R) + C × (ln R)³. A equação Beta é, na verdade, o caso particular dessa equação com C = 0. Os coeficientes são calculados a partir de três valores de resistência medidos em três temperaturas diferentes; com três pontos bem escolhidos, a equação fica tipicamente melhor que 0,1 °C dentro da faixa calibrada. Em vez de resolver A, B e C à mão, o código abaixo calcula os coeficientes a partir dos seus três pontos medidos, dentro do setup().

C++ (Arduino IDE)
1const int NTC_PIN = A0;
2const float SERIES_R = 10000.0;    // ölçtüğün sabit direnç / your measured fixed resistor
3
4// Kalibrasyon noktaları: örnek değerler, kendi ölçümlerini yaz / calibration points: sample values, use your own
5const float CAL_T1 = 0.0,  CAL_R1 = 32900.0;   // buzlu su / ice water
6const float CAL_T2 = 25.0, CAL_R2 = 10000.0;   // oda, referans termometreyle / room, against a reference thermometer
7const float CAL_T3 = 98.5, CAL_R3 = 690.0;     // kaynayan su / boiling water
8
9float shA, shB, shC;               // Steinhart-Hart katsayıları / coefficients
10
11void computeCoefficients() {
12  float L1 = log(CAL_R1), L2 = log(CAL_R2), L3 = log(CAL_R3);
13  float Y1 = 1.0 / (CAL_T1 + 273.15);
14  float Y2 = 1.0 / (CAL_T2 + 273.15);
15  float Y3 = 1.0 / (CAL_T3 + 273.15);
16  float g2 = (Y2 - Y1) / (L2 - L1);
17  float g3 = (Y3 - Y1) / (L3 - L1);
18  shC = ((g3 - g2) / (L3 - L2)) / (L1 + L2 + L3);
19  shB = g2 - shC * (L1 * L1 + L1 * L2 + L2 * L2);
20  shA = Y1 - (shB + shC * L1 * L1) * L1;
21}
22
23float readResistance() {
24  long sum = 0;
25  for (int i = 0; i < 16; i++) {
26    sum += analogRead(NTC_PIN);
27    delay(2);
28  }
29  float adc = sum / 16.0;
30  if (adc < 1.0 || adc > 1022.0) return -1.0;            // sensör hatası / sensor error
31  return SERIES_R * (1023.0 - adc) / adc;                // NTC üstte / NTC on the high side
32}
33
34void setup() {
35  Serial.begin(9600);
36  computeCoefficients();           // katsayıları bir kez hesapla / compute the coefficients once
37}
38
39void loop() {
40  float r = readResistance();
41  if (r < 0) {
42    Serial.println(F("Sensor hatasi / Sensor error"));
43  } else {
44    float lnR = log(r);
45    float tempK = 1.0 / (shA + shB * lnR + shC * lnR * lnR * lnR);   // Steinhart-Hart
46    Serial.print(F("R: "));
47    Serial.print(r, 0);
48    Serial.print(F(" ohm  Sicaklik / Temp: "));
49    Serial.print(tempK - 273.15, 2);
50    Serial.println(F(" C"));
51  }
52  delay(1000);
53}

Os três pontos do código são exemplos; meça o seu próprio NTC e substitua os valores. Com esses valores de exemplo, Steinhart-Hart dá o resultado exato a 0 °C, 25 °C e 98,5 °C. Já se você colocar as mesmas resistências na equação Beta (B = 3950), o ponto de 0 °C sai como 0,4 °C e o de 98,5 °C como 100,4 °C, um erro de cerca de 2 °C em alta temperatura. Escolha pontos nas duas extremidades e no meio da faixa que você vai medir; fora da faixa calibrada (por exemplo, a −20 °C com esses coeficientes) o erro volta a crescer. No Uno, um float tem só 32 bits, mas isso basta para esse cálculo: os resultados coincidem com um cálculo de precisão dupla dentro de 0,01 °C.

Calibração: transforme seu NTC em um termômetro confiável

  1. Meça o resistor fixo: meça o valor real do resistor de 10 kΩ com um multímetro e coloque-o em SERIES_R no código; um desvio de 1% sozinho significa cerca de 0,2 °C de erro.
  2. Deixe o NTC à prova d'água: não mergulhe um NTC de epóxi desprotegido na água; isole os terminais com tubo termorretrátil e silicone, ou use um NTC pronto em sonda de aço inox.
  3. Ponto de 0 °C: encha um copo até a borda com gelo picado, adicione um pouco de água gelada e mexa. Mantenha o NTC no meio do copo por 2–3 minutos e, quando o valor estabilizar, anote o valor de R no Monitor Serial.
  4. Ponto de temperatura ambiente: deixe o NTC ao lado de um termômetro digital confiável por 10 minutos, em um lugar sem corrente de ar; anote a leitura do termômetro e a resistência do NTC.
  5. Ponto de alta temperatura: ao nível do mar, a água ferve a 100 °C, mas o ponto de ebulição cai cerca de 1 °C a cada 300 m de altitude (cerca de 96,7 °C a 1000 m). Mergulhe o NTC na água fervendo sem encostar no fundo da panela e anote a resistência.
  6. Coloque os valores no código: insira os três pontos no código de Steinhart-Hart. Se você só vai medir em torno da temperatura ambiente, uma correção de offset em um único ponto (subtrair a diferença constante) muitas vezes já basta.
Saber de onde vem o erro mostra onde vale a pena investir esforço. Para um NTC de 10 kΩ, B3950: uma tolerância de R25 de ±1% significa cerca de ±0,2 °C; uma tolerância de B de ±1% significa ±0,2 °C a 0 °C e ±0,9 °C a 100 °C. Em um divisor de 5 V e 10 kΩ, o NTC dissipa no máximo 0,625 mW e se autoaquece cerca de 0,3–0,4 °C em ar parado. Para reduzir isso, você pode alimentar o divisor por um pino digital em vez do 5V e colocá-lo em HIGH só durante a medição, ou usar um NTC de 100 kΩ com um resistor fixo de 100 kΩ. Neste último caso, adicione um capacitor de 100 nF entre A0 e GND, porque o ADC do ATmega328P foi projetado para uma impedância de fonte de cerca de 10 kΩ ou menos.

Termômetro NTC com display LCD

Para mostrar a leitura sem computador, vamos adicionar um LCD I2C 16x2. Ligue o pino SDA do display ao A4, o SCL ao A5, o VCC ao 5V e o GND ao GND; o circuito do NTC continua igual. O código usa a biblioteca LiquidCrystal I2C, que você pode instalar pelo Gerenciador de Bibliotecas. O endereço do display costuma ser 0x27, e em alguns módulos 0x3F. Para o símbolo de grau, imprimimos o caractere 223 da tabela de caracteres do LCD. Na linha de baixo, o display também mostra a menor e a maior temperatura medidas desde que o Arduino foi ligado.

Display LCD I2C 2x16
LCD I2C 16x2: graças ao módulo I2C na parte de trás, ele se liga com apenas 4 fios (GND, VCC, SDA, SCL); o trimpot azul ajusta o contraste.
C++ (Arduino IDE)
1#include <Wire.h>
2#include <LiquidCrystal_I2C.h>
3
4LiquidCrystal_I2C lcd(0x27, 16, 2);   // adres 0x27 ya da 0x3F / address 0x27 or 0x3F
5
6const int NTC_PIN = A0;
7const float SERIES_R = 10000.0;
8const float R_NOMINAL = 10000.0;
9const float T_NOMINAL_K = 298.15;
10const float BETA_K = 3950.0;
11
12float minC = 999.0;                   // en düşük değer / lowest value
13float maxC = -999.0;                  // en yüksek değer / highest value
14
15float readTempC() {
16  long sum = 0;
17  for (int i = 0; i < 16; i++) {
18    sum += analogRead(NTC_PIN);
19  }
20  float adc = sum / 16.0;
21  if (adc < 1.0 || adc > 1022.0) return NAN;             // sensör hatası / sensor error
22  float r = SERIES_R * (1023.0 - adc) / adc;
23  return 1.0 / (1.0 / T_NOMINAL_K + log(r / R_NOMINAL) / BETA_K) - 273.15;
24}
25
26void setup() {
27  lcd.init();
28  lcd.backlight();
29}
30
31void loop() {
32  float t = readTempC();
33  lcd.clear();
34  if (isnan(t)) {
35    lcd.print(F("Sensor hatasi"));
36  } else {
37    if (t < minC) minC = t;
38    if (t > maxC) maxC = t;
39    lcd.print(F("Sicaklik "));
40    lcd.print(t, 1);
41    lcd.print((char)223);             // derece işareti / degree symbol
42    lcd.print('C');
43    lcd.setCursor(0, 1);              // ikinci satır / second row
44    lcd.print(F("Min"));
45    lcd.print(minC, 1);
46    lcd.print(F(" Max"));
47    lcd.print(maxC, 1);
48  }
49  delay(1000);
50}

Termistor NTC com ESP32

O ADC do ESP32 é de 12 bits (0–4095) e o chip funciona com 3,3 V, então alimente o divisor pelo pino 3V3. Ligue o NTC sempre em um pino ADC1 (GPIO 32–39); os pinos ADC2 não podem ser lidos com o Wi-Fi ligado. Você pode ver o mapa de pinos da sua placa na ferramenta Pinagem. Há uma diferença importante aqui: o ADC do ESP32 não usa a tensão de alimentação como referência, e sim uma referência interna de cerca de 1,1 V mais a atenuação selecionada. Então a medição raciométrica que você tem no Uno não acontece automaticamente, e você precisa saber o valor real da linha de 3V3. Por isso, o código lê milivolts com analogReadMilliVolts(), que usa os dados de calibração gravados no chip na fábrica, e calcula a resistência a partir do valor de 3V3 que você mediu com o multímetro. Segundo a documentação da Espressif, o ESP32 clássico consegue medir 150–3100 mV com a atenuação padrão de 11 dB, mas a região recomendada e mais linear é 150–2450 mV. Esses limites definem a faixa de temperatura que você pode medir, dependendo da ligação:

Ligação (3,3 V, 10 kΩ)150–2450 mV (mais preciso)150–3100 mV (faixa completa)
NTC em cima: 3V3 – NTC – GPIO 34 – 10 kΩ – GNDCerca de −30 … +50 °CCerca de −30 … +100 °C
NTC embaixo: 3V3 – 10 kΩ – GPIO 34 – NTC – GNDCerca de +3 … +114 °CCerca de −26 … +114 °C
C++ (Arduino IDE)
1const int NTC_PIN = 34;            // ADC1_CH6, Wi-Fi açıkken de çalışır / works while Wi-Fi is on
2const float VCC_MV = 3300.0;       // 3V3 pinini multimetreyle ölçüp yaz / measure the 3V3 pin and write it here
3const float SERIES_R = 10000.0;
4const float R_NOMINAL = 10000.0;
5const float T_NOMINAL_K = 298.15;
6const float BETA_K = 3950.0;
7const int SAMPLES = 64;            // ortalama için ölçüm sayısı / number of samples to average
8
9void setup() {
10  Serial.begin(115200);
11  analogReadResolution(12);                     // 0–4095
12  analogSetPinAttenuation(NTC_PIN, ADC_11db);   // varsayılan zayıflatma / default attenuation
13}
14
15void loop() {
16  uint32_t sum = 0;
17  for (int i = 0; i < SAMPLES; i++) {
18    sum += analogReadMilliVolts(NTC_PIN);       // kalibre edilmiş mV / calibrated millivolts
19    delay(1);
20  }
21  float mv = sum / (float)SAMPLES;
22
23  if (mv < 150.0 || mv > 3100.0) {              // ADC aralığı dışında / outside the ADC range
24    Serial.println("Aralik disi / Out of range");
25    delay(1000);
26    return;
27  }
28
29  float rNtc = SERIES_R * (VCC_MV - mv) / mv;   // NTC üstte / NTC on the high side
30  float tempC = 1.0 / (1.0 / T_NOMINAL_K + log(rNtc / R_NOMINAL) / BETA_K) - 273.15;
31  Serial.printf("Gerilim / Voltage: %.0f mV  R: %.0f ohm  Sicaklik / Temp: %.2f C\n", mv, rNtc, tempC);
32  delay(1000);
33}

Para um termômetro interno ou externo, a ligação com o NTC em cima é a ideal. Se você vai medir acima de 50 °C, por exemplo uma chaleira elétrica, uma cafeteira ou a mesa de uma impressora 3D, passe o NTC para o braço inferior e mude a fórmula para Rntc = Rs × mV / (Vcc − mV). Com o Wi-Fi ligado, os picos de corrente do ESP32 causam pequenas oscilações na linha de 3V3; tirar a média de 64 leituras e colocar um capacitor de 100 nF entre o GPIO 34 e o GND melhora o resultado de forma visível. Se você está começando com o ESP32, leia o artigo O que é o ESP32 para fazer a configuração.

NTC com Raspberry Pi Pico e MicroPython

O ADC de 12 bits do Pico fica nos pinos GP26, GP27 e GP28; no MicroPython, read_u16() retorna o resultado em escala de 0–65535. A referência do ADC do Pico (ADC_VREF) é obtida na própria placa a partir da linha de 3,3 V, por meio de um pequeno filtro RC. Se você também alimentar o divisor pelo pino 3V3(OUT), a medição fica aproximadamente raciométrica, como no Uno, e a fórmula continua a mesma; basta usar 65535 no lugar de 1023. O ADC do Pico é um pouco ruidoso e dá pequenos saltos em certos códigos, então tirar a média é essencial aqui também. Usar o AGND (pino 33) como terra analógico reduz um pouco o ruído. Se é a primeira vez que você usa o Pico, a instalação do MicroPython está no artigo O que é o Raspberry Pi Pico.

MicroPython
1from machine import ADC
2import math
3import time
4
5ntc = ADC(26)                # GP26 = ADC0, fiziksel pin 31 / physical pin 31
6SERIES_R = 10000             # sabit direnç / fixed resistor
7R_NOMINAL = 10000            # NTC'nin 25 °C'deki direnci / NTC resistance at 25 °C
8T_NOMINAL_K = 298.15         # 25 °C kelvin cinsinden / 25 °C in kelvin
9BETA_K = 3950                # B25/50 değeri / B25/50 value
10SAMPLES = 64                 # ortalama için ölçüm sayısı / number of samples to average
11
12
13def read_temp_c():
14    total = 0
15    for _ in range(SAMPLES):
16        total += ntc.read_u16()          # 0–65535
17    raw = total / SAMPLES
18    if raw < 100 or raw > 65435:
19        return None                      # kopuk ya da kısa devre / open or shorted
20    r_ntc = SERIES_R * (65535 - raw) / raw          # NTC üstte / NTC on the high side
21    temp_k = 1 / (1 / T_NOMINAL_K + math.log(r_ntc / R_NOMINAL) / BETA_K)
22    return temp_k - 273.15
23
24
25while True:
26    t = read_temp_c()
27    if t is None:
28        print("Sensor hatasi / Sensor error")
29    else:
30        print("Sicaklik / Temp: {:.2f} C".format(t))
31    time.sleep(1)

No MicroPython, math.log() também é o logaritmo natural, então você usa a mesma fórmula do código do Arduino. O Pico também tem um sensor de temperatura interno (ADC(4)), mas ele mede a temperatura do próprio chip, não do ambiente, e costuma marcar alguns graus a mais durante o funcionamento. Para a temperatura ambiente, um NTC externo é muito mais preciso. Se quiser usar os coeficientes de Steinhart-Hart, você pode traduzir a função computeCoefficients() do código do Arduino para Python em poucas linhas.

NTC x PTC: qual é a diferença?

Nos termistores PTC (Positive Temperature Coefficient), a resistência aumenta com a temperatura. O tipo mais comum de PTC é usado para proteção, não para medição: PTCs de chaveamento feitos de cerâmica de titanato de bário mantêm resistência baixa até certa temperatura (o ponto de Curie) e, acima dela, a resistência salta de repente centenas ou milhares de vezes. As proteções contra superaquecimento em enrolamentos de motores e os aquecedores PTC autolimitantes funcionam por esse princípio. Os fusíveis rearmáveis de polímero (polyfuses) se comportam de forma parecida; o fusível de 500 mA na linha USB do Arduino Uno é um deles. Já sensores PTC de silício como o KTY81 variam de forma quase linear, cerca de 0,7–0,8%/°C. RTDs de platina como o PT100 e o PT1000 também têm coeficiente positivo, mas são sensores metálicos, não termistores; eles medem 100 Ω ou 1000 Ω a 0 °C, podem passar de 500 °C e precisam de um amplificador como o MAX31865 para serem lidos.

CaracterísticaTermistor NTCPTC de chaveamentoPT100 / PT1000 (RTD)
Resistência ao esquentarDiminui (cerca de −4,4%/°C a 25 °C)Varia pouco e depois salta na temperatura de chaveamentoAumenta (cerca de +0,385%/°C)
CurvaExponencial, não linearSalto repentino (como uma chave)Quase linear
Faixa típica−40 … +125 °C (250–300 °C em vidro)Temperatura de chaveamento escolhida conforme o modelo (ex.: 80 °C, 120 °C)−200 … +500 °C ou mais
Uso principalMedição de temperatura, limitação da corrente de partidaProteção contra superaquecimento e sobrecorrenteMedição industrial de precisão
Leitura com ArduinoDivisor de tensão + pino analógicoGeralmente não é usado para mediçãoCom um módulo amplificador como o MAX31865
PreçoMuito baratoBaratoMais caro

Aplicações em impressoras 3D e baterias

Nas impressoras 3D, tanto a temperatura do hotend quanto a da mesa são medidas, na maioria das vezes, com termistores NTC. Aqui se usam NTCs de 100 kΩ em vez de 10 kΩ, porque a 250 °C um NTC de 10 kΩ cai para cerca de 35 Ω e a medição perde a resolução; o arquivo de configuração do popular firmware Marlin chega a avisar, sobre o termistor genérico de 10 kΩ: “do not use for a hotend, it gives bad resolution at high temp” (não use no hotend, a resolução é ruim em alta temperatura). Em placas de 8 bits como a RAMPS, as entradas de termistor têm pull-up de 4,7 kΩ para 5 V, e o Marlin converte o valor do ADC em temperatura usando tabelas prontas; um dos tipos definidos para termistores de 100 kΩ B3950 é o número 11. Se o fio do termistor romper, o ADC lê o valor máximo, o firmware interpreta isso como frio extremo e mostra Err: MINTEMP; com um curto-circuito, aparece Err: MAXTEMP. Se o termistor escapar do encaixe, o aquecedor continua aquecendo, mas o valor medido não sobe; o Marlin detecta isso com a proteção THERMAL RUNAWAY e desliga os aquecedores. Nunca desative essa proteção.

Células de íon-lítio não devem ser carregadas abaixo de 0 °C nem acima de cerca de 45 °C; carregar no frio faz lítio metálico se acumular dentro da célula e causa danos permanentes. Por isso, a maioria das baterias de celulares, notebooks e bicicletas elétricas tem um NTC colado nas células, e o terceiro terminal do conector da bateria (marcado T ou NTC) geralmente vai para esse termistor. O pino 1 (TEMP) do popular CI carregador TP4056 serve exatamente para isso: segundo o datasheet, se a tensão nesse pino ficar abaixo de 45% ou acima de 80% da tensão de entrada por mais de 0,15 segundo, a carga é suspensa. No seu próprio projeto com bateria, você pode colar um NTC na célula, lê-lo com um Arduino e cortar o circuito de carga com um MOSFET quando a temperatura sair dos limites. Nas fontes de alimentação, NTCs grandes tipo disco limitam a corrente de partida que flui para os capacitores quando o aparelho é ligado; conforme esquentam, a resistência cai de alguns ohms para menos de um ohm, então eles causam pouquíssima perda no funcionamento normal.

Módulo carregador de Li-ion TP4056
Módulo carregador TP4056 com entrada USB-C e circuito de proteção: o pino TEMP do CI pode monitorar a temperatura da célula com um NTC; na maioria dos módulos prontos esse pino está ligado ao GND, o que desativa a função.

Ideias de projetos com termistor NTC

  • Termostato de ventoinha com histerese: ligue uma ventoinha com um módulo relé quando a temperatura passar de 30 °C e desligue quando cair para 28 °C; a diferença de 2 graus impede que o relé fique ligando e desligando o tempo todo.
  • Termômetro de aquário com sonda à prova d'água: meça a temperatura da água com uma sonda NTC de aço inox e acione um buzzer se o aquecedor falhar.
  • Termômetro de bolso com display OLED: mostre a temperatura e um gráfico da última hora em um display OLED.
  • Monitor do gabinete da impressora 3D: meça a temperatura dentro do gabinete fechado e ligue uma ventoinha de exaustão acima de 45 °C.
  • Guarda de temperatura da bateria: acompanhe a temperatura da célula durante a carga, corte a carga fora da faixa de 0–45 °C e avise com um LED.
  • Registrador de temperatura com Wi-Fi: com um ESP32, grave uma leitura por minuto em um cartão SD ou mostre-a em uma página web que você abre no celular.

Erros comuns e como corrigir

SintomaCausa provávelSolução
O valor é sempre 1023 ou 0Falta o resistor fixo, fio rompido ou NTC em curtoVerifique o divisor; a 25 °C o multímetro deve mostrar cerca de 2,5 V no A0
A temperatura cai quando esquentaNTC e resistor fixo estão trocadosCorrija a ligação ou use a fórmula da outra ligação
O resultado é −273,15 °C, inf ou nananalogRead retorna 0 e causa uma divisão por zeroVerifique o fio; não remova do código a verificação de faixa
Correto perto de 25 °C, muito errado mais longeUso de log10() em vez de ln, ou valor B errado (ex.: 3950 em um NTC de 3435)Use log() e coloque o valor B do datasheet do NTC
O valor fica sempre 1–2 °C acimaAutoaquecimento, ou NTC perto do regulador ou do módulo ESP32Alimente o divisor só durante a medição e afaste o NTC da placa com um cabo
As leituras oscilamRuído, fios longos ou mau contato na protoboardTire a média das leituras, adicione um capacitor de 100 nF, trance os fios
Valores sem sentido no ESP32 no frio ou no calorA tensão está fora da região linear de 150–2450 mV do ADCEscolha a ligação de acordo com a sua faixa (veja a tabela do ESP32)
A leitura no ESP32 falha quando o Wi-Fi ligaO NTC está em um pino ADC2Use um dos pinos ADC1, GPIO 32–39
Resposta muito lentaMassa térmica de uma sonda ou invólucro grossoÉ normal; para resposta rápida escolha uma gota de epóxi fina ou um NTC SMD
Se você não consegue decidir entre um NTC, o LM35 e o DS18B20, pense assim: o NTC é o sensor mais barato, o que reage mais rápido e o que tem mais opções de encapsulamento, mas a precisão depende da calibração. O DS18B20 já vem de fábrica com ±0,5 °C de precisão, a saída digital continua confiável mesmo com cabos longos e vários sensores podem compartilhar um pino. O LM35 tem saída analógica linear, mas precisa de pelo menos 4 V. Para uma comparação detalhada, veja a comparação de sensores de temperatura e, para entender a fundo como o ADC funciona, o artigo sobre conversão analógico-digital.

O termistor NTC ensina a transformar uma peça barata em um termômetro preciso com um único resistor e algumas linhas de matemática: divisor de tensão, ADC, logaritmos e calibração, tudo junto. Você vai usar a mesma abordagem com outros sensores analógicos mais adiante; para deixar suas leituras ainda mais suaves, dê uma olhada nas técnicas de filtragem de dados de sensores. No app BlueGrays você encontra medição de temperatura com NTC e LCD 2x16, temperatura e umidade com o DHT11, uma estação de temperatura com ESP32 e LCD e um registrador de temperatura, cada um com esquemas do circuito passo a passo e código pronto para usar.

Perguntas frequentes

Para que serve um termistor NTC?

O termistor NTC é um resistor semicondutor cuja resistência diminui quando a temperatura aumenta. Ele é usado principalmente para medir temperatura: impressoras 3D, aparelhos de ar-condicionado, geladeiras, packs de bateria e termômetros digitais geralmente medem a temperatura com um NTC. Os tipos grandes em disco são usados para limitar a corrente de partida em fontes de alimentação.

Como testar um termistor NTC com multímetro?

Coloque o multímetro na escala de resistência e meça entre os dois terminais do NTC; um NTC de 10 kΩ deve marcar cerca de 10 kΩ a 25 °C e cerca de 12,5 kΩ a 20 °C. Depois segure o NTC entre os dedos: a resistência deve cair claramente em poucos segundos. Se o display mostrar OL (circuito aberto) ou um valor próximo de zero, o termistor está com defeito.

Qual é a diferença entre NTC e PTC?

A resistência do NTC diminui quando ele esquenta, enquanto a do PTC aumenta. Os NTCs são usados principalmente para medir temperatura e limitar a corrente de partida. Os PTCs mais comuns são componentes de proteção cuja resistência salta de repente em certa temperatura; as proteções contra superaquecimento de motores e os aquecedores autolimitantes funcionam assim.

Que resistor devo usar com um termistor NTC de 10k?

Se você vai medir em torno da temperatura ambiente, use um resistor igual ao valor do NTC a 25 °C, ou seja, 10 kΩ; o divisor é mais sensível nessa temperatura. Para uma faixa específica, o melhor valor é a média geométrica das resistências do NTC nas duas extremidades da faixa, por exemplo cerca de 4,7 kΩ para 0–100 °C. Para ter precisão, escolha um resistor de filme metálico de 1%.

O que significa o valor B (3950) de um termistor?

O valor B é uma constante do material que mostra a rapidez com que a resistência do NTC muda com a temperatura, e sua unidade é o kelvin. B25/50 = 3950 significa que ele foi calculado a partir das resistências a 25 °C e 50 °C. Se você não usar no código o valor B real do seu NTC, o erro cresce à medida que você se afasta de 25 °C.

O que é melhor: termistor NTC, DS18B20 ou LM35?

Para rapidez, baixo custo e tamanho pequeno, escolha um NTC; para ±0,5 °C de precisão sem calibração e cabos longos, o DS18B20 é melhor. O LM35 tem saída analógica linear, mas precisa de pelo menos 4 V, o que complica o uso com o ESP32 e o Pico de 3,3 V. Acima de 125 °C (por exemplo, no hotend de uma impressora 3D), você precisa de um NTC encapsulado em vidro, um PT100 ou um termopar.

Ver todos os projetos
Medição de temperatura com NTC e display LCD 2x16
#44Iniciante
Premium

Medição de temperatura com NTC e display LCD 2x16

Meça a temperatura ao seu redor com um sensor que parece uma pequena conta. Esse componente, chamado NTC, deixa a eletricidade passar com mais facilidade à medida que aquece; o Arduino lê essa mudança

4.5(33)
44
Temperatura e umidade com DHT11
#55Intermediário

Temperatura e umidade com DHT11

Qual é a temperatura do seu quarto? O ar está úmido ou seco? O sensor DHT11 mede a temperatura e a umidade, e o Arduino mostra os valores em um display LCD de duas linhas, atualizando a cada poucos se

4.7(47)
73
Medição da intensidade da luz com LDR
#11Iniciante

Medição da intensidade da luz com LDR

Quer ver a luminosidade do seu quarto em números? O LDR, um pequeno componente sensível à luz, mede a luz ambiente, e o Arduino exibe o valor na tela do computador a cada meio segundo. Cubra o sensor

4.6(81)
139
Leitura da intensidade da luz com módulo LDR e ESP32
#113Iniciante

Leitura da intensidade da luz com módulo LDR e ESP32

Acompanhe em tempo real no Monitor Serial o valor bruto do ADC do módulo LDR e a porcentagem relativa de luz calculada a partir de referências de escuridão e claridade. Essa porcentagem não é uma medida em lux. O projeto ensina a lógica de calibração do módulo. É ideal fazê-lo antes do projeto 10, pois ajuda a determinar o valor do limiar.

4.6(36)
55
Temperatura e umidade com ESP32 e DHT22 (com display LCD)
#117Intermediário

Temperatura e umidade com ESP32 e DHT22 (com display LCD)

Este projeto mede a temperatura e a umidade do ambiente com um sensor DHT22 e exibe os dados em tempo real em um LCD I2C 16x2. Os dados são lidos do sensor pelo protocolo de um fio (one-wire) com a biblioteca Adafruit DHT. Este projeto serve de base para estações meteorológicas IoT, automação residencial ou sistemas de monitoramento ambiental em estufas. A comunicação com o DHT22 é feita pelo pino GPIO 4 do ESP32.

4.8(38)
56
Registrador de temperatura com ESP32 (DHT22 + DS1307 RTC + microSD + OLED)
#144Avançado
Premium

Registrador de temperatura com ESP32 (DHT22 + DS1307 RTC + microSD + OLED)

Monte um registrador de temperatura com data e hora usando ESP32! Leia a temperatura e a umidade do DHT22 a cada minuto, obtenha a hora real do DS1307 RTC e grave os dados em CSV no cartão microSD. O OLED exibe a temperatura atual em letras grandes, a porcentagem de umidade, a data e a hora e o contador de registros. O arquivo /temp_log.csv no cartão SD pode ser aberto no Excel, Google Sheets ou pandas do Python para análise — ideal para monitorar estufas, acompanhar a temperatura de casa ou…

4.7(7)
12
Uso do display LCD com I2C
#32Iniciante
Premium

Uso do display LCD com I2C

Dê ao seu Arduino um display próprio e faça-o escrever sua primeira mensagem. O display LCD de duas linhas é conectado com poucos fios; primeiro aparece uma saudação na linha de cima, depois uma segun

4.8(53)
70
Voltímetro digital com display LCD
#56Intermediário
Premium

Voltímetro digital com display LCD

Descubra a tensão de uma pilha ou de um adaptador de alimentação com um medidor feito por você. Um divisor formado por dois resistores reduz a tensão alta a um nível que a placa consegue ler, e o Ardu

4.5(27)
36