Bom dia.

Preciso de ajuda para fazer com que o Arduino me envie um POST ou GET para o PHP que vai popular o Banco MYSQL'.Já fiz varios testes e nada até agora.

Estou usando:

Arduino uno;

Ethernet Shield;

E estou usando o WAMPSERVER onde estam os arquivos .PHP e o BANCO MYSQL

Obrigado!!!

Exibições: 5709

Responder esta

Respostas a este tópico

Willliam,

Pelo que eu vi no seu código, o seu POST não está atingindo a página no servidor. Na linha:

    client.print("POST /PHP/Update.php HTTP/1.1\n");

 

Deveria ser:

    client.print("POST /update/Update.php HTTP/1.1\n");


Feito isso, escreva um script só para testar, antes mesmo de começar a inserir no banco de dados. Poderiamos fazer simplesmente um echo, mas vamos escrever um log!

Eu anexei um arquivo php com uma função de log. Para usar é só fazer um include no seu script:

<?php

include_once("log.php");

//Pega o valor da sua variavel button_state

$button_state = $_POST['BUTTON_STATE'];

//Grava o log com a mensagem do valor recebido

$log_ok = gravaLog("Recebi o valor $button_state");

if(!$log_ok){

die("Nao foi possivel gravar o log");

}

?>

Procure pelo arquivo eventos.log no diretorio em que você pôs o script log.php

Experimente aí. Se o log gravar o valor direitinho, é hora de partir pro banco de dados

Anexos

Boa tarde.


Obrigado Gabriel pela ajuda.


Vamos lá, fiz o você me recomendou dentro da www/update/Update.php.
client.print("POST /update/Update.php HTTP/1.1\n");

criei um arquivo chamado includ.PHP, e o arquivo log.php que você me enviou e coloquei dentro do diretório update gerou apasta eventos mais ela só recebe valores quando eu executo arquivo includ.php manualmente e não gera do arduino.

E também mudei:

client.print("Host: yourwebsite.com\n"); A qui eu mudei p/ localhost

#include <SPI.h>
#include <Ethernet.h>

int bstate = 0; // Esta é a variável que irá enviar, mas vai ser formatada como String first.
String txData =""; // Estes são os dados que serão enviados para a página PHP. Ela terá nomes e dados variáveis ??nele.

// Configurações de Rede Local
// Meu mac 90-A2-DA-0D-83-9D deve ser exclusivo na rede local
// (deve ser na parte traseira do ethernet shield)

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x83, 0x9D };
byte ip[] = { 192, 168, 0, 7 }; // Deve ser único na rede local
byte gateway[] = { 192, 168, 0, 1 }; // Deixei isso para consultas no caso de você precisar deles
byte subnet[] = { 255, 255, 255, 0 }; // Deixei isso para consultas no caso de você precisar deles

void setup()
{
Ethernet.begin(mac, ip); 
// Mina funciona apenas com o mac e ip. Pode ser necessária Gateway e DNS
// Dependendo da configuração do roteador, você pode precisar
// referência http://arduino.cc/en/Reference/EthernetBegin

Serial.begin(9600); //Apenas para a saída para que possamos ver se o seu trabalho 
delay(1000);
}
void loop()

bstate++; // Isso só acrescenta um para a variável "bstate" cada vez através do loop. Eu só fiz isso para testes
// Eu vou enviar os dados como uma String. Eu li sobre alguns com dificuldades de enviar integers.g
// 'TxDados' é uma string que é enviada para a página PHP.

txData = "BUTTON_STATE="+ (String (bstate));

// 'BUTTON_STATE' é a variável POST que a página PHP está procurando. 
// O '+' coloca as partes de cordas juntos.
// '(String (bstate))' formatos 'bstate' a partir de um valor numérico para uma string.
// Múltiplas seria semelhante
// TxDados = "VARIABLE1 =" + (String (var1)) + "& variavel2 =" (String (var2));

EthernetClient client;
//("yourwebsite.com", 80) também pode ser, eu acho que um IP, (xxx.xxx.xxx.xxx, 80) ou
// você pode definir um 'servidor' variável como fizemos com 'ip' e 'mac'
// assim, 'server byte [] = {xxx, xxx, xxx, xxx}' 
// então essa linha ficaria assim 'if (client.connect(server,80))'

if (client.connect("localhost",80))
{

Serial.println("localhost"); //Isso não é necessário, apenas para o gabarito
Serial.println();

// HERE IS THE MEAT AND GRAVEY = AQUI ESTÁ A CARNE E gravey
// O '/ update / update.php' é o diretório eo arquivo que você está enviando para
// se o arquivo está na raiz do domínio que seria apenas '/ update.php'


client.print("POST /PHP/Update.php HTTP/1.1\n");
// yourwebsite.com, domínio onde o arquivo php está hospedado

client.print("Host: yourwebsite.com\n"); A qui eu mudei p/ localhost
client.print("Connection: close\n");

client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");

// Lembre-se de nossa variável TxDados? Ele tem todas as informações que estamos enviando
// para a página PHP, 'update.php'. MAS, a página PHP precisa saber quantos caracteres
// estão vindo. Damos-lo usando "txData.length () '

client.print(txData.length()); 
client.print("\n\n");
client.print(txData); // after all of the required junk we send the data
}
else
{
Serial.println("Connection Failed."); // Mais uma vez a série é para o gabarito. 
Serial.println();
}
delay(5000); // este atraso foi para o meu teste para enviar um número a cada 5 segundos
}

William,

Troque os "localhost" pelo IP da máquina que é o servidor local. Por localhost entende-se a própria máquina. Então o Arduino está enviando requisições para ele mesmo.

Ex:

client.print("Host: localhost\n");

por

client.print("Host: <IP do seu servidor_local>\n");

Fazendo isso, seu problema estará resolvido.

Boa tarde.

Quero lhe agradecer de verdade pela ajuda esta funcionando.

Deus te abençoe. Vou configurar agora para cada sensor (4) popular o banco .

Att.

William jeremias

Boa tarde Gabriel.

Preciso de mais uma vez de sua ajuda.

Você já fez algo com que eu estou tentando fazer?

Quero que Ativar 4 portas com com 4 sensores quando um sensor for acionado o mesmo enviar um POST especifico daquela porta (pinMode) para

o meu PHP com $_POST[BUTTON_STATE].

Estou fazendo assim não deu certo e fica fazendo insert direto:


#include <SPI.h>
#include <Ethernet.h>

//int bstate = 0; // Esta é a variável que irá enviar, mas vai ser formatada como String first.
//String txData = ""; // Estes são os dados que serão enviados para a página PHP. Ela terá nomes e dados variáveis ??nele.

String txData1 ="s1";
String txData2 ="s2";
String txData3 ="s3";
String txData4 ="s4";
int sensor1 = 4;
int sensor2 = 5;
int sensor3 = 6;
int sensor4 = 7;

// Configurações de Rede Local
// Meu mac 90-A2-DA-0D-83-9D deve ser exclusivo na rede local
// (deve ser na parte traseira do ethernet shield)

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x83, 0x9D };
byte ip[] = { 192, 168, 0, 7 }; // Deve ser único na rede local
byte gateway[] = { 192, 168, 0, 1 }; // Deixei isso para consultas no caso de você precisar deles
byte subnet[] = { 255, 255, 255, 0 }; // Deixei isso para consultas no caso de você precisar deles

void setup()
{
Ethernet.begin(mac, ip);
// Mina funciona apenas com o mac e ip. Pode ser necessária Gateway e DNS
// Dependendo da configuração do roteador, você pode precisar
// referência ttp://arduino.cc/en/Reference/EthernetBegin

Serial.begin(9600); //Apenas para a saída para que possamos ver se o seu trabalho
delay(1000);
}
void loop()
{
pinMode(sensor1, INPUT);
pinMode(sensor2, INPUT);
pinMode(sensor3, INPUT);
pinMode(sensor4, INPUT);

//bstate++; // Isso só acrescenta um para a variável "bstate" cada vez através do loop. Eu só fiz isso para testes
// Eu vou enviar os dados como uma String. Eu li sobre alguns com dificuldades de enviar integers.g
// 'TxDados' é uma string que é enviada para a página PHP.

//txData = "BUTTON_STATE="+ (String (bstate));
txData1 = "BUTTON_STATE="+ (String (sensor1));
txData2 = "BUTTON_STATE="+ (String (sensor2));
txData3 = "BUTTON_STATE="+ (String (sensor3));
txData4 = "BUTTON_STATE="+ (String (sensor4));
//txData = "BUTTON_STATE="+ (String (sensor1)) + "& BUTTON_STATE =" (String (sensor2)) + "& BUTTON_STATE =" (String (sensor3)) + "& BUTTON_STATE =" (String (sensor4));

// 'BUTTON_STATE' é a variável POST que a página PHP está procurando.
// O '+' coloca as partes de cordas juntos.
// '(String (bstate))' formatos 'bstate' a partir de um valor numérico para uma string.
// Múltiplas seria semelhante
// TxDados = "VARIABLE1 =" + (String (var1)) + "& variavel2 =" (String (var2));

EthernetClient client;
//("yourwebsite.com", 80) também pode ser, eu acho que um IP, (xxx.xxx.xxx.xxx, 80) ou
// você pode definir um 'servidor' variável como fizemos com 'ip' e 'mac'
// assim, 'server byte [] = {xxx, xxx, xxx, xxx}'
// então essa linha ficaria assim 'if (client.connect(server,80))'

if (client.connect("192.168.0.5",80))
{

Serial.println("Connected to yourwebsite..."); //Isso não é necessário, apenas para o gabarito
Serial.println();

// HERE IS THE MEAT AND GRAVEY = AQUI ESTÁ A CARNE E gravey
// O '/ update / update.php' é o diretório eo arquivo que você está enviando para
// se o arquivo está na raiz do domínio que seria apenas '/ update.php'


client.print("POST /update/IncludPHP.php HTTP/1.1\n");
// yourwebsite.com, domínio onde o arquivo php está hospedado

client.print("Host: 192.168.0.5\n");
client.print("Connection: close\n");

client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");

// Lembre-se de nossa variável TxDados? Ele tem todas as informações que estamos enviando
// para a página PHP, 'update.php'. MAS, a página PHP precisa saber quantos caracteres
// estão vindo. Damos-lo usando "txData.length () '

//client.print(txData.length());
//client.print("\n\n");
//client.print(txData); // after all of the required junk we send the data --depois de todo o lixo que nós necessário enviar os dados
}
else
{
Serial.println("Connection Failed."); // Mais uma vez a série é para o gabarito.
Serial.println();
}
delay(5000); // este atraso foi para o meu teste para enviar um número a cada 5 segundos
}

Grato.

ola gabriel queria agradecer por sua ajuda fiz o meu TCC e foi um sucesso  eleito melhor projeto e com possibilidades reais de venda  vou escrever um artigo a convite da facudade

obrigado mesmo Deus te abençoe

Que bom que funcionou William! É um prazer ajudar a comunidade.

Sucesso no projeto!

William,

Sobre o Arduino eu não tenho tanto domínio, mas acho que o caso aí seria usar interrupções. Deixar o programa "ouvindo" as portas que você quer monitorar. Uma mudança no estado das mesmas dispara um evento, que no seu caso irá rodar o processo de gravação dos dados no BD.

Pra ajudar, dê uma olhada na biblioteca PinChange: http://code.google.com/p/arduino-pinchangeint/ ou na Arduino PCIManager (http://code.google.com/p/arduino-pcimanager/). Aí você pode ouvir a mudança de estados em cada pino individualmente.

Dica: Defina a "direção" das portas fora do loop principal. Assim você só define uma vez. Ao invés de


void loop(){
pinMode(sensor1, INPUT);
pinMode(sensor2, INPUT);
pinMode(sensor3, INPUT);
pinMode(sensor4, INPUT);

 

Faça:


void setup(){
    pinMode(sensor1, INPUT);
    pinMode(sensor2, INPUT);
    pinMode(sensor3, INPUT);
    pinMode(sensor4, INPUT);
}

Obrigado Gabriel.

Fiz o que você me orientou tirei do loop, só que ainda continua  mandando sem parar

até manda o valor da porta client.print(txData2.length()); porta (5) certinho mais eu quero fazer o valor ir

ainda não olhei aqueles links que você me mandou mas vou olhar agora.

Grato.

A dica do loop era só para evitar processamento desnecessário. Para você não ficar redefinindo o que já foi definido antes.

Mas veja sim as bibliotecas, acho que será de grande valia para você. Tente fazer com as interrupções, aí o micro controlador vai ficar ouvindo as portas e só quando o estado de uma das portas mudar ele dispara a requisição, do jeito que você quer.

olha eu dinovo ta dificil cara.

 Fiz algumas modificações mais ainda continua enviando qualquer registro (0 ou  outro)

Da uma olhada vê se você consegue me ajudar:

 

#include <SPI.h>

#include <Ethernet.h>

 

// Configurações de Rede Local

// Meu mac 90-A2-DA-0D-83-9D deve ser exclusivo na rede local

// (deve ser na parte traseira do ethernet shield)

 

byte mac[]     = { 0x90, 0xA2, 0xDA, 0x0D, 0x83, 0x9D };

byte ip[]      = { 192, 168,   0,  7 };   // Deve ser único na rede local

byte gateway[] = { 192, 168,   0,  1 };   // Deixei isso para consultas no caso de você precisar deles

byte subnet[]  = { 255, 255, 255,  0 };  // Deixei isso para consultas no caso de você precisar deles

 

String txData = ""; // Estes são os dados que serão enviados para a página PHP. Ela terá nomes e dados variáveis ??nele.

int sensor1  = 4;

//int pinoled5 = 5;

int sensor2  = 6;

//int pinoled7 = 7;

int leitura  = 0;

int leitura2 = 0;

 

void setup()

{

  Ethernet.begin(mac, ip);

 

  pinMode(sensor1, INPUT);

 // pinMode(pinoled5,OUTPUT);

 digitalWrite(sensor1, 0);

 

  pinMode(sensor2, INPUT);

 // pinMode(pinoled7,OUTPUT);

 digitalWrite(sensor2, 0);

 

 Serial.begin(9600); //Apenas para a saída para que possamos ver se o seu trabalho

 delay(1000);

}

void loop()

{

 

  leitura=digitalRead(sensor1); //Verifica o status do Botao1

 

  if (leitura == 1)

   {

  txData += "&SENSOR=1"+ (String (leitura));

  inserir(txData);

   }

 

  leitura2=digitalRead(sensor2); //Verifica o status do Botao1

 

  if (leitura2 == 1)

   {

  txData += "&SENSOR=2"+ (String (leitura));

  inserir(txData);

    }

 

}

  void inserir(String valor)

 {

 EthernetClient client;

nt.connect(server,80))'

 

if (client.connect("192.168.0.5",80))

  {

/* O update / update.php' é o diretório eo arquivo que você está enviando para se o arquivo está na raiz do domínio que seria apenas '/ update.php'*/

 

   client.print("POST /update/IncludPHP.php HTTP/1.1\n"); // Domínio onde o arquivo php está hospedado

 

   client.print("Host: 192.168.0.5\n");                         

    client.print("Connection: close\n");

Obrigado

Att.

William Jeremias

 

    client.print("Content-Type: application/x-www-form-urlencoded\n");

    client.print("Content-Length: ");

 '

 

client.print(valor.length());                                           

client.print("\n\n");

client.print(valor);    // epois de todo o lixo que nós necessário enviar os dados

  }

  else

  {

    Serial.println("Connection Failed."); // Mais uma vez a série é para o gabarito. 

   Serial.println();

  }

 delay(5000); // este atraso foi para o meu teste para enviar um número a cada 5 segundos

}

Posta o codigo no www.pastebin.com

Melhor para visualização.

Sobre GET e POST, estou pesando em criar um video tutoria, você já conseguiu resolver seu problema ?

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço