[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

Vinicius, meu projeto também é para o tcc. 

Vou começar a testar aqui os exemplo do servidor com php. que até então não deu certo. qualquer problema aqui eu posto pra vcs...

Leandro, o tablet como central de comando e servidor web é interessante, analisa se isso é viável, se for é uma ideia bacana.

Você poderia disponibilizar o codigo fonte do arduino e php?

 

fera, poderia disponibilizar seu código? deste que esta no vídeo, gostaria de fazer estes enlaces.

Caro Hugo

Voce poderia disponibilizar o codigo do video? Achei bem interessante. Estou fazendo a automacao da minha casa e isso iria me ajudar muito

grato

Bom dia a todos, alguem sabe me dizer como colocar mais botões neste script e tambem como buscar o status do sensor LDR  que coloquei neste projeto, aguardo resposta e obrigado!

José,

Lá na parte html, coloque essas instruções:

echo "<button style=\"width:90;font: bold 14px Arial\" type = \"Submit\"Name = \"nomeDaSuaVariavel\">Texto do seu botão</button></br></br>";

Aí voce edita o que precisa.

Não é bem isto que vc está dizendo não, está á a parte mais fácil a qual já fiz, só incluindo outro botão no html não resolve dá erro, eu quero saber mesmo é tudo, como modifico o resto do projeto para aceitar o novo botão, porque já tentei várias coisas e não deu certo.

Você tb não detalhou onde eram os botões, entendi ser que seria no HTML e postei. Para trabalhar com MAIS botões no código, você deve antes de tudo adicionar as referencias deles na programação do Arduino. Por exemplo, alterar o tamanho do array de acordo com sua necessidade, depois vc pegará uma posição do seu array, msg[X] e 'linkar' com o que vc deseja fazer, caso o botão seja pressionado. Você vai replicar o código que ja esta usando.

Bom dia, eu estou com esse mesmo problema você conseguiu resolver isso ?

Galera, estou tentando usar esse exemplo para apenas acionar relés. Mas são 64 relés.

Entendi a parte de conexão e tudo mais, só que estou com dificuldades de adequar isso ao meu projeto. 

Ao trocar as variáveis e portas não está dando certo.

Alguém poderia me dar um help?

Boa Noite, 

Vê se consegue me ajudar a partir de toda as discuções do forum. 

Estou trabalhando com um sensor de peso no arduino, gostaria que a informação deste peso fosse mostrada na pagina WEB através do php. Consigo fazer isso através do "socket"? Como mostrar essas informações?

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço