Publicar datos de sensores en Internet a través de ThingSpeak

Hace quince días os enseñamos cómo poder conectar nuestro Arduino a Internet a través del módulo WiFi ESP8266. También comentamos un caso de ejemplo que estamos trabajando en el colegio como es la creación de un huerto hidropónico, en el cual vamos a conectar diferentes sensores para tomar valores de cada uno de ellos y a partir de aquí poder llevar un control o realizar cálculos estadísticos por ejemplo.

En un principio lo difícil no es programar estos sensores para recoger datos; a veces lo complicado es cómo consultar estos datos. Para ponernos la vida un poco más fácil, existen servicios como www.thingspeak.com, en la cual nos podemos sacar una cuenta gratuita que nos servirá para publicar estos datos. Pero… ¿cómo lo hacemos?

En cuanto a la parte de montaje en Arduino, vamos a usar el sensor DHT22 que nos ofrece temperatura y humedad, el cual ya lo hemos explicado anteriormente.

 

La parte interesante hoy es la de ThingSpeak.

ThingSpeak te ofrece la posibilidad de ir guardando diferentes tipos de datos, cada cual organizado en un canal distinto. Para crear este canal tendremos que rellenar un formulario donde como máximo podremos registrar hasta 8 campos diferentes.

www.thinkspeak.com

 

Una vez hemos completado la configuración y guardados los cambios, necesitaremos apuntar un par de datos que nos proporciona ThingSpeak y que deberemos incluir en el código:

  • El número de nuestro canal (Channel ID)
  • La clave de escritura (Write API Key)

 

En cuanto a la parte de programación en Arduino, para poder utilizar el DHT 22 y enviar datos a Thingspeak vamos a necesitar tener instalados en nuestro IDE de arduino algunas librerías:

  • Las librerías para el DHT 22 que ya instalamos y utilizamos en una entrada anterior. La librería “ThingSpeak.h” que instalaremos desde:
    • Programa – Incluir Librería – Gestionar Librerías
    • En la casilla filtrar búsqueda si escribimos  “thingspeak”, nos aparecerá la librería “ThingSpeak”. La seleccionamos y la instalamos.

Para usar el programa ejemplo que hemos dejado en la parte inferior de este artículo, debéis completar el programa con vuestros datos:

  • Nombre de vuestra conexión WiFi
  • Contraseña WiFi
  • Número de canal de ThingSpeak
  • ThingSpeak write API Key

El programa ejemplo lee cada 5 minutos la temperatura y humedad del DHT 22,  muestra los valores por el puerto serie y los enviar a nuestro canal de ThingSpeak.

Nosotros hemos configurado el canal como público, quien lo consulte verá la siguiente pantalla:

Ha continuación el código del programa con sus correspondientes comentarios explicativos:

// Open Lanuza Thingspeak Ver 1.3
//
//MEDIDOR DE TEMPERATURA Y HUMEDAD
//Publica datos en Thingspeak
//www.openlanuza.com

#include "DHT.h" // Librería sensores DHT
#include "ThingSpeak.h" // Include ThingSpeak Library
#include <ESP8266WiFi.h> // Include ESP8266wifi Library

#define DHTPIN D1 // pin al que hemos conectado el DHT 22

char ssid[] = "XXXXXXXX"; // Nombre del WiFi (nombre del router)
char pass[] = "XXXXXXXXXXXX"; // WiFi router password
unsigned long myChannelNumber = XXXXXX; // Thingspeak número de canal
const char * myWriteAPIKey = "XXXXXXXXXXXXXXXX"; // ThingSpeak write API Key

/* creamos el objeto DHT para utilizar sus funciones, especificando que nuestro
modelo es el DHT22. Existen otros como el DHT11
*/

DHT dht(DHTPIN, DHT22);

int status = WL_IDLE_STATUS;

WiFiClient client;

void setup() {

WiFi.begin(ssid, pass); // Inicia WiFi
ThingSpeak.begin(client); // Inicia ThingSpeak
dht.begin(); // Inicia el sensor

Serial.begin(115200); // Velocidad puerto serie

Serial.println();
Serial.print("Conectando a ");
Serial.print(ssid);

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

Serial.println();
Serial.println("Conectado a WiFi");
Serial.print("Dirección IP: ");
Serial.println(WiFi.localIP());

}

void loop() {

// Hacemos pausa de dos segundos antes de cada nueva medición
//al sensor le cuesta 250ms leer estos datos
delay(2000);

//leemos humedad
float h = dht.readHumidity();

// usamos variables tipo float para guardar valores decimales
// Leemos temperatura
float t = dht.readTemperature();

// Comprobamos si las lecturas pueden dar algún fallo mediante la función isnan()
// Esta función devuelve un 1 en caso de que el valor no sea numérico
// Los caracteres || son como un OR. Si se cumple una de las dos condiciones mostramos error
if (isnan(h) || isnan(t)) {
Serial.println("Fallo en la lectura del sensor DHT!");
return;
}

Serial.print("Humedad: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperatura: ");
Serial.print(t);
Serial.println(" *C\t ");

// Carga los valores a enviar
ThingSpeak.setField(1, t);
ThingSpeak.setField(2, h);

// Escribe todos los campos a la vez.
ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);

Serial.println("¡Datos enviados a ThingSpeak!");

// Añadimos un retraso para limtitar el número de escrituras en Thinhspeak

int duracionDelay = 300; //En segundos
for (int i = 0; i < duracionDelay; i ++) { //Esto es debido a que el máximo que el Arduino puede procesar con precisión es 5000ms o 5 segundos
delay (1000);
}

}

 

Para finalizar Enrique y Manuel Bonet, asiduos a nuestros talleres de Robótica en Familia, nos cuentan como realizar el montaje y la programación de forma detallada:

2 thoughts on “Publicar datos de sensores en Internet a través de ThingSpeak”

    1. hola, no entiendo la pregunta… Tus datos los tienes publicados en una página web, en thingspeak.. si quieres enviar los datos del arduino al correo es realmente complicado porque tienes que montar un servidor de correo y yo al menos desconozco la manera de hacerlo.
      Desde thingspeak tu puedes descargarte también tus datos en CSV, pero automatizar una tarea para exportar y enviar por correo yo diría que no tienen, o yo no conozco..

      no sé si te he ayudado..

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *