LM35 – Medindo temperatura com Arduino

728 Flares Twitter 0 Facebook 728 Google+ 0 728 Flares ×

Em diversas aplicações temos que fazer a leitura de variáveis físicas, tais como a temperatura, distancia, entre diversas outras. Nesse tutorial iremos aprender como fazer a leitura de temperatura usando o LM35, um sensor barato e de ótima precisão. Vamos lá?

Sistemas autônomos

Quando pensamos em um sistema autônomo, pensamos em um sistema que faça a tarefa designada por conta própria, sem a necessidade de interferência do homem. Para isso, é fundamental que o seu sistema autônomo enxergue as variáveis físicas que serão importantes para o desempenho da atividade.

Pense em uma geladeira ou num ar condicionado. Neles devemos definir o valor de temperatura desejado e a partir desse valor o equipamento deve controlar essa variável. Para que ele tenha capacidade de controlar a temperatura, é fundamental que o sistema possa ler a variável. É ai que entram os sensores.

Sensores

Da famosa enciclopédia online Wikipédia, temos que:

 “Um sensor é um dispositivo que responde a um estímulo físico/químico de maneira específica e mensurável analogicamente.”

Ou seja, sensores são dispositivos capazes de ler variáveis físicas ou químicas do ambiente e transformá-las em informação.

Qualquer processo automático possui sensores. Em industrias, onde há processos de produção automatizados, temos muitos tipos de sensores medindo as mais diversas variáveis do processo: temperatura, pressão, peso, pH, dentre muitos outros. Devido a importância da leitura dessas variáveis, existe uma área responsável por instrumentos de medição, a Instrumentação Industrial.

Nós, seres humanos, também somos feitos de vários sensores que nos ajudam a desenvolver nossas tarefas. Os nossos cinco sentidos: Olfato, audição, paladar, tato e visão, nada mais são do que conjuntos de sensores que colhem informações do ambiente para que o cérebro possa tomar decisões adequadas em cada situação.

Usando sensores

Tão importante quanto medir uma variável física é  transformá-la em uma informação legível pelo cérebro do sistema autônomo, nosso Arduino, por exemplo. Pensando em eletrônica, essa informação pode ser digital ou analógica (Veja o tutorial Grandezas Digitais e Analógicas e PWM)

  • Digital: Quando a informação é passada através de valores lógicos Altos(1) ou valores lógicos baixo(0).
  • Analógico: Quando a informação pode assumir qualquer valor dentro de um máximo e um mínimo. Quando trabalhamos com eletrônica, geralmente essa informação é dada por um valor de corrente ou tensão.

LM35

O sensor LM35 é um sensor de precisão que apresenta uma saída de tensão linear proporcional à temperatura em que ele se encontrar no momento, tendo em sua saída um sinal de 10mV para cada Grau Célsius de temperatura.

LM35

LM35

Esse sensor não necessita de qualquer calibração externa para fornecer com exatidão, valores temperatura com variações de ¼ºC ou até mesmo ¾ºC dentro da faixa de temperatura entre –55ºC e 150ºC.

Ele pode ser usado de duas formas, com alimentação simples ou simétrica, dependendo do que se desejar como sinal de saída, mas independentemente disso, a saída continuará sendo de 10mV/ºC.

Em cada uma dessas duas formas de alimentação, o range de temperatura, ou seja, a temperatura máxima e mínima medida com exatidão, é diferente.

LM352

Modo escala completa – (-55ºC a 150ºC)

LM35

Modo básico – (2ºC a 150ºC)

Uma vantagem é o fato desse sensor drenar apenas 60μA para estas alimentações. Dessa forma, seu auto-aquecimento é de aproximadamente 0.1ºC ao ar livre.

O sensor LM35 é apresentado com vários tipos de encapsulamentos, sendo o mais comum o TO-92, que mais se parece com um transistor, e oferece ótima relação custo benefício, por ser o encapsulamento mais barato sem diferenças em seu uso ou exatidão.

Veja a folha de dados dele clicando aqui.

lm35_3

 

Mãos à obra – Medindo temperatura

Ingredientes:

  • Fios Jumper’s
  • Protoboard
  • Arduino Uno Rev3
  • LM35

Misturando os ingredientes

Agora vamos conectar os componentes do projeto. Para isso, desligue o cabo USB de seu Arduino e monte seu circuito conforme a figura a seguir.

Veja como ficou o nosso:

PSX_20150626_152624

Levando ao forno

Conecte seu Arduino ao computador e abra a IDE Arduino.

Antes de carregar um programa, você precisa selecionar qual porta você deseja usar para fazer carregar o programa no Arduino (upload). Dentro do Arduino IDE, clique no menu Ferramentas (tools) e abra o submenu Porta(Port). Clique na porta que seu Arduino está conectado, tal como COM3 ou COM4. Geralmente aparece o nome da placa Arduino : “COM3 (Arduino Uno)”.

Você também precisa garantir que o tipo de placa apropriado está selecionado em Ferramentas(Tools) no submenu Placa (Board).

Preparando a cobertura

Crie um programa (sketch) e salve com o nome de “programa_sensor_de_luz”.

Com o seu programa salvo, escreva nele o código conforme escrito abaixo.

//Sensor de temperatura usando o LM35

const int LM35 = A0; // Define o pino que lera a saída do LM35
float temperatura; // Variável que armazenará a temperatura medida

//Função que será executada uma vez quando ligar ou resetar o Arduino
void setup() {
Serial.begin(9600); // inicializa a comunicação serial
}

//Função que será executada continuamente
void loop() {
temperatura = (float(analogRead(LM35))*5/(1023))/0.01;
Serial.print("Temperatura: ");
Serial.println(temperatura);
delay(2000);
}

Após escrever o código, clique em Upload para que o programa seja transferido para seu Arduino.

Experimentando o prato

Caso tenha ocorrido tudo conforme esperado, poderemos fazer a leitura da temperatura através do monitor serial. Abra o monitor serial para verificar o que está sendo lido na entrada A0.

gifserial

 

Entendendo o Software

Primeiramente, em nosso programa usamos o comando de leitura analógica, já estudado no tutorial Entradas e Saídas Analógicas, para fazer a leitura do valor em A0. Além disso, usamos a comunicação serial, também discutida em outro tutorial, Comunicação Serial Arduino . É importante que o leitor entenda como eles funcionam. Experimente ler nossos tutoriais anteriores.

Em resumo, nosso programa lerá qual é o valor do sinal em A0, que varia de 0 a 1023, onde 0 corresponde a 0Volts e 1023 corresponde a 5Volts. Como sabemos, 1ºC é igual a 10mV. Sendo assim, temos:

Tensão em A0 = (Valor lido em A0)*(5/1023)

Temperatura = Tensão em A0/10mV

Logo:

Temperatura =  [(Valor lido em A0)*(5/1023)]/10mV

Em linguagem de programação, ficará:

temperatura = (float(analogRead(LM35))*5/(1023))/0.01;

Perceba que colocamos o comando de leitura do valor analógico, analogicRead, dentro de float(). Você saberia me dizer o motivo?

Quando o Arduino faz uma leitura analógica, ele converte o valor lido, que pode ser um valor de tensão entre 0V e 5V, em um número entre 0 e 1023. Ou seja, o Arduino divide 5Volts, que é o maior valor que ele é capaz de ler, em 1024 partes iguais e lhe informa quantas partes tem o valor que ele está medindo.

O número que o Arduino lhe informa é do tipo inteiro, contudo, o valor de temperatura é um numero racional, que pode assumir valores decimais. Por conta disso, no nosso programa, declaramos a temperatura como uma float.

Em programação, quando multiplicamos uma variável inteira por uma variável racional, o programa considera que o resultado deve ser inteiro, eliminando a parte decimal da variável. Dessa forma, para que tenhamos um resultado racional, devemos transformar o número inteiro em um número racional.

Em virtude disso, em nosso código foi necessário colocar o comando de leitura do valor analógico, analogicRead, dentro de float().

numeroracional = float(numero);
temperatura = (float(analogRead(LM35))*5/(1023))/0.01;

Sempre que for necessário fazer um calculo com o valor analógico, precisamos convertê-lo para uma variável do tipo float.

Em alguns casos, precisamos transformar uma variável qualquer para o tipo inteiro. O procedimento é o mesmo, ou seja, basta colocar o valor ou variável dentro dos parenteses de int();

numerointeiro= int(numero);
temperatura = int((float(analogRead(LM35))*5/(1023))/0.01);

Se usamos o int() no calculo de temperatura, tal como mostrado acima, teremos um resultado sem os números decimais. Faça o teste.

Desafios

  1. Tente retirar o comando float() do calculo de temperatura e veja o resultado. Provavelmente você terá o valor de temperatura igual a zero, descubra o motivo.
  2. Crie um alarme usando um buzzer e um LM35, explicado em nosso ultimo tutorial Usando buzzer com Arduino, Quando a temperatura estiver muito alta, o alarme deve disparar.
  3. Usando 3 ou mais LED’s e um LM35, faça um programa que aumente o numero de LED’s acesos conforme a temperatura seja maior.

Esperamos que tenham gostado, deixe seu comentário com duvidas, sugestões ou com a foto ou vídeo de seu projeto!!

Revisado por Ícaro Lobo.

Apostila Arduino 800px

 

728 Flares Twitter 0 Facebook 728 Google+ 0 728 Flares ×

Allan Mota

Estudante de Engenharia Elétrica da UFES, integrante da ERUS - Equipe de Robótica da UFES e Fundador do Vida de Silício. Sonhador com uma única pretensão, fazer a diferença.

You may also like...

  • Edwin

    Parabéns Allen com seu artigo.
    Uma observação: 5/1023 = 0.00488 volt … = 4.88 mV = resolução maxima = 4.88 mV /10 mV / 1 Celsius = 0.488 Celsius.
    Para obter uma resolução maior que approx. 0.5 Celsius seria por limitar a escala de temperatura e amplificar o sinal de saída do LM35. Por exemplo 10 vezes (usando um OPAMP) = 0.0488 Celsius de resolução … * 1023 = +49.9 Celsius como limite max.

    • Allan Mota

      Obrigado pelo retorno. Gostei da sugestão.

  • A sua ideia é grande , mas o artigo tem uma série de coisas precisa de ser melhorada , por exemplo , no que diz respeito a alguns dos conceitos em frente do sensor pode ser apropriadamente reduzida , uma descrição mais detalhada da função pode ser implementado em alguma parte .

  • julius cal

    Olá, recentemente adquiri um kit de arduino e estava testando alguns items que vieram com o mesmo, então testei o sensor LM35, com o mesmo código mostrado acima, mas mesmo assim ele mostrava no monitor serial valores absurdos como de 100 a 200, gostaria de saber se é um problema com o sensor ou alguma configuração errada que possa ter cometido durante a instalação.
    Previamente agradeço.

    • Ricardobruno

      Também estou com esse mesmo problema!

      • Áquila

        Também estou com o mesmo problema [3]

    • Rodrigo

      Com certeza é o sensor, componentes eletrônicos com defeito ou falsificados sempre da dor de cabeça, ainda mais pq geralmente é o lote inteiro que foi fabricado que esta com defeito, ou o fornecedor da loja vendeu falsificado mesmo, as lojas nao testam os componentes, o melhor seria vc trocar por algum que vc saiba que está funcionando.

  • Ivo Calado

    Allan, segui os passos passados porém o resultado está apresentando uma grande variação, conforme abaixo. Alguma sugestão do que pode estar ocorrendo?

    Temp: 0.00
    Temperatura: 0.00
    Temperatura: 37.15
    Temperatura: 23.95
    Temperatura: 34.70
    Temperatura: 16.13
    Temperatura: 0.00
    Temperatura: 0.00
    Temperatura: 7.33
    Temperatura: 32.26
    Temperatura: 35.68
    Temperatura: 0.00
    Temperatura: 0.00
    Temperatura: 0.00
    Temperatura: 3.42
    Temperatura: 21.99

    • Áquila

      Também estou com o mesmo problema [2]

    • Rodrigo

      Provavelmente o seu LM35 ta com defeito, troca ele.

    • isso está acontecendo porque você está invertendo a pinagem do sensor. Também tive esse problema pois olhei o datasheet de outra versão sem querer e estava dando valores absurdos de 53°C. Eis a pinagem correta http://3.bp.blogspot.com/-5j3ehcVvJGg/U30LDEeJ6rI/AAAAAAAACK0/pO5ti-DNydI/s1600/LM35-pin.jpg

    • pode ser também corrente baixa, tente alimentar o arduino num carregador de celular, por exemplo.
      coloquei um LCD e o LM35, no USB do PC não funciona bem, mostra temperatura um pouco maior do que o normal. Já num Powerbank fica perfeito.

      • Oscar B. Monteiro Jr.

        Não creio que seja “corrente baixa”. Qualquer porta USB de um desktop fornece pelo menos 100 mA. O sensor drena no máximo 60 uA. Dá e sobra! Estou com o mesmo problema do Ivo Calado e tantos outros, com um lote de 5 sensores comprados na Banggood! Porém tenho minhas dúvidas quanto a capacidade do meu Arduino Nano. Depois de carregar o code, rodar e desconectar o jumper do pino A0, o Nano continua mandando informações pro display. Como pode se não tem mais sinal entrando?
        Abraço!

        • É, porém não estou alimentando somente o LM35 com a porta USB.
          Pra ter uma noção, até a regulagem de contraste fica com uma gama mais alta numa powerbank ou alimentação externa.

        • Mas no caso dessa variação, acho que pode descartar a corrente mesmo. É meio absurdo.

  • FELIPE GBUR

    é possível utilizar a varável Double no lugar da de float

  • FELIPE GBUR

    eu consigo fazer os leds acenderem porem, conforme a temperatura aumenta os led’s anteriores não se apagam, alguém pode ajudar

    //sensor de temperatura
    #define sensor A0
    #define LED_VERDE 2
    #define LED_AMARELO 3
    #define LED_VERMELHO 4

    int alerta;
    float temperatura;

    float tempBaixa = 1.0;
    float tempMedia= 20.0;
    float tempAlta= 25.0;

    void setup() {
     Serial.begin(9600);
     pinMode(LED_VERDE, OUTPUT);
     pinMode(LED_AMARELO, OUTPUT);
     pinMode(LED_VERMELHO, OUTPUT);

    }

    void loop() {
     temperatura = (float(analogRead(sensor)) * 5 / (1023)) / 0.01;
     Serial.print(“temperatura= “);
     Serial.println(temperatura);
     delay(3000);

     if (tempBaixa >= temperatura) {
       digitalWrite(LED_VERDE, HIGH);
     }else{
       digitalWrite(LED_VERDE, LOW);

       }
     if (tempMedia>=temperatura){
       digitalWrite(LED_AMARELO, HIGH);
     }else{
       
       digitalWrite(LED_AMARELO, LOW);
     }
     if (tempAlta>temperatura)   {
       digitalWrite(LED_VERMELHO, HIGH);
     }else{ digitalWrite(LED_VERMELHO, LOW);}
    }

  • FELIPE GBUR

    eu consigo fazer os LED acenderem porem, conforme a temperatura aumenta os LED anteriores não se apagam, alguém pode ajudar

    //sensor de temperatura
    #define sensor A0
    #define LED_VERDE 2
    #define LED_AMARELO 3
    #define LED_VERMELHO 4

    int alerta;
    float temperatura;

    float tempBaixa = 1.0;
    float tempMedia= 20.0;
    float tempAlta= 25.0;

    void setup() {
    Serial.begin(9600);
    pinMode(LED_VERDE, OUTPUT);
    pinMode(LED_AMARELO, OUTPUT);
    pinMode(LED_VERMELHO, OUTPUT);

    }

    void loop() {
    temperatura = (float(analogRead(sensor)) * 5 / (1023)) / 0.01;
    Serial.print(“temperatura= “);
    Serial.println(temperatura);
    delay(3000);

    if (tempBaixa >= temperatura) {
    digitalWrite(LED_VERDE, HIGH);
    }else{
    digitalWrite(LED_VERDE, LOW);

    }
    if (tempMedia>=temperatura){
    digitalWrite(LED_AMARELO, HIGH);
    }else{

    digitalWrite(LED_AMARELO, LOW);
    }
    if (tempAlta>temperatura) {
    digitalWrite(LED_VERMELHO, HIGH);
    }else{ digitalWrite(LED_VERMELHO, LOW);}
    }

    • Oscar B. Monteiro Jr.

      No início do loop, comece com todos apagados (LOW) !

    • Marcus Vinícius

      O correto é:
      if (temperatura temp Baixa && temperatura = tempAlta) {
      digitalWrite(LED_VERMELHO, HIGH);
      }else{ digitalWrite(LED_VERMELHO, LOW);}
      }

  • rogerio peixoto

    Prezados, sou iniciante no mundo Arduíno e um dos fatores do projeto que preciso desenvolver envolver medição de temperatura corporal de pequenos animais. Sabendo que a fiação entre os sensores e o microcontrolador será roída por eles (além do risco de choque elétrico ao spécimen) gostaria de saber dos Srs se conhecem algum sensor que possa medir a temperatura a curta distância, sem que precise estar fixado ao corpo do animal (que ficará em uma pequena gaiola). Desde já agradeço pelas dicas/orientações.

    • Oscar B. Monteiro Jr.

      Já pensou em infra vermelho (IR). Existem medidores de temperatura com IR !

  • Oscar B. Monteiro Jr.

    Então, não dei sorte na compra de um lote de 5 sensores e nenhum deles funciona como esperado. Esqueceram de dizer pra eles na fabricação qual seria a função deles. Iria utilizar o sensor pra monitorar a temperatura de um dissipador com ventoinha, mandando o sinal pro Arduino Nano e este iria controlar o acionamento do motor da ventoinha de acordo com a temperatura. O esquema seria esse:
    https://uploads.disquscdn.com/images/eb85154fa1fc67f41cec747281be65bd18ab7ed7f3e614c0a47759b930a2998c.png

    Mas com essa dificuldade com os sensores, me dei conta de que não preciso saber o valor da temperatura pra acionar a ventoinha. Basta ao Arduino saber: tá quente, ligar a ventoinha! Então pensei no termistor NTC. Vai esquentando o dissipador, a resistência do termistor diminui liberando tensão pro motor virar mais rápido. Ventoinha resfriou o dissipador, termistor aumenta resistência, motor diminui rotação e boa! Eles chegam no equilíbrio de tensão x temperatura do conjunto.
    A dúvida é: qual especificação do termistor ?
    Enquanto escrevia tudo isso pensei: talvez nem precise do Arduino pra fazer o monitoramento….

    Agradeço a ajuda!

    Abraço!

  • Juari Neris Do Nascimento

    Boa tarde. Existe a possibilidade de ir salvando de 10 em 10 os valores de temperatura em 10 variáveis diferentes ? Assim eu posso digitar no monitor por exemplo temp7 e me mostra a sétima temperatura lida.
    Existe esta possibilidade?