bclose

ESP8266: Subir datos a un servidor mediante WiFi

ESP8266 como cliente

 

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.

#include <DHT11.h>
#include <ESP8266WiFi.h>

DHT11 dht11(D4);

const char* ssid = "Euskaltel-cs7A";
const char* password = "xxxxxxxx";

const char* host = "prometecserver.ddns.net";

En el setup establecemos la conexión con la red WiFi y mostramos por el puerto serie la dirección IP que nos ha asignado.

void setup()
{
 Serial.begin(9600);
 // We start by connecting to a WiFi network

 Serial.println();
 Serial.println();
 Serial.print("Connecting to ");
 Serial.println(ssid);

 WiFi.begin(ssid, password);

 while (WiFi.status() != WL_CONNECTED) {
 delay(500);
 Serial.print(".");
 }

 Serial.println("");
 Serial.println("WiFi connected");
 Serial.println("IP address: ");
 Serial.println(WiFi.localIP());
}

Y ya en loop lo primero que haremos será obtener los datos de temperatura y humedad de las misma forma que en el apartado anterior. Una vez los tenemos vamos a utilizar la clase WiFIClient para establecer una conexión TCP. Para ello tenemos que declarar una serie de Strings a partir de las cuales montaremos la URL completa a la que nos vamos a conectar.

 
  • El símbolo “?” indica que empieza el envío de parámetros al servidor.
  • Después del símbolo “?” enviamos los parámetros identificándolos con su nombre y fijando su valor separados por el símbolo “&”.
  • En nuestro caso los parámetros son la contraseña “pass” y los datos del sensor “Temperatura” y “Humedad”.
  • Existen dos formas de enviar los datos a la página, mediante GET o POST. Ambos envían una petición y reciben una respuesta aunque de una forma un poco diferente, y ambos funcionarían en el programa (podéis buscar información de sus diferencias fácilmente).
 

Ahora ya podemos enviar la petición al servidor:

 Serial.print("connecting to ");
 Serial.println(host);

 // Use WiFiClient class to create TCP connections
 WiFiClient client;
 const int httpPort = 80;
 if (!client.connect(host, httpPort)) {
 Serial.println("connection failed");
 return;
 }

 // We now create a URL for the request
 String url = "/dht11.php";
 String key = "?pass=1234";
 String dato1 = "&Temperatura=";
 String dato2 = "&Humedad=";

 Serial.print("Requesting URL: ");
 Serial.println(url);

 // This will send the request to the server
 client.print(String("GET ") + url + key + dato1 + temp + dato2 + hum + " HTTP/1.1\r\n" +
 "Host: " + host + "\r\n" +
 "Connection: close\r\n\r\n");
 unsigned long timeout = millis();
 while (client.available() == 0) {
 if (millis() - timeout > 5000) {
 Serial.println(">>> Client Timeout !");
 client.stop();
 return;
 }
 }

Y ya por último leemos la respuesta del servidor y cerramos la conexión. Además le vamos a poner un delay para que suba los datos cada 60 segundos. Vosotros podéis adaptar el tiempo al que mejor os parezca.

  // Read all the lines of the reply from server and print them to Serial
 while (client.available()) {
 String line = client.readStringUntil('\r');
 Serial.print(line);
 }

 Serial.println();
 Serial.println("closing connection");

 delay(60000);

Aquí os dejamos el programa completo: Esp8266_DHT11_Cliente. 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.

(7) Comments

  • Buenas,

    Quisiera saber si podrian facilitarme un link para descargar las librerias del modulo ESP8266. Encontre unas pero me dan errores.

    Es importante destacar que estoy usando el IDE de arduino 1.0.6 ya que utilizo un shield para mi proyecto que solo funciona con ese IDE. no se si eso sea el inconveniente que estoy teniendo con esas librerias.

    Saludos.

  • Hola una pregunta si no tengo creado el servidor con lra Raspberry, pero lo tengo creado con mi pc, debo poner en el nombre del host 17.0.0.1? y otra mas debo tener los dos archivos de php que se ven en el post de crear una base con Raspbery para que se pueda conectar a mi base de datos ? saludos

    • Hola Danilo, para subir los datos tienes que poner la ip local del pc en el que tengas el servidor. Los archivos php son para crear las páginas de prueba y la que sirve para subir los datos y guardarlos en las tablas de la base de datos mysql.

    • Pepe Romero

    Hola. Tengo una shield con tres sensores que se comunican mediante el protocolo I2C con Arduino, usando para ello la librería Wire. Por el puerto serie muestro el nombre de las variables y sus valores.

    ¿Puedo usar esta misma comunicación I2C para que el módulo WIFI ESP8266-01 (el de 8 pines) envíe los valores a un servidor? ¿O en su defecto enviar todo lo que sale por el puerto serie?

    Agradezco sus tutoriales.

    • Hola Pepe, El esp8266-01 no dispone de pines I2C al exterior por lo que no te va a servir para eso, pero si que puedes comunicar por la puerta serie cuanto quieras.

      Si quieres utilizar un unico arduino con wifi te recomiendo que revises el nodemcu que es excelente

      • El mensaje que sale por el puerto serie cada X tiempo con el conjunto de sensores es del tipo “Temperatura = X ºC, Humedad = X % ….”.

        ¿Entonces si conecto los pines RX y TX del módulo de sensores a TX y RX del ESP8266-01 puedo mandar toda esa información a un servidor? Ya sería cuestión de usar parser (o como se llame) para separar los distintos valores y organizarlos en la base de datos, ¿no?

        Todo esto lo comento para no tener que comprar el Nodemcu ahora mismo, si es que me puedo apañar para ello con lo que tengo actualmente.

Give a Reply

WordPress Anti-Spam by WP-SpamShield

¡Ofertón!

Robot Rover 4×4

Ahora por sólo

50€ + IVA

¡Lo quiero!