Módulo ESP8266 y envio de datos a base mysql [SOLUCIONADO]

Hola,

deseo subir datos a una base de datos mysql con el módulo ESP8266-01. Utilizo arduino uno.

He utilizado el código de la web:

Y al ejectutar el programa en el arduino obtengo la siguiente respuesta en el monitor serie y el siguiente error:

ESP8266 conectado con el servidor...
Enviando HTTP . . .
Peticion HTTP enviada:

GET /Arduino/Arduino.php?a=3&b=3.14 HTTP/1.1
Host: www.matematiqueseso.com 

Esperando respuesta...

+IPD,604:HTTP/1.1 301 Moved Permanently
Date: Tue, 04 Jun  17:23:45 GMT
Content-Type: text/html; charset=iso-8859-1
Content-Length: 274
Server: Apache
Location: https://www.matematiqueseso.com/Nombre_carpeta/Nombre_fichero.php?a=3&b=3.14
Set-Cookie: SERVERID100401=152070|XPapH|XPapH; path=/
Cache-control: private
X-IPLB-Instance: 28303

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="https://www.matematiqueseso.com/Nombre_carpeta/Nombre_fichero.php?a=3&amp;b=3.14">here</a>.</p>
</body></html>
La respuesta ha excedido el tamaño maximo
Conexion finalizada

Es como si no pudiera acceder al fichero php que enviará los datos.

Las líneas de código donde da el error creo que son:

Serial.println("ESP8266 conectado con el servidor...");             
    
          //Armamos el encabezado de la peticion http
          String peticionHTTP= "GET /Nombre_carpeta/Nombre_fichro.php?a=";
          peticionHTTP=peticionHTTP+String(variable1)+"&b="+String(variable2)+" HTTP/1.1\r\n";
          peticionHTTP=peticionHTTP+"Host: https://www.matematiqueseso.com \r\n\r\n";
          
          //Enviamos el tamaño en caracteres de la peticion http:  
          SerialESP8266.print("AT+CIPSEND=");
          SerialESP8266.println(peticionHTTP.length());

Gracias de antemano por la ayuda.

Jose M.

Hola de nuevo,

he probado a realizar el envío de los datos desde el mismo monitor serie, escribiendo las instrucciones en la línia de comandos.

El caso es que me dice que conecta con el servidor, pero a los pocos segundos me hecha fuera.

Consigo enviar la longitud de la cadena que voy a enviar, me dice que OK > , pero la siguiente instrucción que contiene los datos ya no me deja enviarla.

Dejo el error que sale en el monitor serie:

OK

AT+CIPSTART="TCP","www.matematiqueseso.com",80

CONNECT

OK

AT+CIPSEND=83


OK
> 

+IPD,212:HTTP/1.0 408 Request Time-out
Cache-Control: no-cache
Connection: close
Content-Type: text/html

<html><body><h1>408 Request Time-out</h1>
Your browser didn't send a complete request in time.
</body></html>
CLOSED

Si se os ocurre algo, muy agradecido.

Saludos.

Jose Morales.

Pareciera como que pudo enviar la longitud 83 pero luego no reconoció el caracter > que debe leer del Server

    SerialESP8266.println(peticionHTTP.length());

          //esperamos a ">" para enviar la petcion  http
          if(SerialESP8266.find(">")) // ">" indica que podemos enviar la peticion http
          {
            Serial.println("Enviando HTTP . . .");

Como verás tienes el envio de la longitud que fue 83 y luego esperas > para enviar la petición pero eso nunca ocurrió y te saca por timeout.

Revisa esa parte.

Hola Surbyte,

gracias por la ayuda.

Cuando introduzco las instrucciones desde el monitor serie de arduino, no paso de AT+CIPSEND=83

Me da la respuesta de OK y > y a los pocos segundos me sale en pantalla que se cerró la comunicación.

Cuando ejecuto el programa, avanzo algo más, pues veo que llega a:

ESP8266 conectado con el servidor...
Enviando HTTP . . .
Peticion HTTP enviada:

GET /Arduino/Arduino.php?a=3&b=3.14 HTTP/1.1
Host: www.matematiqueseso.com 

Esperando respuesta...

He consultado al administrador del dominio, estoy a la espera que me digan porqué no puedo acceder y me cierra la comunicación.

Espero me digan algo en breve, ya lo pondré aquí, a ver si se soluciona.

Gracias por todo.
José Morales.

Hola,

al final lo solucioné cambiando de servidor. Al parecer no dejaba insertar datos en tabla por seguridad.

Dejo el código completo por si interesa.

#include <SerialESP8266wifi.h>
#include <SoftwareSerial.h>

SoftwareSerial SerialESP8266(10,11); // RX, TX

// Temperatura
#include "DHT.h"
#define DHTPIN 2     // Digital pin connected to the DHT sensor

#define DHTTYPE DHT11   // DHT 11

DHT dht(DHTPIN, DHTTYPE);

// Nivell aigua
float y; 

// Velocitat vent
float z;
String server = "matematiqueseso.000webhostapp.com";

//variables para enviar al servidor
String peticionHTTP="";
String cadena="";

void setup() {


  dht.begin();
  
  SerialESP8266.begin(9600);
  Serial.begin(9600);
  SerialESP8266.setTimeout(2000);

  
  //Verificamos si el ESP8266 responde
  SerialESP8266.println("AT");
  if(SerialESP8266.find("OK"))
    Serial.println("Respuesta AT correcto");
  else
    Serial.println("Error en ESP8266");

  //-----Configuración de red-------//Podemos comentar si el ESP ya está configurado

    //ESP8266 en modo estación (nos conectaremos a una red existente)
    SerialESP8266.println("AT+CWMODE=1");
    if(SerialESP8266.find("OK"))
      Serial.println("ESP8266 en modo Estacion");
      
    //Nos conectamos a una red wifi 
    SerialESP8266.println("AT+CWJAP=\"ONODD84\",\"GUSrA9pauZHf\"");
    Serial.println("Conectandose a la red ...");
    SerialESP8266.setTimeout(10000); //Aumentar si demora la conexion
    if(SerialESP8266.find("OK"))
      Serial.println("WIFI conectado");
    else
      Serial.println("Error al conectarse en la red");
      SerialESP8266.setTimeout(2000);
      //Desabilitamos las conexiones multiples
      SerialESP8266.println("AT+CIPMUX=0");
      if(SerialESP8266.find("OK"))
      Serial.println("Multiconexiones deshabilitadas");
    
  //------fin de configuracion-------------------

  delay(1000);
  
}


void loop() {
   // Wait a few seconds between measurements.
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false) 
  //float hic = dht.computeHeatIndex(t, h, false);

  int sensorValue_pluja = analogRead(A0);
  
  if (sensorValue_pluja<600){y=map(sensorValue_pluja, 0, 1000, 0, 40);}
  if (sensorValue_pluja>=600){y=map(sensorValue_pluja, 0, 677, 0, 40);}
  
  int sensorValue_vent = analogRead(A1);
    z=map(sensorValue_vent, 0, 60, 0, 120);
    
  Serial.print(F("Humitat (%): "));
  Serial.print(h);
  Serial.print(F(", Temperatura (ºC): "));
  Serial.print(t);
  Serial.print(F(", Pluja (litres): "));
  Serial.print(y);
  Serial.print(F(", Vent (Km/h): "));
  Serial.println(z);
  
  
  //---------enviamos las variables al servidor---------------------

 
      //Nos conectamos con el servidor:
      
      SerialESP8266.println("AT+CIPSTART=\"TCP\",\"" + server + "\",80");
      if( SerialESP8266.find("OK"))
      {  
          Serial.println();
          Serial.println();
          Serial.println();
          Serial.println("ESP8266 conectado con el servidor...");             
    
          //Armamos el encabezado de la peticion http
          String peticionHTTP= "GET /Nombrefichero.php?a=";
          peticionHTTP=peticionHTTP+t+"&b="+h+"&c="+y+"&d="+z+" HTTP/1.1\r\n";
          peticionHTTP=peticionHTTP+"Host: matematiqueseso.000webhostapp.com\r\n\r\n";
           SerialESP8266.print("AT+CIPSEND=");
          SerialESP8266.println(peticionHTTP.length());
          
          //esperamos a ">" para enviar la petcion  http
          if(SerialESP8266.find(">")) // ">" indica que podemos enviar la peticion http
          {
            Serial.println("Enviando HTTP . . .");
            SerialESP8266.println(peticionHTTP);
            if( SerialESP8266.find("SEND OK"))
            {  
              Serial.println("Peticion HTTP enviada:");
              Serial.println();
              Serial.println(peticionHTTP);
              Serial.println("Esperando respuesta...");
              
              boolean fin_respuesta=false; 
              long tiempo_inicio=millis(); 
              cadena="";
              
              while(fin_respuesta==false)
              {
                  while(SerialESP8266.available()>0) 
                  {
                      char c=SerialESP8266.read();
                      Serial.write(c);
                      cadena.concat(c);  //guardamos la respuesta en el string "cadena"
                  }
                  //finalizamos si la respuesta es mayor a 500 caracteres
                  if(cadena.length()>1000) //Pueden aumentar si tenen suficiente espacio en la memoria
                  {
                    Serial.println("La respuesta ha excedido el tamaño maximo");
                    
                    SerialESP8266.println("AT+CIPCLOSE");
                    if( SerialESP8266.find("OK"))
                      Serial.println("Conexion finalizada");
                    fin_respuesta=true;
                  }
                  if((millis()-tiempo_inicio)>10000) //Finalizamos si ya han transcurrido 10 seg
                  {
                    Serial.println("Tiempo de espera agotado");
                    SerialESP8266.println("AT+CIPCLOSE");
                    if( SerialESP8266.find("OK"))
                      Serial.println("Conexion finalizada");
                    fin_respuesta=true;
                  }
                  if(cadena.indexOf("CLOSED")>0) //si recibimos un CLOSED significa que ha finalizado la respuesta
                  {
                    Serial.println();
                    Serial.println("Cadena recibida correctamente, conexion finalizada");         
                    fin_respuesta=true;
                  }
              }
    
              
            }
            else
            {
              Serial.println("No se ha podido enviar HTTP.....");
           }            
          }
      }
      else
      {
        Serial.println("No se ha podido conectarse con el servidor");
      }

        
  //-------------------------------------------------------------------------------
  //delay(5000);
  delay(600000); //pausa de 10 minutos antes de conectarse nuevamente al servidor (opcional)
}

Saludos.

José Morales