Termostato Wi-Fi con ESP8266

Después de varias semanas haciendo algunas pruebas, y siguiendo un poco con la temática de las ultima entradas, quiero presentar un termostato Wi-Fi que controlaremos al 100% con una app de móvil ( NETIO ) como en entradas anteriores.

Este sistema, nos permitirá encender y apagar la calefacción a distancia, y ajustar la temperatura de confort que queramos tener en casa…

IMG_1162

 

En un pequeño display oled de 0,96 pulgadas podremos ver ,el estado de la calefacción ( encendida o apagada ) , el estado de la caldera ( funcionando o parada), la temperatura real y la temperatura objetivo que queremos alcanzar.

Para la alimentación del sistema, vamos a reciclar un cargador de móvil de 5v, y finalmente meteremos todo el sistema en una caja de 70×70 diseñada con 123ddesing, e impresa en plástico ABS.

Para llevar a cabo este proyecto, tendremos que echar mano de las dos entradas anteriores, con la primera, prepararemos la placa ESP8266, para poder cargarle el sketch usando el entorno de Arduino, y con la segunda, añadiremos dos puertos GPIO a la placa ESP8266, ya que necesitaremos 4 puertos, dos para la pantalla oled, uno para conectar el sensor de temperatura y uno para el rele de activación de la caldera.

Una vez terminado el proyecto, podremos controlar la calefacción desde donde queramos usando nuestro móvil o tablet, la única pega es que la app para poder realizar el control el de pago, desde la App Store, o desde Play Store.

El acceso desde el interior lo haremos usando nuestra ip interna, la cual saldrá en la pantalla oled al iniciar el termostato , y si queremos acceder desde el exterior de casa, tendremos que hacer uso de algún servicio de DDNS, como puede ser Dyndns o NOip. Solo tendremos que redireccioinar el puerto 90 a la ip del termostato.

Para empezar, aquí dejo dos esquemas para el montaje, uno de ellos tiene como relé, una shield que ya viene preparada para conectar directamente a la salida del puerto GPIO, y el otro un esquema para usar un relé de 6V con un transistor …(**)

ESP8266 termostato_bb

 

ESP8266 termostato_v2_bb

 

Como podéis observar, la lista de componentes no es muy larga… Ni muy cara…

1x Módulo ESP8266

1x Pantalla OLED i2C de 0,96″

1x Módulo relé de 5v

1x Regulador de 3,3v

3x Resistencia de 4,7K

1x Cargador de móvil ( como alimentador del termostato )

** 1x Relé 6v

**1x Transistor BC547

**1x Resistencia 1K

**1x Diodo 1N4007

 

Ahora vamos a explicar paso a paso el montaje….

En primer lugar Yo he imprimido la caja que voy usar, de la que AQUI dejo el archivo STL para poder imprimirla

Captura de pantalla 2016-03-11 a las 20.10.05

La versión terminada queda mas o menos así..

IMG_1168

 

Lo primero que vamos a hacer, es desmontar el cargador del movil que vamos a usar para alimentar el termostato…

IMG_1169

 

Soldaremos un cable a la entrada de 220V y otro a la salida de 5v para alimentar el circuito… para después meterlo en nuestra caja…

IMG_1170

 

En el diseño de la caja, no están los agujeros para pasar los cables, ya que depende del alimentador que usemos, podremos hacer los agujeros donde mejor nos venga…

Ahora pegaremos la pantalla OLED en su sitio …

IMG_1171

 

Para dejarla fija, he usado un par de gotas de cola caliente…

Seguidamente colocaremos el regulador de 3,3V, y el relé dejando la zona central para el resto de componentes…

IMG_1172

 

He decidido colocar un zócalo para después insertar el módulo ESP8266, en vez de soldarlo directamente, ya que así puedo soltarlo para programarlo de nuevo…

Aquí ya están colocadas las resistencias y el transistor …

IMG_1175

Y aqui ya están todos los componentes…

IMG_1176

 

Solo quedan los dos hilos de conexión a la caldera…

IMG_1177

 

No se aprecia en la foto anterior, pero el sensor de temperatura , al ser bastante sensible, lo he sacado por un lateral, para evitar que le afecte la temperatura de la electrónica …

IMG_1179 IMG_1180 IMG_1181

 

Ya tenemos el termostato montado… Ahora hay que ponerlo a andar, y controlarlo…

El Sketch para programarlo podéis descargarlo con el paquete de archivos desde AQUI

Una vez que los conectamos a la corriente, en la pantalla aparecerá , el SSID de la red a la que estáis conectados junto con la IP …

IMG_1182

Esa es la IP que tendremos que poner en la configuración del archivo .json de NetIO

Captura de pantalla 2016-03-11 a las 20.48.05

 

Una vez configurada y cargada en la App podremos controlar nuestro termostato…

IMG_1167

 

IMG_1166

El archivo .json podéis descargarlo desde AQUI.

Hay un par de cosas dentro del código que quiero comentar, por si queréis hacer algún cambio…

Primero:

En estas lineas hay que colocar el SSID y el password de vuestra red WiFi:

Captura de pantalla 2016-03-11 a las 20.56.31

 

Segundo:

Si queréis poner IP fija al termostato… hay que descomentar  las siguientes lineas…

Captura de pantalla 2016-03-11 a las 20.57.54 Captura de pantalla 2016-03-11 a las 20.58.07

Tercero :

El margen de temperatura, es decir, lo que tarda en volver a activarse la caldera, desde que alcanzamos la temperatura objetivo, es de 0,2 ºC es decir … si ajustamos la temperatura a 20ºC y ya la hemos alcanzado, la caldera se apagará, y no se encenderá si la temperatura no baja a los 19,80ºC…

Este valor podremos cambiarlo desde la siguiente linea…

Captura de pantalla 2016-03-11 a las 21.17.06

Y para finalizar…

Cuarto:

El ajuste de la temperatura.. es decir… una vez montado, lo he colocado junto a otro termostato durante algún tiempo para comprobar la diferencia de temperatura, en mi caso es de 2ºc, podría ser por el calor detectado de la electronica ( o simplemente es mucho mas preciso )… lo podremos ajustar al final del código, en la función de comprobar temperatura…

Captura de pantalla 2016-03-11 a las 21.20.16

 

Espero que lo disfrutes….

 

DonacionPayPal

 

Anuncios

42 Respuestas a “Termostato Wi-Fi con ESP8266

  1. Hola Sergio, sigo tus tutoriales y la verdad este está muy bueno, increible. Ahora tengo un problema a ver si me puedes ayudar. No quiero usar la interfaz de NetIo sino de Jquery Mobile. He creado ya la interfaz y los disparadores para la recepción de la información por AJAX. El tema es que tengo un problema con la parte de cambiar la temperatura y más concretamente con encender y apagar el relé.

    Por ejemplo en el condicional de recepción de información al recibir X valor pasado por / responde con los datos solicitados. Pero e la hora de mandar un comando al ESP8266 para que haga una acción no llega a realizarla.

    Por ejemplo si voy a apagar el relé:
    (req.indexOf(“/estado”) se supone que sería al ejecutar http://miip:90/estado no? O sea, si lo das cambia de estado a encendido o apagado. El tema es que al mirar por el terminal me devuelve información pero no enciende o apaga el módulo. Alguna idea? Muchas gracias por adelantado

    • En cuanto al entorno, no puedo ayudarte, no conozco jquery mobile…
      Pero en la forma de activarlo, si es así…
      Miip:puerto/estado
      Ten en cuenta , que él rele solo se activa, si la temperatura objetivo es más baja que la temperatura real detectada…
      Por lo de mas.. Has puesto todos los componentes? La pantalla oled, el detector ds18d20?
      Se cambia de color el indicador de estado?

      • No, o sea, lo que he hecho ha sido eliminar el componente de OLED para sólo manejarlo desde la aplicación móvil. El problema podría venir debido a que he omitido el transistor, resistencia y diodo? Aunque trabaja a 3.3V al pasarle una batería con 1.5AMP deja activado por defecto el relé. O sea, el relé lo alimento a 5V pero para el IN1 lo paso al GPIO del ESP que comunica a 3.3V. Crees que por ahí estarían los tiros? Con un convertidor de nivel TXS0108E de 3.3V a 5V del GPIO al IN1 podría ser la solución? O crees que va por otro lado. Este sería el código que he modificado: http://pasted.co/c2678008

      • Haz la prueba conectando un led con una resistencia de 330 ohm , en vez de el rele.
        No se puede conectar una carga tan baja ( el rele ) directamente a el módulo esp8266. Es posible que se queme, un adaptador de nivel te podría servir si es capaz de suministrar la corriente necesaria.
        Si has modificado el esquema, imagino que habrás modificado las asignaciones de los pines en el código .

  2. Si, si, modifiqué las asignaciones de código. Voy a hacer la prueba con el LED y si funciona usaré luego el adaptador de nivel. Gracias por adelantado

  3. Pues no lo contigo. He probado con tu código completo igual y sigue sin funcionar. El tema es que cuando “recibo la orden de subir, baja o apagar” realizando la prueba vía ip miip:puerto/accion el navegador me da un ERR_EMPTY_RESPONSE

    Hice la prueba con los led y funcionan perfectamente los GPIO, de hecho el 2 es al que tengo asignado el DS y me funciona bien, además en ambos sentidos. El problema es que por alguna razón no me funciona la lógica de subirT, bajarT, estado. No llega a ejecutarse, en cambio al enviar la temperatura, estado caldera, calefacción me retorna la información sin ningún problema.

      • Las pruebas las realizo con el navegador claro. Una vez viendo que funcione bien cogería y lo haría con la aplicación. Pero primero debería funcionarme en el navegador. Este es tu código modificado http://pasted.co/c2678008 , el cual estoy usando pero aparentemente está todo bien. De hecho, como tal los GPIO0 y GPIO2 funcionan ya que he realizado la prueba con los led sin problemas. Y de hecho en el GPIO2 estoy usando el sensor de temperatura y este si me arroja sin ningún problema la temperatura. Es más, las peticiones que muestran información (/target, /real, /calefaccion, /1caldera) funcionan de miedo, el problema es cuando quier que actue, no lo hace. No lo hace ni con un led, menos con el relay. Cuando ejecuto un comando, por ejemplo el de estado en la web genera un error ya que no recibe parámetros. Ahí daría igual ya que puede no generar una respuesta pero si generar un trabajo como debería ser, pero tampoco lo hace.

      • Otra pregunta más. En tu código al realizar una actuación desde el navegador, como /estado /subirT … te funciona?? o sólo lo hace desde la aplicación.

        O sea. Si yo pulso http://miip:puerto/estado esto automáticamente debería apagar o endender el relé. Y si yo pulso http://miip:puerto/subirT debería subir en un grado la temperatura de consigna, todo ello aunque no me responda nada el enlace, ya que salvo la respuesta que daría en el monitor “por ejemplo: Serial.println(contador);” en el caso de /subirT no emite respuesta alguna en el navegador. En el monitor si genera respuesta en todos los casos, pero ni subir, n ibaja ni apagar o encender hace que salte “digitalWrite(rele,LOW); o digitalWrite(rele,HIGH);”

      • Espera….
        Acabo de caer en una cosa….
        Puse un contador … Por qué la app netio , envía 3 veces la petición, pon a 1 el contador … Creo que ese es el problema…

  4. Hola Sergio, gracias por preocuparte. A ver, he realizado los cambio en los condicionales.., y si, funciona pero a medias jaja. O sea, ya cuando se apaga, cambia el estado de “Apagada Caldera o Encendida Caldera” y también el color rojo o verde para el botón que indica el estado. Además, cuando doy a subirT o bajarT si que baja o sube la temperatura pero el “número” ya que el actuador sigue sin apagarse o encenderse jeje. Al menos ya casi hemos corregido todo, ahora queda lo más importante, que se encienda o apague el actuador jaja. Alguna idea?

    • Solo se me ocurre que elimines del principio todo lo relacionado con el lcd…
      char *dtostrf(double val, signed char width, unsigned char prec, char *s);
      char str_temp[6];
      char str_target[6];
      char target_2[10];
      char temperature[10];
      dtostrf(temp, 4, 2, str_temp);
      sprintf(temperature, “%s”” “, str_temp);

      eliminalo y prueba….

      • Hola Sergio, perdona la demora pero no pude hacer pruebas hasta ahora, muy poco tiempo libre he tenido.

        Ya lo probé y funcionó perfectamente. Hice algunos cambios, pero básicamente la única diferencia que hizo que me funcionase o no fue eliminar esas variables y formato. No sé porqué narices fallaba con eso, pero realmente así fue. Te paso Me funcionó perfecto en este instante.

        Muchas gracias por todo, de verdad!!

      • Me alegro de que ya te funcione…
        Puedes colgar el código , por si alguien quisiera hacer la misma modificación. El sketch y el control desde el móvil …
        si prefieres mándamelo a través del formulario de contacto, y lo posteo modificando el artículo …

  5. ok, perfecto. En un rato preparo el control desde el móvil con los códigos que actúan sobre el sketch y te lo envío para que lo publiques.

  6. Buenas noche.
    Muchas gracias por tu tiempo y en compartirlo con los demás.
    estoy montando este proyecto y al compilar me da error
    error de compilación en tarjeta Generic ESP8266 Module
    estoy utilizando Arduino 169.
    si compilo y cargo el ejemplo de gpio que tienes todo sin problemas
    he puesto las librerías de dallas y OneWire como si fueran de arduino
    no se que puede ser el error no me da mucha información.
    Muchas gracias.

    • el código es para un esp8266, no te va a compilar ( creo que las librería del ejemplo son exclusivas para el esp8266)

      tendrás que modificarlo, además, esa placa no lleva wifi no?

      pon algo del error para hacernos una idea…

      • La tarjeta que tengo es la esp8266 y le he cargado el FW en que directorio se colocan las librerías como si fueran de Arduino ??
        si compilo tu ejemplo para 2 gpio funciona bien es al compilar el termostato supongo que es porque no encuentra las librería.
        Gracias.

  7. Es cierto da un error, ya encuentra las librerias, pero en la de ONEwire da error

    ATENCION: Categoría ” en Librería OneWire no es válida. configurando a ‘Uncategorized’

    Versión de Arduino 1.6.9

    Un saludo
    y muchas Gracias por tu tiempo.

  8. Buenas tardes.
    solucionado el problema en compilación con librería OneWired.
    Versión de arduino 1.6.9
    S.O. Windows 10
    He descargado la libreria de :
    https://github.com/PaulStoffregen/OneWire
    la he instalado en el directorio de librerias de arduino.
    He compilado y sin problemas.
    Me falta probara el circuito completo.
    Un saludo.
    Y muchas Gracias

  9. hola he seguido tu proyecto, me funciona todo menos en la aplicación que no me deja subir ni bajar la temperatura, solo me muestra la temperatura real y objetivo, puedes echarme una mano??. Gracias

  10. Que guapo el proyecto, yo he hecho algo parecido y con una app creada con app inventor 2 gestiono el encendido/apagado de la caldera y la temperatura, a la vez que monitorizo humedad y temperatura usando el código JSON que saco de thingspeak. Luego mediante noip.com redirecciono la ip y así lo tengo desde el móvil todo. El tema de sacar dos puertos más al ESP8266 me es imposible con el soldador que tengo, menos con el pulso, jaja….
    Ahora estoy teniendo problemas con la patilla con la que muevo el relé, puesto que se me desconecta, creo que es tema de alimentación, voy a seguir investigando. Pero lo dicho, tu proyecto muy chulo…

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s