Go Down

Topic: Comunicação Arduino e PHP (Read 3 times) previous topic - next topic

SpiderNet2

Estou com um problema..
Consigo enviar dados do PHP para o Arduino, mas precisava enviar os valores de um sensor para o servidor PHP hospedado em uma maquina da rede local. Vou postar parte do código em que tentei a comunicação, tanto do Arduino, quanto do PHP, se possível me deem uma força ai.
Arduino
Code: [Select]
  void loop() {
     EthernetClient client = server.available();
        sensor = analogRead(analogChannel);
        client.write(sensor);

PHP
Code: [Select]
<?php
   $sock 
socket_create(AF_INETSOCK_STREAMSOL_TCP);
   
socket_connect($sock,"192.168.0.120"8080);
   
sensor socket_read($sock);
   echo 
$sock;
   
socket_close($sock);
?>

Aguardo uma luz ai se alguém puder me ajudar.

bubulindo

Falta algo no teu exemplo...

Dá uma vista de olhos a este exemplo:

http://arduino.cc/en/Tutorial/WebServer

Tens de ver se existe algum cliente (neste caso o teu script php) disponível para receber os dados que vais enviar. Também tens de estar a ouvir no porto 8080, como inicializaste o Arduino? Mete o código todo aqui e talvez te consigamos ajudar mais.



Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

SpiderNet2

Esse tutorial do Arduino.cc no meu caso não serve, ele é em HTML e no próprio código do Arduino. O meu está em uma maquina na rede e futuramente vou hospedá-lo em algum host.

bubulindo

Ok...

eu já te apontei no caminho certo. Se não sabes o que é HTML, PHP, servidor e cliente, talvez devesses refrescar esses conceitos. O facto do exemplo retornar HTML é irrelevante. Troca as linhas do código HTML pelo client.write(sensor); e dá no mesmo. Ainda assim, sem ver como configuraste o Arduino não é possível saber ao certo se haverá algo mais a não funcionar.

Uma coisa que reparei:

Code: [Select]
<?php
   $sock 
socket_create(AF_INETSOCK_STREAMSOL_TCP);
   
socket_connect($sock,"192.168.0.120"8080);
   
$sensor socket_read($sock);  //<---------------------------------faltava o $
   
echo $sensor;  //   <-------------------------------------------------Tu queres ver o valor do sensor, não o handle da socket. 
   
socket_close($sock);
?>
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

SpiderNet2

Realmente bubulindo meu conhecimento nessa parte de web é pouco..hehe
Pela resposta sua paciência não parece estar boa, mas vou te incomodar de novo.
Fui modificando o código e já virou foi bagunça.
Vou passar o código que peguei no engenheirando.com.
Exatamente o que ele faz ai que pretendo alcançar, com a diferença de receber o valor dos sensores que vou usar.
Coloquei o código que me passou, deu erro, mas já vi que foi por falta de conhecimento meu dessa comunicação por socket.
Se puder me mostrar como faço isso fico grato.
PHP
Code: [Select]
<html>
<head></head>
<body>

<?php
$sock 
socket_create(AF_INETSOCK_STREAMSOL_TCP);

// Se conecta ao IP e Porta:
socket_connect($sock,"192.168.0.250"8080);
 
// 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);
 
// /*--- Aqui está a parte do codigo que me passou. Não sei se tem que encerrar o socket aberto acima que envia para depois abrir outro que recebe..
 
$sock socket_create(AF_INETSOCK_STREAMSOL_TCP);
   
socket_connect($sock,"192.168.0.120"8080);
   
$sensor socket_read($sock);
   echo 
$sensor;  
     
socket_close($sock);

//  ---*/

?>


Codigo Arduino
Code: [Select]
//  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 };
byte ip[] = { 192,168,0, 250 }; // ip que o arduino assumirá
byte gateway[] = { 192,168,0, 2 };  // ip do roteador
byte subnet[] = { 255, 255, 255, 0 };
int canalAnalogico=0;
int sensor;


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

EthernetServer server(8080); // 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(0,OUTPUT);
  pinMode(1,OUTPUT);
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
}

void loop() {
  EthernetClient 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(4,HIGH);
          delay(1000);
          digitalWrite(4,LOW);
        break;
        case 'G':
          // Caso G#, aciona o pino do portão pequeno por 1s.
          digitalWrite(5,HIGH);
          delay(1000);
          digitalWrite(5,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(0,HIGH); else digitalWrite(0,LOW);
          if (Luz[1]=='1') digitalWrite(1,HIGH); else digitalWrite(1,LOW);
          if (Luz[2]=='1') digitalWrite(2,HIGH); else digitalWrite(2,LOW);
          if (Luz[3]=='1') digitalWrite(3,HIGH); else digitalWrite(3,LOW);
        break;
       
      }
    }
//ESTOU ENVIANDO AQUI, SÓ QUE ESTÁ COM ERRO.
    sensor = analogRead(canalAnalogico);
    client.print(sensor);
   
  }
}


Go Up