← Sensores · Núcleo Neon · aula 1

O LM35 e a regra de três

O sensor devolve um número de 0 a 1023, não graus. Esta aula é a conta que traz a temperatura de volta, do jeito mais simples que existe.

começar ↓

Na aula do motor que esquenta, a conta para na temperatura: quanto o enrolamento subiu acima do ar em volta. Quem responde isso na prática é um sensor preso na carcaça. Só que o sensor não fala em graus. Ele devolve um número, e o número sozinho não diz nada.

O caminho de todo sensor: temperatura → tensão → Arduino → número. O Arduino não enxerga volts: ele transforma a tensão num número de 0 a 1023, onde 0 é 0 V e 1023 é 5 V.

temperatura → tensão → Arduino → número
0 é 0 V  ·  1023 é 5 V

A peça por fora

Antes da conta, saber o que é cada perna evita a maior parte dos sustos.

LM35 · TO-92 a parte chata virada pra você LM35 DZ +Vs saída GND o que cada perna faz +Vs · alimentação, de 4 V a 30 V saída · 10 mV a cada 1 °C GND · o zero, junto com o do Arduino a 30 °C solta 0,30 V a 0 °C solta 0 V o DZ mede de 0 a 100 °C
LM35 · o sensor já entrega tensão pronta. Não precisa de resistor nenhum em volta.

A regra de três

O LM35 é o “feijãozinho” preto de três pernas. A cada 1 °C, ele solta 10 milivolts (0,01 V). A 30 °C, solta 0,30 V.

com letra

Passo 1, de número pra volts (5 V está pra 1023 assim como V está pra leitura):

V = leitura × 5 ÷ 1023

Passo 2, de volts pra graus (0,01 V vale 1 °C: dividir por 0,01 é multiplicar por 100):

T = V × 100  ⇒  T = leitura × 5 × 100 ÷ 1023
sem letra

O Arduino leu 62:

V = 62 × 5 ÷ 1023 = 310 ÷ 1023 = 0,303 V
T = 0,303 × 100 = 30,3 °C

Confere: 30,3 °C × 0,01 V = 0,303 V ✓

Quadro negro com a dedução do LM35 escrita à mão
no quadro · o LM35, do caminho do sensor até a regra de três

A mesma conta, dentro do Arduino

Tudo que está acima cabe em três linhas. O analogRead é quem devolve o número de 0 a 1023:

const int PINO = A0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  int leitura = analogRead(PINO);          // 0 a 1023
  float volts = leitura * 5.0 / 1023.0;    // passo 1
  float graus = volts * 100.0;             // passo 2: 10 mV por grau

  Serial.print(leitura);   Serial.print("  ");
  Serial.print(volts, 3);  Serial.print(" V  ");
  Serial.println(graus, 1);
  delay(500);
}

Repare que as duas linhas da conta são exatamente os dois passos da regra de três. Não tem biblioteca, não tem mágica.

sem o sensor na mão

Não precisa ter o LM35 para ver isso funcionando. Na bancada de Arduino do site esse mesmo código está compilado e roda num Uno emulado: você gira um botão de temperatura, ele injeta no A0 a tensão que o LM35 soltaria, e o monitor serial imprime a leitura, os volts e os graus. O LED do pino 13 faz de alarme acima de 60 °C.

O que é de mentira ali é só o sensor. O código é o mesmo, compilado de verdade.

o limite que quase ninguém conta

Com esse código, o LM35 não consegue distinguir meio grau.

por quê

O Arduino divide os 5 V em 1024 degraus: cada degrau vale 5 ÷ 1024 = 4,88 mV. Como o LM35 dá 10 mV por grau, um degrau do conversor vale 0,49 °C. A leitura pula de meio em meio grau, e nada que você escreva no código muda isso. O jeito de melhorar é trocar a referência: analogReference(INTERNAL) usa 1,1 V em vez de 5 V, cada degrau vira 1,07 mV, e a resolução cai para 0,11 °C. Em troca, o máximo que dá para medir passa a ser 110 °C.

Bancada · mexe na leitura do Arduino

arrasta e vê a conta inteira se refazendo, com o degrau do conversor à mostra

A continha de hoje à noite · o LM35 leu 60

A conta 60 × 5 × 100 ÷ 1023 parece grande, mas são três continhas pequenas.

pedaço 1 · 60 × 5 · o que eu fiz

60 × 5 = 360

a correção

360 é 60 × 6, somei uma vez a mais. 60 × 5 é cinco vezes o 60: 60 + 60 + 60 + 60 + 60 = 300. Mais rápido: tira o zero, 6 × 5 = 30, devolve o zero: 300. Truque: fala “cinco vezes o sessenta” e conta nos dedos.

pedaço 2 · 300 × 100 · o que eu fiz

300 × 100 = 300 mil

a correção

O 100 tem dois zeros, então põe só dois zeros no fim: 300 → 30.000 (trinta mil). Confere: 300 × 10 = 3.000, e ×10 de novo = 30.000.

pedaço 3 · 30.000 ÷ 1023 · o que eu fiz

Dividi por 3.

a correção

Dividir por 1000 é riscar três zeros, não dividir por 3: 30.000 vira 30. Como 1023 é um pouco maior que 1000, o resultado fica um pouco menor que 30.

sem letra
60 × 5 = 300 → 300 × 100 = 30.000 → 30.000 ÷ 1023 ≈ 29,3 °C

E o exemplo anterior, leitura 51: 51 × 5 = 250 + 5 = 255, ×100 = 25.500, ÷1023 ≈ 24,9 °C ✓

A regrinha dos zeros

×10, ×100, ×1000 põe 1, 2 ou 3 zeros no fim
÷10, ÷100, ÷1000 tira 1, 2 ou 3 zeros do fim
pra treinar
  1. LM35 leu 40: qual a temperatura?
  2. O LM35 está marcando 100 °C. Que número o Arduino está lendo?
  3. A leitura pulou de 62 para 63. Quantos graus isso mudou?

Primeiro tenta, depois confere.

ver as respostas 1. 40 × 5 = 200 → ×100 = 20.000 → ÷1023 ≈ 19,6 °C · 2. 100 °C são 1,00 V, e 1,00 V é 1023 ÷ 5 = 205 (o número volta pelo caminho contrário) · 3. Um degrau do conversor: 4,88 mV, que no LM35 valem 0,49 °C. É o menor passo que ele enxerga.
Quadros negros na parede com as contas, e a cama coberta de folhas e canetas
a sala de aula · os quadros na parede, as folhas na cama e as canetas. É daqui que sai cada aula.
pra levar

O Arduino devolve um número de 0 a 1023, não volts. No LM35 o caminho são dois passos: número vira volts pela regra de três, volts viram graus multiplicando por 100. E nenhuma conta no código faz o sensor enxergar menos que meio grau, porque o limite está no conversor, não na fórmula.

Sensores · Núcleo Neon · aula 1 de 2 · o caderno e o quadro são do João; as contas foram conferidas uma a uma na arrumação pro site