Monitor de Temperatura via TCP/IP
Autor: Arduino-ce | Publicado: 2011-01-25T18:05:00-08:00

A diferença desse tutorial para o anterior&nbsp;é 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&nbsp;remotamente pela Rede Local ou através da Internet usando computador ou celular via Wifi!&nbsp;Para tanto, utilizaremos um Shield, que é uma placa auxiliar "espetada" no Arduino &nbsp;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&nbsp;(http://shieldlist.org/) &nbsp;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!&nbsp;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&nbsp;privilégios&nbsp;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:&nbsp;

/*&nbsp;---------------------------------------------
&nbsp;*&nbsp;Teste&nbsp;EthernetShield&nbsp;V1.0&nbsp;Rev0.0
&nbsp;*&nbsp;Arduino-ce
&nbsp;*&nbsp;Comunidade&nbsp;Cearense&nbsp;de&nbsp;Hardware&nbsp;Livre
&nbsp;*&nbsp;http://groups.google.com/group/arduino-ce?hl=pt-br&nbsp;
&nbsp;*&nbsp;http://arduino-ce.blogspot.com&nbsp;
&nbsp;*&nbsp;janeiro&nbsp;de&nbsp;2011
&nbsp;---------------------------------------------*/
#include&nbsp;&lt;Ethernet.h&gt;//Biblioteca EthernetShield 

#define&nbsp;SAMPLES&nbsp;500&nbsp;//Número de amostras de temperaturas
#define&nbsp;sensortemp&nbsp;0&nbsp;//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()
{
&nbsp;&nbsp;Ethernet.begin(mac, ip, gateway, subnet); //Inicializando a ethernet
&nbsp;&nbsp;server.begin(); //Inicializando o servidor web
}

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

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



Após feito o upload para o Arduino, clique em iniciar&amp;gt;executar&amp;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:&nbsp;


/*&nbsp;---------------------------------------------
&nbsp;*&nbsp;WebTemp&nbsp;V1.0&nbsp;Rev0.0
&nbsp;*&nbsp;Monitor&nbsp;de&nbsp;temperatura&nbsp;via&nbsp;TCP/IP
&nbsp;*&nbsp;Arduino-ce
&nbsp;*&nbsp;Comunidade&nbsp;Cearense&nbsp;de&nbsp;Hardware&nbsp;Livre
&nbsp;*&nbsp;http://groups.google.com/group/arduino-ce?hl=pt-br&nbsp;
&nbsp;*&nbsp;http://arduino-ce.blogspot.com&nbsp;
&nbsp;*&nbsp;janeiro&nbsp;de&nbsp;2011
&nbsp;---------------------------------------------*/
#include&nbsp;&lt;Ethernet.h&gt;//Biblioteca EthernetShield 

#define&nbsp;SAMPLES&nbsp;500&nbsp;//Número de amostras de temperaturas
#define&nbsp;sensortemp&nbsp;0&nbsp;//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()
{
&nbsp;&nbsp;Ethernet.begin(mac, ip, gateway, subnet); //Inicializando a ethernet
&nbsp;&nbsp;server.begin(); //Inicializando o servidor web
}

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

&nbsp;&nbsp;&nbsp;&nbsp;client.println("&lt;html&gt;"); //Início do código HTML
&nbsp;&nbsp;&nbsp;&nbsp;client.println("&lt;font face='arial' size='4' color='green' &gt;WEBTEMP V1.0&lt;/font&gt;&lt;hr&gt;"); //Exibe texto com formatação&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;for (int i=0; i &amp;lt;= SAMPLES; i++) // Incrementa i ate i = SAMPLES
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;valAnalog&nbsp;=&nbsp;analogRead(sensortemp); // Leitura do pino analogico correspondente ao sensor e guarda em valAnalog
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempvector[i]&nbsp;=(&nbsp;5.0&nbsp;*&nbsp;valAnalog&nbsp;*&nbsp;100.0)/1024.0;&nbsp;//Armazena as temperaturas num vetor de tamanho = SAMPLES
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempSensor&nbsp;=&nbsp;tempSensor&nbsp;+tempvector[i];&nbsp;// Soma as temperaturas e armazena em tempSensor
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;tempSensor&nbsp;=&nbsp;tempSensor/SAMPLES;&nbsp;&nbsp;// Calcula a média das temperaturas e as armazena em 'tempSensor'
&nbsp;&nbsp;&nbsp;&nbsp;client.println("&lt;h1&gt;"); //Inicio do cabeçalho H1&nbsp;&nbsp;&nbsp;&nbsp;client.print(tempSensor); //Exibe a temperatura &nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;client.print("&amp;deg;"); // Referência do caratere(graus º) na codificação Latin-1 (ISO-8859-1)
&nbsp;&nbsp;&nbsp;&nbsp;client.println("C" &lt;/h1&gt;&lt;br&gt;);// Exibe o "C" e finaliza a tag H1&nbsp;&nbsp;&nbsp;&nbsp;client.println("&lt;input type='button' value='Refresh' onClick='window.location.href=window.location.href'&gt;");        client.println("&lt;/html&gt;"); //Fim do código HTML          
&nbsp;&nbsp;}&nbsp;
&nbsp;&nbsp;// Damos ao navegador um tempo para receber os dados
&nbsp;&nbsp;delay(1);
&nbsp;&nbsp;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&nbsp;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. &nbsp;
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!