Con el creciente número de dispositivos IOT, también se han aumentado las formas en la cuales almacenar los datos que estos recogen para su posterior análisis. En algunos casos los datos que son recolectados sirven para hacer funcionar otro tipo de mecanismos o para mejorar el funcionamiento de algún sistema. En esta entrada vamos a mostrar la forma de construir un dispositivo TempLogger por nosotros mismos y a enviar los datos recolectados a un documento de Google Sheets, donde se almacenarán para su posterior análisis.
El dispositivo: TempLogger
Para construir este dispositivo vamos a utilizar únicamente tres elementos principales. Primero utilizaremos una placa NodeMCU ESP8862, la cual tiene la capacidad de fábrica de conectarse a través de WiFi; esto será muy útil para poder conectarnos a nuestra Web App y enviar los datos para que queden debidamente almacenados en nuestro documento de Google Sheets. Otra ventaja de utilizar esta placa es que puede ser programada directamente con el IDE de Arduino sin mayor trabajo.
Además de esta placa vamos a utilizar un sensor DHT22 para poder capturar la temperatura ambiente y la humedad relativa del ambiente. También se puede utilizar el sensor DHT11, pero el que utilizaremos es mejor que este. Es una de las partes más importantes del TempLogger por obvias razones. Además de esto utilizaremos algunos cables dupont para hacer las conexiones necesarias. Como algo extra podemos utilizar una mini breadboard para hacer las conexiones de manera más cómoda, aunque también se puede montar el dispositivo sin esta pieza.
TempLogger paso 1: Preparar el documento en Google Sheets

Primero se debe tener una cuenta de Google y con está creamos una documento nuevo de Google Sheets. A este nuevo libro o documento le tenemos que poner un nombre que haga referencia al proyecto en el cual estamos trabajando. También debemos colocar un nombre que identifique la hoja en la cual queremos que nuestro dispositivo transmita los datos que capture. Estos dos nombres debemos apuntarlos en algún lugar, porque no servirán al momento de cargar el código en el editor de la Web App.
TempLogger paso 2: Preparar la Web App en Google Sheets

Dentro de nuestro documento que hemos creado vamos al menú ‘Extensiones’ y dentro de este menú elegimos la opción de Apps Script. Entraremos en el editor donde deberemos pegar el código que hemos descargado en el archivo adjunto, una vez hemos pegado el código debemos modificar un par de parámetros de él para que funcione de manera correcta.


Debemos cambiar el ‘Sheet ID’ dentro del código, este ID lo obtenemos de la URL del documento que hemos creado, una vez tengamos el ID, nos guiamos con los comentarios del código para saber donde hay que pegarlo. De todas formas te dejo un captura donde debe de ir.
Dejo aquí el código y algunas librerías necesarias para hacer este ejercicio. El archivo con extensión .gs es el que se tiene que subir a este editor y hacer los cambios que se mencionan para que funcione.
Una vez hemos agregado el ID de nuestro documento y el nombre de la hoja es momento de hacer la publicación de la Web App para que Google nos provea el ‘Script ID’ que este nos servirá para colocarlo en el código que quemaremos en nuestro placa.
Publicar la Web App de Google Sheets




Hacemos click sobre el botón de ‘Implementar’ y en ese menú elegimos ‘Nueva Implementación’. Hacemos click en el engranaje y elegimos ‘Aplicación Web’. En la descripción ponemos un nombre a nuestro proyecto, en la aplicación web elegimos nuestro correo electrónico y en la lista donde determinamos quién tiene acceso elegimos ‘Cualquier Usuario’.





Una vez implementemos, Google nos pedirá que autoricemos la Web App, al momento que aparezca el cuadro donde nos indica que la aplicación no está verificamos tenemos que elegir la opción ‘Advanced’, luego hacemos click sobre el nombre de nuestra Web App y en el siguiente cuadro, elegimos ‘Allow’. En el siguiente cuadro Google nos proporciona nuestro Google Script ID. Este también debemos de apuntarlo en algún lado y guardarlo, porque lo pondremos en el código de nuestra placa.
Código de la Placa
En el código de la placa debemos poner el el Google Script ID, donde nos indican los comentarios, aunque también coloca una screen en está entrada. Además de este ID debemos también de colocar el nombre de la red WiFi donde se conectará el dispositivo y la contraseña correspondiente.
#include <ESP8266WiFi.h>
#include "HTTPSRedirect.h"
#include "DebugMacros.h"
#include <DHT.h>
#define DHTPIN D4 // El pin digital donde hacemos la conexión
#define DHTTYPE DHT22 // Seleccionar el tipo de sensor que vamos a utilizar
DHT dht(DHTPIN, DHTTYPE);
float h;
float t;
String sheetHumid = "";
String sheetTemp = "";
const char* ssid = ""; // Reemplazar con el nombre de red de nuestra WiFi
const char* password = ""; // Reemplazar con la contraseña de nuestra red
const char* host = "script.google.com";
const char *GScriptId = ""; // Reemplazar con el scriptID de nuestro documento
const int httpsPort = 443; //El puerto https es el mismo
// echo | openssl s_client -connect script.google.com:443 |& openssl x509 -fingerprint -noout
const char* fingerprint = "";
//const uint8_t fingerprint[20] = {};
String url = String("/macros/s/") + GScriptId + "/exec?value=Temperatura"; // Escribe Temperatura en la celda A1 de nuestro documento
// Fetch Google Calendar events for 1 week ahead
String url2 = String("/macros/s/") + GScriptId + "/exec?cal"; // Escribe en la celda A de manera continua
// Reemplazar con el nommbre de la hoja de nuestro documento no confundir con el nombre del documento
String payload_base = "{\"command\": \"appendRow\", \
\"sheet_name\": \"TempSheet\", \
\"values\": ";
String payload = "";
HTTPSRedirect* client = nullptr;
// Utilizado para almacenar los valores de aumulacion libre antes que el HTTPSRedirect se inicie
// Para que puedan se escritos en el documento Google Sheets antes de la iniciazión
void setup() {
delay(1000);
Serial.begin(115200);
dht.begin(); // inicia el DHT22
Serial.println();
Serial.print("Connecting to wifi: ");
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());
// Usa la clase HTTPSRedirect para crear una nueva conexion TLS
client = new HTTPSRedirect(httpsPort);
client->setInsecure();
client->setPrintResponseBody(true);
client->setContentTypeHeader("application/json");
Serial.print("Connecting to ");
Serial.println(host); // Trata de conectar con "script.google.com"
// Trata de hacer conexión 5 veces y luego desiste
bool flag = false;
for (int i = 0; i < 5; i++) {
int retval = client->connect(host, httpsPort);
if (retval == 1) {
flag = true;
break;
}
else
Serial.println("Connection failed. Retrying...");
}
if (!flag) {
Serial.print("Could not connect to server: ");
Serial.println(host);
Serial.println("Exiting...");
return;
}
// Finish setup() esta funcion es de un segundo para encender el temporizador del Wathdog y resetear el chip.
// Para evitar demasiadad solicitudes en setup()
Serial.println("\nWrite into cell 'A1'");
Serial.println("------>");
// busca la data de la hoja de calculo
client->GET(url, host);
Serial.println("\nGET: Fetch Google Calendar Data:");
Serial.println("------>");
// busca la data de la hoja de calculo
client->GET(url2, host);
Serial.println("\nStart Sending Sensor Data to Google Spreadsheet");
// borra el objeto HTTPSRedirect
delete client;
client = nullptr;
}
void loop() {
delay(30000);
h = dht.readHumidity(); // Las lecturas de humedad y temperatura toman 250 milisegundos
t = dht.readTemperature(); // Lee la temperatura en celcius
if (isnan(h) || isnan(t)) { // Comprueba si hay algunas lecturas y termina
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
Serial.print("Humidity: "); Serial.print(h);
sheetHumid = String(h) + String("%"); // Convierte le humedad entera en una caracater
Serial.print("% Temperature: "); Serial.print(t); Serial.println("°C ");
sheetTemp = String(t) + String("°C");
static int error_count = 0;
static int connect_count = 0;
const unsigned int MAX_CONNECT = 20;
static bool flag = false;
payload = payload_base + "\"" + sheetTemp + "," + sheetHumid + "\"}";
if (!flag) {
client = new HTTPSRedirect(httpsPort);
client->setInsecure();
flag = true;
client->setPrintResponseBody(true);
client->setContentTypeHeader("application/json");
}
if (client != nullptr) {
if (!client->connected()) {
client->connect(host, httpsPort);
client->POST(url2, host, payload, false);
Serial.print("Sent : "); Serial.println("Temp and Humid");
}
}
else {
DPRINTLN("Error creating client object!");
error_count = 5;
}
if (connect_count > MAX_CONNECT) {
connect_count = 0;
flag = false;
delete client;
return;
}
// Serial.println("GET Data from cell 'A1':");
// if (client->GET(url3, host)) {
// ++connect_count;
// }
// else {
// ++error_count;
// DPRINT("Error-count while connecting: ");
// DPRINTLN(error_count);
// }
Serial.println("POST or SEND Sensor data to Google Spreadsheet:");
if (client->POST(url2, host, payload)) {
;
}
else {
++error_count;
DPRINT("Error-count while connecting: ");
DPRINTLN(error_count);
}
if (error_count > 3) {
Serial.println("Halting processor...");
delete client;
client = nullptr;
Serial.printf("Final free heap: %u\n", ESP.getFreeHeap());
Serial.printf("Final stack: %u\n", ESP.getFreeContStack());
Serial.flush();
ESP.deepSleep(0);
}
delay(15000); // El retardo se debe de mantener al menos de 2 segundos para que el sensor funcione bien y recomiendo no subirlo mas de 10 segundos
}
Una vez tengamos todo esto configurado es hora de hacer el cableado del dispositivo y colocarlo en el lugar donde queremos que tome las medidas de temperatura y humedad relativa. Una vez el dispositivo comience a transmitir nuestra hoja de cálculo comenzará a recibir datos y se irá construyendo una tabla con la información recolectada.

En el código he dejado un retraso de 3 segundos entre cada toma de datos, recomiendo dejar valores similares, ya que si este intervalo sube al rango de minutos, por alguna razón la hoja de cálculo deja de grabar los datos. Creería que tiene algo que ver con el tiempo que deja el dispositivo en reposo la hoja de cálculo.
Resultado
Luego de desplegar nuestro dispositivo en la sala de mi hogar, logre hacer que el dispositivo transmitiera de forma ininterrumpida durante 3 días. Cabe mencionar que mi dispositivo lo alimente directamente de un toma corriente de la sala de mi casa con una fuente con conector USB, si no se puede contar con una alimentación de esta forma, al diseño del dispositivo arriba descrito, se le debe añadir una batería que lo mantenga funcionando. También debo mencionar que el código no funciona bien si uno aumenta el tiempo de retraso de ejecución del mismo, por lo tanto tuve que dejarlo tomando medidas cada 15 segundos. Una lectura cada 15 segundos durante 3 días dieron como resultado bastantes registros en nuestro documento en Google Sheets, aún así no hubo ningún problema con el almacenamiento de nuestros datos.

Aquí el resultado de los dato recolectados, hemos cruzado la variables de temperatura del aire y de la humedad relativa del aire, para poder sacar patrones de comportamiento a lo largo del día. Podemos ver que tienen un comportamiento inverso y como se van moviendo a medida van avanzado el día.
Conclusión
La opción de poder almacenar los datos recolectados por nuestros dispositivos directamente en un documento de Google Sheets, es algo que facilita bastante la tarea de hacer monitoreo atmosférico a nivel de nuestro hogar, ya que nos ahorramos el hecho de tener que agregar al dispositivo una tarjeta SD para almacenar lo recolectado. Únicamente le faltó a este dispositivo el agregar un módulo de reloj para saber la hora y fecha en la que se toma cada lectura, pero en otra entrada muestro como hacer esto.
Ojala encuentren útil la información de esta entrada.
Saludos a todos.-
Israel es un Xennial entusiasta del PC Case Modding y del hardware en general. Ha surfeado la web desde 1995 y ha pasado toda su vida rodeado de PCs, Legos y Nintendos. Siempre aprendiendo algo fuera de las aulas. Cree firmemente que si el hardware no se puede modificar, en realidad no te pertenece y que las computadoras tienen el corazón de quien las diseña y construye.

