Go Down

Topic: Arduino no envía datos a MySQL através de Internet utilizando POST [OFF-TOPIC] (Read 444 times) previous topic - next topic

COMANDO

Oct 02, 2018, 07:35 pm Last Edit: Oct 05, 2018, 03:52 pm by surbyte Reason: Agregado etiqueta de imagen
OJO; Soy principiante en Arduino. Llevo ya casi semanas tratando de enviar datos desde mi arduino MEGA 2650, como cliente a un servidor que tengo en otra PC, mi propio Hosting, instalado MySQL y PHP.
El problema es que no logro enviar datos, nose en que estoy mal, si en el código de arduino o en en lado del backend. Lo que quiero es que me envié datos del sensor de Temperatura, Humedad y presión
Code: [Select]

#include "Seeed_BME280.h"
#include <Ethernet.h>
#include <Wire.h>
#include <SPI.h>
BME280 bme280;


// INTERNET EN LA TARJETA DE RED
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[]= {179, 60, 204, 167};   // Inicia la librería Ethernet server con el puerto 80 (por defecto el puerto HTTP).
IPAddress dnServer ( 8, 8, 8, 8 ) ;
char serverName[] = " www.monitoreoclimatologicodelnorte.com ";
IPAddress gateway ( 179 , 60 , 204 , 1 ) ;
// la subred: subred
IPAddress subnet ( 255 , 255 , 255 , 0 ) ;
//Inicializa la instancia client
EthernetClient client;
//Datos del sensor
int h= 0;
int t=0;
String data;

//Configuracion de Arduino
void setup() {
 //Inicializa puerto Serial
  Serial.begin(9600);
 Serial.println("Bienvenidos a MCN");
 
//Inicializa el dispositivo de Ethernet
Ethernet.begin(mac, ip);
//delay(1000);

//Inicializa el sensor BME280
 bme280.init();
  
int h = bme280.getHumidity(); // Obtiene la Humedad
int t = bme280.getTemperature();// Obtiene la Temperatura

data = "";
}

void loop(){

  t= (int)bme280.getTemperature();// Obtiene la Temperatura
  Serial.println(t);
  
  h= (int)bme280.getHumidity(); // Obtiene la Humedad

 // Control de errores, valida que se obtuvieron valores para los datos medidos
  if (isnan(h) || isnan(t)) {
    Serial.println("Falla al leer el sensor BM280!");
    return;
  }  
  data = "temp=" + String(t) + "&hum=" + String(h);
  
  Serial.println("Conectandonos.....");

  if (client.connect(serverName,80>0)){
    Serial.println("entro al if");
    client.print("POST /metaestaciones/add.php?data=");
    client.print(data);
    client.println(" HTTP/1.1");
    client.print("User-Agent: Arduino/1.1");
    client.println();
    client.print("Conectado");
      
}
  else {
     Serial.println("Fallo en la conexion");
  }
  
if (!client.connected()) {
    Serial.println("Desconectado!");
  }
  client.stop();
  client.flush();
  delay(1000); // Espero un minuto antes de tomar otra muestra
}



Los scripts de PHP
Script de la conexion a la BD
Code: [Select]

<?php
 
function Connection(){
 
$server="localhost";
 
$user="monitoreoclimato_uspruebas";
 
$pass="*********";
 
$db="monitoreoclimato_estaciones";
 
$connection mysql_connect($server$user$pass);
 if (!
$connection) {
     die(
'MySQL ERROR: ' mysql_error());
 }
 
mysql_select_db($db) or die( 'MySQL ERROR: 'mysql_error() );
 return 
$connection;
 }
?>



script que se encarga de subir los datos recibidos a la base de datos de sensores
Code: [Select]

<?php
   
include("connect.php");
   
   
$link=Connection();
 
$fecha=$_POST["fecha"];
 
$temp=$_POST["temp"];
 
$hum=$_POST["hum"];
 
$preshpa=$_POST["preshpa"];

 
$query "INSERT INTO `datosdeestacion` (`fecha`,`temp`, `hum`, `preshpa`) 
 VALUES ('"
.$fecha."','".$temp."','".$hum."','".$preshpa."')"
     
mysql_query($query,$link);
 
mysql_close($link);
   
header("Location: index.php");
?>




Lo que quiero por ahora es solo enviar los datos de temperatura y Humedad

Empece revisando esta fuente con el método GET
https://geekytheory.com/internet-de-las-cosas-parte-2-subir-los-datos-a-una-base-de-datos

Luego revise otros ejemplos y me encontré esto pero con el método POST
https://www.instructables.com/id/PART-1-Send-Arduino-data-to-the-Web-PHP-MySQL-D3js/

Aquí una imagen de los scripts del PHP


GO_zalo

Si estás enviado los datos en la URL usando ? Etc etc, en PHP tienes que acceder como $_GET

COMANDO

Intente modificar nuevamente con un solo valor "temp" pero aún no logro enviar ningún valor
Code: [Select]

#include "Seeed_BME280.h"
#include <Ethernet.h>
#include <Wire.h>
#include <SPI.h>
BME280 bme280;


// INTERNET EN LA TARJETA DE RED
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[]= {179, 60, 204, 167};   // Inicia la librería Ethernet server con el puerto 80 (por defecto el puerto HTTP).
IPAddress dnServer=( 8, 8, 8, 8 ) ;
IPAddress dnsServer=( 8, 8, 4, 4 ) ;
//Direccion del servidor
char server[] = "www.monitoreoclimatologicodelnorte.com";
//IPAddress dnsServer ( 179 , 60 , 204 , 0 ) ;
IPAddress gateway ( 179 , 60 , 204 , 1 ) ;
IPAddress subnet ( 255 , 255 , 255 , 0 ) ;
//Inicializa la instancia client
EthernetClient client;
//Datos del sensor
int h= 0;
int t=0;
//String data;

//Configuracion de Arduino
void setup() {
 //Inicializa puerto Serial
 Serial.begin(9600);
 Serial.println("Bienvenidos a MCN");
 
//Inicializa el dispositivo de Ethernet
Ethernet.begin(mac, ip, dnServer,dnsServer);
//delay(1000);

//Inicializa el sensor BME280
 bme280.init();
 
//int h = bme280.getHumidity(); // Obtiene la Humedad
//int t = bme280.getTemperature();// Obtiene la Temperatura

//data = "";
}

void loop(){

 int  t= bme280.getTemperature();// Obtiene la Temperatura
  Serial.println(t);
 
 int   h= bme280.getHumidity(); // Obtiene la Humedad
  Serial.println(h);
 // Control de errores, valida que se obtuvieron valores para los datos medidos
  if (isnan(h) || isnan(t)) {
    Serial.println("Falla al leer el sensor BM280!");
    return;
  } 
 // data = "temp=" + String(t) + "&hum=" + String(h);
 
  Serial.println("Conectandonos...");

  if (client.connect(server,8080)){
    Serial.println("entro al if");
    client.print("GET /metaestaciones/add2.php?temp=");
    client.print(t);
    client.println(" HTTP/1.1");
    client.print("Host:");
    client.print(server);
    client.print("User-Agent: Arduino/1.1");
    client.println();
    client.print("Conectado");
       
}
  else {
     Serial.println("Fallo en la conexion");
  }
 
if (!client.connected()) {
    Serial.println("Desconectado!");
  }
  client.stop();
  client.flush();
  delay(1000); // Espero un minuto antes de tomar otra muestra
}


COMANDO

Script actualizado a GET se llama "add2"
Code: [Select]

<?php
    include(
"connect.php");
   

   
$link=Connection();
$fecha=$_GET["fecha"];
$temp=$_GET["temp"];
$hum=$_GET["hum"];
$preshpa=$_GET["preshpa"];
$query "INSERT INTO `datosdeestacion` (`fecha`,`temp`, `hum`, `preshpa`) 
VALUES ('"
.$fecha."','".$temp."','".$hum."','".$preshpa."')"
   
    mysql_query($query,$link);
mysql_close($link);
   
header("Location: index.php");
?>


_jose_

pueden ser muchas las  cosas que pueden fallarte y no estas implementando ningun sistema para poder depurar donde esta el fallo.por ejemplo ,mysql_query devuelve true si la insercion se ha realizado con exito ,aprovechalo para ver si el fallo esta en la query.Cuando se recoge un valor del array $_POST o $_GET ,se puede usar con funcion isset para comprobar si se esta recibiendo el valor:
Code: [Select]
$temp = isset($_GET["temp"])?$_GET["temp"]:"vacio";
en fin,tienes que dejar un rastro para saber hasta donde estas llegando....
asegurate que  la query que generas esta bien ,asi es mas facil de leer,creo que la tabla  y los campos no necesitan comillas.
Code: [Select]
$query = "INSERT INTO  datosdeestacion (fecha,temp, hum, preshpa)
VALUES ('$fecha','$temp','$hum','$preshpa')";
        mysql_query($query,$link);

prueba a copiar la query substituyendo las variables por valores y la copias-pegas en el phpmyadmin pestaña ejecutar sql para comprobar que funciona.asegurate que los valores que introduces concuerdan  con el tipo de datos de la tabla,en tu caso los tratas  como texto,en la tabla tambien son datos tipo texto??

surbyte

Moderador: tuve que modificar el título porque mas alla que los datos lleguen o no veo que la discusión de centra del lado de PHP y 0 en arduino.
Entiendo el problema pero este es un foro de Arduino.
Ahora pueden continuar el debate sin problemas.

COMANDO

Muchas gracias por sus comentarios
En el lado del PHP,dudo que este el error, porque manualmente insertaba los valores desde la URL con el método GET y si me mostraba los valores.
Pero ya logre enviar valores. Se los dejo por si a alguien les sirve, tal vez no sea el mejor código pero de algo les servirá.
Code: [Select]

#include "Seeed_BME280.h"
#include <Ethernet.h>
#include <Wire.h>
#include <SPI.h>
BME280 bme280;


// INTERNET EN LA TARJETA DE RED
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(179, 60, 204, 167);   // Inicia la librería Ethernet server con el puerto 80 (por defecto el puerto HTTP).
EthernetServer server(80);
IPAddress dnServer ( 8, 8, 8, 8 ) ;
char serverName[] = "www.monitoreoclimatologicodelnorte.com";
// dirección del gateway del enrutador:
IPAddress gateway ( 179 , 60 , 204 , 1 ) ;
// la subred: subred
IPAddress subnet ( 255 , 255 , 255 , 0 ) ;
//int serverPort = 80;
//Inicializa la instancia client
EthernetClient client;


//Datos del sensor
int h= 0;
int t=0;
String data;

//Configuracion de Arduino
void setup() {
 //Inicializa puerto Serial
  Serial.begin(9600);
 Serial.println("Bienvenidos a MCN");
 
//Inicializa el dispositivo de Ethernet
Ethernet.begin(mac, ip, dnServer, gateway, subnet );
server.begin();
if (client ){
  server.write(client.read());
 
}
Serial.print("IP del Arduino ");
Serial.println(Ethernet.localIP());

//Inicializa el sensor BME280
 bme280.init();
 
int h = bme280.getHumidity(); // Obtiene la Humedad
int t = bme280.getTemperature();// Obtiene la Temperatura

  data = "";

 
}


void loop(){
client = server.available();
//delay(1000);
 h= (int)bme280.getHumidity(); // Obtiene la Humedad
  Serial.println(h);
 t= (int)bme280.getTemperature();// Obtiene la Temperatura
  Serial.println(t);
// Control de errores, valida que se obtuvieron valores para los datos medidos
  if (isnan(h) || isnan(t)) {
    Serial.println("Falla al leer el sensor DHT!");
    return;
  }
 
 // Serial.print("Temperatura: ");
 // Serial.print(temp);
 // Serial.println(" *C ");
 // Serial.print("Humedad: ");
 // Serial.print(hum);
 // Serial.println(" %\t");
 
 // data = "temp=" + String(t) + "&hum=" + String(h);
 
  Serial.println("Conectandonos al servidor web");

 
if (client.connect(serverName,80)){
    Serial.println("entro al if");
  //  client.print("GET /metaestaciones/add2.php?temp="+String(t)+"&hum="+String(h));
    client.println("GET /metaestaciones/add2.php?temp="+String(t)+"&hum="+String(h)+" HTTP/1.1");
   // client.print(data);
   // client.println(" HTTP/1.1");
    client.println("Host: www.monitoreoclimatologicodelnorte.com");
    client.println("User-Agent: Arduino/1.1");
    client.println("Connection: keep-alive");
    client.println();
   // client.print("Content-Type: application/x-www-form-urlencoded;");
   // client.print("Content-Length: ");
   // client.println(data.length());
 //   client.println();
   //  client.print(data);
   Serial.println("fin if");
   
}
  else {
     Serial.println("Fallo en la conexion");
  }
 
  if (!client.connected()) {
    Serial.println("Desconectado!");
    client.stop();
  }
 
  delay(4000);
}



Seguiré avanzando por que tengo que sacar los datos de Presión ahora. GRACIAS

COMANDO

Lo que pasa es que en la primera parte intente hacerlo por POST, en el cual era mi consulta
Pero tenia los 2 scripts en el lado del servidor, en POST y GET,
Y finalmente logre hacerlo con GET, pero mi objetivo es hacerlo con POST, es un proyecto "ESTACIÓN METEOROLÓGICA"

Go Up