bclose

ESP8266: Subir datos a un servidor mediante WiFi

ESP8266 como cliente

Objetivos

 

 

    • Conectar un módulo ESP8266 a una red WiFi.
    • Conectarle un sensor DHT11 y leer los datos de temperatura y humedad.
    • Aprender a subir los datos a un servidor.
 

Material requerido.

 

 Tienda EspañaTienda Mexico
Vista principalNodemcu V2Nodemcu V2
sensor humedad y temperaturaSensor DHT11Sensor DHT11

 

Consideraciones previas

 

Antes de comenzar esta sesión vamos a repasar algunas cosillas que vamos a necesitar tener preparadas, y otras que tenemos que considerar ante de ponernos a realizarla.

Lo primero es bastante evidente, si vamos a querer subir valores a una base de datos que tengamos en un servidor, necesitamos un servidor preparado para ello. Podéis haceros uno propio, o utilizar alguna página que lo permite, como https://thingspeak.com/.

Nosotros vamos a aprovechar que montamos un servidor utilizado una Raspberry y vamos a subir los valores a la tabla que creamos en una base de datos SQL. Si no le habéis echado un ojo antes, aquí os dejamos los enlaces:

 

Por otra parte, si estáis familiarizados con los esp8266, sabréis que hay bastantes modelos diferentes con ese mismo chip. Aquí hace tiempo que nos decidimos por los NodeMCU (a partir del modelo 1.0), que son a nuestro parecer los más sencillos y completos, así que este tutorial vamos a hacerlo utilizando uno de ellos. Si no habéis trabajado nunca con este tipo de módulos, tenemos algunas sesiones en las que hablamos de todo esto más en profundidad:

 

Node MCU board

Conectar y programar el sensor de temperatura y humedad DHT11

 

El DHT11 es un sensor que nos permite leer la temperatura y la humedad relativa. No es muy preciso, pero es muy barato y fácil de utilizar, y nos va a servir de sobra para lo que queremos hacer. Estos sensores se presentan de muy diversas formas, con 3 o 4 pines en función de si tienen la resistencia pull-up incluida o no, y el orden de los pines puede variar de un modelo a otro, así que es importante que os fijéis en el vuestro. Los más normales son estos dos:

distribución de pines

Una vez tengamos claro cuál es el nuestro sólo tenemos que conectarlo. En este caso el nuestro tiene la resistencia pull-up incorporada y 3 pines, así que la conexión la haríamos de esta forma (si tenéis el de 4 pines y no sabéis cómo conectarlo, podéis echar un ojo aquí)

conexion dht11 esp8266 nodemcu

Ahora ya podemos empezar con el programa, pero antes tendremos que descargar el pluggin para el esp8266 si no lo habéis usado nunca anteriormente. Aquí tenéis una sesión en la que indicamos como hacerlo Instalar el pluggin ESP8266 en Arduino.

Una vez instalado el pluggin lo primero que deberíais  hacer es descargar la librería que vamos a utilizar DHT11.zip si no la habéis usado nunca antes. Comenzamos el programa incluyendo la librería y  definimos una instancia del sensor donde declaramos el pin al que esta conectado.

#include <DHT11.h>
DHT11 dht11(D4);

Si os fijáis, hemos nombrado el pin como D4, y no como 4 como haríamos con cualquier Arduino normal. Y es que los nombres de los pines no corresponden con los GPIOS en el NodeMCU. De hecho si probáis a poner 4, no funcionará, ya que el pin que identifica como 4 es el rotulado como D2. En está imagen lo podréis ver de forma más clara:

pinout

Así que para evitar confusiones podéis poner la ‘D’ por delante y él pluggin se encargará hará de hacer la relación.

Por lo demás el programa es sencillo. Utilizaremos la función dht11.read pasándole como parámetros las variables donde queremos guardar los valores, comprobando que no haya un error . El programa quedaría así:

#include <DHT11.h>

int pin=2;
DHT11 dht11(pin);

void setup()
   {
       Serial.begin(9600);
   }

void loop()
   {
       int err;
       float temp, hum;
       if((err = dht11.read(hum, temp)) == 0)    // Si devuelve 0 es que ha leido bien
          {
             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();
          }
       delay(1000);            //Recordad que solo lee una vez por segundo
   }

Ahora probad a subir el programa, asegurándoos de que habéis seleccionado como placa el NodeMCU. Una vez cargado, si abrimos el puerto serie veremos los valores de temperatura y humedad.

 
  • Podéis hacer que suban tanto la temperatura como la humedad echando un poco de aliento en el sensor, y veréis cómo varían los valores. 
Medidas de consola

 

Subir los valores a una base de datos en un servidor

 

Ya sólo nos queda subir los valores al servidor.Básicamente lo que hemos hecho ha sido adaptar uno de los programas que vienen de ejemplo con la librería llamado “WiFiClient”. Lo primero que hacemos es incluir la librería (no tenéis que descargarla porque se instala con el pluggin que ya hemos descargado), y además vamos a declarar algunas variables que usaremos para conectarnos a la red WiFi, nombre de la red y password, y la dirección del servidor al que subiremos los datos.

 

Contenido solo disponible para suscriptores. ¡Accede al contenido!

Ahora no tenéis más que subir el programa y si abrís el puerto serie veréis como establece la conexión a la red WiFi y envía una petición cada minuto.

esp8266 cliente servidor

Y si ahora accedéis al servidor al que lo habéis subido y miráis en la base de datos deberían estar esos mismos valores en la tabla a la que los hayáis subido, en nuestro caso el de la Raspberry que gestionamos con phpMyAdmin.

tabla base de datos temperatura humedad

Con esto creemos ya estaréis en posición de adaptar este programa para vuestros propios montajes y propósitos. Estaremos encantados de que nos hagáis llegar vuestros proyectos. Nosotros os dejamos por aquí un vídeo con el resultado:

 

Resumen de la sesión

 

En esta sesión hemos aprendido varias cosas importantes:

 
    • Hemos usado un DHT11 para leer los datos de temperatura  humedad usando un NodeMcu.
    • Nos hemos conectado a una red WiFi.
    • A establecer una conexión TCP con un servidor.
    • Hemos subido los datos de temperatua y humedad a un servidor.

Para porder realizar consultas a nuestros expertos, tienes que ser suscriptor. Suscribiendote nos ayudas a mantener este proyecto en marcha.

¡ Quiero Suscribirme !

Si ya eres premium y no puedes comentar haz login. Hacer login

(85) Comments

    • Lekan

    hola de nuevo:
    Si quiero cambiar la forma de envio de datos de GET a metodo POST, Bastaria con cambiar en el php y en ide de arduino donde pone GET,por POST o habria que hacer algo mas?.

      • Ivan Uriarte

      Hola! Debería de funcionar igualmente.

    • Lekan

    Hola:
    He realizado todo el proceso.Metiendo los datos desde la cabacera,funciona correctamente.Meescribe los datos en labase de datos.
    El problema ,esque cuando lo hago desde el esp82 66,me mete en la base el valor 0 y 0 tanto en temperatura como en humedad.
    ¿Sabeis donde puede estar el fallo?
    Tambien me gustaria saber, para quees lakey que ingresa arduino y de donde sale.
    String key = “?pass=1234”;

    Gracias de antemano

      • Ivan Uriarte

      Hola Lekan, la key es una especie de password un poco chapucero, para que no te suban datos si saben la IP de tu servidor. Por otro lado, si los sensores te están funcionando bien, no tengo muy claro por qué te puede estar subiendo un 0. Prueba a subir números directamente desde el Arduino, en vez de los datos del sensor, a ver si funciona. Primero prueba con números enteros, y después con decimales. A ver si podemos ir descartando cosas. un saludo.

    • Ikrloz

    COMO LO CONECTO CON LA NUEVA LIBRERIA 2.6.2

      • Charly

      Hola Ikrloz, ¿A que libreria te refieres?

    • Ignacio

    Hola, comp podría aplicar esto con un esp32?

      • Ivan Uriarte

      Sería exactamente igual, cambia sólo la librería.

    • Karen

    hola, ese “/dht11.php” es un script diferente?? es que no lo encuentro en el tutorial…

    • Alberto

    Hola, he seguido el tutorial para cargar datos, durante bastante tiempo lo tuve activo con la raspberry, siguiendo el tutorial del servidor también pero recientemente he estado ampliando funcionalidades en la raspberry, haciendo más páginas web y tuve que ordenar el directorio de /var/www. Dentro de este directorio cree diferentes carpetas y dentro de cada una de estas metí los archivos de las web, quedando así:
    /var/www/pagina1
    /var/www/pagina2
    /var/www/pagina3
    Ahora, ya no soy capaz de enviar datos a la base de datos. Entiendo que al hacer esto tendría que cambiar el servidor y poner http://www.mipaginaweb.com/pagina1 para enviar los datos a la base de datos. (la página del servidor que creé con el tutorial la tengo dentro de la carpeta pagina1).
    A través de cualquier navegador no tengo ningún problema para acceder a la web pero soy incapaz de enviar datos correctamente. Si meto los datos manualmente a través de la web, poniendo en la url /dht11.php?Temperatura=33&Humedad=44 los datos se cargan correctamente pero soy incapaz de hacerlo con Arduino y el ESP8266.
    He probado a ir metiendo los comandos manualmente para ver que error me da y da todo OK hasta el momento de enviar el comando AT+CIPSTART=”TCP”,”www.mipagina.com/pagina1″,”80″, que me da como respuesta ERROR y nada más. He probado cambiando la IP del servidor, poniendo la IP de Google, cambiando el puerto y nada, no hay forma de poder conectarme con el ESP8266. Los puertos lo tengo abiertos, y no sé cómo arreglar esto… ¿Alguien me puede echar una mano con esto? ¿Sabéis porqué ya no me puedo conectar al servidor? ¿Qué estoy pasando por alto?

    Muchísimas gracias por la ayuda de antemano!!

      • Ivan Uriarte

      Hola ALberto, a mí me da problemas el firewall de windows. Puede ser eso? Prueba a desactivarlo y si funciona metelé una excepción. UN saludo.

    • Cotepower

    Hola y el archivo PHP?

    • Oscar

    Buen día.
    En esta parte del programa:
    const char* host = “prometecserver.ddns.net”;

    pongo la dirección IP de mi base de datos de PHPmyadmin?

    Muchas gracias-!

      • Ivan Uriarte

      Ahí pondrías la dirección o la ip de tu servidor

    • Pablo Agriano

    Hola. Como podría hacer para enviar desde un arduino Yun los datos via WiFi de un sensor de CO2, a un programa python?
    Mi duda es que como Yun ya esta conectado a un router wifi, ¿solo habría que crear el cliente para subir los datos en el programa python con BridgeClient no?
    Es que no hay manera….
    Agradecería mucho tu ayuda.

      • Ivan Uriarte

      Yo creo que lo más sencillo es que montes el Arduino como servidor y te conectes desde Python como cliente.

    • Ing

    saludos, con ESP8266, podría mandar una código que este verificara el código con php en la base de datos y el servidor mandara la respuesta al ESP8266 para mostralo por una pantalla LCD con el arduino, que no sea con el ethernet netamente wifi.

      • Ivan Uriarte

      Sí, claro. Es indiferente que uses WiFi o Ethernet.

    • Gonzalo Ruiz

    Hola tengo una duda, esta variable que representa String key = “?pass=1234”;

      • Ivan Uriarte

      Es una clave de seguridad muy simple. Si no la recibe antes de los valores, no te permite acceder.

    • Jack

    ¿Cómo hago para leer los datos que he enviado a la página, con un arduino. y que dependiendo del valor sensado, se prenda o no un led?

      • Ivan Uriarte

      Tendrías que hacer una página PHP para sacar los datos que quieras y que el Arduino se conecte a ella. Aquí hacemos algo parecido con ethernet https://www.prometec.net/ethernetled/

    • Carlos collado

    esto se podria hacer de la misma forma con un sensor biometrico

      • Ivan Uriarte

      No veo por qué no.

    • Laureano

    hola, que tendria que modificar para usarlo con el dht22 y que tendria que modificar para usarlo con thingspeak?

      • Ivan Uriarte

      Hola Laureano, descárgate la librería para el DHT22 y carga el ejemplo para ver cómo funciona. Para subirlo a thingspeak sólo tienes que poner los datos del servidor y url que te den desde ahí.

    • AMJ

    Hola muchas gracias por este y el resto de tus tutoriales!

    Tengo la duda si sería posible mostrar una imagen en el servidor que crea.
    Lo he intentado añadiendo la siguiente línea en el HTML pero no ha dado resultado:

    “”;

    He probado creando el servidor y una vez creado conectando el ESP al wifi y al contrario primero conectando el ESP a wifi y luego creando el servidor.
    Pero aún así no he sido capaz de hacer que me muestre una imagen.

    También intente guardándola en la memoria interna pero no lo he logrado.

    Cualquier referencia sería de gran ayuda.

    Gracias

      • Ivan Uriarte

      Hola Aaron, no hay manera de que deje ver el código. Nunca he probado a poner una imagen, lo que veo por ahí es que tienes que crear una carpeta “data” en el directorio del skecth y ahí meter la imagen (no más de 3MB) y este archivo html con el nombre index.html


      < !DOCTYPE html>

      This example shows image loading from ESP8266 Web server, Image and HTML
      web page files are uploaded in ESP Flash using SPIFFS tool:

      Image from ESP8266



    • Kevyn

    Saludos.
    Me sirvió bastante.
    Ahora quisiera mostrar la base de datos en una página web que he construido.
    Alguien tiene alguna idea para ayudarme?
    Saludos

      • Ivan Uriarte

      Hola Kevyn, tienes que hacerte una página php que muestre las líneas que quieras de la base de datos. Y el arduino que haga una petición a esa web. Un saludo.

    • Santamaría

    Intento conectarme a localhost, me conecta a la red wifi pero al probar con localhost genera connection failed alguna ayuda?

      • Ivan Uriarte

      Has creado el servidor y lo tienes arrancado?

    • Kevyn

    Es posible hacer el mismo proceso desde python?

      • Prueba TPV TPV

      Claro, con python seria igual de facil

    • Leticia

    Buenas tardes,
    he conseguido que mi arduino reconozca lo siguiente:
    Connecting to Hotel …… // wifi

    Connected to network

    My IP address is: 192.168.1.108 // ip arduino

    Connecting to SQL… OK. // conectado al sql myphpadmin

    pero cuando tu pones String url = “/dht11.php”;
    significa que en otro programa tienes un codigo para dht11 en php , ahí es cuando me surgen muchas dudas y no soy capaz de enviar los datos.

    si pudieras echarme una mano,
    gracias
    un saludo

      • Prueba TPV TPV

      Hola leticia, Un servidor web esta simepre escuchando lo que le escribes y puedes mandar el mensaje que quieras si el server lo procesa despues, pero no se nada de SQL que es un tema con sus propias manias

    • David

    hola, no me funciona me pueden mandar el codigo?

      • Ivan Uriarte

      Hola David, el código lo tienes en esta misma página. Qué problema estás teniendo?

Para porder realizar consultas a nuestros expertos, tienes que ser suscriptor. Suscribiendote nos ayudas a mantener este proyecto en marcha.

¡ Quiero Suscribirme !

Si ya eres premium y no puedes comentar haz login. Hacer login