terça-feira, 25 de janeiro de 2011

Monitor de Temperatura via TCP/IP

A diferença desse tutorial para o anterior é o meio por onde iremos monitorar temperaturas.Com esse projeto (WebTemp) você poderá monitorar, por exemplo, uma estufa de plantas, uma câmara frigorífica ou mesmo sua adega ;-) tudo remotamente pela Rede Local ou através da Internet usando computador ou celular via Wifi! Para tanto, utilizaremos um Shield, que é uma placa auxiliar "espetada" no Arduino  que tem uma determinada funcionalidade, você pode comprá-lo como também criar o seu próprio shield. Existem shields praticamente pra tudo, nesse link (http://shieldlist.org/)  você confere a lista de shields disponíveis por fabricante, bem como os pinos que eles ocupam no Arduino! Para esse projeto iremos utilizar um dos shields que eu mais gosto e um dos mais interessantes, o EthernetShield (http://www.arduino.cc/en/Main/ArduinoEthernetShield) ,que implementa a pilha TCP/IP e suporte a UDP, possibilitando a comunicação via ethernet! Por ser de fácil implementação, utilizaremos o modelo que conta com o chip da Wiznet 5100 (Figura1)

Figura1 - EthernetShield da WizNet



Testando a placa

Primeiramente você deverá ter privilégios de Administrador para configurar a sua placa de rede no PC. Para que a comunicação possa ser estabelecida sem problemas entre o Arduino e o PC, atribua o IP: 192.168.1.14, Gateway: 192.168.1.1 e Máscara de subrede: 255.255.255.0. Caso não saiba como configurar sua placa de rede no Windows veja esse link: http://www.baboo.com.br/conteudo/modelos/Configurando-uma-rede-domestica-no-Windows-XP_a5307_z0.aspx

Para um teste inicial, "espete" a placa EthernetShield no Arduino, conecte o cabo usb ao PC(os leds da shield acenderão indicando que a placa está energizada), conecte uma extremidade do cabo UTP RJ-45M no conector RJ-45F do Arduino e a outra extremidade do conector na placa de rede do PC. Abra a IDE do Arduino, carregue o código abaixo, salve e faça o upload do sketch: 


/* ---------------------------------------------
 * Teste EthernetShield V1.0 Rev0.0
 * 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
 ---------------------------------------------*/
#include <Ethernet.h>//Biblioteca EthernetShield 

#define SAMPLES 500 //Número de amostras de temperaturas
#define sensortemp 0 //Pino analógico em que estará conectado o sensor LM35

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


byte mac[]     = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //Define o endereço físico da placa
byte ip[]      = { 192, 168, 1, 15 };  // Ip da EthernetShield
byte gateway[] = { 192, 168, 1, 1 };   // Gateway (opcional)
byte subnet[]  = { 255, 255, 255, 0 }; // Mascara de subrede

Server server(80); //Cria o objeto na porta 80

void setup()
{
  Ethernet.begin(mac, ip, gateway, subnet); //Inicializando a ethernet
  server.begin(); //Inicializando o servidor web
}

void loop()
{
  Client client = server.available(); //
  if (client) {
    // uma requisição http termina com uma linha em branco
    boolean current_line_is_blank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read(); // Recebe caractere do browser e guarda em "c"
        // Se chegamos ao fim da linha (recebeu uma nova linha
        // de caractere) e a linha está em branco, a requisição http termina
        // para que possamos enviar uma resposta!
        if (c == '\n' && current_line_is_blank) {
          // Envia um cabeçalho padrão de resposta HTTP 
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          break;
        }
        if (c == '\n') {
          // Se começamos uma nova linha...
          current_line_is_blank = true;
        } 
        else if (c != '\r') {
          // Se ainda temos um caractere na linha atual...
          current_line_is_blank = false;
        }
      }
    }

    client.println("<html>"); //Início do código HTML
    client.println("Arduino na web!");
    client.println("</html>"); //Fim do código HTML 
  } 
  // Damos ao navegador um tempo para receber os dados
  delay(1);
  client.stop();// Fecha a conexão 
}



Após feito o upload para o Arduino, clique em iniciar&gt;executar&gt; digite "cmd" sem aspas, no prompt de comando digite "ping 192.168.1.15 -t" sem aspas. Isso é o teste básico de conexão via rede! Se tudo estiver OK ficará como a tela abaixo:

Figura2 - Pingando no Arduino + EthernetShield



Agora, abra o seu navegador e digite o endereço 192.168.1.15, a janela deverá exibir conforme abaixo:

Figura3 - Teste no Browser


Montando o WebTemp

Desconecte o cabo usb do Arduino e conecte o sensor LM35 conforme figura abaixo:

Figura4 - Conexão EthernetShield com LM35


Reconecte o cabo usb, abra a IDE do Arduino, carregue o código abaixo, salve e faça o upload do sketch: 



/* ---------------------------------------------
 * WebTemp V1.0 Rev0.0
 * Monitor de temperatura via TCP/IP
 * 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
 ---------------------------------------------*/
#include <Ethernet.h>//Biblioteca EthernetShield 

#define SAMPLES 500 //Número de amostras de temperaturas
#define sensortemp 0 //Pino analógico em que estará conectado o sensor LM35

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


byte mac[]     = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //Define o endereço físico da placa
byte ip[]      = { 192, 168, 1, 15 };  // Ip da EthernetShield
byte gateway[] = { 192, 168, 1, 1 };   // Gateway (opcional)
byte subnet[]  = { 255, 255, 255, 0 }; // Mascara de subrede

Server server(80); //Cria o objeto na porta 80

void setup()
{
  Ethernet.begin(mac, ip, gateway, subnet); //Inicializando a ethernet
  server.begin(); //Inicializando o servidor web
}

void loop()
{
  Client client = server.available(); //
  if (client) {
    // uma requisição http termina com uma linha em branco
    boolean current_line_is_blank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read(); // Recebe caractere do browser e guarda em "c"
        // Se chegamos ao fim da linha (recebeu uma nova linha
        // de caractere) e a linha está em branco, a requisição http termina
        // para que possamos enviar uma resposta!
        if (c == '\n' && current_line_is_blank) {
          // envia um cabeçalho padrão de resposta HTTP 
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          break;
        }
        if (c == '\n') {
          // Se começamos uma nova linha...
          current_line_is_blank = true;
        } 
        else if (c != '\r') {
          // Se ainda temos um caractere na linha atual...
          current_line_is_blank = false;
        }
      }
    }

    client.println("<html>"); //Início do código HTML
    client.println("<font face='arial' size='4' color='green' >WEBTEMP V1.0</font><hr>"); //Exibe texto com formatação    
    for (int i=0; i &lt;= SAMPLES; i++) // Incrementa i ate i = SAMPLES
    {    
      valAnalog = analogRead(sensortemp); // Leitura do pino analogico correspondente ao sensor e guarda 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'

    client.println("<h1>"); //Inicio do cabeçalho H1

    client.print(tempSensor); //Exibe a temperatura  

    client.print("&deg;"); // Referência do caratere(graus º) na codificação Latin-1 (ISO-8859-1)     client.println("C" </h1><br>);// Exibe o "C" e finaliza a tag H1

    client.println("<input type='button' value='Refresh' onClick='window.location.href=window.location.href'>");    
    client.println("</html>"); //Fim do código HTML          
  } 
  // Damos ao navegador um tempo para receber os dados
  delay(1);
  client.stop();// Fecha a conexão 
}



Observe que a maior parte o trecho em negrito foi copiado do tutorial anterior com uma mudança, apenas, na exibição da temperatura (vide trecho em cor verde)

Agora, abra o seu navegador e digite o endereço 192.168.1.15, a janela deverá exibir conforme abaixo:

Figura5 - WebTemp em funcionamento




Deixando o projeto mais profissional (Sugestão)

Para acomodar o Arduino + EthernetShiled + LM35 utilizei a caixa SFE Arduino Project Enclosure (http://www.robotshop.com/world/sfe-arduino-project-enclosure.html), disponível na Robotshop, eu sei é um pouco caro, mas fica um ótimo acabamento! Vide fotos do projeto finalizado:


Figura6

Figura7

Figura8


Figura9


Alimentando a placa

Se o local monitorado possui um computador com porta usb disponível, a alimentação do circuito poderá ser feita por ela, entretanto, se o local monitorado não tiver computador próximo, o circuito poderá ser alimentado por uma fonte externa de 12V x 500mA (Figuras 10 e 11), essa fonte custa em torno de R$25,00 em lojas de eletrônicas. Outra opção seria utilizar uma fonte de carregador de celular com entrada USB (Figuras 12 e 13), que custa menos de R$ 5,00 no DealExtreme (http://www.dealextreme.com/c/batteries-chargers-204)


Figura10

Figura11

Figura12

Figura13
.  


Sugestões:

- O Firmware pode ser alterado para receber até 6 sensores de temperatura, podendo monitorar mais de um ponto, deve-se, no entanto, utilizar cabos blindados e de curto alcance, visto que interferências externas podem prejudicar a leitura do sensor por causa do próprio tamanho do cabo!

- Um Access Point pode ser conectado diretamente ao EthernetShield, o que possibilita o monitoramento via Wifi pelo notebook ou celular com essa tecnologia!


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



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!

quinta-feira, 13 de janeiro de 2011

terça-feira, 11 de janeiro de 2011

Começando do começo...

Bem, para quem tem dúvidas gostaria de responder um pequeno FAQ

-Devo comprar ou fazer uma placa?
Bem se você já possui um conhecimento em eletrônica, prototipagem, sabe características e código de componentes, tanto o layout da placa como a lista de componentes estão disponíveis na licença GPL veja mais em: http://www.arduino.cc/en/Main/Policy caso seja iniciante continue lendo.

- Onde eu encontro Arduino?
No Brasil existem lojas que vendem o Arduino, porém ainda com preços exorbitantes, há também pessoas quem fazem as placas e as vendem por um preço bom. Para quem tem cartão internacional basta associar o número ao PayPal para comprar, obviamente, em sites que ofereçam esse serviço. A vantagem de se comprar fora, além do preço, são as variedades de placas, a desvantagem é só demora pra chegar.

- Quais sites vendem Arduino e outros componentes eletrônicos?
Se alguém conhecer outros por favor divulgue!
Obviamente antes de comprar devemos fazer uma pesquisa e ver o custo do produto+frete tendo em vista a oscilação do valor do dólar.

- Para quem compra de fora demora quanto tempo pra chegar?
Depende da época do ano, fui fazer compras em novembro (Robotshop), até agora to esperando... mas já cheguei a receber em 10 dias (Cutedigi) e dois meses (Seeedstudio), mas creio que nessa época do ano (janeiro) seja mais tranqüila.

- Qual Arduino devo comprar?
Aqui tem algumas formas de como o  Arduino se apresenta http://arduino.cc/en/Main/Hardware
Alguns exemplos de placas criadas. Invente o seu Arduino também!

- Comprei o Arduino (e o cabo USB é claro...) e agora?
Na página http://arduino.cc/ no link “download” você pode baixar o último release do ambiente de desenvolvimento para Windows, Mac OS X ou Linux (32 bit) e, se preferir também pode baixar o código fonte e alterá-lo! Após baixá-lo descompacte em um local conhecido.

- Como instalar a IDE de desenvolvimento? 
No Getting Started with Arduino (http://arduino.cc/en/Guide/HomePage) há o passo a passo para Windows, Mac OS X e Linux . 


Marcelo Melo

domingo, 9 de janeiro de 2011

Seja bem vindo(a)!



O grupo Arduino-ce  visa a difusão do hardware Livre Arduino (www.arduino.cc). Com ele, você pode criar desde pequenos robôs até aplicações de automação para residências, indústrias ou, até mesmo, para automatizar sua rotina de trabalho utilizando programação e eletrônica simples. Estarei disponibilizando tutoriais e dicas, se você realmente gostar espero que divulgue esse grupo, pois a tecnologia livre é promissora e irá crescer rapidamente!

Página do grupo:http://groups.google.com/group/arduino-ce?hl=pt-br
E-mail do grupo:arduino-ce@googlegroups.com

Marcelo Melo
Moderador Arduino-ce