Pages: [1]   Go Down
Author Topic: Comunicação Arduino e PHP  (Read 3134 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
  void loop() {
     EthernetClient client = server.available();
        sensor = analogRead(analogChannel);
        client.write(sensor);
PHP
Code:
<?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.
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3267
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.



Logged

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).

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3267
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
<?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);
?>
Logged

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).

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
<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:
//  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);
   
  }
}
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3267
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Eu tenho paciência... mas quando alguém teima em algo que não sabe, enerva.

Experimentaste ambos os códigos? Tens um servidor php a correr esse script?
Logged

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).

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sim. A parte de acionamentos dos relês está funcionando perfeitamente.
O que quero adicionar é essa funcionalidade do servidor receber o valor de uma porta do Arduino, como o exemplo do WebServer que vem na IDE do Arduino que envia os dados para uma pagina em HTML.
Ou seja, preciso que esse código tanto continue acionando os relês como recebendo o valor da porta analógica onde está o sensor.

Posteriormente quero jogar isso em uma aplicação Android, mas primeiro tenho que ir entendendo como tudo funciona.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Como enviar um valor de uma variável do código Arduino para o PHP receber via socket?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Galera, estou travado no meu projeto por não conseguir fazer uma comunicação correta entre o PHP e o Arduino

Lampada(rele) <--------------Arduino <-----------------------PHP  //essa parte funciona corretamente

Sensor------------------------>Arduino------------------------>PHP  //Essa parte funcionando em conjunto no mesmo código não consigo de forma alguma...

Se alguém intender dessa comunicação me ajuda ai... Obrigado!!! smiley-cry smiley-cry smiley-cry
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3267
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
No mesmo sítio que envias dados para o Arduino deves ler dele usando a mesma socket. Eu acho que estás a fazer copy paste de código que não entendes e é isso que te está a travar.

Experimenta fazer um sketch de raíz onde o Arduino comunica com o php... deve ser algo tão simples como:


#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 };
const int canalAnalogico=0;
int sensor;

 
EthernetServer server(8080); // Cria o servidor na porta 8081
 
void setup() {
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
 }
 
void loop() {
  EthernetClient client = server.available();
  if (client) {
  while (client.connected()) {
      if (client.available()) {
            //ESTOU ENVIANDO AQUI, SÓ QUE ESTÁ COM ERRO.
            sensor = analogRead(canalAnalogico);
            client.print(sensor);
            client.println("digital");//test
     }}
  }
}

Code:
<?php
$sock 
socket_create(AF_INETSOCK_STREAMSOL_TCP);

// Se conecta ao IP e Porta:
socket_connect($sock,"192.168.0.250"8080);
//falta testar se conseguiu conectar.

$sensor socket_read($sock);
     echo 
$sensor;  
     
socket_close($sock);

//  ---*/

?>
Logged

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).

Pages: [1]   Go Up
Jump to: