Consuta a servidor PHP

Hola,

Estoy con el ejemplo WebClient de la librería Ethernet y tengo un servidor PHP con formularios al cual estoy conectado desde mi arduino. Hasta ahora he probado a realizar consultas con constantes numéricas y funciona perfecto. El problema viene cuando deseo realizar una consulta utilizando una variable, la cual guarda el valor de una tag rfid leída prevíamente. Creo que el error es de sintaxis, pero no he encontrado ejemplos para corregirlo:

if (client.connect()) {
    Serial.println("connected");
    // Make a HTTP request:
    client.println("GET /consulta.php?iden='dato' HTTP/1.0");
    client.println();

La variable es dato de tipo int. ¿Alguien sabe cómo escribirlo dentro del GET?

Gracias de antemano!

Tienes que crear una string nueva, concatenando las que quieras y casteando los datos:

char buff[20];
int dato_int=5;
float unadato_float=4.345;

String mandar="GET /consulta.php?iden="+String(dato_int)+"&test="+String(dtostrf(unadato_float,5,2,buff))+" HTTP/1.0";

client.println(mandar);

suerte!

Muchas gracias zaktux! Ya lo he solucionado :smiley:

Veréis ahora me ha surgido otro problema. A raíz de los ejemplos básicos de RFID y cliente de la librería Ethernet estoy tratando de leer el código de mi tarjeta para más tarde enviarlo a modo de consulta al servidor PHP. Os enseño los dos códigos y debajo de cada uno os describo los problemas que me surgen:

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

// Definicion de la capa de red y enlace de datos.
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,2,4 }; //IP Arduino
byte server[] = { 192,168,2,12 }; // PC Luis
byte gateway[] = { 192,168,2,12 };
byte subnet[] = {255,255,255,0 };
char c = 0;
char val = 0; // variable que recibe bytes del puerto serie0 RFID
char code[13] = "000000000000"; //variable que guarda el valor de la TAG
int prueba=1; //variable int de prueba
String mandar="GET /consulta1.php?iden="+String(prueba)+" HTTP/1.0"; //petición de consulta al servidor PHP
// Inicializamos la clase Client de la librería Ethernet
// con la IP y el puerto designados
// que necesitamos para conectar al servidor (port 80 is default for HTTP):
Client client(server, 80);

void setup() {
// Iniciamos la conexion Ethernet:
Ethernet.begin(mac, ip);
// Iniciamos la libreria Serial:
Serial.begin(9600);
// Dejamos un delay de 1 segundo
delay(1000);
Serial.println("Conectando...");

// Si conseguimos conectar, lo reportamos a través del serial:
if (client.connect()) {
Serial.println("Conectado");

} else {
Serial.println("No se conectado");
}
} // void setup

void loop()
{
if(Serial.available() > 0) {

for (int i = 0; i < 13; i++) {
val = Serial.read();
code*=val; *
_ Serial.print(code*, HEX);_
_
}*_

* Serial.println();*
* client.println(mandar);*
* client.println();*
* delay (3000);*
* if(client.available()){*
* Serial.println("Enviando peticion");*
* while (client.available()){*
* char c = client.read();*
* Serial.print(c);*
* } //while *
} //if(client.available)

* if (!client.connected()){*
* Serial.println();*
* Serial.println("Disconnecting...");*
* client.stop();*
* client.connect();*
* Serial.println("Reconectando...");*
* Serial.flush();*
* }*
} //if(Serial.available)
* } // void loop[/quote]*
Con este código no consigo leer la Tag bien, pues me aparecen valores FFF en hex entre el código de la targeta, pero cuando realiza la consulta al servidor con la variable prueba = 1, éste si le devuelve el dato asociado al identificador 1 de su base de datos. Os enseño el serialmonitor:

2º Código
> #include <SPI.h>
> #include <Ethernet.h>
>
> // Definicion de la capa de red y enlace de datos.
> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
> byte ip[] = { 192,168,2,4 }; //IP Arduino
> byte server[] = { 192,168,2,12 }; // PC Luis
> byte gateway[] = { 192,168,2,12 };
> byte subnet[] = {255,255,255,0 };
> //Definicion variables RFID.
> byte i = 0;
> byte val = 0;
> byte code[12];
> byte checksum = 0;
> byte bytesread = 0;
> byte tempbyte = 0;
> int digito1 = 0;
> int digito2 = 0;
> int digito3 = 0;
> int digito4 = 0;
> int digito5 = 0;
> int digito6 = 0;
> //Otras
> int prueba=1;
> char c = 0;
> String mandar="GET /consulta1.php?iden="+String(prueba)+" HTTP/1.0"; //petición de consulta al servidor PHP
> // Inicializamos la clase Client de la librería Ethernet
> // con la IP y el puerto designados
> // que necesitamos para conectar al servidor (port 80 is default for HTTP):
> Client client(server, 80);
>
> void setup() {
> // Iniciamos la conexion Ethernet:
> Ethernet.begin(mac, ip);
> // Iniciamos la libreria Serial:
> Serial.begin(9600);
> // Dejamos un delay de 1 segundo
> delay(1000);
> Serial.println("Conectando...");
>
> // Si conseguimos conectar, lo reportamos a través del serial:
> if (client.connect()) {
> Serial.println("Conectado");
*> *
> } else {
> Serial.println("No se conectado");
> }
> } // void setup
>
> void loop()
> {
> if(Serial.available() > 0) {
*> *
> if((val = Serial.read()) == 2) { // Chequeamos la cabecera
> bytesread = 0;
> while (bytesread < 12) { // Pasamos a leer los 10 digitos + 2 de checksum
> if( Serial.available() > 0) {
> val = Serial.read();
> if((val == 0x0D)||(val == 0x0A)||(val == 0x03)||(val == 0x02)) { // Si encontramos cabecera o bytes de parada antes de los 10 digitos
> break; // dejamos de leer
> }
>
> // De Ascii/Hex conversion:
> if ((val >= '0') && (val <= '9')) {
> val = val - '0';
> } else if ((val >= 'A') && (val <= 'F')) {
> val = 10 + val - 'A';
> }
>
> // Every two hex-digits, add byte to code:
> if (bytesread & 1 == 1) {
> // make some space for this hex-digit by
> // shifting the previous hex-digit with 4 bits to the left:
> code[bytesread >> 1] = (val | (tempbyte << 4));
>
> if (bytesread >> 1 != 5) { // If we're at the checksum byte,
> checksum ^= code[bytesread >> 1]; // Calculate the checksum... (XOR)
> };
> } else {
> tempbyte = val; // Store the first hex digit first...
> };
>
> bytesread++; // ready to read next digit
> }
> }
>
> // Output to Serial:
>
> if (bytesread == 12) { // Si la lectura de los 12 digitos está completa
> Serial.println("El codigo de la Tag es: ");
> for (i=0; i<6; i++) {
> Serial.print(code*, DEC);*
> * } //for para sacar por serialmonitor el valor del array de bytes de los digitos*
> * Serial.println("");*
> * digito1=code[0];*
> * digito2=code[1];*
> * digito3=code[2];*
> * digito4=code[3];*
> * digito5=code[4];*
> * digito6=code[5];*
> * //Hemos pasado cada casilla del array a una variable de tipo int*
> * Serial.print(digito1);*
> * Serial.print(digito2);*
> * Serial.print(digito3);*
> * Serial.print(digito4);*
> * Serial.print(digito5);*
> * Serial.print(digito6); *
> * Serial.println(""); //Imprimimos en serialmonitor los digitos en tipo int para verificarlos*
>
> * Serial.print("5-byte code: "); // A partir de aquí, como en Playground*
> * for (i=0; i<5; i++) {*
> _ if (code < 16) Serial.print("0");
> Serial.print(code*, HEX);
> Serial.print(" ");
> }
> Serial.println();
> Serial.print("Checksum: ");
> Serial.print(code[5], HEX);
> Serial.println(code[5] == checksum ? " -- passed." : " -- error.");
> Serial.println();
> }
> for (i=0; i<30; i++) {
> code=0;
> }
> bytesread = 0;
> }_

_
>_
> _ Serial.println();
> client.println(mandar); //enviamos la peticion al servidor*

> * client.println();
> delay (3000);
> if(client.available()){
> Serial.println("Enviando peticion");
> while (client.available()){
> char c = client.read();
> Serial.print(c);
> } //while
> } //if(client.available)_

_
>_
> _ if (!client.connected()){
> Serial.println();
> Serial.println("Disconnecting...");
> client.stop();
> client.connect();
> Serial.println("Reconectando...");
> Serial.flush();
> }
> } //if(Serial.available)
> } // void loop[/quote]
> En este segundo, consigo leer la tarjeta sin problemas y mostrarla en decimal para enviarla al servidor. El problema es a la hora de la consulta, pues aunque le vuelvo a pedir que me dé la información asociada al identificador 1, me devuelve esto:
> *

> Sólo he cambiado la estructura del código en la parte interna del if(serial.available > 0), por lo que no consigo entender por qué no realiza la consulta al servidor de la misma forma. Por favor, a ver si alguien puede echarme una mano con este problema.
> Pido disculpas por si he cargado demasiado el post, pues quería arrojar toda la información posible a vuestra mano y por si he cometido fallos garrafales en el código, pues soy bastante novato con arduino. Gracias de antemano!_

Solucionado aparentemente... el problema era que no conseguía enviar la petición client.println(mandar).

Utilizando el 2º código y en vez de guardar la petición GET en el string "mandar" para enviarlo por el cliente, lo que he hecho ha sido enviar la petición directamente... lo que no entiendo es por qué de esta forma sí lo envía y la anterior no... ¿será que puede haber conflicto al declarar y usar una variable que contiene otra? En fin, sólo espero que no vuelva a darme problemas más adelante.
Saludos.