Capa do Artigo Como usar o ESP8266 com o Google Sheets

Como enviar dados do ESP8266 para o Google Sheets 10

Existe uma grande variedade de sensores para aquisição de dados através do ESP8266. Neste post, veremos como inserir os dados lidos pelo ESP8266 em uma planilha do Google Sheets. Dessa forma, podemos facilmente manipular os dados adquiridos e monitorá-los em tempo real.

Imagem de ESP8266 com Google Sheet.
Planilha com Google Sheets com uma imagem do ESP8266 sobreposta.

Materiais Necessários

Para montagem do circuito exemplo utilizaremos os seguintes componentes:

Circuito do ESP8266

Na imagem abaixo vemos a montagem do circuito exemplo. O potenciômetro representa um sensor analógico, mas qualquer dispositivo compatível com o ESP8266 pode ser usado para aquisição de dados.

Diagrama de montagem do ESP8266 e um potenciômetro no fritzing para uso com o Google Sheets.
Conexão do ESP8266 com um potenciômetro utilizando uma protoboard.

Configuração do Google Sheets para conversar com o ESP8266

O primeiro passo é criar uma nova planilha no Google Sheets e anotar a chave, que pode ser encontrada no URL conforme mostrado abaixo.

Barra de endereço do Chrome com Google Sheet e a chave constante na url.
Detalhe da chave dessa planilha do GoogleSheets.

Agora, mude o nome da Página 1 para ‘Sheet1’ e monte a primeira linha conforme a mostrada na imagem abaixo.

Cabeçalho da planilha com os campos: Date, Time, value0, value1, value2.
Detalhe do cabeçalho da planilha do google sheet.

Na barra superior vá em Ferramentas → Editor de Script e cole o código abaixo substituindo a chave da planilha que anotou nos passos anteriores.

var SS = SpreadsheetApp.openById('insira-aqui-a-chave-da-planilha');
var str = "";
 
 
function doPost(e) {
 
  var parsedData;
  var result = {};
  
  try { 
    parsedData = JSON.parse(e.postData.contents);
  } 
  catch(f){
    return ContentService.createTextOutput("Error in parsing request body: " + f.message);
  }
   
  if (parsedData !== undefined){
    var flag = parsedData.format;
    if (flag === undefined){
      flag = 0;
    }
    
    var sheet =  SS.getSheetByName("MAIN"); 
    var dataArr = parsedData.values.split(",");
         
    var date_now = Utilities.formatDate(new Date(), "CST", "yyyy/MM/dd"); 
    var time_now = Utilities.formatDate(new Date(), "CST", "hh:mm:ss a");
    
    var value0 = dataArr [0];
    var value1 = dataArr [1];
    var value2 = dataArr [2]; 
   
    switch (parsedData.command) {
      
      case "insert_row":
         
         sheet.insertRows(2);
         
         sheet.getRange('A2').setValue(date_now);
         sheet.getRange('B2').setValue(time_now);
         sheet.getRange('C2').setValue(value0);
         sheet.getRange('D2').setValue(value1); 
         sheet.getRange('E2').setValue(value2);
         
         str = "Success";
         SpreadsheetApp.flush();
         break;
         
      case "append_row":
         
         var publish_array = new Array();
         publish_array [0] = date_now;
         publish_array [1] = time_now;
         publish_array [2] = value0;
         publish_array [3] = value1;
         publish_array [4] = value2;
         
         sheet.appendRow(publish_array);
         
         str = "Success";
         SpreadsheetApp.flush();
         break;     
 
    }
    
    return ContentService.createTextOutput(str);
  }
  
  else{
    return ContentService.createTextOutput("Error! Request body empty or in incorrect format.");
  }
}

Clique no ícone de Salvar e vá em Implementar → Nova Implementação.

Tela do GoogleSheet com as opções Implementar e Nova implementação.
Criando nova implementação do código no googlesheet.

Agora basta clicar em Implantar e anotar o código de implantação.

Telas de configuração da nova implementação com a chave para vincular o ESP8266 ao GoogleSheet.
Detalhe de onde encontrar a chave da nova implementação.

Código

No código abaixo, substitua o nome e a senha da sua rede WiFi e o ID do Google Scripts (código de implantação).

Antes de fazer upload dos código no seu microcontrolador, é necessário adicionar os arquivos disponibilizados na mesma pasta do sketch.

//Config-----------------------------------------------------------
const char* ssid        = "insira-aqui-o-nome-da-sua-rede-wifi";
const char* password    = "insira-aqui-a-senha-da-sua-rede-wifi";


const char* GScriptId   = "insira-aqui-o-seu-id-do-google-scripts";
//-----------------------------------------------------------------


String payload_base =  "{\"command\": \"append_row\", \"sheet_name\": \"Sheet1\", \"values\": ";
String payload = "";

const char* host        = "script.google.com";
const int   httpsPort   = 443;
String      url         = String("/macros/s/") + GScriptId + "/exec?cal";


//WiFi----------------------
//#include <WiFi.h>
#include <ESP8266WiFi.h>
#include "HTTPSRedirect.h"


//Objects----------------------------------
HTTPSRedirect* client = nullptr;
//-----------------------------------------


//Control Variables------------------------
int value0 = 0;
int value1 = 0;
int value2 = 0;
//-----------------------------------------


void setup()
{
  Serial.begin(115200);

  //WiFi Setup
  Serial.print("Conectando ao WiFi...");
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED){ Serial.print("."); delay(500); }
  Serial.println("[OK]");

  //HTTPS Redirect Setup
  client = new HTTPSRedirect(httpsPort);
  client->setInsecure();
  client->setPrintResponseBody(true);
  client->setContentTypeHeader("application/json");
  Serial.print("Conectando ao Google...");

  bool flag = false;
  for (int i=0; i<5; i++)
  { 
    int retval = client->connect(host, httpsPort);
    if (retval == 1)
    {
       flag = true;
       Serial.println("[OK]");
       break;
    }
    else
      Serial.println("[Error]");
  }
  if (!flag)
  {
    Serial.print("[Error]");
    Serial.println(host);
    return;
  }
  delete client;
  client = nullptr;
}

void loop()
{
  value0 ++;
  value1 = analogRead(0);
  value2 = value1/1023*3.3;

  static bool flag = false;
  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); } }
  else { Serial.println("[Error]"); }
  
  payload = payload_base + "\"" + value0 + "," + value1 + "," + value2 + "\"}";
  
  Serial.println("Enviando...");
  if(client->POST(url, host, payload)){ Serial.println(" [OK]"); }
  else { Serial.println("[Error]"); }
  
  delay(10000);  
}

Agora, basta deixar o ESP ligado e observar os dados aparecerem na sua planilha. O procedimento apresentado nesse post pode ser integrado em diversos projetos como, por exemplo, um sistema de monitoramento de umidade e temperatura ou até mesmo um registro de quando um dispositivo é ligado ou desligado.

Gostou de aprender como enviar dados para uma Planilha do Google Sheets através do ESP8266? Deixe um comentário aqui embaixo nos contando o que achou. Se ficou com alguma dúvida ou quiser compartilhar o resultado de um projeto, acesse nossa Comunidade Maker no Facebook.

Faça seu comentário

Acesse sua conta e participe

10 Comentários

  1. Olá Italo, ótimo post. Tentei fazer o experimento mas não estou conseguindo, recebo essa mensagem no serial:

    Enviando…
    Errobody {background-color: #fff; margin: 0; padding: 0;}.errorMessage {font-family: Arial,sans-serif; font-size: 12pt; font-weight: bold; line-height: 150%; padding-top: 25px;}Função de script não encontrada: doPost

    [OK]

    Você teria ideia de como resolver esse problema? Agradeço desde já

    1. Olá Rodrigo!

      Você fez a implementação na parte de ferramentas e scripts na planilha?
      Colou a chave de implementação do script na linha 6 do código carregado no NodeMCU?
      A função está escrita doPost no script da planilha, respeitando os caracteres maiúsculos e minúsculos?

      Abraços!
      Vinícius – Equipe FilipeFlop

  2. Olá Ìtalo. Muito legal seu post. Tentei implementar com meu módulo ESP8266 mas quando compilo para carregar no final tenho um erro: “Erro compilando para a placa Generic ESP8266 Module”. Já confirmei a biblioteca varias vezes e porta. Você saberia como corrigir por favor? Abaixo tem mais detalhes do erro. Grato se puder ajudar.

    Mensagem de erro com mais detalhes:
    Arduino: 1.8.15 (Windows Store 1.8.49.0) (Windows 10), Placa:”Generic ESP8266 Module, 80 MHz, Flash, Disabled (new aborts on oom), Disabled, All SSL ciphers (most compatible), 32KB cache + 32KB IRAM (balanced), Use pgm_read macros for IRAM/PROGMEM, dtr (aka nodemcu), 26 MHz, 40MHz, DOUT (compatible), 1MB (FS:64KB OTA:~470KB), 2, nonos-sdk 2.2.1+100 (190703), v2 Lower Memory, Disabled, None, Only Sketch, 115200″

    c:/users/marcio/onedrive/documentos/arduinodata/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.0.4-gcc10.3-1757bed/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: libraries\HTTPSRedirect-main\config.cpp.o:C:\Users\MARCIO\OneDrive\Documentos\Arduino\libraries\HTTPSRedirect-main/config.cpp:11: multiple definition of `GScriptId’; sketch\teste_esp8266_na_internet_2.ino.cpp.o:C:\Users\MARCIO\OneDrive\Documentos\Arduino\Meus Códigos\teste_esp8266_na_internet_2/teste_esp8266_na_internet_2.ino:6: first defined here

    c:/users/marcio/onedrive/documentos/arduinodata/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.0.4-gcc10.3-1757bed/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: libraries\HTTPSRedirect-main\config.cpp.o:C:\Users\MARCIO\OneDrive\Documentos\Arduino\libraries\HTTPSRedirect-main/config.cpp:8: multiple definition of `host’; sketch\teste_esp8266_na_internet_2.ino.cpp.o:C:\Users\MARCIO\OneDrive\Documentos\Arduino\Meus Códigos\teste_esp8266_na_internet_2/teste_esp8266_na_internet_2.ino:13: first defined here

    collect2.exe: error: ld returned 1 exit status
    exit status 1
    Erro compilando para a placa Generic ESP8266 Module

  3. Muito bom! Parabéns!

    1. Valeu, João!!!

  4. Olá… não estou conseguindo carregar o codigo… me retorna erro após adicionar os arquivos. Sabe me informar o que pode estar acontecendo?

    1. Olá Jonathan
      Substitua ‘value2 = value/1023*3.3;’ por ‘value2 = value1/1023*3.3;’ no código, cometi um erro ao passar o código para o post. Quanto aos arquivos, garanta que todos estejam na mesma pasta que o arquivo .ino do sketch.

      1. Olá Ítalo… Tudo certo?
        Consegui carregar o sketch e também obtenho no monitor serial o que segue: (realizei uma alteração na aquisição dos dados com base em incremento (apenas para termos algum dado). também imprimi na serial mais dados para verificação)

        Enviando…
        Errobody {background-color: #fff; margin: 0; padding: 0;}.errorMessage {font-family: Arial,sans-serif; font-size: 12pt; font-weight: bold; line-height: 150%; padding-top: 25px;}TypeError: Cannot read property 'appendRow' of null (linha 58, arquivo "Código")

        url: /macros/s/AKfycbzEVxXF6HHdlVl-w8NNqaP5tOM7I_ymFVuRXRTBWsSuzbMUT-zyo33r_UOvOfbfBlg/exec?cal
        host: script.google.com
        payload: {“command”: “append_row”, “sheet_name”: “Sheet1”, “values”: “6,7,9”}
        [OK]

        Porém, nada é exibido na planilha… e depois de alguns ciclos ocorrem vários erros de comunicação com o host. Consegue me dar uma ideia de o que posso estar fazendo de errado?

        1. Verifique se mudou o nome da Página da planilha de Página1 para Sheet1 no canto inferior esquerdo.

        2. Oi Jonathan, tive o mesmo problema.
          Resolvi acrescentando a linha

          var publish_array = new Array();

          Abaixo da linha 58

          Abraços.

          Ítalo, obrigado pelo ótimo artigo.