ESP8266 y Google SpreadSheets

En artículos anteriores abordamos el tema de guardar datos de los sensores en Excel, sea por medio de un script en Python que recibe los datos por medio de MQTT o mediante el puerto serie; en esta ocasión quiero trabajar con las planillas de calculo de Google, puesto que ofrecen la posibilidad de escribir scripts para automatizar tareas.

Serán estos scripts los que nos ayudaran a guardar la información de los sensores conectados al microcontrolador (para el ejemplo utilizare un ESP8266, pero puede ser cualquiera) en una planilla.

Utilizaremos un sensor de gases MQ-5 para el ejemplo, pero es posible utilizar cualquier sensor disponible; el objetivo es registrar en la planilla la fecha y hora de la medición y el valor de la lectura.

Comenzaremos ingresando en Google Drive y creando una Hoja de Cálculo nueva, la llamaremos nivelGas y en la columna A indicaremos como titulo Fecha y Hora; en la columna B Nivel Gas a modo informativo.

Luego que se haya guardado la planilla, debemos crear el script que realizara los cambios sobre la misma; para ello vamos al menú Herramientas – Editor de secuencias de comandos:

Se abrirá una nueva ventana en nuestro navegado que contiene un editor para que podamos cargar el código que utilizaremos:

Aquí debemos indicar el nombre del proyecto, en mi caso utilizare modificarHoja y debemos copiar el siguiente código:


1
2
3
4
5
6
7
8
9
10
function doPost(e) {
   var ss1 = SpreadsheetApp.getActiveSpreadsheet();
   var sheet = ss1.getSheets()[0];

   var fechaHora = Utilities.formatDate(new Date(), "GMT-3", "yyyy-MM-dd HH:mm:ss");
   valor = String(e.parameters.data);
   sheet.appendRow([fechaHora,valor]);
   
   return ContentService.createTextOutput("Completo");
}

Este sencillo programa toma la hoja de cálculos abierta y de la misma identifica la primer hoja y por ultimo agrega una fila con los datos que fueron enviados desde el NodeMCU.

Por ultimo debemos establecer los permisos y accesos sobre el script para poder ejecutar correctamente, debemos ir a Publicar – Implementar como aplicación web

Debemos elegir que se ejecute como nuestro usuario y que cualquier persona incluso los anónimos tengan acceso a la aplicación; luego confirmamos las opciones que se nos presenta.

Copiamos la url que nos presenta, la utilizaremos en el programa del ESP8266.

Construiremos un sencillo circuito para tomar datos del entorno y guardarlos en la hoja de calculo, utilizaremos un sensor de gas MQ-5 que va conectado:

NodeMCUMQ-5
3v3VCC
GNDGND
A0A0

En el Arduino IDE utilizaremos las librerías y variables siguientes:


1
2
3
4
5
6
7
8
9
10
11
12
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>

const char* ssid = "SSID"; //Replace with your own
const char* password = "PASSWORD";

const char* myDomain = "script.google.com";

String script = "/macros/s/XXXXXXXXXXXXXXXXXXXXX/exec";

long ultimoReporte=0;
long periodoReportes = 60 * 1000;

Donde ssid y password reemplazamos por los valores correspondientes a nuestra red wifi y en el variable script reemplazamos XXXXXXXXXXXXXXXXXXXXX por la correspondiente que nos otorgo Google Script.

Luego el metodo setup() es sencillo solo establecemos la salida serie y la conexion a la red. En el metodo loop tendremos lo siguiente:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
void loop() {
 
  if ((millis() - ultimoReporte) > periodoReportes) {
   
    if(WiFi.status() != WL_CONNECTED) {
      setup_wifi();
    }
    ultimoReporte = millis();
    int valor = analogRead(0);
    Serial.println(valor);
    enviarDatosCloud(valor);
  }

}

Respecto a la función enviarDatosCloud(), es la que se conecta al script de Google y pasa los parametros determinados:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
void enviarDatosCloud(int valor) {
  WiFiClientSecure clientSecure;
  if (clientSecure.connect(myDomain, 443)) {
    Serial.println("Connection successful");  

    String Data = "data="+String(valor);
    clientSecure.println("POST " + script + " HTTP/1.1");
    clientSecure.println("Host: " + String(myDomain));
    clientSecure.println("Content-Length: " + String(Data.length()));
    clientSecure.println("Content-Type: application/x-www-form-urlencoded");
    clientSecure.println();
   
    clientSecure.print(Data);    
    Serial.println("Waiting for response.");
    long int StartTime=millis();
    while (!clientSecure.available()) {
      Serial.print(".");
      delay(100);
      if ((StartTime+60000) < millis()) {
        Serial.println();
        Serial.println("No response.");
        break;
      }
    }
    Serial.println();
   
    while (clientSecure.available()) {
      Serial.print(char(clientSecure.read()));
    }  
   
  } else {
    Serial.println("Connected to " + String(myDomain) + " failed.");
  }
  clientSecure.stop();
}

Si todo esta correcto deberíamos poder compilar y al cabo de 60 segundos se actualizara nuestra hoja de cálculo; podemos cambiar el tiempo de actualización cambiando el valor de la variable periodoReportes.

En breve publicare en github el repositorio con el código del ejemplo.

ESP32-Cam: Subir fotos a Google Drive

En el articulo anterior sobre el ESP32-CAM vimos cuales son los primeros pasos para comenzar a utilizarlo y como obtener imágenes desde el dispositivo con un sencillo script en Python; en esta ocasión veremos como tomar fotos y subirlos a una carpeta de Google Drive de manera de que nos sirva de punto de partida para otras aplicaciones.

El primer paso consiste en utilizar el script de Google para construir un sencillo programa que reciba la imagen y la almacene dentro de una carpeta determinada, para ello debemos ir a Google Drive – Nuevo – Más – Google Apps Scripts

Se va a presentar un editor para que escribamos el código como el siguiente::

Reemplazaremos el contenido total por el siguiente Reem:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function doPost(e) {
  var data = Utilities.base64Decode(e.parameters.data);
  var nombreArchivo = Utilities.formatDate(new Date(), "GMT-3", "yyyyMMdd_HHmmss")+".jpg";
  var blob = Utilities.newBlob(data, e.parameters.mimetype, nombreArchivo );
 
 
  var folder, folders = DriveApp.getFoldersByName("ESP32-CAM");
  if (folders.hasNext()) {
    folder = folders.next();
  } else {
    folder = DriveApp.createFolder("ESP32-CAM");
  }
  var file = folder.createFile(blob);
 
  return ContentService.createTextOutput("Completo.")
}

El programa lo que hace es recibir tres parámetros:
1. La data en si, que consiste en la imagen, codificada en base64
2. El tipo de dato que se envía, en este caso sera image/jpeg
3. También recibe el nombre del archivo, aunque no lo utilizamos porque tomamos la fecha y hora para darle el nombre, de manera que quede organizado.

El paso siguiente es guardar el script y publicarlo como aplicación web, esto ultimo lo hacemos desde Publicar – Implementar como aplicación web; debemos elegir que se ejecute como nuestro usuario y que cualquier persona incluso los anónimos tengan acceso a la aplicación; luego confirmamos las opciones que se nos presenta.

En la ultima opción Google nos mostrar una url donde estará publicada nuestra aplicación; debemos copiar esta url, la utilizaremos en el programa del ESP32-CAM.

La url provista tendra el siguiente formato:

https://script.google.com/macros/s/XXXXXXXXXXXXXX/exec

Donde las XXXXXXXXXXXXXX serán reemplazadas por una secuencia alfanumérica que identifica a la aplicación.

En este punto estamos listos para cargar el programa en el ESP32-CAM, crearemos un nuevo programa con el IDE de Arduino llamado ESP32-CAM_Drive, de manera que nos cree la carpeta donde esta el archivo ESP32-CAM_Drive .ino; en dicha carpeta copiaremos los archivos Base64.cpp y Base64.h.

Dentro del archivo ESP32-CAM_Drive.ino al comienzo debemos reemplazar tres parámetros importantes: el nombre y contraseña de la red WiFiy la url del script que creamos anteriormente.


1
2
3
const char* ssid     = "SSID";   //your network SSID
const char* password = "PASSWORD";   //your network password
String myScript = "/macros/s/XXXXXXXXXXXXXX/exec";    //Replace with your own url

La lineas anteriores debemos reemplazar el código por los propios.

Para cargar el programa puede repasar el articulo anterior o ver video. Luego que se cargue el programa, desconectamos el GND de IO0 y reiniciamos el ESP32, al cabo de unos instantes se conectara a la red inalambrica, obtendra la foto y la subira al Drive, si vemos en el Monitor serie veremos algo similar a esto:

El programa creara una carpeta llamada ESP32-CAM dentro de Google Drive y en la misma guardara las imagenes, si revisamos la carpeta tendremos las fotos que saco el dispositivo:

La foto del Nano Osciloscopio.

Pueden encontrar el repositorio en GitHub.