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>executar> 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 <= 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("°"); // 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!