Guias · 19 min de leitura

Tipos de sensor de temperatura para Arduino: 8 sensores comparados

Tipos de sensor de temperatura para Arduino comparados: DHT11, DHT22, DS18B20, LM35, NTC, BME280, MAX6675 e MLX90614 por precisão, faixa, ligação, comprimento de cabo e preço.

Escolher entre os diferentes tipos de sensor de temperatura para Arduino importa mais do que parece: um DHT11 e um DS18B20 no mesmo cômodo podem discordar em 2 °C, e é bem possível derreter um sensor tentando medir um forno de 300 °C com o modelo errado. Oito sensores de temperatura dominam a eletrônica hobby: DHT11, DHT22, DS18B20, LM35, o termistor NTC, BME280, MAX6675 (termopar tipo K) e MLX90614 (infravermelho sem contato). Cada um tem faixa de medição, precisão, forma de ligação e preço diferentes. Qual é o certo depende do que você vai medir: o ar do cômodo, água, um forno ou um motor girando que você não pode tocar?

Neste guia colocamos os oito sensores lado a lado em duas tabelas grandes: faixa de medição, precisão, resolução, velocidade de leitura, interface, tensão de alimentação, comprimento de cabo e preço relativo. Depois você verá como cada um funciona, seus pontos fortes e fracos, a ligação no Arduino Uno, ESP32 e Raspberry Pi Pico, exemplos de código para NTC, MAX6675 e MLX90614, uma montagem de teste que coloca três sensores para competir entre si e qual escolher para cada projeto. Também temos tutoriais detalhados para a maioria desses sensores; os links estão nas seções correspondentes.

Módulo sensor de temperatura e umidade DHT11
Módulo sensor de temperatura e umidade DHT11
Módulo sensor de temperatura e umidade DHT22 (AM2302)
Módulo sensor de temperatura e umidade DHT22 (AM2302)
Sonda de temperatura DS18B20 à prova d'água
Sonda de temperatura DS18B20 à prova d'água
Módulo sensor de temperatura, umidade e pressão BME280
Módulo sensor de temperatura, umidade e pressão BME280
Termistor NTC
Termistor NTC

O que observar ao escolher um sensor de temperatura?

Antes de comparar sensores, é preciso ler corretamente os termos do datasheet. A dupla que mais se confunde é precisão e resolução. A precisão diz o quanto a leitura está próxima da temperatura real; a resolução é o menor passo que o sensor consegue distinguir. O BME280 informa a temperatura em passos de 0,01 °C, mas sua precisão é de cerca de ±1 °C; então os dois últimos dígitos dos 23,47 °C na sua tela servem para acompanhar pequenas variações, mas não dizem a temperatura real com essa exatidão. Observe estes sete critérios na hora de escolher:

  • Faixa de medição: o sensor deve cobrir com folga a menor e a maior temperatura que você quer medir. O DHT11 não enxerga abaixo de zero; uma geladeira pede um DS18B20 e um forno pede um termopar.
  • Precisão: ±2 °C é aceitável para um termômetro de ambiente, mas um aquário ou uma chocadeira precisa de ±0,5 °C.
  • Interface: sensores analógicos precisam de um pino ADC; sensores digitais precisam de um ou mais pinos digitais e, em geral, de uma biblioteca. O número de pinos livres na sua placa define quantos sensores você pode ligar.
  • Comprimento do cabo: se o sensor vai ficar a 5 metros da placa, no jardim ou no fundo de uma caixa d'água, sensores analógicos e I2C sofrem; o 1-Wire e o protocolo de fio único do DHT aguentam longas distâncias muito melhor.
  • Tempo de resposta: uma sonda em capa de aço ou um DHT na sua carcaça plástica só percebe uma mudança brusca de temperatura depois de segundos ou até minutos; um NTC pequeno e exposto é bem mais rápido.
  • Medições extras: se você também precisa de umidade, um DHT22 ou BME280 resolve; se precisa ainda de pressão e altitude, o BME280 cobre tudo em um só módulo.
  • Tensão de alimentação: no ESP32 e no Pico, que funcionam com 3,3 V, cuidado com sensores como o LM35, que pedem no mínimo 4 V, e garanta que não chegue mais de 3,3 V à entrada do ADC.

Tabela comparativa de 8 sensores de temperatura

A primeira tabela resume o desempenho de medição; a segunda, a parte de ligação e custo. Os valores vêm dos datasheets; salvo indicação em contrário, a precisão vale perto da temperatura ambiente e piora nas extremidades da faixa.

SensorFaixa de mediçãoPrecisãoResoluçãoVelocidade de leitura
DHT110 … +50 °C±2 °C1 °C1 vez por segundo
DHT22 (AM2302)−40 … +80 °C±0,5 °C0,1 °C1 vez a cada 2 segundos
DS18B20−55 … +125 °C±0,5 °C (de −10 a +85 °C)0,0625 °C (12 bits)750 ms (12 bits), 94 ms (9 bits)
LM35DZ0 … +100 °C (LM35: −55 … +150 °C)Típica ±0,6 °C, garantida ±1,5 °C0,49 °C no Uno (ref. 5 V), 0,11 °C (ref. 1,1 V)Instantânea (velocidade do ADC)
NTC 10 kΩ, B 3950−40 … +125 °C (encapsulado em vidro ≈ 300 °C)A 25 °C: ±0,25 °C (1%) … ±1 °C (5%)≈ 0,1 °C em temperatura ambiente no UnoInstantânea (velocidade do ADC)
BME280−40 … +85 °C±0,5 °C (25 °C), ±1 °C (0 … 65 °C)0,01 °CDezenas por segundo
MAX6675 + termopar tipo K0 … +1023,75 °CAlguns °C (conversor ≈ ±2 °C, junção fria até ±3 °C)0,25 °C≈ 4 por segundo (conversão de 0,22 s)
MLX90614Objeto −70 … +380 °C, ambiente −40 … +125 °C±0,5 °C (perto da temperatura ambiente)0,02 °CVárias vezes por segundo
SensorInterfaceAlimentaçãoComprimento do caboMedição extraPreço relativo
DHT11Digital de fio único, 1 pino3–5,5 VAté 20 mUmidadeMuito baixo
DHT22Digital de fio único, 1 pino3,3–6 VAté 20 mUmidadeMédio
DS18B201-Wire, vários sensores em 1 pino3,0–5,5 VDezenas de metrosNenhumaBaixo
LM35Analógica, 1 pino ADC4–30 VCurto, ≈ 1 m (mais longo exige cuidados)NenhumaBaixo
NTCAnalógica, 1 pino ADC via divisor3,3 ou 5 V pelo divisorAlguns metrosNenhumaO mais baixo
BME280I2C (2 pinos) ou SPIChip 1,71–3,6 V; módulo com regulador 5 VCurto, menos de 50 cmUmidade e pressãoMédio
MAX6675SPI, 3 pinos (só leitura)3,0–5,5 VO fio do termopar pode ter metrosNenhumaMédio
MLX90614I2C (SMBus), 2 pinosVersão de 3 V ou 5 V (o módulo pode ter regulador)Curto (I2C); mede sem contatoTemperatura ambienteAlto
Em linhas gerais, a ordem de preço é esta: o NTC é o mais barato, seguido do DHT11, LM35 e DS18B20; o DHT22 e o BME280 ficam na faixa intermediária, o módulo MAX6675 com a sonda de termopar custa um pouco mais e o MLX90614 é o mais caro da lista. Clones de sensores baratos são muito comuns; principalmente no DS18B20, LM35 e BME280, peças clonadas podem não alcançar a precisão do datasheet. Deixar dois sensores no mesmo lugar e comparar as leituras é a forma mais simples de saber se o seu é confiável.

DHT11 e DHT22: temperatura e umidade juntas

Dentro da gaiola plástica de um sensor DHT há um elemento de umidade (resistivo no DHT11, capacitivo no DHT22), um termistor e um pequeno controlador que converte as medições em dados digitais. O sensor envia o resultado por uma única linha de dados como um pacote de 40 bits: 16 bits de umidade, 16 bits de temperatura e 8 bits de checksum. Esse protocolo não é 1-Wire, e sim um protocolo de fio único próprio do fabricante, por isso cada DHT precisa do seu próprio pino. O DHT11 é barato e serve para temperatura ambiente, mas a faixa de 0–50 °C e o erro de ±2 °C o deixam fraco para uso externo e trabalhos precisos. Com a mesma ligação, o DHT22 (AM2302) mede de −40 a +80 °C com precisão de ±0,5 °C e informa a umidade de 0–100%; em troca, só consegue fazer uma leitura a cada dois segundos. Os dois têm a mesma fraqueza, a lentidão: mostram a mudança com atraso, porque o ar dentro da gaiola primeiro precisa entrar em equilíbrio com o ambiente. Para ligação, instalação da biblioteca e código, veja Sensor de temperatura e umidade DHT11; o mesmo código funciona no DHT22 trocando uma única palavra.

Se você usa um DHT avulso de 4 pinos, precisa colocar um resistor de pull-up de 10 kΩ entre a linha de dados e o VCC; nos módulos de 3 pinos esse resistor já está na placa. Ler um DHT com intervalo menor que dois segundos não traz uma medição nova: a biblioteca devolve o valor antigo ou retorna nan.

DS18B20: à prova d'água, robusto e vários sensores em um pino

Sonda de temperatura DS18B20 à prova d'água
Sonda DS18B20 à prova d'água: um sensor digital dentro de uma capa de aço inox com cabo de três fios (vermelho VDD, preto GND, amarelo dados).

O DS18B20 mede a temperatura dentro do chip e a envia como um número digital, com resolução selecionável de 9 a 12 bits. Mede de −55 a +125 °C, oferece precisão de ±0,5 °C de −10 a +85 °C e, graças ao protocolo 1-Wire, você pode ligar dezenas de sensores em um único pino de dados; cada um tem um endereço único de 64 bits gravado de fábrica. A versão em sonda à prova d'água, com capa de aço inox, é imbatível para aquários, caixas d'água, tubulação de aquecimento, solo e freezers. A única exigência é um resistor de pull-up de 4,7 kΩ entre a linha de dados e a alimentação; sem ele, a biblioteca retorna −127 °C. No modo de 12 bits uma conversão leva 750 ms, então talvez seja preciso reduzir a resolução para acompanhar uma temperatura que muda rápido. O código com vários sensores e como ler no ESP32 sem bloqueio estão em Sensor de temperatura DS18B20.

LM35: o sensor analógico mais simples, sem biblioteca

O LM35 converte a temperatura diretamente em tensão: a saída sobe 10 mV por grau e dá 250 mV a 25 °C. Não precisa de biblioteca; você obtém o resultado com a fórmula temperatura = analogRead × 5,0 / 1024 × 100. Essa simplicidade o torna um primeiro passo perfeito para aprender o ADC. Os pontos fracos vêm do mesmo lugar: com referência de 5 V, o ADC de 10 bits do Arduino Uno só dá passos de cerca de 0,49 °C, qualquer desvio nos 5 V do USB vai direto para a temperatura e, quanto mais longo o cabo, mais ruído a saída capta. A maioria dos LM35 à venda é LM35DZ, garantido só para 0–100 °C. Ele também precisa de pelo menos 4 V, então no ESP32 e no Pico deve ser alimentado pelo pino de 5 V. Em placas de 3,3 V, uma opção analógica mais prática é o TMP36: funciona com 2,7–5,5 V, mede de −40 a +125 °C e também tem saída de 10 mV/°C, mas como dá 500 mV a 0 °C a fórmula vira temperatura = (V − 0,5) × 100. A precisão típica é de ±1 °C a 25 °C e ±2 °C em toda a faixa. Explicamos passo a passo como reduzir o passo para 0,11 °C com a referência interna de 1,1 V em Sensor de temperatura LM35, e você encontra como o ADC funciona em conversão analógico-digital.

O LM35 e o DS18B20 vêm no mesmo encapsulamento TO-92 preto e parecem quase idênticos, mas os pinos de alimentação são invertidos. Um sensor ligado ao contrário fica quente demais para tocar em poucos segundos. Ao energizar pela primeira vez, encoste o dedo no sensor; se estiver esquentando, corte a alimentação na hora e leia a marcação nele.

Termistor NTC: o sensor mais barato e mais rápido

Um termistor NTC (Negative Temperature Coefficient, coeficiente de temperatura negativo) é um resistor cuja resistência cai à medida que a temperatura sobe. O tipo mais comum em projetos hobby tem 10 kΩ a 25 °C e coeficiente B de 3950 K. Como o Arduino não mede resistência diretamente, o NTC é ligado como um divisor de tensão junto com um resistor fixo, e a tensão no ponto médio é lida em um pino analógico. Esse circuito tem uma propriedade interessante: quando o divisor é alimentado pelos mesmos 5 V da referência do ADC, a medição é raciométrica, então o resultado não muda mesmo que a alimentação seja 4,8 ou 5,1 V. Você pode calcular facilmente as tensões do divisor com a ferramenta Divisor de tensão.

A resistência de um NTC varia com a temperatura de forma exponencial, não linear, então não dá para obter o resultado com um único multiplicador como no LM35. Na prática se usa a equação Beta: 1/T = 1/T0 + (1/B) × ln(R/R0). Aqui T é a temperatura em kelvin, T0 = 298,15 K (25 °C), R0 = 10 kΩ e B = 3950. A sensibilidade é muito alta em temperatura ambiente: pela fórmula B/T², a resistência varia cerca de 4,4% por grau. Por isso um NTC com tolerância de 1% erra só cerca de ±0,25 °C a 25 °C; nas extremidades da faixa, porém, entra a tolerância do coeficiente B e o erro cresce. Para mais precisão em uma faixa ampla, usa-se a equação de Steinhart-Hart de três pontos; os detalhes estão em termistor NTC.

C++ (Arduino IDE)
1const int NTC_PIN = A1;          // bölücünün orta noktası / divider midpoint
2const float R_FIXED = 10000.0;   // 5V ile A1 arasındaki direnç / resistor between 5V and A1
3const float R0 = 10000.0;        // NTC'nin 25 °C'deki direnci / NTC resistance at 25 °C
4const float BETA = 3950.0;       // B katsayısı (veri sayfası) / B coefficient (datasheet)
5const float T0 = 298.15;         // 25 °C Kelvin cinsinden / 25 °C in kelvin
6const int SAMPLES = 16;          // ortalama için ölçüm sayısı / 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;
19
20  if (adc < 1.0 || adc > 1022.0) {                    // kopuk ya da kısa devre / open or shorted
21    Serial.println(F("NTC baglantisini kontrol et / Check the NTC wiring"));
22    delay(1000);
23    return;
24  }
25
26  float r = R_FIXED * adc / (1023.0 - adc);           // NTC direnci (ohm) / NTC resistance (ohm)
27  float invT = 1.0 / T0 + log(r / R0) / BETA;         // Beta denklemi / Beta equation
28  float tempC = 1.0 / invT - 273.15;                  // Kelvin -> °C
29
30  Serial.print(F("R: "));
31  Serial.print(r, 0);
32  Serial.print(F(" ohm  Sicaklik / Temp: "));
33  Serial.print(tempC, 1);
34  Serial.println(F(" C"));
35  delay(1000);
36}

Neste circuito, o resistor fixo de 10 kΩ fica entre 5V e A1, e o NTC entre A1 e GND. Quando a temperatura sobe, a resistência do NTC cai, e com ela a tensão em A1. O código primeiro calcula a resistência do NTC a partir do valor bruto, depois a temperatura em kelvin com a equação Beta, e converte para Celsius; a média de 16 leituras reduz o ruído do ADC a um quarto. Em temperatura ambiente, um passo do ADC do Uno corresponde a cerca de 0,09 °C, ou seja, a resolução é cinco vezes melhor que a de um LM35 lido com referência de 5 V. Em módulos NTC prontos (o KY-013, por exemplo), o lado em que fica o resistor fixo varia de placa para placa; se a leitura cair quando você encosta algo quente no NTC, inverta a fórmula da resistência: r = R_FIXED × (1023 − adc) / adc.

BME280: temperatura, umidade e pressão em um só módulo

O BME280 da Bosch mede temperatura, umidade relativa e pressão atmosférica em um chip de apenas 2,5 × 2,5 mm, e se comunica por I2C (endereço 0x76 ou 0x77) ou SPI. Na temperatura, oferece resolução de 0,01 °C e precisão de ±0,5 °C a 25 °C e ±1 °C de 0 a 65 °C; faz dezenas de leituras por segundo e consome bem menos de 1 µA em repouso. Isso o torna ideal para estações meteorológicas a bateria. O chip em si não aguenta mais de 3,6 V: os módulos roxos de 6 pinos geralmente são só para 3,3 V, enquanto os módulos de 4 pinos com regulador podem ser ligados em 5 V. Quando mede continuamente, o chip esquenta um pouco e pode marcar alguns décimos de grau a mais; para medições meteorológicas, o modo forçado (forced) com algumas leituras por minuto é suficiente. Explicamos como funciona o barramento I2C em O que é I2C?.

Alguns módulos vendidos como BME280 são, na verdade, um BMP280, que não mede umidade. Os dois são quase iguais; a forma segura de diferenciá-los é ler o registrador de ID do chip (chip ID): o BME280 retorna 0x60 e o BMP280, 0x58. Nesse caso, o sketch de exemplo da biblioteca Adafruit BME280 mostra “Could not find a valid BME280 sensor”. O código de leitura do ID e a solução estão em BME280 e BMP280.

MAX6675 e termopar tipo K: até 1000 °C

Um termopar é feito de dois fios de metais diferentes soldados em uma ponta. A diferença de temperatura entre a solda (a junção quente) e o ponto em que os fios se ligam ao aparelho (a junção fria) gera uma tensão minúscula nos fios; num termopar tipo K, são cerca de 41 µV por grau. O ADC do Arduino não consegue ler uma tensão tão pequena, e ainda é preciso saber a temperatura da junção fria. O MAX6675 faz as duas coisas: amplifica a tensão do termopar, aplica a compensação de junção fria medindo a própria temperatura e entrega o resultado por SPI com 12 bits e resolução de 0,25 °C. A faixa vai de 0 a +1023,75 °C, o que o torna a única opção aqui para lugares onde os outros sensores não sobrevivem, como ferro de solda, forno de pizza, churrasqueira, forno de cerâmica ou escapamento.

Você também deve conhecer os limites do MAX6675: ele não mede abaixo de 0 °C; o erro do próprio conversor é de cerca de ±2 °C entre 0 e 700 °C, e a isso se somam o erro da compensação de junção fria, de até ±3 °C, e a tolerância do fio do termopar. Então espere uma precisão total de alguns graus; num forno a 800 °C essa diferença não importa. Uma conversão leva 0,17–0,22 segundo, então espere pelo menos 250 ms entre duas leituras. Se você também precisa de temperaturas negativas, o MAX31855, mais novo (−200 a +1350 °C, 14 bits), é a melhor escolha. Você encontra como funciona o barramento SPI em O que é SPI?. Depois de instalar a biblioteca MAX6675 library da Adafruit pelo Gerenciador de Bibliotecas da Arduino IDE, carregue o código abaixo:

C++ (Arduino IDE)
1#include "max6675.h"
2
3const int thermoDO  = 4;    // SO: veri çıkışı / data out
4const int thermoCS  = 5;    // CS: çip seçimi / chip select
5const int thermoCLK = 6;    // SCK: saat / clock
6
7MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
8
9void setup() {
10  Serial.begin(9600);
11  delay(500);                                   // ilk ölçümü bekle / wait for the first conversion
12}
13
14void loop() {
15  float c = thermocouple.readCelsius();
16  if (isnan(c)) {                               // D2 biti: termokupl açık / bit D2: thermocouple open
17    Serial.println(F("Termokupl takili degil / Thermocouple not connected"));
18  } else {
19    Serial.print(F("Sicaklik / Temp: "));
20    Serial.print(c, 2);
21    Serial.println(F(" C"));
22  }
23  delay(500);                                   // en az 250 ms bekle / wait at least 250 ms
24}
Os terminais do termopar têm polaridade: ligue os terminais marcados com + e − nos bornes com parafuso de mesma marcação no módulo; se inverter, a leitura cai à medida que a sonda esquenta. Não coloque o módulo ao lado do aparelho que está esquentando: como o MAX6675 corrige a junção fria usando a própria temperatura, qualquer aquecimento da placa vai direto para a medição. Se a sonda não estiver ligada ou o fio estiver rompido, a biblioteca retorna nan.

MLX90614: medindo temperatura sem contato

O MLX90614 é um sensor de temperatura sem contato que detecta, com uma termopilha, a radiação infravermelha emitida pelos objetos. Ele fornece dois valores ao mesmo tempo: a temperatura ambiente, que é a temperatura do próprio corpo do sensor (−40 a +125 °C), e a temperatura do objeto, que é a da superfície para a qual ele aponta (−70 a +380 °C). Perto da temperatura ambiente, oferece precisão de ±0,5 °C e resolução de 0,02 °C; vem calibrado de fábrica, comunica-se por I2C (SMBus) no endereço 0x5A, e a velocidade do barramento não pode passar de 100 kHz. É ideal para medir sem tocar um motor girando, um rolamento, um chip quente numa placa de circuito ou uma panela no fogão.

A medição sem contato tem dois segredos. O primeiro é o campo de visão: o sensor mede a média de tudo o que está dentro do seu cone de visão. A versão mais comum, a MLX90614ESF-BAA, tem campo de visão de 90°; isso significa que, a 5 cm de distância, ela faz a média de uma área de cerca de 10 cm de diâmetro. Para medir um objeto pequeno, aproxime o sensor ou escolha uma versão de ângulo estreito, como 35° (BCC) ou 5° (BCI). O segundo é a emissividade: o sensor vem ajustado de fábrica para 1,0. Para tinta fosca, plástico, madeira, pele e água, o coeficiente fica entre 0,9 e 0,98, então o resultado fica próximo do correto; superfícies metálicas brilhantes, porém, emitem pouquíssima radiação e parecem muito mais frias do que são. Colar um pedaço de fita preta fosca nelas é uma solução simples e eficaz. Instale a biblioteca Adafruit MLX90614 pelo Gerenciador de Bibliotecas e teste este código:

C++ (Arduino IDE)
1#include <Wire.h>
2#include <Adafruit_MLX90614.h>
3
4Adafruit_MLX90614 mlx = Adafruit_MLX90614();
5
6void setup() {
7  Serial.begin(9600);
8  if (!mlx.begin()) {                           // varsayılan adres 0x5A / default address 0x5A
9    Serial.println(F("MLX90614 bulunamadi / not found"));
10    while (true) delay(10);
11  }
12  Serial.print(F("Emisivite / Emissivity: "));
13  Serial.println(mlx.readEmissivity(), 2);      // fabrika ayarı 1.00 / factory default 1.00
14}
15
16void loop() {
17  Serial.print(F("Ortam / Ambient: "));
18  Serial.print(mlx.readAmbientTempC(), 2);      // sensör gövdesi / sensor body
19  Serial.print(F(" C   Nesne / Object: "));
20  Serial.print(mlx.readObjectTempC(), 2);       // baktığı yüzey / surface in view
21  Serial.println(F(" C"));
22  delay(500);
23}
O MLX90614 não enxerga através de vidro: o filtro óptico deixa passar comprimentos de onda de 5,5–14 µm, e o vidro é quase opaco nessa faixa. Se você apontar o sensor para fora pela janela, vai medir o vidro, não o lado de fora. Além disso, quando o sensor é levado de um cômodo frio para um quente, ele pode ler errado por alguns minutos, até o corpo entrar em equilíbrio.

Resumo de ligação: Arduino Uno, ESP32 e Raspberry Pi Pico

Sensor e pinoArduino UnoESP32Raspberry Pi Pico
DHT11 / DHT22: DATAD2GPIO 27GP15
DS18B20: DQ (+ pull-up de 4,7 kΩ)D3GPIO 4GP22
LM35: Vout (alimentação 5 V)A0GPIO 34 (ADC1)GP26 (ADC0)
NTC: ponto médio do divisorA1 (divisor a partir do 5V)GPIO 35 (ADC1, divisor a partir do 3V3)GP27 (ADC1, divisor a partir do 3V3)
BME280: SDA / SCLA4 / A5GPIO 21 / 22GP4 / GP5
MLX90614: SDA / SCLA4 / A5 (mesmo barramento I2C)GPIO 21 / 22GP4 / GP5
MAX6675: SO / CS / SCKD4 / D5 / D6GPIO 19 / 23 / 18GP16 / GP17 / GP18
Alimentação (VCC)5V (3.3V para o BME280 de 6 pinos)3V3 (5V/VIN para o LM35)3V3(OUT) (VBUS para o LM35)

O ESP32 e o Pico funcionam com 3,3 V; se você alimentar o divisor do NTC pelo 3V3, nenhuma tensão perigosa chega à entrada do ADC. No ESP32, ligue sensores analógicos só nos pinos ADC1 (GPIO 32–39), porque os pinos ADC2 não funcionam com o Wi-Fi ligado; já para linhas de dados bidirecionais como as do DHT e do DS18B20, evite os GPIO 34–39, pois esses pinos são só de entrada. O BME280 (0x76) e o MLX90614 (0x5A) têm endereços diferentes, então podem dividir os mesmos dois fios I2C sem problema. Você encontra todos os pinos da sua placa na ferramenta Pinagem e os códigos de cores dos resistores de pull-up na ferramenta Código de cores.

Teste comparativo com o ESP32: três sensores no mesmo lugar

A melhor forma de ver as diferenças entre sensores é com os próprios olhos. O código para ESP32 abaixo lê um DS18B20, um DHT22 e um BME280 ao mesmo tempo e mostra os resultados como três linhas separadas no Plotter Serial da Arduino IDE. Coloque os sensores lado a lado na protoboard, a pelo menos 10 cm do ESP32; o ESP32 esquenta durante o funcionamento e afeta qualquer sensor ao lado. O código precisa das bibliotecas OneWire, DallasTemperature, DHT sensor library e Adafruit BME280.

C++ (Arduino IDE)
1#include <OneWire.h>
2#include <DallasTemperature.h>
3#include <DHT.h>
4#include <Wire.h>
5#include <Adafruit_Sensor.h>
6#include <Adafruit_BME280.h>
7
8const int ONE_WIRE_PIN = 4;     // DS18B20 DQ (4,7 kΩ pull-up -> 3V3)
9const int DHT_PIN = 27;         // DHT22 DATA
10
11OneWire oneWire(ONE_WIRE_PIN);
12DallasTemperature ds(&oneWire);
13DHT dht(DHT_PIN, DHT22);
14Adafruit_BME280 bme;            // I2C: SDA GPIO 21, SCL GPIO 22
15bool bmeOk = false;
16
17void setup() {
18  Serial.begin(115200);
19  ds.begin();
20  dht.begin();
21  bmeOk = bme.begin(0x76) || bme.begin(0x77);   // iki adresi de dene / try both addresses
22  if (!bmeOk) Serial.println("BME280 bulunamadi / not found");
23}
24
25void loop() {
26  ds.requestTemperatures();                     // 12 bitte ~750 ms sürer / takes ~750 ms at 12-bit
27  float tDs  = ds.getTempCByIndex(0);           // sensör yoksa -127 / -127 if missing
28  float tDht = dht.readTemperature();           // hata olursa NAN / NAN on error
29  float tBme = bmeOk ? bme.readTemperature() : NAN;
30
31  // Seri Çizici için etiket:değer biçimi / label:value format for the Serial Plotter
32  Serial.printf("DS18B20:%.2f,DHT22:%.1f,BME280:%.2f\n", tDs, tDht, tBme);
33  delay(2000);                                  // DHT22 en fazla 2 sn'de bir / DHT22 at most every 2 s
34}

Primeiro espere alguns minutos e veja a distância entre as linhas: diferenças de 0,5–1 °C estão dentro dos limites de precisão desses sensores. Depois coloque um copo de água morna ao lado deles ou sopre de leve nos três. O DS18B20 e o BME280 reagem em poucos segundos, enquanto a linha do DHT22 fica claramente para trás por causa da gaiola plástica. Se o BME280 ficar sempre alguns décimos de grau acima dos outros, é o chip aquecendo a si mesmo. Esse pequeno experimento mostra diferenças que não estão escritas em nenhum datasheet. Para registrar leituras por muito tempo, você pode usar um módulo de cartão SD ou enviar os dados para o Google Sheets.

Medindo temperatura com o Raspberry Pi Pico e MicroPython

O firmware MicroPython do Pico já vem com os módulos dht, onewire e ds18x20 embutidos, então você não precisa copiar nenhum arquivo extra para o Pico para usar o DHT e o DS18B20. O chip RP2040 também tem um sensor de temperatura interno ligado ao canal 4 do ADC. O código abaixo lê os três juntos:

MicroPython
1from machine import Pin, ADC
2import dht, onewire, ds18x20, time
3
4dht22 = dht.DHT22(Pin(15))                          # DHT22 DATA -> GP15
5ds = ds18x20.DS18X20(onewire.OneWire(Pin(22)))      # DS18B20 DQ -> GP22 (4,7 kΩ pull-up)
6roms = ds.scan()                                    # hattaki sensörler / sensors on the bus
7cpu = ADC(4)                                        # RP2040 dahili sensörü / internal sensor
8
9def cpu_temp():
10    v = cpu.read_u16() * 3.3 / 65535                # ham değer -> volt / raw value -> volts
11    return 27 - (v - 0.706) / 0.001721              # RP2040 veri sayfası formülü / datasheet formula
12
13while True:
14    t_ds = None
15    if roms:
16        ds.convert_temp()                           # ölçümü başlat / start conversion
17        time.sleep_ms(750)                          # 12 bit dönüşüm süresi / 12-bit conversion time
18        t_ds = round(ds.read_temp(roms[0]), 2)
19    try:
20        dht22.measure()
21        t_dht, nem = dht22.temperature(), dht22.humidity()
22    except OSError:                                 # okuma hatası / read error
23        t_dht = nem = None
24    print("DS18B20:", t_ds, "DHT22:", t_dht, "Nem / RH:", nem,
25          "Pico:", round(cpu_temp(), 1))
26    time.sleep(2)

O sensor interno mede a temperatura do chip, não a do ambiente, e pequenos desvios na referência do ADC podem deslocar o resultado em alguns graus. Então ele não serve para medir o ambiente, mas é útil para verificar se a placa está superaquecendo. Não se esqueça do pull-up de 4,7 kΩ na linha de dados do DS18B20; os resistores de pull-up internos do Pico são fracos demais para o 1-Wire. Se você está começando com o Pico, comece por O que é o Raspberry Pi Pico?.

Qual sensor de temperatura para qual projeto?

Projeto ou necessidadeSensor recomendadoPor quê?
Primeiro projeto, termômetro de ambienteDHT11O mais barato, também mede umidade; ±2 °C basta para um cômodo
Estação meteorológica interna e externaBME280 ou DHT22Chega a −40 °C e mede umidade; o BME280 também mede pressão e altitude
Aquário, caixa d'água, água do aquecedorSonda DS18B20 à prova d'águaCapa de inox, ±0,5 °C, cabo longo
Geladeira e freezerDS18B20Mede até −55 °C; o DHT11 não enxerga abaixo de zero
Medição em vários pontos (cômodos, estufa, tubulação)DS18B20Dezenas de sensores em um pino, cada um com seu endereço
ChocadeiraDHT22 ou BME280±0,5 °C perto de 37,5 °C, mais controle de umidade
Forno, churrasqueira, ferro de soldaMAX6675 + termopar tipo KAguenta até 1000 °C
Hotend de impressora 3D, pack de bateriasTermistor NTCPequeno, barato e rápido; impressoras 3D usam NTCs de 100 kΩ encapsulados em vidro
Motor, rolamento, placa de circuito, peça móvelMLX90614Mede sem contato
Aprender o ADC e medição analógicaLM35 ou NTCNão precisa de biblioteca, funciona com uma fórmula

Ideias de projetos com sensores de temperatura

  • Estufa inteligente: meça a temperatura e a umidade do ar com um DHT22 e a temperatura do solo com uma sonda DS18B20; controle a ventoinha e a irrigação com um módulo relé. Para o projeto completo, veja o projeto de estufa inteligente.
  • Aquecedor de aquário com termostato: mantenha a água entre 25 e 26 °C com um DS18B20 à prova d'água; use 0,5 °C de histerese para o relé não ligar e desligar a cada pequena variação.
  • Estação meteorológica a bateria: combine um BME280 com o modo deep sleep do ESP32 e meça a cada dez minutos, para o sistema funcionar por meses com baterias.
  • Termômetro para forno de pizza ou churrasqueira: mostre a temperatura do forno em dígitos grandes num display OLED com um MAX6675 e uma sonda tipo K.
  • Alarme de temperatura de motor sem contato: monitore a temperatura da superfície de um motor ou da mesa de uma impressora 3D com um MLX90614 e faça um buzzer tocar quando passar de um limite.
  • Automação residencial: envie a temperatura de cada cômodo para o Home Assistant via MQTT com um ESP32 e controle o aquecimento de acordo.
  • Guardião do freezer: com um DS18B20, dispare um alarme se o interior do freezer passar de −12 °C e mostre o valor num display LCD I2C.

Erros comuns e como resolvê-los

SintomaCausa provávelSolução
DHT: nan ou “Failed to read from DHT sensor!” (falha na leitura)Tipo errado no código (DHT11/DHT22), sem pull-up ou leitura frequente demaisCorrija o tipo, adicione um pull-up de 10 kΩ, espere 2 segundos entre leituras
DS18B20: −127 °CSensor não encontrado: sem pull-up, cabo com defeito ou pino erradoColoque 4,7 kΩ entre DQ e VCC, confira as ligações
DS18B20: sempre 85 °CLido antes de a conversão terminar, ou alimentação insuficienteEspere o tempo de conversão, alimente o VDD diretamente
LM35: valor anormalmente alto, sensor esquentandoPinos de alimentação ligados ao contrárioCorte a alimentação na hora e corrija a ordem dos pinos
LM35 ou NTC: valor fica pulandoRuído do ADC, cabo longo, alimentação USB oscilandoTire a média das leituras, adicione um capacitor de 0,1 µF, encurte o cabo
NTC: temperatura cai quando esquentaA orientação do divisor não bate com o códigoInverta a fórmula da resistência
BME280: “Could not find a valid BME280 sensor” (sensor não encontrado)Endereço errado (0x76/0x77) ou o chip é na verdade um BMP280Mude o endereço, leia o chip ID (0x60 / 0x58)
BME280 ou DHT: 1–3 °C acimaAutoaquecimento, ESP32 ou regulador por pertoAfaste o sensor da placa, leia com menos frequência, aplique um offset
MAX6675: nanTermopar não ligado ou fio rompidoConfira os bornes com parafuso e a sonda
MAX6675: valor cai quando esquentaPolaridade do termopar invertidaTroque os terminais + e − de lugar
MLX90614: metal brilhante parece muito frioEmissividade baixaCole fita preta fosca ou ajuste a emissividade
MLX90614: objeto pequeno medido erradoCampo de visão maior que o objetoAproxime o sensor ou use uma versão de ângulo estreito
Seja qual for o sensor escolhido, a maior fonte de erro muitas vezes não é o sensor em si, mas onde você o coloca. Um sensor sob sol direto, colado a um regulador de tensão ou a um ESP32, ou fechado numa caixa mede a temperatura do seu próprio entorno, não a do ambiente. Afaste o sensor da placa, coloque-o num lugar com circulação de ar, compare uma vez com um termômetro de confiança e corrija a diferença constante no código. Para suavizar valores que oscilam, veja os métodos em filtragem de dados de sensores.

Resumindo: um DHT22 ou BME280 para ambientes e clima, um DS18B20 para água e lugares frios, um LM35 ou NTC para aprender medição analógica e ter resposta rápida, um MAX6675 para altas temperaturas e um MLX90614 para superfícies que você não pode tocar são os pontos de partida certos. Se quiser conhecer outros tipos de sensor também, dê uma olhada no guia de sensores para Arduino. No app BlueGrays você encontra esquemas do circuito e código passo a passo para projetos como medição de temperatura e umidade com DHT11, termômetro com NTC e LCD, indicador de temperatura com ESP32, DHT22 e LCD, registrador de temperatura com ESP32 e irrigação inteligente.

Perguntas frequentes

Qual é o sensor de temperatura mais preciso para Arduino?

Entre os sensores hobby, as opções mais precisas perto da temperatura ambiente são o DS18B20, o DHT22, o BME280 (a 25 °C) e o MLX90614, todos com ±0,5 °C. O DS18B20 se destaca em medições com fio e à prova d'água; o DHT22 ou o BME280, quando você também precisa de umidade. Seja qual for a escolha, comparar o sensor uma vez com um termômetro confiável e corrigir o offset no código melhora bastante a precisão.

Devo comprar um DHT11 ou um DHT22?

Se você só quer acompanhar de forma aproximada a temperatura e a umidade de um cômodo, o DHT11 basta. Se precisa de uso externo, temperaturas abaixo de zero ou precisão de ±0,5 °C, compre um DHT22; ele mede de −40 a +80 °C e também dá umidade mais precisa. Os dois funcionam com a mesma biblioteca e o mesmo código; você só muda o tipo do sensor no sketch.

Como medir a temperatura da água com Arduino?

O melhor sensor para água é a sonda DS18B20 à prova d'água, com capa de aço inox. Você mergulha a sonda na água e liga o fio de dados a um pino digital do Arduino com um resistor de pull-up de 4,7 kΩ. O cabo e as emendas geralmente não são feitos para ficar muito tempo em água quente, então coloque só a ponta de aço na água.

O Arduino consegue medir temperaturas altas, como 500 °C?

Sim. Com um termopar tipo K e um módulo MAX6675 você mede de 0 a cerca de 1024 °C. A ponta do termopar vai dentro do forno, enquanto o módulo MAX6675 deve ficar longe do calor. Sempre confira até que temperatura a capa e o cabo da sonda que você comprou aguentam.

Dá para fazer um termômetro sem contato com Arduino?

Você pode montar um termômetro infravermelho sem contato ligado ao Arduino com um MLX90614; a versão padrão oferece precisão de ±0,5 °C perto da temperatura ambiente. Para temperatura corporal, é preciso a versão de precisão médica (±0,2 °C) e a distância de medição correta, e mesmo assim essa montagem não substitui um aparelho médico. Ao medir, garanta que a superfície-alvo preencha totalmente o campo de visão do sensor.

Por que meu sensor de temperatura marca acima do real?

O motivo mais comum é uma fonte de calor perto do sensor: um ESP32, um regulador de tensão ou luz do sol. Sensores como o BME280 também se aquecem um pouco quando medem continuamente. Afaste o sensor 10–15 cm da placa, leia com menos frequência e corrija no código a diferença constante que sobrar, comparando com um termômetro de confiança.

Ver todos os projetos
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 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 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
Relógio, calendário e estação meteorológica de matriz de pontos (MAX7219, DS1307)
#85Intermediário
Premium

Relógio, calendário e estação meteorológica de matriz de pontos (MAX7219, DS1307)

Um painel com texto em rolagem para sua mesa ou parede que mostra, em sequência, a hora, a data e as condições do ambiente. No display LED 8x32, você vê primeiro a temperatura em Celsius e Fahrenheit,

5.0(50)
66
Estação de irrigação inteligente
#83Avançado
Premium

Estação de irrigação inteligente

Um jardineiro que rega suas plantas sozinho para que elas não sequem enquanto você está de férias. Um sensor de umidade do solo mede o quanto a terra está úmida; quando ela seca, o Arduino aciona a bo

5.0(42)
57
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