Pages: [1]   Go Down
Author Topic: Recuperando dados do servidor PHP(c/ MySQL) e lendo com Arduino  (Read 822 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Olá Pessoal,

Pesquisei bastante aqui no fórum e até encontrei algumas referencias que funcionaram, mas não trouxeram o valor corretamente.
Estou desenvolvendo uma aplicação, que um usuário vai digitar um valor num KEYPAD, ele será enviado para uma página PHP que vai trazer um retorno, uma frase ou um valor.

Até o envio está funcionando, e eu sei porque fiz o teste gravando no banco de dados, porém não consigo pegar qualquer informação do PHP ou do banco de dados.

Tentei utilizar a biblioteca do mysql.h direto para fazer a conexão, mas meu banco de dados fica online e não é o único, então não consegui fazer funcionar.

Vou postar meus códigos aqui, inclusive com os textos comentados (que não estão rodando) porque estou tentando descobrir a maneira correta, e colocarei também o PHP.

Arduino:
Code:
#include  <Ethernet.h>             //Biblioteca para função de Ethernet
#include  <Client.h>              //Biblioteca para função de Cliente
#include  <SPI.h>                //Biblioteca para função do EthernetShield W5100
#include <mysql.h>
#include <sha1.h>

uint8_t hwaddr[6] = {0x90, 0xA2, 0xDA, 0x0F, 0x89, 0x98};
uint8_t ipaddr[4] = {192, 168, 0, 254};    // Endereço de IP do arduino (vai depender do seu gateway)
uint8_t gwaddr[4] = {192, 168, 0, 1};  // Endereço de IO do seu Gateway (Não necessario para este Exemplo)
uint8_t subnet[4] = {255, 255, 255, 0};// mascara da rede   (Não necessario para este Exemplo)

IPAddress serverip(xxx, 154, 225, xxx);
int serverport = 80;
EthernetClient client;

/***********************/
const int ledPin    = 13; // the pin connected to the LED to flash
const int sensorPin = 0;  // the analog pin connected to the sensor
const long referenceMv = 5000; // long int to prevent overflow when multiplied

    int val = analogRead(sensorPin);
    int mV = (val * referenceMv) / 1023;
    int cm = getDistance(mV);

/****************************** MYSQL */

//IPAddress server_addr(xxx, 154, 225, xxx);
char user[] = "xxxxxxx"; //usuário do BD
char password[] = "xxxxxxx"; //senha do BD
Connector my_conn;

/***************************************************/

   
void setup(void)// setup função que é iniciada quando o arduino é ligado (Executa 1 vez)
{

    //Inicia a Serial
    Serial.begin(9600);
   
    Serial.println("Iniciando Ethernet");
    Ethernet. begin(hwaddr, ipaddr);// inicia a ethernet

}

/**********************************************/
const int TABLE_ENTRIES = 12;
const int firstElement = 250; // first entry is 250 mV
const int INTERVAL  = 250; // millivolts between each element
static int distance[TABLE_ENTRIES] = {150,140,130,100,60,50,40,35,30,25,20,15};
/**********************************************/

void loop(){
 
    int val = analogRead(sensorPin);
    int mV = (val * referenceMv) / 1023;
    int cm = getDistance(mV);
     
    Serial.print("Estabelecendo conexao com o Servidor.  |  ");
    Serial.print(cm);
    Serial.println();

    //Tenta estabelecer a conexão senão envia o erro client.connect(ip do servidor, porta do servidor)
    if(client.connect(serverip, serverport)){
       
       char cli;
       
        //Envia a URL + os parametros para o servidor
        Serial.println("Enviado dados para o Servidor: ");
        client.print("GET /~gelit/arduino/insere.php?distancia=");
        Serial.print("GET /~gelit/arduino/insere.php?distancia=");
        client.print(cm);
        Serial.print(cm);
        Serial.println();
     
        client.println(" HTTP/1.1");                  //script padrão para o protocolo HTTP
        Serial.println(" HTTP/1.1");                  //
        client.println("Host: www.grupoelit.com");    //
        Serial.println("Host: www.grupoelit.com");    //
        client.println("User-Agent: Arduino");        //
        Serial.println("User-Agent: Arduino");        //
        client.println("Accept: text/html");          //
        Serial.println("Accept: text/html");          //
       


       
        if(client.available()){
          Serial.println(client.read());
          Serial.println("^-- Read | Read--v");
          Serial.println(client.available());
        }
       
/**************************************
unsigned long now = millis();
    Serial.println("testa timeout");
    while ((cli = client.available()) <= 0)  {
        if (millis() - now >= 1000)  {  //um segundo para teste... isto é demasiado, mas por agora terá de servir.
            Serial.println("timed out");
            break; //sai daqui para fora
        } //end if
    }  //end while

      //Serial.print(id); //replica para a Serial
      while (client.available() >0) {
          Serial.println(client.read()); //lê os dados enviados do servidor, nesse momento já deveria mostrar o que o servidor enviou
      }
  /**************************************/   
       
        client.println();                             //
        Serial.println();
/*
      Serial.println("Conectando ao banco de dados...");
        if (my_conn.mysql_connect(serverip, 3306, user, password)) {
          delay(1000);
          my_conn.cmd_query("mysql_select_db('gelit_arduino')");
          my_conn.cmd_query("SELECT count(*) FROM tabela LIMIT 1");
          my_conn.show_results();
      }else
          Serial.println("Connection failed.");

      Serial.println();
     
/*
        Serial.print("Registros: ");
        Serial.print("GET /~gelit/arduino/conta.txt HTTP/1.0");
        Serial.println();
*/       

    }else{
        //Se a Conexão Falhar envia a informação de Erro para Serial
        client.println("Erro ao Estabelecer Conexão");
    }

    if(client.connected() && client.available()) {        // Quando a conexão é feita e está disponivel:
        char c = client.read();                                   // Le a reposta do Servidor e imprime na tela
        Serial.print(c);
    }
    Serial.println();
  client.stop();   //  termina a conexao
  delay(10000);  //delay de 10 segundos para recomeçar o loop
}


int getDistance(int mV)
{
   if( mV >  INTERVAL * TABLE_ENTRIES-1 )
      return distance[TABLE_ENTRIES-1];
   else
   {
      int index = mV / INTERVAL;
      float frac = (mV % 250) / (float)INTERVAL;
      return distance[index] - ((distance[index] - distance[index+1]) * frac);
   }
}



PHP:
Code:
<?php

include('connect.php');

$distancia $_GET['distancia'];

if(
$distancia){
   
$sql "insert into tabela values (null, $distancia)";
   
$qry mysql_query($sql);


   
$sql "SELECT count(*) FROM tabela";
   
$res mysql_query($sql);
   
$row mysql_fetch_array($res);
   echo 
$row[0];

}



?>




Espero que eu tenha sido claro no que eu preciso e quis expressar.
No momento, como é teste a aplicação não está usando o teclado, mas foi para simplificar um pouco, já que o outro código está 100%

Agradeço antecipadamente a todos que lerem e mais ainda aos que puderem contribuir.

Abraço.
 smiley-lol
Logged

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

Olá...

Podes explicar-me o que faz a palavra "static" numa variável global?

Onde foste buscar o mysql.h para Arduino?

Porque é que só imprimes um caracter (8 bits) da resposta do servidor?

Code:
        if(client.available()){
          Serial.println(client.read()); <--------------ESTA LINHA
          Serial.println("^-- Read | Read--v");
          Serial.println(client.available());
        }

Depois envias que tens caracteres a ler... mas não os lês.
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: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Obrigado pelo retorno!

Eu estava tão preocupado que meus próprios códigos não estavam funcionando, que decidi procurar por tutoriais e exemplos prontos na internet.
A medida que tudo foi funcionando, eu fui deixando no código para estudar depois.

No caso da variável, eu peguei deste site: https://www.inkling.com/read/arduino-cookbook-michael-margolis-2nd/chapter-6/recipe-6-5

Até entrei nele antes de te responder pra saber se eu não tinha feito besteira, mas ví que copiei certinho, e foi um dos códigos que funcionou.


Referente ao MySQL, também peguei na internet... a maioria dos fóruns estava apontando para o mesmo link, então foi onde eu baixei, este link: http://drcharlesbell.blogspot.com.br/2013/04/introducing-mysql-connectorarduino_6.html


Agora, referente ao código, mesmo sendo 8bits no console ele me retorna como -1, ou seja, sem dados do lado do servidor.

Após responder as suas perguntas, fico na dúvida se realmente estou indo na direção correta.

Aguardo e Agradeço.
Logged

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

Já tentaste ver se a ligação continua aberta quando tentas ler?

O servidor pode estar a fechar a ligação... é improvável, mas nunca se sabe.

E se tirasses aquele código do mySQL e corresses isto sem ele?? Aliás... e se retirasses metade do código que tens e começasses por aí? Eu vejo ali coisas que não fazem muito sentido e que podem estar a atrapalhar umas às outras.

Code:
void loop(){
 
    int val = analogRead(sensorPin);
    int mV = (val * referenceMv) / 1023;
    int cm = getDistance(mV);
     
    Serial.print("Estabelecendo conexao com o Servidor.  |  ");
    Serial.print(cm);
    Serial.println();

    //Tenta estabelecer a conexão senão envia o erro client.connect(ip do servidor, porta do servidor)
    if(client.connect(serverip, serverport)){
       unsigned char cli;
       
        //Envia a URL + os parametros para o servidor
        Serial.println("Enviado dados para o Servidor: ");
        client.print("GET /~gelit/arduino/insere.php?distancia=");
        Serial.print("GET /~gelit/arduino/insere.php?distancia=");
        client.print(cm);
        Serial.print(cm);
        Serial.println();

        client.println(" HTTP/1.1");                  //script padrão para o protocolo HTTP
        Serial.println(" HTTP/1.1");                  //
        client.println("Host: www.grupoelit.com");    //
        Serial.println("Host: www.grupoelit.com");    //
        client.println("User-Agent: Arduino");        //
        Serial.println("User-Agent: Arduino");        //
        client.println("Accept: text/html");          //
        Serial.println("Accept: text/html");          // 
       
    unsigned long now = millis();
    Serial.println("testa timeout");
    while ((cli = client.available()) <= 0)  {
        if (millis() - now >= 1000)  {  //um segundo para teste... isto é demasiado, mas por agora terá de servir.
            Serial.println("timed out");
            break; //sai daqui para fora
        } //end if
    }  //end while

      while (client.available() >0) {
          Serial.println(client.read()); //lê os dados enviados do servidor, nesse momento já deveria mostrar o que o servidor enviou
      }
   }else{
        //Se a Conexão Falhar envia a informação de Erro para Serial
        client.println("Erro ao Estabelecer Conexão");
    }

  client.stop();   //  termina a conexao
  delay(10000);  //delay de 10 segundos para recomeçar o loop
}

Começa com este código e verifica o que é retornado sem código avulso pelo meio.

Ahh, e apaga os valores 47 a 50 da tua base de dados... fui eu que os meti lá... :$
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: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Agradeço toda a ajuda que tem oferecido, mas não deu certo. Ficou com timeout.

Veja o código completo:
Code:
#include  <Ethernet.h>             //Biblioteca para função de Ethernet
#include  <Client.h>              //Biblioteca para função de Cliente
#include  <SPI.h>                //Biblioteca para função do EthernetShield W5100

uint8_t hwaddr[6] = {0x90, 0xA2, 0xDA, 0x0F, 0x09, 0x88};
uint8_t ipaddr[4] = {192, 168, 0, 254};    // Endereço de IP do arduino (vai depender do seu gateway)
uint8_t gwaddr[4] = {192, 168, 0, 1};  // Endereço de IO do seu Gateway (Não necessario para este Exemplo)
uint8_t subnet[4] = {255, 255, 255, 0};// mascara da rede   (Não necessario para este Exemplo)

IPAddress serverip(198, 154, 225, 246);
int serverport = 80;
EthernetClient client;

/***********************/
const int ledPin    = 13; // the pin connected to the LED to flash
const int sensorPin = 0;  // the analog pin connected to the sensor
const long referenceMv = 5000; // long int to prevent overflow when multiplied

    int val = analogRead(sensorPin);
    int mV = (val * referenceMv) / 1023;
    int cm = getDistance(mV);

   
void setup(void)// setup função que é iniciada quando o arduino é ligado (Executa 1 vez)
{

    //Inicia a Serial
    Serial.begin(9600);
   
    Serial.println("Iniciando Ethernet");
    Ethernet. begin(hwaddr, ipaddr);// inicia a ethernet

}

/**********************************************/
const int TABLE_ENTRIES = 12;
const int firstElement = 250; // first entry is 250 mV
const int INTERVAL  = 250; // millivolts between each element
static int distance[TABLE_ENTRIES] = {150,140,130,100,60,50,40,35,30,25,20,15};
/**********************************************/

void loop(){
 
    int val = analogRead(sensorPin);
    int mV = (val * referenceMv) / 1023;
    int cm = getDistance(mV);
     
    Serial.print("Estabelecendo conexao com o Servidor.  |  ");
    Serial.print(cm);
    Serial.println();

    //Tenta estabelecer a conexão senão envia o erro client.connect(ip do servidor, porta do servidor)
    if(client.connect(serverip, serverport)){
       unsigned char cli;
       
        //Envia a URL + os parametros para o servidor
        Serial.println("Enviado dados para o Servidor: ");
        client.print("GET /~gelit/arduino/insere.php?distancia=");
        Serial.print("GET /~gelit/arduino/insere.php?distancia=");
        client.print(cm);
        Serial.print(cm);
        Serial.println();

        client.println(" HTTP/1.1");                  //script padrão para o protocolo HTTP
        Serial.println(" HTTP/1.1");                  //
        client.println("Host: www.grupoelit.com");    //
        Serial.println("Host: www.grupoelit.com");    //
        client.println("User-Agent: Arduino");        //
        Serial.println("User-Agent: Arduino");        //
        client.println("Accept: text/html");          //
        Serial.println("Accept: text/html");          // 
       
    unsigned long now = millis();
    Serial.println("testa timeout");
    while ((cli = client.available()) <= 0)  {
        if (millis() - now >= 1000)  {  //um segundo para teste... isto é demasiado, mas por agora terá de servir.
            Serial.println("timed out");
            break; //sai daqui para fora
        } //end if
    }  //end while

      while (client.available() >0) {
          Serial.println(client.read()); //lê os dados enviados do servidor, nesse momento já deveria mostrar o que o servidor enviou
      }
   }else{
        //Se a Conexão Falhar envia a informação de Erro para Serial
        client.println("Erro ao Estabelecer Conexão");
    }

  client.stop();   //  termina a conexao
  delay(10000);  //delay de 10 segundos para recomeçar o loop
}


int getDistance(int mV)
{
   if( mV >  INTERVAL * TABLE_ENTRIES-1 )
      return distance[TABLE_ENTRIES-1];
   else
   {
      int index = mV / INTERVAL;
      float frac = (mV % 250) / (float)INTERVAL;
      return distance[index] - ((distance[index] - distance[index+1]) * frac);
   }
}

Agora  o SerialMonitor:


Veja uma prévia dele rodando, link do youtube: http://www.youtube.com/watch?v=hexDyIjbdsU&feature=youtu.be

Referente aos registros no banco, não se preocupe, pois está ali para testes mesmo!

Obrigado.
Logged

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

Eu lembro-me que tive problemas deste género numa brincadeira que fiz com php e acabei por instalar o wireshark e ver como é que o web browser lida com isto.

Sabes usar o wireshark?
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: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Não, na verdade nunca nem ouvi falar sobre isso.

É estranho não funcionar, você reproduziu aí e funcionou?

Obrigado.
Logged

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

http://www.wireshark.org

Não, eu não tenho aqui uma ligação de rede para o meu arduino.

O que eu estou a dizer é para acederes a essa página com o wireshark a correr e analisares os pacotes que vão de e para o teu arduino.
Num deles consegues ver o pedido como é feito.  E se simplificares o pedido?

Tenho ideia que não precisas de indicar o user agent e accept num pedido get. Tenta também dar dois carriage returns.

Analisa se o método println adiciona um carriage return ou carriage return e line feed. Isso pode causar confusão talvez...
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).

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

Falta-te um client.println() no final do pedido de get...

http://stackoverflow.com/questions/15752324/arduino-php-query

http://stackoverflow.com/questions/14655122/sending-variable-which-is-read-by-arduino-to-php-scriptelectronic-toll-collect

http://stackoverflow.com/questions/15752324/arduino-php-query

http://www.instructables.com/id/Save-data-of-temperature-and-humidity-on-MySQL-wit/step6/Codes-for-the-arduino/

Compara todos estes sites com o teu...
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: