domingo, 16 de janeiro de 2011

Monitor de Temperatura com Log

Esse é um projeto bem simples, porém bastante útil para quem precisa monitorar ambientes ou cargas em que a temperatura representa um risco, sejam cargas perecíveis ou mesmo uma sala com computadores (servidores). O sensor  utilizado é o LM35 (http://www.national.com/ds/LM/LM35.pdf), barato, preciso e fácil de encontrar nas lojas de eletrônica, ele é um sensor de circuito integrado que mede a temperatura(ºC) com uma saída elétrica proporcional a mesma, por ter um invólucro de plástico(TO-92) ele é resistente a oxidação, podendo ficar exposto a intempéries do ambiente monitorado!


O LM35 tem 3 pinos, onde:

V+      alimentamos com 5V vindo do Arduino;
GND  ligamos ao gnd correspondente do Arduino;
OUT  saíde de tensão correspondente a temperatura(ºC).

Figura1 - Pinos LM35

O fator de escala é 0,01 V  por grau Celcius, ou seja, a cada 0,01V no pino OUT corresponde a 1ºC. Se tivermos 0,5v teremos uma temperatura de 50ºC, se tivermos 1V, teremos uma temperatura de 100ºC e assim por diante...

Como a saída (OUT) do LM35 é analógica, devemos, portanto, conectá-la a um pino de entrada analógica  do Arduino- no projeto o pino escolhido foi o 0 (zero)- As ligações ao Arduino ficarão como mostra a Figura2.


Figura2 - Conexão ao Arduino

O Programa abaixo lê a temperatura periodicamente em um intervalo definido(1s) e envia a informação via serial para o computador.


/* ---------------------------------------------
 * Temp_logger V1.0 Rev0.0
 * Monitor de temperatura para sala de servidores
 * Arduino-ce
 * Comunidade Cearense de Hardware Livre
 * http://groups.google.com/group/arduino-ce?hl=pt-br 
 * http://arduino-ce.blogspot.com 
 * janeiro de 2011
 ---------------------------------------------*/

#define SAMPLES 500 //Número de amostras de temperaturas
#define sensortemp 0 //Pino analógico em que estará conectado o sensor LM35
#define TEMPO_LEITURA 1000 //Intervalo entre cada leitura do sensor LM35 em milisegundos! OBS: 1000ms = 1s

int tempvector[SAMPLES]; //Vetor que armazenará as temperaturas
double tempSensor = 0.0; //Variável auxiliar
int  valAnalog = 0; // Variável para aramazenar a leitura do sensor LM35

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

void loop() 
{  
  for (int i=0; i <= SAMPLES; i++) // Incrementa i ate i = SAMPLES
  {    
    valAnalog = analogRead(sensortemp); // Faz a leitura do pino analógico do sensor e armazena em valAnalog
    tempvector[i] =( 5.0 * valAnalog * 100.0)/1024.0; //Armazena as temperaturas num vetor de tamanho = SAMPLES
    tempSensor = tempSensor +tempvector[i]; // Soma as temperaturas e armazena em tempSensor
  } 
  tempSensor = tempSensor/SAMPLES;  // Calcula a média das temperaturas e as armazena em tempSensor
  Serial.println(tempSensor); //Envia a temperatura para porta COMX
  delay(TEMPO_LEITURA);// Espera um tempo determinado em TEMPO_LEITURA (milisegundos)
}




O valos analógico do sensor LM35 é lido e armazenado em valAnalog que por sua vez é multiplicado pela tensão de referência (5V) depois multiplicado por 100.0 depois dividido por 1024.0. Isso ocorre porque no pino analógico temos uma escala de leitura que vai de 0(zero) a 1024, portanto, nossa escala de tensão correspondente tem que estar no limiar de 0 até 1024, onde 0  corresponde a temperatura mínima e 1024 corresponde a temperatura máxima. Após esse cálculo obtemos a temperatura em ºC e armazenamos no vetor tempvector de tamanho igual a SAMPLES, logo esse valor é somado com o posterior e armazenado em  tempSensor. Após somadas todas as temperaturas dividimos pelo total de amostras (SAMPLES) para termos uma média, isso torna o processo de captação de temperatura mais preciso!

Por fim, imprimimos, com uma quebra de linha, a temperatura Serial.println(tempSensor); no nosso projeto ele está na na porta COM3 (Verifique a porta que o seu Arduino está utilizando!). Para conferir o funcionamento basta clicar no botão "Serial Monitor" na IDE do Arduino, conforme figura abaixo.

Figura3 - Serial Monitor

Após conferido o funcionamento iremos criar um script para o computador, que capture as temperaturas recebidas pela porta COM3 e as escreva em um arquivo de texto - que pode ser exportado para uma planilha posteriormente. Abra o bloco de notas do Windows, cole o script abaixo altere a porta, a extensão e salve-o como TempLogger.VBS:


Const ForReading = 1
Const ForWriting = 2


Set fso = CreateObject("Scripting.FileSystemObject")
Set com = fso.OpenTextFile("COM3:9600,N,8,1", ForReading)


Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\TempLogger.txt", ForWriting, True)


MsgBox("Iniciado TempLogger")


Do While com.AtEndOfStream <> True
temperatura = com.ReadLine
        objFile.Write(now())
        objFile.Write(" ")
objFile.WriteLine(temperatura)
WScript.Sleep(100)
Loop


objFile.Close
com.Close()



Certifique-se que que a IDE do Arduino esteja fechada e que nenhum outro programa esteja usando a mesma porta! Execute o script e, se tudo ocorrer bem, a janela abaixo será exibida:


As temperaturas já estão sendo colhidas. Vá ao direório C:\ e abra o arquivo TempLogger.txt, o arquivo estará armazenando a temperatura do sensor a cada 1s conforme figura abaixo. Altere o tempo para sua necessidade, bastando modificar SAMPLES no firmware e enviá-lo ao Arduino. Lembrando que 1000ms corresponde a 1s!





Deixando o projeto mais profissional

Para finalizar, acondicionaremos o Arduino em uma caixa pra tornar o projeto mais profissional. Utilizei uma caixa Caixa Patola PB-86 (http://www.patola.com.br/index.php?pagina=info_produto.php&produto_id=100&titulo=PB-086) mas você pode usar uma similiar! Além disso foi utilizado um ferro de solda, para soldar os fios no sensor; cola de silicone, para prender o sensor fora da caixa; um alicate de corte, para cortar um pequeno quadrado deixando o espaço para o conector USB do Arduino, também foi utilizado e um parafuso de 6mm com porca para fixar o Arduino na tampa da caixa. Vejam as fotos de como ficou.











 
Por enquanto é só! Até o próximo tutorial!

26 comentários:

  1. Olá amigo, excelente projeto. Muito bom mesmo. Posso utilizá-lo como base para um mais ousado, onde a leitura será realizada dentro de uma "estufa" ou forno elétrico?

    obrigado

    ResponderExcluir
  2. Sim, mas dependendo da temperatura máxima do local, deverá ser trocado o sensor de temperatura! O LM35 pode medir até 150°C.

    ResponderExcluir
  3. tenho dúvidas na programação VBS...

    ResponderExcluir
  4. Este comentário foi removido pelo autor.

    ResponderExcluir
  5. Qual a distancia maxima (extensão do fio) entre o sensor e o microcontrolador ? (eu pretendo fazer esse projeto porem vou precisar colocar 3 sensores e gostaria que cada um fique em media de 1,2m do modulo arduino. Outra coisa é você teria como expor um tutorial com o uso de um LCD de 2 linhas expondo as temperaturas ?

    ResponderExcluir
    Respostas
    1. Olá Wesley, não recomendo distâncias maiores que 1m. Se for usar grandes distancias utilize RF ou até uma pequena rede RS-485, mas o custo aumenta um pouco. Obrigado pela sugestão vou ver uma aplicação com LCD's!

      Excluir
    2. Muito Obrigado Arduino-ce, fiquei muito feliz com sua resposta, acredito que 1m vai atender meu projeto

      Excluir
  6. Teria alguma forma do próprio arduino salvar as leituras e eu lê-las posteriormente no computador ?

    ResponderExcluir
    Respostas
    1. Sim, mas terá que fazer um script para ler da porta Serial e salvar em um banco. Sugestão: Python + MySql

      Excluir
  7. Existe uma forma de eu entrar com um valor de comparação para a leitura?? um setpoint que comparada a leitura da temperatura realize alguma instrução tipo acionar uma saida digital.
    abraço

    ResponderExcluir
  8. por que existem alguns projetos que usam um resistor na saida do sensor para arduino, sabe me informar?

    exemplo:

    http://www.arduinoecia.com.br/2013/02/lm35-sensor-de-temperatura.html#comment-form

    ou
    http://www.ipaq.org.br/vb/showthread.php?98123-Como-usar-o-LM35-Arduino-como-controle-de-temperatura

    ResponderExcluir
    Respostas
    1. Para compensar o uso de um cabo maior... no projeto o cabo eh bem pequeno, pois ficará abrigado dentro da própria caixa.

      Excluir
  9. Olá,
    Eu utilizei esse seu script para gravar informações em log, deu tudo certo. Porém, eu gostaria de saber qual o comando que executo para interromper o uso da por COM? Por exemplo, eu tenho outros sketchs para carregar mas a porta está ocupada e o arduino não deixa carregar, toda vez eu tenho que reiniciar o micro.

    ResponderExcluir
    Respostas
    1. No Windows use ctrl+alt+del e no gerenciador de processos, na aba Processos procure por WScript.exe, selecione-o e clique em Finalizar processo! Pronto!

      Excluir
  10. Este comentário foi removido pelo autor.

    ResponderExcluir
  11. Estou com instabilidade em meu circuito. Verifiquei que na port 5V do arduino esta saindo picos de 500 mA. Como posso resolver isso colocando uma fonte alternativa de 5V?

    ResponderExcluir
  12. Ola. Tentei seu programa. Executei, porem nao consegui encontrar o arquivo TempLogger.txt, na pasta C:\ .... como faço?

    ResponderExcluir
    Respostas
    1. Verifique as permissões de criação de pasta. Revise o script...

      Excluir
  13. Bom dia!!!

    eu executei o seu codigo funcionou tudo certo,porem nao consigo carregar outro no arduino, qual o script para parar o serviço.

    ResponderExcluir
    Respostas
    1. No Windows use ctrl+alt+del e no gerenciador de processos, na aba Processos procure por WScript.exe, selecione-o e clique em Finalizar processo! Pronto!

      Excluir
  14. Quando executo o Script da erro: Permissão negada

    ResponderExcluir
    Respostas
    1. Este comentário foi removido pelo autor.

      Excluir
    2. o meu também estava dando erro, é que o windows não permite mais criar um txt direto no Diretório C, então eu criei uma pasta com o nome TempLogger, e alterei o codigo dae funcionou.

      Const ForReading = 1
      Const ForWriting = 2


      Set fso = CreateObject("Scripting.FileSystemObject")
      Set com = fso.OpenTextFile("COM3:9600,N,8,1", ForReading)


      Set objFSO = CreateObject("Scripting.FileSystemObject")
      Set objFile = objFSO.OpenTextFile("C:\TempLogger\TempLogger.txt", ForWriting, True)


      MsgBox("Iniciado TempLogger")


      Do While com.AtEndOfStream <> True
      temperatura = com.ReadLine
      objFile.Write(now())
      objFile.Write(" ")
      objFile.WriteLine(temperatura)
      WScript.Sleep(500)
      Loop


      objFile.Close
      com.Close()

      Excluir