[Solucionado]Termostato, control por wifi ESP8266.h, peticiones web sin respuest

Hola,
Primero quiero agradecer toda la ayuda que me puedan prestar.
Estoy haciendo un termostato, ademas de controlar la temperatura por la pantalla quiero poder cambiar la temperatura por internet (desde casa o fuera). Lo tengo ya todo desarrollado sin embargo cuando realizo las peticiones a traves de la web no me funciona siempre, hay veces el servidor coge las peticiones y las procesa bien y hay otras veces que no. El programa es bastante largo, os pego la parte relativa a las peticiones wifi y al servidor web:

#include "ESP8266.h"
#include <SoftwareSerial.h>
#define wifiWrite(A) wifi.send(mux_id, (uint8_t*) A, sizeof(A) - 1);
const char* SSID = "XXXXXXX";
const char* PASSWORD = "XXXXXXXXX";
SoftwareSerial softSerial(11, 10); // RX, TX
ESP8266 wifi(softSerial);


void comprobarHTTP(){
 uint8_t buffer[128] = { 0 };
 char result[8]; // Buffer big enough for 7-character float
 char result2[8];
 dtostrf(temp, 6, 1, result);
 dtostrf(tempDeseada, 6, 1, result2);

 uint8_t mux_id;
 uint32_t len = wifi.recv(&mux_id, buffer, sizeof(buffer), 100);
  if (len > 0) {
     Serial.print("Received from: ");
     Serial.print(mux_id);
     Serial.print("\r\n");

     wifiWrite("HTTP/1.1 200 OK\r\nnContent-Type: /html\r\nConnection: close\r\n\r\n");
     wifiWrite("<html>\n<head>\n<title>TERMOSTATO</title>\n</head>\n<body>");
     wifiWrite("<table border='1' align='center' width='50%'>\n<tr>\n<td>");
     wifiWrite("<h1>TEMPERATURA CASA</h1>");wifiWrite("\n</td>\n<td>");wifiWrite("<h1>");wifiWrite(result);wifiWrite("  C");wifiWrite("</h1>");wifiWrite("</td>\n</tr>");
     wifiWrite("<tr>\n<td>");
     wifiWrite("<h2>TEMPERATURA DESEADA</h2>");wifiWrite("\n</td>\n<td>");wifiWrite("<h2>");wifiWrite(result2);wifiWrite("  C");wifiWrite("</h2>");wifiWrite("</td>\n</tr>");    
    
     wifiWrite("<tr>\n<td>");
     if (TermostCalderaOn==0) {
      wifiWrite("<h2>ESTADO</h2>");wifiWrite("</td>\n<td>");wifiWrite("<h2>OFF</h2>")wifiWrite("</td>\n</tr>");
      wifiWrite("<tr>\n<td>\n<center>");
      wifiWrite("<button onClick=location.href='./?data=1'>MANUAL</button>");wifiWrite("\n</center></td>\n<td>\n<center>");
      wifiWrite("<button onClick=location.href='./?data=2'>PROGRAMACION</button>");   wifiWrite("\n</center>\n</td>\n</tr>");
     }
     else if (TermostCalderaOn==1) {
      wifiWrite("<h2>ESTADO</h2>");wifiWrite("</td>\n<td>");wifiWrite("<h2>MANUAL</h2>");wifiWrite("</td>\n</tr>");
      wifiWrite("<tr>\n<td>\n<center>");
      wifiWrite("<button onClick=location.href='./?data=0'>OFF</button>");wifiWrite("\n</center></td>\n<td>\n<center>");
      wifiWrite("<button onClick=location.href='./?data=2'>PROGRAMACION</button>");   wifiWrite("\n</center>\n</td>\n</tr>");   
            
     }
     else if (TermostCalderaOn==2) {
      wifiWrite("<h2>ESTADO</h2>");wifiWrite("</td>\n<td>");wifiWrite("<h2>PROGAMACION</h2>");wifiWrite("</td>\n</tr>");
      wifiWrite("<tr>\n<td>\n<center>");
      wifiWrite("<button onClick=location.href='./?data=0'>OFF</button>");wifiWrite("\n</center></td>\n<td>\n<center>");
      wifiWrite("<button onClick=location.href='./?data=1'>MANUAL</button>");   wifiWrite("\n</center>\n</td>\n</tr>");
     }
     wifiWrite("</table>");
    
     wifiWrite("


");
     wifiWrite("<table border='1' align='center' width='50%'>\n<tr>\n<td>");
     wifiWrite("<h1>ALARMA</h1>");wifiWrite("\n</td>\n<td>");
    
     if (alarmaOn==0){
      wifiWrite("<h2>OFF</h2>");wifiWrite("</td>\n</tr>") ;
      wifiWrite("<tr>\n<td>\n<center>");
      wifiWrite("<button onClick=location.href='./?data=5'>ACTIVAR</button>");wifiWrite("\n</center></td>\n<td>\n</td></tr>");
     }
      else if (alarmaOn==1){
      wifiWrite("<h2>ON</h2>");wifiWrite("</td>\n</tr>") ;
      wifiWrite("<tr>\n<td>\n<center>");
      wifiWrite("<button onClick=location.href='./?data=6'>DESACTIVAR</button>");wifiWrite("\n</center></td>\n<td>\n</td></tr>");
     }
     wifiWrite("</table>");     
     wifiWrite("</body></html>");

     Serial.println("Send finish");

     for (uint32_t i = 0; i < len; i++) {
        char c = (char)buffer[i];
        if (c == '?')
        {
           if ((char)buffer[i + 6] == '1')
           {
              Serial.println("Pasando a modo MANUAL");
              TermostCalderaOn=1;
              tempManual=20.0 ;        
              DrawBotonesPrinc();
              DrawDeseadaTemp(210,5);
              comprobarEncender();
           }
           else if ((char)buffer[i + 6] == '0')
           {
              Serial.println("Pasando a modo OFF");
              TermostCalderaOn=0;         
              DrawBotonesPrinc();
              DrawDeseadaTemp(210,5);
              comprobarEncender();
           }
            else if ((char)buffer[i + 6] == '2')
           {
              Serial.println("Pasando a modo PROGRAMACION");
              TermostCalderaOn =2;
              DrawBotonesPrinc();
              DrawDeseadaTemp(210,5);
              comprobarEncender();           
           }
           else if ((char)buffer[i + 6] == '5')
           {
              Serial.println("Activando Alarma");
              activarAlarma();
              myGLCD.clrScr();
              myButtons.drawButtons();
              screen = SCREEN_MAIN;
           }
           else if ((char)buffer[i + 6] == '6')
           {
              Serial.println("Desactivando Alarma");
              activarAlarma();
              myGLCD.clrScr();
              myButtons.drawButtons();
              screen = SCREEN_MAIN;
           }            
           break;
        }
     }
  }

void ArrancarWifi() {

  if (wifi.setOprToStationSoftAP()) {
     Serial.print("to station + softap ok\r\n");
  }
  else {
     Serial.print("to station + softap err\r\n");
  }

  if (wifi.joinAP(SSID, PASSWORD)) {
     Serial.print("Join AP success\r\n");
     delay(1000);
     Serial.print("IP: ");
     ipWifi=wifi.getLocalIP().c_str();
     Serial.println(ipWifi);
  }
  else {
     Serial.print("Join AP failure\r\n");
  }

  if (wifi.enableMUX()) {
     Serial.print("multiple ok\r\n");
  }
  else {
     Serial.print("multiple err\r\n");
  }

  if (wifi.startTCPServer(80)) {
     Serial.print("start tcp server ok\r\n");
  }
  else {
     Serial.print("start tcp server err\r\n");
  }

  if (wifi.setTCPServerTimeout(20)) {
     Serial.print("set tcp server timout 20 seconds\r\n");
  }
  else {
     Serial.print("set tcp server timout err\r\n");
  }

  Serial.println("setup end\r\n"); 
}

void setup() {
ArrancarWifi();
:
:

}

void loop {
:
comprobarHTTP();
:
:

}

termostatoV7_1.ino (44.4 KB)

Hola,
Queria comentar un poco mas sobre esto.
Si alguien esta interesado comparto el codigo sin problemas.
En primer lugar se trata algo mas que un termostato, ya que controlo las persianas de la casa y una alarma.

Como harware tengo:
-Placa Arduino mega
-Pantalla 3.2 lcd tactil
-modulo inalambrico esp8266 esp-01
-Detector de presencia HC-SR501
-Medidor de temperatura/humedad DHT22
-barometro bmp085
-8 Reles 5v SRD-05VDC-SLC
-RTC DS3231

Para el modulo wifi tengo puesto una fuente de alimentacion externa.

Puedes pasarme el *.ino me mola el rollo, voy a ver si le echo un vistazo y si encuentro algo raro te comento. :wink:

Un saludo.

Lagger18, perdona no haber respondido antes, la verdad es que tampoco dispongo de demasiado tiempo.
Con el riesgo que me conlleva al ser el tercer programa en arduino, os comparto el codigo, antes de nada queria mencionar varias cosillas:

  1. No he podido copiar todo el codigo en el apartado "/code" por ser demasiado extenso, sin embargo SI lo he puesto como fichero adjunto, ahi SI que esta completo. Si teneis problema para la descarga comentadlo.

2)No es solo un termostato (con modo off, programacion,manual). Tambien me permite subir/bajar dos persianas y activar una alarma mediante un sensor de presencia.

3)De momento solo tengo configurado un rele (el de la caldera). El resto (persianas y alarma) no los tengo configurado, esto no lleva casi nada de tiempo.

  1. He adjuntado tambien un pequeño dibujo que he hecho del cableado (en mi segundo post), en él aparecen dos fuentes de alimentacion, uno para la placa mega + lcd 3.2 (touch screen) y otra fuente de alimentacion que alimenta el resto del circuito, esta segunda fuente es de 10v y 800 mah, espero que eso no de problemas.

  2. La wifi no la activo en el setup, la activo una vez ha arrancado con un boton en el menu, en el setup me daba problemas y prefiero hacerlo manualmente

  3. Para la comprobacion de peticiones HTTP lo hago con la funcion comprobarHTTP(); . Esta funcion aparece varias veces en el void loop (), asi me aseguro que tengo mas posibilidades a la hora de captar las peticiones

Hola,
Lo he configurado a velocidad de 9600, lo puedes ver en el fichero que he sibido en un post anterior.
Serial.begin(9600);

ArduMyth, muchas gracias por las criticas constructivas, durante esta semana intentare cambiar lo que comentas:
1)tablas, estan obsoletas, utilizare CSS responsive, ahora mismo no se lo que es, pero me informare.
2)onclick dentro del html.

No tengo claro saber hacer todo lo que comentas, sobre todo esto:
"El button en html, úsalo para submit u otras cosas, no para redirigir, o al menos pon el JS bien."
Si me das alguna pista mas genial, si no intentare hacerlo con CSS.

Aun asi, no tengo claro que sea ese el problema. Al hacer la peticion, veo que llega a la placa ESP8266 pues se enciende el led azul siempre, sin embargo unas veces sigue parpadeando el led azul y procesa la peticion y otras veces se queda solo en ese unico parpadeo azul y no hace mas. Si lo reintento dos o tres veces mas acaba procesando la peticion, pero repito, veo que la peticion SIEMPRE llega.

Todos los comentarios seran bienvenidos.
Muchas gracias por vuestra atencion.

Hola,
Gracias por las indicaciones ArduMyth, creo que ya se donde esta el problema. Con el ejemplo que me has mandado he visto que el problema solo lo tengo la pantalla principal activa. Cuando tengo activa esta pantalla arduino esta constantemente dibujando en la pantalla.

En las demas pantallas esto no pasa, solo en la principal.
Modificare el codigo para que solo digbuje algo en la pantalla cuando haya algun cambio, ahora mismo esta constantemente dibujando aunque no cambie nada y esto estara saturando arduino.

Me va a llevar un rato cambiar esto, este fin de semana os cuento como lo llevo, pero tiene toda la pinta que es eso, pues solo pasa en la pantalla principal.

Mil gracias por todo.

Cuando lo cambie, si quereis os paso el codigo por si os interesa el proyecto.

Un saludo

Se me olvidó comentar que también quite las múltiples llamadas que hacía para comprobar lag peticiones http. Ya solo he dejado una comprobación y desde una pantalla que no sea la principal funciona.

Gracias

Hola,
Ya esta resuelto el problema, como he comentado mas arriba, el problema lo tenia en la pantalla principal en la que estaba constantemente escribiendo en la pantalla aunque los datos no cambiasen. He cambiado el codigo para que solo escriba en esa pantalla si cambian los datos, de esta forma se carma menos arduino.

Muchas gracias a todos los que habeis ayudado. Si quiereis el codigo os lo paso sin problemas.

Un saludo