[Ajuda] WebServer PHP + Arduino + Shield Ethernet Wiznet 5100

Fala rapaziada,

Estou começando a desbravar o mundo do HTML e PHP com o objetivo de controlar o arduino pela minha rede local ou pela internet.

Já estou fazendo isso com o arduino tendo o papel de WebServe e até ai me parece muito simples, basicamente pelo que entendi o arduino envia os códigos em HTML para um navegador e o mesmo os interpreta e monta as as páginas e também já estou conseguindo tratar os dados que são enviados pelo navegador para o arduino. Então até ai tudo ok.

Agora eu quero de usar o arduino como Client e cria um WebServer em PHP, para isso eu vi um projeto bem legal neste link que resume bem o que eu quero fazer, mas ainda estou engatinhando no PHP e não estão conseguindo adaptar o código.

Eu só achei exemplos aqui no LDG do PHP comandando o arduino plea serial.

Seguem os códigos com comentários em vermelho para mostrar onde tenho duvidas...

PHP:

<html>
<head></head>
<body>

<?php
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// Se conecta ao IP e Porta:
//socket_connect($sock,"187.15.6.131", 8081);  // Não sei como adpatar esse IP (internet,??)

// Executa a ação correspondente ao botão apertado.
if(isset($_POST['bits'])) {
$msg = $_POST['bits'];
if(isset($_POST['Fora' ])){ if($msg[0]=='1') { $msg[0]='0'; } else { $msg[0]='1'; }}
if(isset($_POST['Quarto1'])){ if($msg[1]=='1') { $msg[1]='0'; } else { $msg[1]='1'; }}
if(isset($_POST['Quarto2'])){ if($msg[2]=='1') { $msg[2]='0'; } else { $msg[2]='1'; }}
if(isset($_POST['Sala' ])){ if($msg[3]=='1') { $msg[3]='0'; } else { $msg[3]='1'; }}
if(isset($_POST['Pequeno'])){ $msg = 'P#'; }
if(isset($_POST['Grande' ])){ $msg = 'G#'; }

socket_write($sock,$msg,strlen($msg));
}

socket_write($sock,'R#',2); //Requisita o status do sistema.

// Espera e lê o status e define a cor dos botões de acordo.
$status = socket_read($sock,6);
if (($status[4]=='L')&&($status[5]=='#')) {
if ($status[0]=='0') $cor1 = lightcoral;
else $cor1 = lightgreen;
if ($status[1]=='0') $cor2 = lightcoral;
else $cor2 = lightgreen;
if ($status[2]=='0') $cor3 = lightcoral;
else $cor3 = lightgreen;
if ($status[3]=='0') $cor4 = lightcoral;
else $cor4 = lightgreen;

echo "<form method =\"post\" action=\"PaginaPHP.php\">";
echo "<input type=\"hidden\" name=\"bits\" value=\"$status\">";
echo "<button style=\"width:70; background-color: $cor1 ;font: bold 14px Arial\" type = \"Submit\" Name = \"Fora\">Fora</button></br></br>";
echo "<button style=\"width:70; background-color: $cor2 ;font: bold 14px Arial\" type = \"Submit\" Name = \"Quarto1\">Quarto1</button></br></br>";
echo "<button style=\"width:70; background-color: $cor3 ;font: bold 14px Arial\" type = \"Submit\" Name = \"Quarto2\">Quarto2</button></br></br>";
echo "<button style=\"width:70; background-color: $cor4 ;font: bold 14px Arial\" type = \"Submit\" Name = \"Sala\">Sala</button></br></br></br>";
echo "<button style=\"width:90;font: bold 14px Arial\" type = \"Submit\" Name = \"Pequeno\">Portao Pequeno</button></br></br>";
echo "<button style=\"width:90;font: bold 14px Arial\" type = \"Submit\" Name = \"Grande\">Portao Grande</button></br></br>";
echo "</form>";
}
// Caso ele não receba o status corretamente, avisa erro.
else { echo "Falha ao receber status da casa."; }
socket_close($sock);
?>

</body>
</html>

Código arduino...

// Maurício Féo
// www.engenheirando.com

#include <SPI.h>
#include <Ethernet.h>

//Configurações do Ethernet Shield

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

//Essa parte eu sei que é preciso modificar de acordo com a minha rede..
byte ip[] = { 192,168,2, 22 }; // ip que o arduino assumirá
byte gateway[] = { 192,168,2, 1 }; // ip do roteador
byte subnet[] = { 255, 255, 0, 0 };

// String que representa o estado dos dispositivos
char Luz[7] = "0000L#";

Server server(8081); // Cria o servidor na porta 8081

// String onde é guardada as msgs recebidas
char msg[7] = "0000L#";

void setup() {
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();
pinMode(A0,OUTPUT);
pinMode(A1,OUTPUT);
pinMode(A2,OUTPUT);
pinMode(A3,OUTPUT);
pinMode(A4,OUTPUT);
pinMode(A5,OUTPUT);
}

void loop() {
Client client = server.available();
// SE receber um caracter...
if (client) {
// guarda o caracter na string 'msg'
msg[1]=msg[2]; msg[2]=msg[3]; msg[3]=msg[4]; msg[4]=msg[5]; msg[5]=msg[6];
msg[6] = client.read();

if (msg[6]=='#') {
switch(msg[5]) {
case 'R':
// Se receber o comando 'R#' envia de volta o status dos
// dispositivos. (Que é a string 'Luz')
client.write(Luz);
break;
case 'P':
// Caso P#, aciona o pino do portão pequeno por 1s.
digitalWrite(A4,HIGH);
delay(1000);
digitalWrite(A4,LOW);
break;
case 'G':
// Caso G#, aciona o pino do portão pequeno por 1s.
digitalWrite(A5,HIGH);
delay(1000);
digitalWrite(A5,LOW);
break;
case 'L':
// Caso L#, ele copia os 4 bytes anteriores p/ a
// string 'Luz' e cada byte representa um
// dispositivo, onde '1'=ON e '0'=OFF
Luz[0]=msg[1];
Luz[1]=msg[2];
Luz[2]=msg[3];
Luz[3]=msg[4];
if (Luz[0]=='1') digitalWrite(A0,HIGH); else digitalWrite(A0,LOW);
if (Luz[1]=='1') digitalWrite(A1,HIGH); else digitalWrite(A1,LOW);
if (Luz[2]=='1') digitalWrite(A2,HIGH); else digitalWrite(A2,LOW);
if (Luz[3]=='1') digitalWrite(A3,HIGH); else digitalWrite(A3,LOW);
break;

}
}
}
}

Esse exemplo já é bem simples, mas alguém tiver alguma experiencia com isso e puder compartilhar ou postar outro exemplo mais simples e direto, explicando mais detalhadamente seria ótimo.

Estou usando o Apache do EasyPHP 5.3.9

Listen 127.0.0.1:8887

Muito Obrigado!

Exibições: 18238

Responder esta

Respostas a este tópico

E ai Sergio,

vou querer sim, quando eu chegar em casa e vc estiver online eu dou um tok.

Vlew!

Estou usando os mesmos fontes que você para meus testes, tanto do Arduino como em PHP. 

Entendo bem de Delphi, mas agora estou tentando entender um pouco PHP pra fazer alguns exemplos diferentes de acesso. 

O no-ip, serve justamente para facilitar o acesso ao seu servidor WEB que se encontra na sua rede local.
O endereço de IP do seu MODEM é constantemente renovado (a não ser que vc tenha IP fixo), isso acontece a
cada 24 ou 48 horas, então para acessar a seu servidor WEB da sua rede, você precisa do no-ip (ou outro serviço semelhante)
para te facilitar isso, de que forma isso é feito ?, simplesmente o no-ip de fornece uma URL,
p.ex.: http://arduserver.sytes.net, e associa esta URL ao
endereço de IP do seu modem, mas para que esta associação funcione, você precisa instalar um programa CLIENT do no-ip
no computador que está funcionando como WEB SERVER e este programa periodicamente informará ao no-ip, o IP atual do seu modem.
Não esqueça de instalar esse cliente no computador que estiver com a função de WEB SERVER, senão não funcionarão as
conexões pela INTERNET.

Para acessar algum endereço de IP dentro da rede, você não precisa liberar portas no MODEM, p.ex.:, seu Arduino está
configurado da seguinte forma:

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0B, 0x00, 0x26 }; // MAC ADRESS do Ethernet Shield (importante colocar isso aqui)
Tem uma etiqueta embaixo do Ethernet Shield que indica o MAC
IPAddress ip(192,168,1,100); // Endereço de IP que será atribuido ao Ethernet Shield na Rede Local, veja se não conflita
com o IP de algum outro computador da rede
Aqui você pode informar qualquer IP, desde que esteja dentro do alcance do DHCP do roteador.
EthernetServer server(80); // Porta usada pelo Ethernet Shield para se comunicar com o roteador,
não confunda com a porta que tem que ser liberada no MODEM para acesso pela INTERNET

Neste momento se você tiver um WEBSERVER rodando no Arduino, e você digitar no seu navegador:
http://192.168.1.100 , o Arduino deverá responder de acordo com a sua programação. Pode usar também o comando ping 192.168.1.100

Agora vamos ao MODEM:
Para liberar o acesso externo no MODEM, devemos configurar NAT - Virtual Servers, que nada mais faz que indicar ao Roteador,
que quando houver um acesso externo via INTERNET, ele direcione o acesso a um endereço interno na Rede Local (LAN).
Procure no manual do seu MODEM como se configura um NAT, não tem segredo.
Mas procure obter esta informação da sua operadora também: Algumas operadoras de telefonia no Brasil, bloqueiam o acesso HTTP
a porta 80 do MODEM, portanto você tem que usar outra porta para acessar o seu WEB SERVER pela INTERNET. P.ex.: a porta 8080,
pode ser qualquer uma desde que não esteja sendo usada.
Normalmente informamos a porta externa de entrada: 80, o protocolo: TCP ou TCP/UDP, e a porta interna também 80, e o endereço
na Rede Local para onde será redirecionado a requisação de INTERNET: 192.168.1.3 (ATENÇÃO: supondo que neste IP você tenha um
computador funcionando como WEB SERVER. Aqui você também poderia colocar o IP do Arduino, desde que ele esteja funcionando com
um sketch de WEBSERVER. Mas vamos partir da premissa de que você tem um computador WEB SERVER na sua rede.

Agora toda a programação que for feita dentro do computador WEB SERVER, que for se comunicar com o Arduino na Rede Local,
deverá usar o IP: 192.168.1.100.

ATENÇÃO: dentro da Rede Local, se você acessar a URL http://arduserver.sytes.net (que você configurou no no-ip), o roteador
irá enviar sua requisição para a página de configuração do MODEM.

Infelizmente em PHP eu não posso ajudar muito, porque também estou aprendendo esta linguagem, mas informação é o que
não falta na WEB, inclusive em português.

Uma pergunta pra vcs que estam testando o webserver com PHP.

 

Porque utilizá-lo ? Qual a vantagem ?

Eu vejo como desvantagem ter que manter um servidor online, além de custo é mais um ponto de falha.

E ai Leandro, blza?

Cara eu iniciei com html, mas ví algumas limitações estéticas e uma possível sobrecarga na memória do arduino.

Tem alguma sugestão melhor que php?

Como vc faz para deixar o projeto online?

 

Abraço.PAZ!

Eu ainda não cheguei nessa limitação...

talvez eu tenha mesmo que mudar para PHP, por isso estou procurando entender o motivo.

E a memória do arduino como mediu ?

O meu é o arduino mega com 256k, só usei 20k, mas tinha MUITA coisa pra fazer ainda, básicamente eu so fiz o layout e alguns comandos para testar.

Leandro , vc poderia mostra seu código?

Tá ai uma boa pergunta...srsrsr

Bem eu acredito que dessa forma nós podemos aproveitar o poder de outra linguagem, e oferecer recusros que talvez seria mais difícil fazer pelo arduino, fora o problema que o Vinícius citou da memoria e layout...

O envio de dados por socket pelo que entendi fica muito mais fácil tratar os dados noa arduino, semelhante a comunicação serial.

Em relação ao uso do PHP, deve ser pq e muito usado, é  Server-side, além de de gratuito

Me corrijam se eu estiver falando bobeira..

Muito obrigado mais uma vez Luís, talvez amanhã eu tentei mais alguma coisa,,, hoje tenho prova na facul.

Abraço.PAZ!

Parei de vez de usar o arduino como Web Serve, chega um ponto que fica muito trabalhoso modificar a página, ainda mais pra quem não domina HTML. A página também começou a dar umas engasgadas usando o Ipad.

Vou seguir o passo de vcs e focar em PHP na comunicação por socket.

 

Seque um videos rápido mostrando o esboço da página que eu estava fazendo com o arduino como web server.

 

Hugo,

A minha preocupação era utilizar um computador em casa para rodar o PHP, ou hospedar na internet. Por isso estava evitando essa alternativa

Mais encontrei uma maneira que pode ser interessante... para testar depois ...

Criar um servidor de PHP no Tablet (ANDROID), como a minha idéia é manter um tablet na parede como "controle universal" o próprio já seria o servidor... ai fica bacana demais !

Só tenho que ver quais as limitações e os requisitos míninos acho que não terá problema, devido as poucas requisições do arduino simultaneas.

Ta aí a dica:

http://phpforandroid.net/

http://agripinoduarte.radig.com.br/2010/07/15/php-agora-funciona-no...

O que acham ?

Abraços

Parece ser interessante Hugo.

Seu projeto é para uso próprio ?

Estou tentando fazer pra apresentar na conclusão do curso(tcc).

Tá froids, tenho concurso da transpetro pra estudar, provas da facul pra fazer e ainda esse tcc...

Fico alternando os dias de estudos aí nem dá pra adiantar.

Vou continuar tentando usar o pc como servidor mesmo.

Obs.: Intranet(LAN) já consigo acionar algumas coisas, vou add umas duas leituras analógicas.

Abração. Qualquer novidade vão postando aqui.

PAZ!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço