[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: 18237

Responder esta

Respostas a este tópico

Neste exemplo do engenheirando.com, o cara fez o seguinte: 

1. acessou uma página hospedada em algum servidor web; contendo este programa em PHP.

2. Desta página ele acessou o MODEM em sua residência utilizando SOCKETS, por isso que ele colocou esse código aqui no programa PHP: socket_connect($sock,"187.15.6.131", 8081); o IP é do MODEM na residência e a porta utilizada para conexão com o Arduino. Se o seu WEB SERVER estiver na sua rede local, este IP será um endereço da rede local.

Estou fazendo algumas experiências com isso também, e fiz o seguinte:

1- Fiz um cadastro no http://www.no-ip.com/

2 - Baixei o programa CLIENT do no IP para rodar no computador servidor WEB na rede;

3- Criei um servidor WEB num computador da minha rede com o WAMPSERVER (Windows + Apache + PHP);

4 - Conectei o Ethernet Shield do Arduino na rede local;

5 - Para acessar o Arduino pelo programa em PHP rodando no servidor WEB, eu faço: socket_connect($sock,"192.168.1.100", 80);  IP e Porta do Arduino na Rede, você também pode usar fsockopen, fwrite, fread.

A configuração do programa para o Arduino ficaria assim: 

//Configurações do Ethernet Shield

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; Mac do seu Ethernet Shield

byte ip[] = { 192.168.1.100 }; // IP do Arduino

Gateway e Subnet não são necessários para este caso.

Meio confuso a forma que o autor usou para passar dados pro Arduino, mas basta lembrar que usando sockets, você consegue enviar/receber caracteres de/para um determinado IP, da rede local ou internet. 


Boa noite Luis, beleza?

Então, minhas dúvidas são semelhantes as do amigo Hugo.

É o seguinte, tb estou usando o WAMPSERVER, porém, quando abro o navegador (localhost/arduino.php) me aparece o erro  """Fatal error:  Call to undefined function socket_create() in C:\xampp\htdocs\arduino.php on line 6 """

pesquisei e na maioria dos casos esse problema era resolvido inserindo a dll socket , ou simplesmente ativando-a,,, no meu caso a dll já tinha, só fiz "ativá-la", mas ainda assim o erro continua. Faz ideia do que pode ser?

Estou tentando pelo mesmo código que o Hugo postou.
Abaixo segue uma imagem do erro e as tentativas de corrigí-lo

Obs.: Páginas php sem usar o socket roda tranquilo

Se alguém poder ajudar, desde já agradeço.Abraço.PAZ!

Agora o teu problema é com a conexão, você fez alteração nesta linha ?

socket_connect($sock,"187.15.6.131", 8081); 

No lugar do IP 187.15.6.131, coloque o IP da Rede onde está conectado o Arduino e também mude a porta.

Luís, muito obrigado. Eu estava usando a porta 80, mudei para 8080 e liberei no modem e funcionou.

vlw mesmo.

 

Luis, tb estou tentando usar o no-ip, mas pelo que entendi,,, toda vez que eu digitar meu host (ex: www.rsrs.no-ip.org) ele irá pegar meu ip atual e já acessá-lo, certo? Porém de "nada" adianta acessar o roteador, o roteador eu consigo acessar, porém, quando especifico a porta www.rsrs.no-ip.org:8080 não vai. Como vc está fazendo ?

Mais uma vez, muito obrigado.PAZ!

Abraço

Dá uma olhada no meu imenso post que coloquei aqui.

O meu ta dando esse mesmo erro das imagens acima ja abillitei as extensoe do php com socket, ja alterei o ip e continua dando o emso erro....sera que voce podera me ajudar?

Bom dia Luiz, utilizei esse código do exemplo e está funcionando tudo corretamente mais eu gostaria de acrescentar mais coisas tipo colocar mais botões e mandar do Arduíno  para o PHP leitura de umidade e não estou conseguindo fazer isso, tens como me dar uma força. 

Obrigado.

Luís, meu caro, vou ter que abusar de vc...srsrsr

Vc poderia disponibilizar o seus códigos do arduino e php ?

Muito obrigado!

Hugo. Usei os mesmos códigos que vc e aqui funcionou.

socket_connect($sock,"187.15.6.131", 8081);  mudei para """socket_connect($sock,"192.168.1.170", 8080); 

liberei a porta 8080.

Eu estava tendando usar o ip do modem  e não dava certo. Aí coloquei o ip do arduino e funcionou.

Obs.: apenas intranet

Uai , Vinícius eu não estou consigo usar esse esse WAMPSERVER, localhost só mostra "Its Works" e localhost/phpyadmin só mostra Not Found...(com o servidor online), não consigo nem abrir os arquivos php que eu coloquei no diretório www. o que pode ser?

E no easyPHP qeu funciona tudo normal esse exemplo que eu postei da um erro na pagina:

Fatal error: Call to undefined function socket_create() in C:\Program Files (x86)\EasyPHP-5.3.9\www\PaginaPHP.php on line 6


Tenho aula agora e assim que voltar vou reinstalar de novo e vou sequir os passos do Luís para colocar o arduino com webserver onine...

Muito Obrigado mesmo, Senhores

Abraços

Hum... Aqui estava dando esse mesmo erro, e o problema era no IP.

Qual sua net? qual ip vc ta usando e qual o gateway da rede?as portas estão liberadas no modem?

 

Abraço.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço