Pages: [1]   Go Down
Author Topic: arduino y guardar la temperatura en base de datos(SOLUCIONADO)  (Read 1425 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 78
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hola.
con el arduino consigo enviar informacion a un php y que envie un correo.
parte codigo del arduino
Code:
   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.
Code:
   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
Quote
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:

Code:
<?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
« Last Edit: June 06, 2013, 12:31:14 pm by karagos » Logged

Palencia, Spain
Offline Offline
Sr. Member
****
Karma: 25
Posts: 476
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 78
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

pues te habia dicho arriba que si.... pero ahora me dejas  smiley-roll-sweat smiley-roll-sweat .
si yo escribo esto en la barra de direcciones si funciona.
Quote
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..... smiley-yell smiley-yell smiley-yell smiley-yell smiley-yell
« Last Edit: June 05, 2013, 10:10:59 am by karagos » Logged

Palencia, Spain
Offline Offline
Sr. Member
****
Karma: 25
Posts: 476
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 78
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Palencia, Spain
Offline Offline
Sr. Member
****
Karma: 25
Posts: 476
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 78
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Code:
//////////////////////////////////////////
/////////// 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 smiley-wink por marcarme el camino
Logged

Palencia, Spain
Offline Offline
Sr. Member
****
Karma: 25
Posts: 476
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 78
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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. smiley-sad
lo que estoy enviando es temperatura (float) y lo del reloj que son byte, eso enviarlo, supongo que en modo texto.
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 78
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Code:
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 smiley-wink eso si me deja convertirlo a String y cuando llega a php 23.45/100=23.45 ya tenemos otra vez el float smiley-wink

siguiente enviarlo, que segun los ejemplos basicos es asi:
Code:
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.
Code:
$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 "<br>";
vosotros dires porque suelta el tio este tanto rollo smiley-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
« Last Edit: June 06, 2013, 12:30:53 pm by karagos » Logged

Pages: [1]   Go Up
Jump to: