Comunicación Arduino Ethernet con base de datos

Hola buenas noches.

Estoy teniendo problemas para enviar datos desde mi Arduino Uno con modulo Ethernet Shield W5100 a mi base de datos. El código php que utilizo para hacer la petición HTTP funciona, al introducir manualmente el valor la base de datos lo registra. Adjunto ambos códigos (php y arduino).

<?php
$servername = "************";
$username ="**************";
$password = "**************";
$dbname ="****************";


date_default_timezone_set("Europe/Madrid");
$fechahora=date("y/m/d H:i:s");


//Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
//Check connection
if ($conn->connect_error) {
	die("Connection failed: " . $conn->connect_error);
}

//Datos recibidos desde Arduino
$temperatura = (($_GET['temperatura']));
$humedad = (($_GET['humedad'])) ;
mysqli_query($conn, "INSERT INTO medidas(fechahora,temperatura,humedad) VALUES ('$fechahora','$temperatura','$humedad')");




$conn->close();
?>

<html>

<form action="index.php">
<input type="submit" value="Volver">

</form>
</html>

De momento para simplificar el codigo estoy intentando introducir dos valores de temperatura y humedad constantes sin leerlos de ningún sensor. El archivo php anterior se llama “insert.php”. Se que el arduino realiza la petición HTTP pero la base de datos no registra los valores.

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

// Configuracion del Ethernet Shield
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFF, 0xEE}; // Direccion MAC
// 
char server[] ="*******************"; // Direccion  del servidor
EthernetClient client; 
int temperatura = 4;
int humedad=3;

void setup(void) {
  Ethernet.begin(mac); // Inicializamos el Ethernet Shield
  delay(1000); // Esperamos 1 segundo de cortesia
  Serial.begin(9600);
}

void loop(void) {
 
  // Proceso de envio de muestras al servidor
  Serial.println("Connecting...");
  if (client.connect(server, 80)) {  // Conexion con el servidor
    client.print("GET /insert.php?");
    client.print("&temperatura=");// Enviamos los datos por GET
    client.print(temperatura);
    client.print("&humedad=");// Enviamos los datos por GET
    client.print(humedad);
    client.println(" HTTP/1.1");
    client.print("Host: ");
    client.println("User-Agent: Arduino-Ethernet");
    client.println("Connection: close");
    client.println();
    

  }
delay(2000);
}

Probaste ingresar los valores con un navegador?

Si, al introducir los datos directamente en el ordenador los almacena

Yo creo que te está faltando enviar el Host, aquí hay un ejemplo de envío de temperatura y humedad con el DHT, no le prestes atención al módulo que están usando, sólo fijate de la sintaxis del envío de los datos al servidor, es la misma para lo que estás utilizando.

/*  ----------------------------------------------------------------
    www.prometec.net

    Leyendo la temperatura y humedad con un sensor DHT11
    y subir los valores a un sercidor mediante WiFi con el esp8266.
  --------------------------------------------------------------------
*/

#include <DHT11.h>
#include <ESP8266WiFi.h>

DHT11 dht11(D4);

const char* ssid     = "Euskaltel-cs7A";
const char* password = "xxxxxxxx";

const char* host = "prometecserver.ddns.net";

void setup()
{
  Serial.begin(9600);
  // We start by connecting to a WiFi network

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop()
{
  int err;
  float temp, hum;
  if ((err = dht11.read(hum, temp)) == 0)
  {
    Serial.print("Temperatura: ");
    Serial.print(temp);
    Serial.print(" Humedad: ");
    Serial.print(hum);
    Serial.println();
  }
  else
  {
    Serial.println();
    Serial.print("Error Num :");
    Serial.print(err);
    Serial.println();
  }


  Serial.print("connecting to ");
  Serial.println(host);

  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }

  // We now create a URL for the request
  String url = "/dht11.php";
  String key = "?pass=1234";
  String dato1 = "&Temperatura=";
  String dato2 = "&Humedad=";

  Serial.print("Requesting URL: ");
  Serial.println(url);

  // This will send the request to the server
  client.print(String("GET ") + url + key + dato1 + temp + dato2 + hum + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
  unsigned long timeout = millis();
  while (client.available() == 0) {
    if (millis() - timeout > 5000) {
      Serial.println(">>> Client Timeout !");
      client.stop();
      return;
    }
  }

  // Read all the lines of the reply from server and print them to Serial
  while (client.available()) {
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }

  Serial.println();
  Serial.println("closing connection");

  delay(60000);
}

La página de donde he sacado esto es esta: link

Lo he añadido, y también he probado a mandar datos a la base de datos desde mi Nodemcu y tampoco los guarda. ¿Puede ser que la base de datos no esté bien configurada?

Tienes varios errores en el PHP:

<?php
$servername = "************";
$username = "**************";
$password = "**************";
$dbname = "****************";

//Create + Check connection
$conn = new mysqli($servername, $username, $password, $dbname) or	die("Connection failed: " . $conn->connect_error);

date_default_timezone_set("Europe/Madrid");

//Datos recibidos desde Arduino
$temperatura = $_GET['temperatura'];
$humedad = $_GET['humedad'] ;

$conn->query("INSERT INTO medidas (temperatura,humedad) VALUES ('$temperatura','$humedad')");
if ($conn->affected_rows == 1){
	return 'Ok';
}else{
	return 'Error';
}
$conn->close();
?>

En MySQL tu campo fecha lo pones tipo timestamp() y en predeterminado pones CURRENT_TIMESPAMP(), eso hace que automaticamente el propios MySQL ponga la fecha en cada registro.

surbyte:
Probaste ingresar los valores con un navegador?

Para probar desde un navegador en el propio servidor Apache escribe en la URL:

http://servidor/carpeta/insert.php?temperatura=25.4&humedad=72

Si insert.php esta en la raíz del servidor Apache (htdocs) no pongas “/carpeta”

Iggy_88: guarda. ¿Puede ser que la base de datos no esté bien configurada?

SI es posible, dinos la estructura de la tabla medidas y cuéntanos donde esta el servidor Apache que estas usando. Me refiero a que si es local (XAMPP) o es un servidor fuera de la red local donde esta Arduino (problemas de cortafuego ?).

Edita tu mensaje y usa insertar imagen por favor. Lee las normas del foro.

Kike_GL:
Edita tu mensaje y usa insertar imagen por favor. Lee las normas del foro.

Pido disculpas. El servidor es externo y es de está página https://infinityfree.net/

Adjunto imagen de la tabla medidas.

La estructura de tu tabla esta bien. El archivo insert.php esta en la carpeta raiz ?

Desde un navegador en tu computadora prueba ingresa un dato. probablemente luego del nombre del servidor ira el nombre de tu cuenta y luego el insert.php?temperatura=25&humedad=60

Sí, lo guarda en la base de datos

Probaste usando la librería para manejo directo de MySql, funciona muy bien...

Comprueba si con postman te logra almacenar los datos en la db. Cuando yo estaba realizando esto con el NodeMCU, postman me sirvió mucho para comprobar si el problema era de la configuración de la db o si era problema de la sintaxis que estaba utilizando en el código. Desde este link lo puedes descargar. Prueba hacerlo y dinos si te funciona.

lucho512: Probaste usando la librería para manejo directo de MySql, funciona muy bien...

Sí, y recibo este error Recording dataError: 80 = INSERT command denied to user '*****'@'****' for table 'medidas'

Iggy_88: Sí, lo guarda en la base de datos

Ok eso indica que la parte PHP y MySQL esta bien, ahora veamos tu parte arduino.

if (client.connect(server, 80)) { 
      client.print("GET /insert.php?");
      client.print("&temperatura=");      //Error aqui quita &
      client.print(temperatura);
      client.print("&humedad=");       
      client.print(humedad);
      client.println(" HTTP/1.1");
      client.print("Host: ");
      client.println(server[]);                  //Creo que te falta esto
      client.println("User-Agent: Arduino-Ethernet");
      client.println("Connection: close");
      client.println();     
   }