arduino y guardar la temperatura en base de datos(SOLUCIONADO)

hola.
con el arduino consigo enviar informacion a un php y que envie un correo.
parte codigo del arduino

    client.print("GET http://xxxxxxxxxxxxx.com/directorio/archivo.php?correo=");
client.print(emergen);
client.print(" HTTP/1.0");
client.println();

.
y parte del codigo de php.

    mail("xxxxxxxxxxx@gmail.com",$asunto,$cuerpo);

.
esto va perfecto y lo he puesto por si a alguien le puede ayudar.

siguiendo esto quiero enviar datos por get a un php y guardarlo en la base de datos.
codigo de arduino

void enviar_temperatura(){
byte server[] = { xx,226,xxx,xx9 }; // mi servidor
Client client(server, 80);
if (client.connect()) {
Serial.println("Enviando Temperatura.....");
client.print("GET http://xxxxxxxxxx.com/directorio/temperatura.php?");
////////////////////////// temperatura /////////////
client.print ("acuario=");
client.print (acuatemp);
client.print ("&ambiente=");
client.print (ambitemp);
client.print ("&fechahora=");
// imprimir hora web 2013-07-30 01:40:03
client.print("20");
if (year < 10) client.print("0");
client.print(year, DEC);
client.print("-");
if (month < 10) client.print("0");
client.print(month, DEC);
client.print("-");
if (dayOfMonth < 10) client.print("0");
client.print(dayOfMonth, DEC);

client.print(" ");
if (hour < 10) lcd.print("0");
client.print(hour, DEC);
client.print(":");
if (minute < 10) client.print("0");
client.print(minute, DEC);
client.print(":");
if (second < 10) client.print("0");
client.print(second, DEC);

client.print(" HTTP/1.0");
// imprimir hora web
client.println();
}
else {

Serial.println("connection failed");
}
delay(2000);
client.stop();

}

en el serial del arduino me muestra enviando temperatura es decir la conexion con el servidor es correcta......

y el php que recibe es este:

<?php
// conectamos con la base de datos
	function Conectarse(){ 
		if(!($link = mysql_connect("localhost","root","clave"))){ 
	    	echo "Error conectando a la base de datos."; 
	      	exit(); 
	   	} 
	   	if(!mysql_select_db("acuario",$link)){ 
	      	echo "Error seleccionando la base de datos."; 
	      	exit(); 
	   	} 
	   	return $link; 
	} 
	
	$link = Conectarse();

//$onoff=0;
//$fechahora= "2013-07-30 01:40:03";
$acuario=$_GET['acuario'];
$ambiente=$_GET['ambiente'];
$fechahora=$_GET['fechahora'];// "2013-07-30 01:40:03";


if (mysql_query("INSERT INTO temperatura 
	(id, acuario, ambiente, fecha) VALUES 
	(NULL, '$acuario', '$ambiente', '$fechahora');")){echo"insercion correcta";}else{echo "ha fallado la insercion";}

	mysql_close($link); //cierra la conexion


?>

el archivo php funciona por que mete los datos vacios si lo actualizas.

pero enviando la informacion desde el arduino no se gurarda nada.
que hay mal
gracias

Como diría Jack, "vayamos por partes":
Primero, ¿has probado el php enviando directamente un get desde un ordenador? Si es así, y funciona, nos podemos centrar en el código arduino; en caso contrario, repasaríamos el php.

pues te habia dicho arriba que si.... pero ahora me dejas :cold_sweat: :cold_sweat: .
si yo escribo esto en la barra de direcciones si funciona.

http://direccion.com/directorio/temperatura.php?acuario=24.44&ambiente=34.63&fechahora=2014-08-04%2019:18:10

yo en el php leeo con $_get .... y lo guarda.
la verdad es que no se como saber que es lo que le llega exactamente al php desde arduino.
Es mas cuando se hace desde arduino no hace ninguna insercion, si se hiciese en blanco al menos sabriamos que se le llama al php.

pd: jack...... el destripador..... :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

Vale. Olvidémonos entonces de la parte php.
Un posible problema podría ser que los valores acuatemp, ambitemp, etc... sean enteros y se estén enviando directamente como uno o dos bytes, en lugar de convertirse previamente a texto decimal.
Yo lo que haría es construir previamente la cadena get en el arduino, y después enviarla toda de una vez. De paso podría enviarla también a la consola y veo lo que he construido.

  char buffer[200]; //Más vale que sobre. Luego podremos calcular la longitud máxima de la cadena
  sprintf(buffer,"GET http://xxxxxxxxx.com/directorio/temperatura.php?acuario=%d&ambiente=%d&fechahora=%d-%02d-%02d %02d:%02d:%02d  HTTP/1.0",
          acuatemp,ambitemp,year+2000,month,dayOfMonth,hour,minute,second);
  Serial.println(buffer);

Ahora, podremos ver si la cadena buffer es correcta, y enviarla al cliente a ver si chuta.

hola.
pues no chuta... esto es lo que envia
GET http://192.168.0.18/acuaphp/temperatura.php?acuario=-32768&ambiente=16845&fechahora=-32768-16917-2013 06:06:00 HTTP/1.0
he cambiado la direccion poniendo la ip interna de mi servidor que esta en mi red local por si acaso y tampoco.
ahora ya no envia tampoco los correos :(....

Pues así a botepronto, aparte de que los valores de acuario, ambiente, etc... parecen aberrantes (probablemente tengas que sustituir %d por %u si es que el problema es que te está presentando con signo números unsigned), hay que solucionar el problema de los espacios y dobles puntos en la dirección, ya que el navegador no los traga.
Una solución sería estandarizar un poco la forma de enviar los datos, evitando utilizar espacios o dobles puntos, aunque luego te toque reconstruir en el php la fecha-hora, por ejemplo enviando ....day=%u&hora=%u&minuto=&u&segundo=%u.
Si quieres probar a enviar la cadena tal cual (igual funciona y todo), deberás sustituir el espacio entre la fecha y la hora por %20 (creo que para poner el % en la cadena sprintf sin que lo tome como indicador de formato tienes que ponerlo duplicado %%).
De momento la prioridad es que la dirección que solicite el arduino sea igual que la que te funciona enviada desde el PC.

siiiiiiiiiiiiii ya consigo guardar en la base de datos.....
(como e modificado y provado tanto que no lo se seguro.) el fallo parece ser:
hay que enviar los datos con dos saltos de linea.
el get con client.println->primer salto de linea
y otro client.println-> con salto de linea, pongo el codigo

//////////////////////////////////////////
/////////// ENVIA TEMPERATURA ////////////
//////////////////////////////////////////

void enviar_temperatura(){
int enviado=0;
  if (client.connect()) {
    Serial.println("Enviando Temperatura.....");

// char buffer[200]; //Más vale que sobre. Luego podremos calcular la longitud máxima de la cadena
//  sprintf(buffer,"GET http://192.168.0.7/acuaphp/temperatura.php?acuario=%d&ambiente=%d&fechahora=%d-%02d-%02d %02d:%02d:%02d  HTTP/1.1",
//          acuatemp,ambitemp,year+2000,month,dayOfMonth,hour,minute,second);
//  Serial.println(buffer);
//  client.print(buffer);

      client.print("GET /acuaphp/temperatura.php?");
////////////////////////// temperatura /////////////
client.print ("acuario=");
client.print (acuatemp);
client.print ("&ambiente=");
client.print (ambitemp);
client.print ("&fechahora=");
// imprimir hora web 2013-07-30 01:40:03
  client.print("20");
  if (year < 10) client.print("0");
  client.print(year, DEC);
  client.print("-");
  if (month < 10) client.print("0");
  client.print(month, DEC);  
  client.print("-");   
  if (dayOfMonth < 10) client.print("0");
  client.print(dayOfMonth, DEC); 

  client.print(" ");
  if (hour < 10) lcd.print("0");
  client.print(hour, DEC);
  client.print(":");  
  if (minute < 10) client.print("0");
  client.print(minute, DEC);
  client.print(":");
  if (second < 10) client.print("0");
  client.print(second, DEC);
  
  client.println(" HTTP/1.1");
// imprimir hora web
client.println();
enviado=1;
  }else {
    // kf you didn't get a connection to the server:
    Serial.println("connection failed");
  }
// whileAmos hasta que leeamos lo que recibimos para saber si el servidor responde
while(enviado==1){
  if (client.available()) {
      char c = client.read();
      Serial.print(c);
    }
    if (!client.connected()) {
      Serial.println();
      Serial.println("disconnecting.");
      client.stop();
      enviado=0;
    }
}// fin del while

}

he echo un while para esperar al servidor a que me conteste y saber que ha pasado y el propio php me diga si hay algun problema.

pero no todo son sonrisas .... la hora guarda 00:00:00
es decir la fecha 2013-06-06 se guarda pero la hora solo guarda ceros..... seguire investigando.
y muchas gracias noter :wink: por marcarme el camino

¿Has probado a cambiar el client.print(" ") por client.print("%20")?
Veo que sigues enviando un espacio sin codificar, lo que podría ser fuente del problema.
Saludos, y si consideras solucionado el problema, ponlo al principio del asunto.

hola anoche estuve probando hasta las 4 am varias cosas y no se como hacerlo, el problema esta en crear la cadena y queal aenviar lo acepte el servidor. :frowning:
lo que estoy enviando es temperatura (float) y lo del reloj que son byte, eso enviarlo, supongo que en modo texto.

bueno pues ya lo he sacado.
el servidor no aceptaba lo que le enviaba, asi que lo primero que e echo, como bien me dijo noter es preparar la cadena a enviar en una sola cadena de tipo String. asi:

int entero;
entero=acuatemp*100;//pasamos de float entero
String stracua = (entero);
entero=ambitemp*100;//pasamos de float entero
String strambi = (entero);
String strano =  String(year, DEC);
strano=String("20"+strano);
Serial.println(strano);
String strmes =  String(month, DEC);
if(strmes.length()==1){strmes=String("0"+strmes);}
Serial.println(strmes);
String strdia =  String(dayOfMonth, DEC);
if(strdia.length()==1){strdia=String("0"+strdia);}
Serial.println(strdia);
String strhora =  String(hour, DEC);
if(strhora.length()==1){strhora=String("0"+strhora);}
Serial.println(strhora);
String strminuto =  String(minute, DEC);
if(strminuto.length()==1){strminuto=String("0"+strminuto);}
Serial.println(strminuto);
String strsegundo =  String(second, DEC);
if(strsegundo.length()==1){strsegundo=String("0"+strsegundo);}
Serial.println(strsegundo);
String enviatemp= String("GET /acuaphp/temperatura.php?acuario="+stracua+"&ambiente="+strambi+"&ano="+strano+"&mes="+strmes+"&dia="+strdia+"&hora="+strhora+"&minuto="+strminuto+"&segundo="+strsegundo);
Serial.println(enviatemp);

el objeto String me daba problemas al intentar convertir un float, asi que 23.45*100=2345 que es entero :wink: eso si me deja convertirlo a String y cuando llega a php 23.45/100=23.45 ya tenemos otra vez el float :wink:

siguiente enviarlo, que segun los ejemplos basicos es asi:

client.println ("GET /acuaphp/temperatura.php?acuario=2437&ambiente=3487&ano=2013&mes=06&dia=06&hora=19&minuto=16&segundo=00 aquiHayUnEspacio HTTP/1.0")
")

pues este daba error la solucion a sido sin el HTTP/1.0, ojo pero si con el "println", un print con salto de linea y despues el client.println("HTTP/1.0");
luego en php lo cojo todo y lo preparo para insertarlo en la base de datos.

 $acuario=$_GET['acuario']/100;
echo $acuario;
 $ambiente=$_GET['ambiente']/100;
//echo $_GET['fecha'];// "2013-07-30 01:40:03";
//echo $_GET['hora'];// "2013-07-30 01:40:03";
echo $fechahora=$_GET['ano']."-".$_GET['mes']."-".$_GET['dia']." ".$_GET['hora'].":".$_GET['minuto'].":".$_GET['segundo'];// "2013-07-30 01:40:03";
//echo "
";

vosotros dires porque suelta el tio este tanto rollo :wink:
es sencillo, de vez en cuando miro haber si puedo ayudar a algun post pero, muchas cosas no se como, asi que si con esto ayudo a alguien. pues genial
bueno un saludo a todos y especial a NOTER. volvereeee

Hola buenas! a mi me ocurre algo parecido, el arduino lee los datos correctamente, el php funciona (comprobado manualmente) pero me inserta valores 0, he cambiado en el arduino las variables a enviar por valores fijos y sigue guardando valores 0 dejo parte del codigo por si alguien puede ayudarme, gracias de antemano

/// ARDUINO ///

String url = "http://192.168.1.125/postsensores.php?";
String data = "tempeamb=20&humedamb=80";
Serial.print("Requesting URL: ");
Serial.println(url);
client.print(String("POST ") + url + " HTTP/1.0\r\n" +
"Host: " + server + "\r\n" +
"Accept: " + "/" + "\r\n" +
"Content-Length: " + data.length() + "\r\n" +
"Content-Type: application/x-www-form-urlencoded\r\n" +
"\r\n" + data);
delay(10);
Serial.println("Respond:");
while(client.available()){
String line = client.readStringUntil('\r');
Serial.print(line);
}

/// PHP ///

<?php // postsensores.php // Importamos la configuración require("configdb.php"); // Leemos los valores que nos llegan por GET echo "Conectado a la BD"; $temperaturamb = $_POST['tempeamb']; $humedadamb = $_POST['humedamb']; echo "aqui va la temperatura:" . "$temperaturamb"; // Esta es la instrucción para insertar los valores $query = "INSERT INTO datos (TEMPERATURAAMBIENTE, HUMEDADAMBIENTE) VALUES ('".$temperaturamb."','".$humedadamb."')"; // Ejecutamos la instrucción mysqli_query($con, $query); mysqli_close($con); ?>

Hola a todoooos tengo un problemita necesito que los datos generados por sensores de paso de corriente se almacenen en una base de datos de SQL y luego ser leidos y mostrados en una grafica de Visual BAsic 2015 Algun alma caritativa que me tire una cuerda y me salve.
Gracias!!!!!