Componentes · 16 min de leitura

Sensor de temperatura LM35 com Arduino: ligação, fórmula e código

Ligação e pinagem do LM35 no Arduino, fórmula de analogRead para °C, resolução de 0,1 °C com a referência de 1,1 V, média de leituras, código para ESP32 e Pico e LM35 vs DS18B20.

O LM35 é um sensor de temperatura analógico barato, de três terminais, que transforma a temperatura diretamente em uma tensão em graus Celsius. Usar o LM35 com Arduino não exige biblioteca nem protocolo complicado: você liga o terminal do meio a um pino analógico, lê com analogRead() e obtém a temperatura com uma fórmula de uma linha. A saída sobe exatamente 10 mV a cada 1 °C, então ela fornece 250 mV a 25 °C e 1 V a 100 °C.

Neste guia você vai aprender como o LM35 funciona, a sua pinagem e o erro de ligação invertida que quase todo mundo comete uma vez, como calcular °C a partir do valor de analogRead, como deixar as leituras mais de quatro vezes mais finas com a referência interna de 1,1 V do Arduino Uno e como acalmar valores instáveis com médias. Depois você vai ver o que observar no ESP32 e no Raspberry Pi Pico de 3,3 V, como medir temperaturas negativas e quando escolher o LM35 em vez do DS18B20 ou do DHT11.

O que é o LM35 e como ele funciona?

Dentro do LM35 há dois transistores funcionando com densidades de corrente diferentes. A diferença entre as tensões base-emissor deles varia em proporção direta com a temperatura absoluta; essa técnica se chama delta-VBE. Um amplificador interno reforça essa diferença minúscula e a ajusta para que a saída seja 0 V a 0 °C. Por isso, ao contrário de sensores baseados em Kelvin como o LM335, você não precisa subtrair uma grande tensão constante da saída: temperatura (°C) = tensão de saída (mV) / 10. O sensor é ajustado já no wafer durante a produção, então não precisa de calibração extra e a curva de saída é quase perfeitamente reta; a não linearidade típica é de só ±0,25 °C.

CaracterísticaValor
Saída10 mV/°C, 0 V a 0 °C (250 mV a 25 °C, 1000 mV a 100 °C)
Tensão de alimentação4–30 V
Corrente de alimentaçãoMenos de 60 µA (tipicamente 56 µA em 5 V)
AutoaquecimentoCerca de 0,08 °C em ar parado
Não linearidadeTipicamente ±0,25 °C
Impedância de saída0,1 Ω com carga de 1 mA
Carga capacitivaAté 50 pF sem cuidados extras
EncapsulamentoTO-92 (o mais comum), TO-220, SOIC-8 e TO-46 metálico

O LM35 não é uma peça só, mas uma família. O sufixo em letra define a faixa de medição e a precisão garantida, enquanto um Z no final indica o encapsulamento plástico TO-92. Segundo o datasheet, as versões em TO-92 plástico são LM35C, LM35CA e LM35D, e a maioria das peças vendidas como “LM35” nas lojas de eletrônica é na verdade o LM35DZ. Então o seu sensor provavelmente só tem garantia para 0–100 °C e pode errar até ±1,5 °C a 25 °C, embora o erro típico fique em torno de ±0,6 °C. Leia a marcação na peça para descobrir qual você tem.

ModeloFaixa de mediçãoPrecisão garantida a 25 °CPior caso nos limites da faixa
LM35A−55 … +150 °C±0,5 °C±1 °C
LM35−55 … +150 °C±1 °C±1,5 °C
LM35CA−40 … +110 °C±0,5 °C±1,5 °C
LM35C−40 … +110 °C±1 °C±2 °C
LM35D (LM35DZ)0 … +100 °C±1,5 °C±2 °C

Pinagem do LM35 e o erro de ligação invertida mais comum

Com a face plana do LM35 virada para você e os terminais para baixo, a ordem da esquerda para a direita é: pino 1 +Vs (alimentação), pino 2 Vout (saída) e pino 3 GND (terra). Como o desenho do datasheet é uma vista de baixo, muita gente o inverte de cabeça e liga tudo ao contrário. Nos módulos LM35 vendidos em uma plaquinha, os pinos costumam ser marcados VCC (ou +), OUT (ou S) e GND (ou −); nesse caso, confie nas marcações da placa.

O LM35 e o DS18B20 vêm no mesmo encapsulamento TO-92 preto e são quase impossíveis de distinguir, mas os pinos de alimentação deles são invertidos: no DS18B20, com a face plana virada para você, o pino da esquerda é o GND e o da direita é o VDD. Se você trocar +Vs e GND no LM35, uma corrente grande passa pelas estruturas de diodo dentro do chip, o sensor fica quente a ponto de queimar o dedo em segundos e as leituras perdem o sentido. Toque no sensor na primeira vez que ligar; se estiver esquentando, corte a alimentação na hora. Um sensor que ficou invertido só por pouco tempo normalmente sobrevive, mas a precisão pode ficar comprometida; se as leituras ficarem incoerentes depois, troque-o.

Ligação do LM35 ao Arduino: Uno, ESP32 e Pico

Pino do LM35Arduino UnoESP32Raspberry Pi Pico
1 · +Vs (esquerda)5V5V / VIN (5 V do USB)VBUS, pino 40 (5 V do USB)
2 · Vout (meio)A0GPIO 34 (ADC1)GP26 / ADC0, pino 31
3 · GND (direita)GNDGNDAGND pino 33 ou GND pino 38
Capacitor de 0,1 µFEntre +Vs e GND, perto do sensorEntre +Vs e GND, perto do sensorEntre +Vs e GND, perto do sensor
Para ambientes com ruído, o fabricante recomenda um capacitor cerâmico de 0,1 µF entre +Vs e GND, bem ao lado do sensor; ele vem marcado “104”, e você pode decodificá-lo com a ferramenta Código de capacitores. A saída do LM35 aguenta sem problemas no máximo 50 pF de carga capacitiva; alguns metros de cabo passam disso, e a saída pode começar a oscilar. Com um cabo longo, coloque um resistor de 2 kΩ em série com a saída ou acrescente um amortecedor R-C de 75 Ω + 1 µF em série entre a saída e o GND; cabo de par trançado também reduz bastante a interferência.

De analogRead para °C: a fórmula do LM35

O conversor analógico-digital (ADC) do Arduino Uno tem 10 bits: ele divide a faixa entre 0 V e a tensão de referência em 1024 passos e entrega um número de 0 a 1023. Como a referência padrão é 5 V, cada passo vale 5 / 1024 = 4,88 mV. Primeiro você converte o valor bruto em tensão e depois a tensão em temperatura: tensao = raw × 5.0 / 1024 e temperatura = tensao × 100. Juntando, temperatura ≈ raw × 0,488. Alguns exemplos usam 1023 em vez de 1024; a diferença é de uma parte em mil e desprezível perto do erro do próprio LM35, mas 1024 é o valor correto. Se quiser entender o ADC em mais detalhes, veja o artigo sobre conversão analógico-digital (ADC).

Valor de analogReadTensão (referência de 5 V)Temperatura
410,200 V20,0 °C
510,249 V24,9 °C
520,254 V25,4 °C
610,298 V29,8 °C
2051,001 V100,1 °C

Olhe a tabela com atenção: na temperatura ambiente, o ADC só produz um número em torno de 50, e uma mudança de um único passo move a temperatura em cerca de 0,5 °C. É por isso que a sua leitura fica pulando entre 24,9 e 25,4; o sensor não está com defeito, essa é simplesmente a resolução da referência de 5 V. Vamos resolver isso daqui a pouco com a referência interna.

A sua primeira medição, passo a passo

  1. Encaixe o LM35 na protoboard; com a face plana virada para você, ligue o terminal da esquerda ao 5V e o da direita ao GND.
  2. Ligue o terminal do meio (Vout) ao A0 com um jumper. Se tiver, acrescente um capacitor de 0,1 µF entre +Vs e GND.
  3. Conecte o Arduino pelo USB e toque no sensor depois de alguns segundos: se estiver na temperatura ambiente, tudo certo; se estiver quente, a ligação está invertida.
  4. Carregue o código abaixo e abra o Monitor Serial em 9600 baud.
  5. Segure o sensor entre os dedos; você deve ver o valor subir devagar e voltar a cair quando soltar.
C++ (Arduino IDE)
1const int LM35_PIN = A0;   // LM35 orta bacak (Vout) / LM35 middle leg (Vout)
2
3void setup() {
4  Serial.begin(9600);
5}
6
7void loop() {
8  int raw = analogRead(LM35_PIN);          // 0–1023 ham değer / raw value 0–1023
9  float voltage = raw * 5.0 / 1024.0;      // 5 V referansla volta çevir / convert to volts (5 V reference)
10  float tempC = voltage * 100.0;           // 10 mV/°C: 0,25 V = 25 °C / 0.25 V = 25 °C
11
12  Serial.print(F("Ham / Raw: "));
13  Serial.print(raw);
14  Serial.print(F("  Gerilim / Voltage: "));
15  Serial.print(voltage, 3);
16  Serial.print(F(" V  Sicaklik / Temp: "));
17  Serial.print(tempC, 1);
18  Serial.println(F(" C"));
19  delay(1000);
20}

A cada segundo, o código lê o valor bruto no A0, converte primeiro em tensão e depois em temperatura e mostra os três no Monitor Serial. Mostrar o valor bruto ajuda muito na depuração: se ele for sempre 0, não chega tensão do Vout; se estiver perto de 1023, o pino analógico foi ligado sem querer ao 5 V; se pular aleatoriamente, o A0 está flutuando. Escrever as strings fixas dentro da macro F() economiza os 2 KB de RAM do Uno. Você encontra mais dicas do Monitor Serial no artigo como usar o Monitor Serial do Arduino.

Como aumentar a resolução com a referência interna de 1,1 V

A referência de 5 V tem dois problemas. O primeiro é a resolução grosseira que você acabou de ver. O segundo é mais traiçoeiro: os 5 V que vêm do USB muitas vezes ficam em qualquer valor entre 4,7 e 5,1 V e, como o seu código diz 5.0, a diferença vai direto para a temperatura. Por exemplo, se a sua placa na verdade funciona com 4,8 V, você vai ver 25 °C como 26 °C e, quando a porta USB do computador cair sob carga, a temperatura parece mudar sozinha. A solução é usar a referência interna de 1,1 V que vem no ATmega328P do Arduino Uno e do Nano. Depois de analogReference(INTERNAL), cada passo vale 1,1 / 1024 = 1,07 mV, ou cerca de 0,11 °C. Em troca, você mede no máximo 1,1 V, ou seja, 110 °C, o que de qualquer forma é bastante para a faixa de 0–100 °C do LM35DZ.

ReferênciaComandoUm passoPasso de temperaturaMaior valor mensurável
5 V (padrão)analogReference(DEFAULT)4,88 mV0,49 °C150 °C (limite do sensor)
3,3 V (ligado ao AREF)analogReference(EXTERNAL)3,22 mV0,32 °C150 °C (limite do sensor)
1,1 V internaanalogReference(INTERNAL)1,07 mV0,11 °C110 °C

A referência de 1,1 V não é exatamente 1,1 V em todo chip; segundo o datasheet do ATmega328P, ela pode ficar entre 1,0 e 1,2 V. Sem calibração, isso significa um erro de escala de até 9%. A solução é fácil: carregue o código abaixo, meça a tensão entre o pino AREF e o GND com um multímetro e escreva o valor na constante VREF (ex.: const float VREF = 1.083;). Você só precisa fazer isso uma vez por placa, e o resultado continua válido. O código também tira a média de 32 amostras a cada leitura:

C++ (Arduino IDE)
1const int LM35_PIN = A0;
2const float VREF = 1.1;     // AREF'te ölçtüğün değeri yaz (ör. 1.083) / write the voltage you measured on AREF (e.g. 1.083)
3const int SAMPLES = 32;     // ortalama için ölçüm sayısı / number of samples to average
4
5void setup() {
6  Serial.begin(9600);
7  analogReference(INTERNAL);        // Uno/Nano: 1,1 V dahili referans / 1.1 V internal reference
8  for (int i = 0; i < 5; i++) {     // referans değişti, ilk okumaları at / discard the first readings after switching
9    analogRead(LM35_PIN);
10    delay(10);
11  }
12}
13
14float readTempC() {
15  long sum = 0;
16  for (int i = 0; i < SAMPLES; i++) {
17    sum += analogRead(LM35_PIN);
18    delay(2);
19  }
20  float raw = sum / (float)SAMPLES;       // ortalama ham değer / average raw value
21  return raw * VREF / 1024.0 * 100.0;     // her basamak ~0,107 °C / each step is ~0.107 °C
22}
23
24void loop() {
25  float t = readTempC();
26  Serial.print(F("Sicaklik / Temp: "));
27  Serial.print(t, 2);
28  Serial.println(F(" C"));
29  if (t > 108.0) {
30    Serial.println(F("Uyari: 1,1 V sinirina yakin / Warning: close to the 1.1 V limit"));
31  }
32  delay(1000);
33}
analogReference(INTERNAL) afeta todas as entradas analógicas da placa: se você também lê um potenciômetro ou um LDR no mesmo projeto, qualquer valor acima de 1,1 V vai aparecer como 1023. Nunca aplique uma tensão externa no pino AREF enquanto a referência interna estiver selecionada; se quiser ligar 3,3 V ao AREF, precisa chamar analogReference(EXTERNAL) antes do primeiro analogRead, senão a referência interna e a fonte externa entram em curto e o microcontrolador pode ser danificado. No Arduino Mega essa opção se chama INTERNAL1V1; no Leonardo e no Micro, INTERNAL dá 2,56 V, e no Uno R4 analogReference(AR_INTERNAL) é 1,5 V.

Como tirar médias e reduzir o ruído

Um único analogRead pode variar um ou dois passos por causa do ruído nos fios e da ondulação na alimentação. A solução mais simples e eficaz é tirar a média de várias leituras: o ruído aleatório cai com a raiz quadrada do número de amostras, então a média de 16 leituras reduz o ruído a um quarto, e a de 64 leituras, a um oitavo. A temperatura muda devagar, então dezenas de leituras feitas em poucos milissegundos não custam nada. Para uma curva ainda mais suave, use um filtro exponencial: filtrado = filtrado + 0.1 × (novo − filtrado). Esse filtro só considera 10 por cento de cada leitura nova e guarda uma única variável na memória. Comparamos outros métodos, como a média móvel e a mediana, no artigo como filtrar dados de sensores.

  • Descarte a primeira leitura depois de trocar de canal: se você lê vários sensores analógicos, o capacitor de amostragem do ADC guarda por um instante a tensão do canal anterior; leia o mesmo pino duas vezes e ignore o primeiro resultado.
  • Leve o GND do sensor direto ao pino GND do Arduino: se a corrente de um relé, motor ou fita de LED passar pelo mesmo fio de terra, surgem desvios de milivolts, e no LM35 cada 10 mV equivale a um grau.
  • Mantenha o cabo curto e longe dos fios de potência: fios longos sem blindagem funcionam como antenas; use cabo trançado ou blindado se precisar.
  • Mantenha o sensor longe de fontes de calor: um LM35 colado em um regulador de tensão, em um módulo ESP32 ou em um relé mede a temperatura da placa, não a do ambiente.
  • Calibre o offset uma vez: deixe o LM35 ao lado de um termômetro confiável e subtraia a diferença constante no código.

LM35 com ESP32: alimentação de 3,3 V e linearidade do ADC

O ESP32 funciona com 3,3 V, mas o datasheet do LM35 exige pelo menos 4 V de alimentação. Um LM35 alimentado com 3,3 V pode parecer funcionar na temperatura ambiente, mas a precisão não é garantida. O jeito certo é alimentar o sensor pelo pino 5V da placa (VIN em algumas placas), ou seja, os 5 V que vêm do USB. Isso não prejudica o ESP32, porque mesmo no ponto mais quente (150 °C) a saída do LM35 nunca passa de 1,5 V. Ligue sempre a saída a um pino do ADC1 (GPIO 32–39), porque os pinos do ADC2 não podem ser usados com o Wi-Fi ligado. Para o mapa detalhado de pinos da sua placa, veja a ferramenta Pinagem e, se o ESP32 é novidade para você, leia O que é o ESP32.

A segunda questão é a linearidade do ADC do ESP32. Ele tem 12 bits (0–4095), mas não é linear nas pontas: mal consegue distinguir tensões abaixo de 100 mV, e o desvio muda de placa para placa. Como o LM35 fornece só 200–300 mV na temperatura ambiente, isso afeta você diretamente. A solução tem duas etapas: escolher a atenuação de acordo com a faixa de tensão do LM35 e, em vez do valor bruto, usar analogReadMilliVolts(), que aplica os dados de calibração gravados no chip durante a produção. Como essa função já retorna milivolts, basta dividir o resultado por 10 para obter a temperatura.

AtenuaçãoFaixa medida com precisãoEquivalente no LM35
ADC_0db100–950 mV10–95 °C
ADC_2_5db100–1250 mV10–125 °C
ADC_6db150–1750 mV15–150 °C
ADC_11db (padrão)150–2450 mV15–150 °C, resolução mais grosseira
C++ (Arduino IDE)
1const int LM35_PIN = 34;     // ADC1_CH6, Wi-Fi açıkken de çalışır / works while Wi-Fi is on
2const int SAMPLES = 64;      // ortalama için ölçüm sayısı / number of samples to average
3
4void setup() {
5  Serial.begin(115200);
6  analogReadResolution(12);                       // 0–4095
7  analogSetPinAttenuation(LM35_PIN, ADC_2_5db);   // ~100–1250 mV, yani 10–125 °C / i.e. 10–125 °C
8}
9
10void loop() {
11  uint32_t sum = 0;
12  for (int i = 0; i < SAMPLES; i++) {
13    sum += analogReadMilliVolts(LM35_PIN);        // kalibre edilmiş mV / calibrated millivolts
14    delay(1);
15  }
16  float mv = sum / (float)SAMPLES;
17  float tempC = mv / 10.0;                        // 10 mV = 1 °C
18  Serial.printf("Gerilim / Voltage: %.1f mV  Sicaklik / Temp: %.2f C\n", mv, tempC);
19  delay(1000);
20}
Como o ESP32 não mede com confiança abaixo de 100 mV, seja qual for a atenuação, leituras do LM35 abaixo de 10 °C no ESP32 saem erradas. Para cômodos frios, ambientes externos ou geladeira, use o DS18B20. Se quiser um sensor analógico em um circuito que só tem 3,3 V, o TMP36 é uma boa alternativa: ele funciona com 2,7–5,5 V e fornece 500 mV a 0 °C. A pinagem é igual à do LM35, e a fórmula é temperatura = (mV − 500) / 10.

LM35 com Raspberry Pi Pico e MicroPython

O ADC de 12 bits do Pico fica nos pinos GP26, GP27 e GP28; como referência, ele usa o ADC_VREF, uma versão filtrada da linha de 3,3 V. No MicroPython, read_u16() escala o resultado para 0–65535, então tensão = raw × 3.3 / 65535. A resolução teórica é de 0,8 mV, ou cerca de 0,08 °C, mas na prática o ADC do Pico tem um pouco de ruído e mostra pequenos saltos em certos valores, então aqui a média também é obrigatória. Alimente o LM35 pelo VBUS (pino 40), que leva os 5 V do USB; se você usar o Pico com baterias em vez de USB, garanta que a tensão no VSYS fique acima de 4 V e alimente o sensor por ali. Se é a primeira vez que você usa um Pico, encontra a instalação do MicroPython em O que é o Raspberry Pi Pico.

MicroPython
1from machine import ADC, Pin
2import time
3
4# Pin(23, Pin.OUT, value=1)  # yalnız Pico (W değil): regülatör PWM modu, daha az gürültü / Pico (not W) only: SMPS PWM mode, less noise
5lm35 = ADC(26)               # GP26 = ADC0, fiziksel pin 31 / physical pin 31
6VREF = 3.3                   # ADC_VREF'i multimetreyle ölçüp yaz / measure ADC_VREF with a multimeter
7SAMPLES = 64                 # ortalama için ölçüm sayısı / number of samples to average
8
9
10def read_temp_c():
11    total = 0
12    for _ in range(SAMPLES):
13        total += lm35.read_u16()   # 0–65535, 12 bit sonuç 16 bite ölçeklenir / 12-bit result scaled to 16 bits
14    raw = total / SAMPLES
15    volts = raw * VREF / 65535
16    return volts * 100             # 10 mV/°C
17
18
19while True:
20    t = read_temp_c()
21    print("Sicaklik / Temp: {:.2f} C".format(t))
22    time.sleep(1)

O chip do Pico também tem um sensor de temperatura (ADC(4)), mas ele mede a temperatura do próprio chip, não do ambiente, e normalmente lê alguns graus acima durante o funcionamento; para a temperatura ambiente você precisa de um sensor externo como o LM35. Para resultados mais limpos em um Pico padrão, você pode colocar o GP23 em HIGH para passar o regulador de alimentação da placa para o modo PWM; isso reduz a ondulação no ADC_VREF, mas consome um pouco mais de corrente em repouso. No Pico W esse pino é reservado para o chip sem fio, por isso essa linha fica comentada no código.

Como medir temperaturas negativas com o LM35

No circuito básico, o LM35 só mede de 2 °C a 150 °C, porque o estágio de saída consegue fornecer corrente, mas quase não consegue absorvê-la, então a saída não desce abaixo do terra. Para temperaturas negativas, o datasheet mostra duas opções. A primeira é ligar a saída a uma alimentação negativa através de um resistor (R = Vs / 50 µA; 100 kΩ para −5 V), algo raro em projetos com Arduino porque não há alimentação negativa. A segunda é o método com fonte única: você levanta o pino GND do LM35 cerca de 1 V acima do terra com dois diodos em série (ex.: 1N4148), liga um resistor de 18 kΩ entre a saída e o terra e então lê a saída no A0 e o pino GND do LM35 no A1. A temperatura é (tensão em A0 − tensão em A1) × 100. Para manter pelo menos 4 V entre os pinos do próprio LM35 nesse circuito, alimente o +Vs pelo VIN (ex.: uma fonte de 9 V) em vez dos 5 V e use a referência de 5 V. Lembre-se de que o LM35DZ comum não tem garantia abaixo de 0 °C; se você precisa de leituras negativas com frequência, o DS18B20 dá muito menos trabalho.

LM35 vs DS18B20 vs DHT11

Sensor DS18B20
Sensor DS18B20
Sensor DHT11
Sensor DHT11
CaracterísticaLM35 (LM35DZ)DS18B20DHT11
SaídaAnalógica, 10 mV/°CDigital (1-Wire)Digital (fio único)
Faixa de medição0 … +100 °C (LM35: −55 … +150 °C)−55 … +125 °C0 … +50 °C
PrecisãoTipicamente ±0,6 °C, no máximo ±1,5 °C a 25 °C±0,5 °C (−10 … +85 °C)±2 °C
Alimentação4–30 V3,0–5,5 V3–5,5 V
UmidadeNãoNãoSim
BibliotecaNão precisaOneWire + DallasTemperatureDHT sensor library
Tempo de leituraInstantâneo, saída contínuaAté 750 ms em 12 bitsNo máximo 1 leitura por segundo
Com ESP32 e PicoCom alimentação de 5 V; atenção aos limites do ADCDireto em 3,3 VDireto em 3,3 V
Vários sensores em um pinoNão, um pino analógico para cadaSimNão
Versão à prova d'águaNão, você precisa vedar por conta própriaSonda de aço inoxNão

Resumindo: se você quer um termômetro simples que reage rápido, não precisa de biblioteca, usa um único pino analógico e funciona em um Arduino de 5 V, o LM35 é ideal; ele também é o sensor mais didático para aprender leituras analógicas e referências do ADC. Se o cabo for longo, se você precisar de temperaturas negativas, se o sensor for mergulhado em um líquido ou se estiver trabalhando com placas de 3,3 V como o ESP32 e o Pico, o DS18B20 é a melhor escolha. Se também quiser umidade, use o DHT11 ou o irmão mais preciso dele, o DHT22. Para uma comparação mais ampla, que também inclui termistores NTC, o BME280 e outros, veja Sensores de temperatura para Arduino comparados.

Ideias de projetos com LM35

O projeto mais popular com LM35 é um termostato que liga uma ventoinha quando a temperatura passa de um valor definido. O segredo é a histerese: se a ventoinha liga a 30 °C e desliga a 28 °C, o relé não fica estalando a cada segundo quando a temperatura oscila bem no limite, e os contatos dele não se desgastam. Você pode acionar a ventoinha com um módulo relé ligado ao D7:

C++ (Arduino IDE)
1const int LM35_PIN = A0;
2const int RELAY_PIN = 7;          // röle modülünün IN pini / relay module IN pin
3const float ON_TEMP = 30.0;       // bu değerde fan açılır / fan turns on here
4const float OFF_TEMP = 28.0;      // bu değerde fan kapanır / fan turns off here
5const float VREF = 1.1;           // ölçtüğün AREF değeri / your measured AREF value
6bool fanOn = false;
7
8float readTempC() {
9  long sum = 0;
10  for (int i = 0; i < 32; i++) {
11    sum += analogRead(LM35_PIN);
12  }
13  return (sum / 32.0) * VREF / 1024.0 * 100.0;
14}
15
16void setup() {
17  Serial.begin(9600);
18  pinMode(RELAY_PIN, OUTPUT);
19  digitalWrite(RELAY_PIN, LOW);
20  analogReference(INTERNAL);      // 1,1 V referans / 1.1 V reference
21  analogRead(LM35_PIN);           // ilk okumayı at / discard the first reading
22  delay(10);
23}
24
25void loop() {
26  float t = readTempC();
27  if (!fanOn && t >= ON_TEMP) fanOn = true;      // eşik aşıldı / threshold exceeded
28  if (fanOn && t <= OFF_TEMP) fanOn = false;     // yeterince soğudu / cooled down enough
29  digitalWrite(RELAY_PIN, fanOn ? HIGH : LOW);   // aktif-HIGH röle varsayıldı / assumes an active-HIGH relay
30  Serial.print(t, 1);
31  Serial.println(fanOn ? " C  fan ON" : " C  fan OFF");
32  delay(1000);
33}
  • Termostato de ventoinha ajustável: combine o código acima com uma ventoinha CC e um relé e suba ou desça o limite com dois botões.
  • Termômetro digital com LCD: mostre a temperatura em um LCD I2C ou em um display OLED junto com a mínima e a máxima do dia.
  • Alarme de superaquecimento: toque um buzzer e acenda um LED quando uma fonte, um carregador de bateria ou o motor de uma impressora 3D esquentar demais.
  • Termômetro de ambiente com Wi-Fi: mostre a temperatura medida pelo ESP32 em uma página web que você abre no celular.
  • Controle de estufa e chocadeira: monte um sistema que gerencia um aquecedor e uma ventoinha conforme a temperatura; detalhes no artigo projeto de estufa inteligente.
  • Registrador de temperatura: grave uma leitura por minuto em um cartão SD e trace a curva diária de temperatura no Excel.

Erros comuns e como corrigi-los

SintomaCausa provávelSolução
O sensor fica quente demais para tocar+Vs e GND estão trocadosCorte a alimentação na hora; com a face plana virada para você, a ordem deve ser +Vs, Vout, GND
O valor é sempre 0Não chega alimentação ao sensor, ou o Vout está ligado a um pino diferente do códigoMeça 5 V entre +Vs e GND com um multímetro e confira se o Vout vai ao A0
Os valores pulam aleatoriamenteO A0 está flutuando ou o contato da protoboard está ruimTroque o jumper e mude o sensor de fileira na protoboard
O valor alterna em passos de 0,5 °CResolução da referência de 5 VUse analogReference(INTERNAL) e tire médias
O valor salta quando um relé ou motor chaveiaQueda de tensão e ruído no terra compartilhadoLeve o GND do sensor direto ao Arduino e acrescente um capacitor de 0,1 µF
Lê 2–3 °C acima da temperatura realO sensor está ao lado do regulador ou do módulo ESP32Afaste o sensor da placa usando um cabo
Outros sensores analógicos leem 1023A referência INTERNAL limita todas as entradas analógicas a 1,1 VLeia os outros sensores com a referência de 5 V ou divida a tensão deles
Valores sem sentido no ESP32 no frioO ADC do ESP32 não mede com precisão abaixo de 100 mVUse um DS18B20 abaixo de 10 °C
Um jeito fácil de conferir a precisão do seu LM35 é deixá-lo alguns minutos ao lado de um termômetro confiável; se a diferença for constante (ex.: sempre 0,8 °C acima), subtraia-a como offset no código. Se você estiver medindo uma superfície, cole o sensor e os terminais na superfície com uma gota de epóxi; segundo o fabricante, o LM35 passa então a acompanhar muito de perto a temperatura da superfície. Se o sensor for para dentro de um líquido, isole sempre os terminais, porque a corrente de fuga entre terminais molhados faz as leituras derivarem.

O LM35 é uma peça inicial perfeita para aprender leituras de sensores analógicos, referências do ADC e filtragem de sinais: você começa com uma única fórmula e depois usa a referência certa, médias e calibração para deixar a sua medição tão confiável quanto um termômetro. Você vai usar a mesma abordagem com outros sensores analógicos, como o termistor NTC. No app BlueGrays você encontra projetos como medição de temperatura com NTC e LCD, temperatura e umidade com 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

Que tensão o LM35 precisa? Ele funciona com 3,3 V?

O datasheet do LM35 especifica uma alimentação de 4–30 V. Com 3,3 V ele normalmente ainda dá uma leitura na temperatura ambiente, mas a precisão não é garantida. No ESP32 e no Pico, alimente o sensor pelo pino de 5 V (VIN ou VBUS); a saída dele nunca passa de 1,5 V, então pode ir direto a uma entrada analógica de 3,3 V.

Por que o meu LM35 está esquentando?

Em funcionamento normal, o LM35 consome só cerca de 60 µA e se aquece menos de 0,1 °C; se ele estiver quente ao toque, os pinos de alimentação e GND quase sempre estão invertidos. Com a face plana virada para você, a ordem correta da esquerda para a direita é +Vs, Vout, GND. Corte a alimentação na hora; um sensor deixado invertido por muito tempo pode ser danificado de forma permanente.

Qual é a fórmula de temperatura do LM35?

Em um Arduino Uno com a referência de 5 V, temperatura (°C) = analogRead × 5.0 / 1024 × 100, ou aproximadamente analogRead × 0,488. Com a referência interna de 1,1 V, o fator passa a ser 1,1 / 1024 × 100 ≈ 0,107. No ESP32, basta dividir o resultado de analogReadMilliVolts() por 10.

O LM35 mede temperaturas negativas?

No circuito básico, o LM35 só mede de 2 °C a 150 °C. Para valores negativos, você precisa puxar a saída para uma alimentação negativa através de um resistor ou levantar o pino GND com dois diodos e medir a diferença com duas entradas analógicas; o sensor também precisa ser uma versão especificada abaixo de zero, como o LM35 ou o LM35C. Na prática, o DS18B20 é muito mais fácil para temperaturas abaixo de zero.

Qual é melhor, o LM35 ou o DS18B20?

Em um projeto com Arduino de 5 V e cabo curto, o LM35 é muito prático porque não precisa de biblioteca e lê na hora. Para cabos longos, temperaturas negativas, medições em líquidos, vários sensores em um pino ou placas de 3,3 V, o DS18B20 digital dá resultados mais precisos e confiáveis. Na temperatura ambiente, o LM35A e o DS18B20 têm precisão parecida, enquanto o LM35DZ comum fica um pouco atrás.

Por que a leitura do meu LM35 fica mudando?

Com a referência de 5 V, cada passo do ADC equivale a cerca de 0,5 °C, então o valor alterna entre dois passos, e a ondulação da tensão do USB também afeta o resultado. Passe para a referência de 1,1 V com analogReference(INTERNAL), tire a média de 16–64 leituras e acrescente um capacitor de 0,1 µF nos pinos de alimentação do sensor. Se houver um relé ou motor, leve o GND do sensor direto ao Arduino.

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 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
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
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
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