Construye un nodo WiFi de temperatura con el ESP8266 y el Dallas DS18B20

Foto temperatura movil ESP8266 ESP-01

Qué es el ESP8266

El ESP8266 es un pequeño microcontrolador de Espressif, de bajo coste y con Wifi integrado. Su bajo coste y pequeño tamaño lo hace ideal para dotar de conectividad Wifi a cualquier sensor o actuador para el Internet de las Cosas. Además podemos programarlo utilizando Arduino IDE y muchas de las librerías que ya conocemos para Arduino, así que utilizarlo es muy fácil.

Qué necesitas

En este post voy a utilizar un ESP-01. Es el circuito más básico que incorpora un ESP8266, y con él podemos conectarnos a una red Wifi, actuar sobre dos pines digitales y comunicarnos por el puerto serie.

Para programarlo necesitamos un conversor USB-serie que funcione a 3.3V. Esto último es muy importante ya que el ESP8266 no tolera más de 3.6V en sus pines. Si tu conversor USB-serie no puede funcionar a 3.3V, como alternativa puedes usar un conversor de niveles TTL y una fuente de 3.3V.

Un sensor digital de temperatura Dallas DS18B20 y su resistencia pull-up, un pequeño integrado para medir temperatura en tus proyectos. Es un sensor muy preciso, presenta un error de ±0.5°C y puede dar hasta 12 bits de precisión en el convertidor analógico-digital del chip. Necesita una resistencia de pull-up de entre 1 y 10k.

Voy a conectarlo todo usando una breadboard y varios cables jumper (macho-hembra del ESP-01 a la breadboard, y macho-macho para las conexiones en la breadboard).

Arduino IDE 1.6.4 o superior con el SDK del ESP8266 y las librerías Dallas-Temperature-Control y OneWire. A partir de esta versión Arduino IDE permite instalar configuraciones adicionales para placas de terceros (no-Arduino) de forma muy sencilla. A partir de aquí asumimos que ya sabemos utilizar las funciones básicas del Dallas DS18B20 y programar el ESP-01 con Arduino IDE.

Conectando el ESP-01 al conversor USB-Serie

Conectando el ESP-01 al conversor USB-Serie

Programando el servidor web

Vamos a empezar programando un servidor web que responda con una cadena estática “Hola mundo” y después haremos la lectura del sensor de temperatura. Haciendo los sketches paso a paso podemos comprobar que cada parte funciona correctamente antes de pasar a la siguiente, y evitaremos quebraderos de cabeza depurando errores.

Librerías, instancias y constantes

Para empezar, necesitamos incluir las librerías del ESP8266, crear los objetos y definir las constantes. Las siguientes líneas dicen a Arduino IDE qué librerías vamos a usar, que para este sketch son todas estas:

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

Para operar necesitamos crear un objeto de la clase ESP8266WebServer cuya función es servir el contenido cuando accedamos con el navegador:

ESP8266WebServer server(80);

Por último, antes de empezar a programar, definimos dos cadenas donde vamos a guardar el nombre de nuestra red WiFi y la contraseña para que el ESP8266 pueda conectarse. Sustituye MI_SSID y MI_PASSWORD por los de tu red WiFi:

const char* ssid = "MI_SSID";
const char* password = "MI_PASSWORD";

Conectando a nuestra red WiFi

Vamos a conectar el ESP8266 a nuestra red WiFi. Como es algo que va a ocurrir solo una vez al inicio del programa, en setup() llamamos a la función para conectarnos, y esperamos a que la conexión se haya realizado:

WiFi.begin(ssid, password); // Conecta a nuestra red WiFi

while (WiFi.status() != WL_CONNECTED) {  // Bucle con espera hasta que se conecte correctamente
delay(500);
}

Configurando y activando el servidor web

La configuración más básica que podemos hacer del servidor web es que responda una web estática cuando en nuestro navegador introducimos la IP de nuestro nodo. Para ello, tan solo tenemos que configurar el servidor para que escuche en la URL raíz (“/”) e introducir la respuesta que deseamos con el siguiente código:

server.on("/", [](){
  server.send(200, "text/plain", "Hola mundo!");
});

El primer argumento de server.on es una cadena (“/”) que indica que estamos creando la respuesta del servidor cuando el navegador solicita la URL raíz. El ESP8266 nos permite definir comportamientos diferentes para “subdirectorios” de la URL, y así podríamos configurar diferentes respuestas para “/sub-url-1”, “/sub-url-2”, etc.

El segundo argumento de server.on es una función. Podemos introducir un puntero a una función ya creada (lo vemos más adelante) o introducir directamente el código que queremos ejecutar de la forma [](){ MI_CODIGO; }. En este caso como es sólo una sentencia hemos elegido el último método.

Cuando el navegador se conecte al ESP8266 se va a ejecutar ese código que hemos puesto dentro de server.on, y que en este caso es una llamada a la función server.send, que lo que hace es responder al navegador. Para ello, hay que darle tres argumentos:

  • Código de respuesta: es un código que se utiliza en el protocolo HTTP para indicar diferentes eventos en las conexiones. Posiblemente te suene el 404 cuando das con un enlace roto, pues el código 200 es menos visible pero más común, es el que se devuelve cuando sí que se encuentra el contenido.
  • MIME-type: es un código que indica el tipo de contenido que se devuelve, puede ser texto, imagen…
  • Respuesta: El contenido de la respuesta en sí, en este caso tan solo queremos responder un “Hola mundo!” de prueba.

Hecho esto iniciamos el servidor con:

server.begin();

Y en la función loop() ya podemos empezar a escuchar las conexiones entrantes:

void loop(void){
  server.handleClient();
}

Prueba que todo funciona

Sube el programa a tu placa con ESP8266, puedes echar un vistazo a este post anterior para ver cómo se hace.

Para acceder al servidor web necesitamos conocer su IP. Mi método preferido es entrar en la web de configuración del router y buscarlo en la lista de dispositivos conectados, pero, si no puedes hacerlo así, también puedes incluir el monitor serie en tu sketch para que mande esta información a Arduino IDE. Para ello inicializa el monitor serie y al final de setup() incluye la línea Serial.println(WiFi.localIP());.

Abre tu navegador favorito, teclea la IP del ESP8266 y tiene que aparecerte algo como esto:

Servidor web ESP8266 con Hola Mundo en el navegador¡Incluso desde el móvil!

Servidor web ESP8266 con Hola Mundo en el navegador del móvil

Insertar la medición de temperatura en la respuesta del servidor web

Ya solo nos queda conectar el DS18B20 y mostrar la temperatura en el servidor web.

Conectando el Dallas DS18B20 y el ESP-01

Lo primero que tenemos que hacer es conectar el Dallas DS18B20. En este caso lo he conectado al pin GPIO2 del ESP-01.

ESP-01 y Dallas DS18B20Creando la respuesta del servidor web con la temperatura del DS18B20

Para dar respuestas más complejas que un “Hola mundo!” lo mejor es crear una función aparte que podamos llamar cada vez que haya una solicitud al servidor web. Voy a crear una función que recoja la temperatura del Dallas DS18B20 y la introduzca en la cadena de respuesta del servidor. Para ello, antes de setup(), podemos escribir:

void respondeTemperatura() {
  String respuesta = "Temperatura: "; // Respuesta del servidor

  sensors.requestTemperatures(); // Solicita las temperaturas
  respuesta += sensors.getTempCByIndex(0); // Añade la temperatura a la respuesta

  respuesta += " C"; // Añade la unidad de medida a la respuesta

  server.send(200, "text/plain", respuesta); // Envía la respuesta
}

No voy a entrar en detalles de cómo se utiliza el Dallas DS18B20 en Arduino IDE para no repetirme alargar innecesariamente el post.

Una vez hecha la función, donde antes teníamos:

server.on("/", [](){
  server.send(200, "text/plain", "Hola mundo!");
});

Ahora tendremos un simple server.on("/", respondeTemperatura);.

El sketch completo

Como no vamos a entrar en detalles de cómo se utiliza el Dallas DS18B20 en Arduino IDE, y ya tenemos una idea de cómo funciona el servidor web en el ESP8266, deberíamos ser capaces de entender el código completo del sketch:

 

Probando que el nodo sensor funciona y nos responde con la temperatura

Sube el sketch, busca la IP de tu nodo sensor y al acceder con tu navegador deberías tener una respuesta parecida a esta:

ESP-01 Servidor Web Dallas DS18B20 en el NavegadorESP-01 navegador movil Dallas DS18B20¡Funciona! Ten en cuenta que la respuesta es una web que generamos en el momento de la solicitud y que la temperatura no cambia en nuestro navegador automáticamente. Tendrás que recargar la página para actualizar su valor.

 

¿Qué proyecto vas a hacer con tu ESP8266? ¡Cuéntanoslo en los comentarios!

¿No te funciona? pregunta a nuestra comunidad maker en nuestro recién estrenado foro de Arduino. ¡Estaremos encantados de ayudarte!

6 Comentarios
  1. taffetacolt 4 meses

    hola, excelente aporte!, me interesa poder hacer que la pagina/servidor a la que se accede desde la Ip se actualice automáticamente cada cierto tiempo, o que sea constante visualizar el cambio de la temperatura,alguna idea de como lograr esto, se agradece mucho la ayuda.

  2. brax 5 meses

    Hola Juan! muchas gracias por el tutorial!!! funciona a la perfección! Te hago una consulta… como tengo que hacer si quiero leer temperatura pero de dos sensores? muchas gracias por tu tiempo!

    • Autor
      pablo 5 meses

      Hola @brax, nos alegra que te haya funcionado el tutorial!

      Cambiando el argumento de la función sensors.getTempCByIndex(0) a otro número distinto de 0 puedes coger la temperatura de varios sensores conectados en el mismo pin, aunque te toca identificar qué sensor es cada número de forma manual.

      http://fabricadigital.org/2015/10/mide-la-temperatura-de-tu-casa-con-arduino-y-el-sensor-dallas-ds18b20/

      Hay formas más avanzadas de obtener la temperatura de varios sensores, que se basan en un identificador único que tiene cada sensor, pero no tenemos tutoriales de cómo utilizar ese método. Si estás interesado en esto, aquí Google es tu amigo.

  3. juandavid8a 7 meses

    Buenos días, muchas gracias por el tutorial .. tengo un problema que ojala me pudieran ayudar. Resulta que luego de llevar en linea un aproximado de 5 horas . la ip se vuelve inaccesible .. alguna idea de como solucionarlo?? ..

    • Autor
      pablo 7 meses

      Hola, puede que se te esté desconctando de la red WiFi. Por simplicidad, este sketch conecta al encender la placa y ya no vuelve a comprobar que sigue conectado.
      Con WiFi.status() == WL_CONNECTED puedes comprobar si sigue conectado y, de no estarlo, vuelve a ejecutar la funcion setup().
      Esto puede solucionarlo si el problema es ese, pero, para diagnosticarlo adecuadamente te recomendamos que utilices el monitor serie para sacar toda la información posible de lo que está ocurriendo en tu sistema.

Contesta

©2017 Fábrica Digital desde Jerez de la Frontera, España.

717 717 452 (solo Whatsapp) / hola@fabricadigital.org

Horario de verano: de Lunes a Viernes de 09:00 a 13:00.

Calle del Comercio, 18, 11407 Jerez de la Frontera, Cádiz. - Cómo llegar

Información Legal - Aceptamos

 

Inicia Sesión con tu Usuario y Contraseña

o    

¿Olvidó sus datos?

Create Account