Aprenda como usar o ESP32 para publicar dados no Google Sheets

Atualizado: Abr 27

Não existe dúvida que o Arduino mudou a forma do mundo ver a eletrônica, tornando o assunto muito mais amigável aos não especialistas no assunto.


Com isto, uma série de ideias e movimentos estão cada vez mais fortes. Nós da Crescer estamos dando robustez a estas ideias, tornando-as usuais na indústria e como produto comercializável.


Nosso lançamento de 1 de março de 2021, a CPB32 vista abaixo:

Levando as ideias a outro patamar, pois o ESP32 é um dual core de 32 bits, com 10x mais velocidade de clock que o Arduino Uno, entradas e saídas analógicas de 12 bis e o principal, WiFi e Bluetooth onboard.


Lembrando que tudo o mostrado neste post, funciona no ESP32 e com algumas modificações, no ESP8266 também.


O projeto deste artigo é ter a CPB32 como um monitorador de consumo elétrico de uma empresa, publicando este consumo periodicamente em uma planilha do Google, com isto poderemos ter tal controle e banco de dados na nuvem. Este conceito pode ser expandido a muitos tipos de aplicações, como apontamento de produção em um chão de fábrica, medições de nível em caixas d’ água, entre muitos outras ideias que virão.


O Google Sheets é uma das ferramentas do Google disponíveis dentro do Drive, é gratuita bastando ter uma conta do Gmail / Google, funcionado muito semelhante ao Excel. Certamente é um diferencial deste post, usar esta ferramenta.


HARDWARE:



1 – Fonte 24V / 1A

2 – CPB32

3 – Shield de Medição AC Crescer

4 – Sensor de corrente AC SCT013


SOFTWARE:


Trabalharemos em 2 frentes, Passo 1 e Passo 2, o primeiro é a preparação da planilha do Google (Google Sheets) e depois trabalharemos no código da CPB32.


PASSO 1: CONFIGURANDO O GOOGLE SHEETS


Você tendo a conta do Google, tem acesso ao Drive via APP`s do Google.

No canto superior esquerdo, vá em Novo:

Escolhendo uma planilha em branco:

Clique no nome da planilha e renomeie, nós colocamos "BlogCrescerCPB32":

Agora vamos copiar a parte da URL que nos interessa, e guardar num arquivo de apoio para usarmos no momento correto:

135Ws-8fP_QFqqtJd16GHyjVJvX5hKifp1gAA2WRwSTY

Agora, vamos agora criar um script para rodar Macro:

Agora cole todo o código abaixo, no lugar do código que está no script:

function doGet(e) { 
 Logger.log( JSON.stringify(e) ); // view parameters
 var result = 'Ok'; // assume success
 if (e.parameter == 'undefined') {
 result = 'No Parameters';
 }
 else {
 var sheet_id = '176RxIsfqc6a5fuljrN6-rRM_uF3Xf0k2GCXgnThYXek';  // Spreadsheet ID
 var sheet = SpreadsheetApp.openById(sheet_id).getActiveSheet(); // get Active sheet
 var newRow = sheet.getLastRow() + 1; 
 var rowData = [];
 d=new Date();
 rowData[0] = d; // Timestamp in column A
 rowData[1] = d.toLocaleTimeString(); // Timestamp in column A
 
 for (var param in e.parameter) {
 Logger.log('In for loop, param=' + param);
 var value = stripQuotes(e.parameter[param]);
 Logger.log(param + ':' + e.parameter[param]);
 switch (param) {
 case 'value1': //Parameter 1, It has to be updated in Column in Sheets in the code, orderwise
 rowData[2] = value; //Value in column A
 result = 'Written on column A';
 break;
 case 'value2': //Parameter 2, It has to be updated in Column in Sheets in the code, orderwise
 rowData[3] = value; //Value in column B
 result += ' Written on column B';
 break;
 case 'value3': //Parameter 3, It has to be updated in Column in Sheets in the code, orderwise
 rowData[4] = value; //Value in column C
 result += ' Written on column C';
 break;
 default:
 result = "unsupported parameter";
 }
 }
 Logger.log(JSON.stringify(rowData));
 // Write new row below
 var newRange = sheet.getRange(newRow, 1, 1, rowData.length);
 newRange.setValues([rowData]);
 }
 // Return result of operation
 return ContentService.createTextOutput(result);
}
function stripQuotes( value ) {
 return value.replace(/^["']|['"]$/g, "");
}

E cole a parte da URL copiada anteriormente no local indicado abaixo, comentado como //Spreadsheet ID:

Nós iremos inserir 3 valores, por isto podemos verificar no código os “value1”, “value2” e “value3”.

Agora vamos publicar o Script, pois o ESP32 irá buscar o script, e o script irá inserir os dados na planilha.

Seguindo a sequência de telas abaixo:

Clique em avançado e depois no local abaixo:

Copie toda a URL gerada, e confirme no seu celular ou email a permissão que o Google irá requerer, para segurança.

Este é um dos momentos bem interessantes do projeto, pois agora temos uma URL que possibilita testar a planilha e é o caminho para todos os acessos a ela. Imaginem que encontramos um post de um pessoal que fez o APP inventor postar dados no Google Sheets, isto me faz pensar que nenhuma empresa pode rodar sem algum tipo de controle, pois está muito acessível tudo isto.


Mas voltando ao nosso assunto, com a URL abaixo:

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

Vamos adicionar:

?value1=113&value2=125&value3=55

Resultando em:

https://script.google.com/macros/s/AKfycbxpDJFU3kc6LfkqM_Yfq1mHYnz5t08GdCteX7X4MU1_2l01QU59/exec?value1=113&value2=125&value3=55

Colocando esta URL no navegador, vamos verificar se os valores aparecem na planilha, sendo que no navegador retornou algo parecido com:

E na planilha foi:

E a cada vez que rodar a URL, será inserida uma nova linha abaixo.


PASSO 2: PROGRAMANDO A CPB32 ou ESP32


Agora vamos ao código que pode ser baixado no link abaixo:


https://github.com/casaautomacao/ESP32_GoogleSheets_v2


O código tem 2 partes distintas, sendo 1 em cada Task. A Task (atividade) que roda no Core 0, é a atividade de envio para o Google Sheets e leva cerda de 4 segundos. Já a atividade do Core 1, é a medição da corrente e tensão da rede e calculando o valor RMS destes sinais.


Caso você não entenda o conceito de Core, verifique o nosso blog anterior: Usando o Dual Core.


Vou apontar de agora em diante, alguns pontos chaves para funcionar e gerar o gráfico abaixo:

Na última aba tem algumas funções para conexão wifi.

Na primeira Aba, tem a configuração dos Cores no setup e a chamada da função da conexão WiFi.

Atenção pois algumas versões do ESP32 não conectam na primeira tentativa no WiFi, necessitando resetar a placa para na próxima tentativa conectar.

Em nossas aplicações, quando não há sucesso na conexão, o ESP reseta e tenta novamente.

Na primeira aba temos a inserção do endereço do script, ali que é feita a amarração entre ESP32 e Google Script.

O ponto de atenção principal nesta primeira Aba está no loop(), onde estamos desabilitando a proteção de watchdog no Core 0, por esta proteção não deixar a aplicação rodar mais que 1 hora sem que ocorra um reset.

Na aba da Task1 que roda no Core 1, temos o cálculo do RMS, o detalhamento vai depender dos comentários neste blog, se tiver bastante pergunta, vamos detalhar como foi feito o cálculo e qual a performance. Caso vocês não tenham interesse...


Mas basicamente ele calcula a tensão e a corrente RMS e disponibiliza para envio na Task2 que roda no Core 0.


Então na Task2 deve ter o que mais é necessário para o projeto funcionar.

Sendo uma função para conectar ao host, que é o próprio google.

E o send_data para montagem da URL e envio, sendo esta, a mais complexa.

String Request = String("GET ") + "/macros/s/" + GScriptId + "/exec?" + "value1=" + tensaoFinal + "&value2=" + correnteFinal + "&value3=" + tempoEnvio + " HTTP/1.1\r\n" + "Host: script.google.com\r\n" + "User-Agent: ESP8266\r\n" + "Connection: close\r\n" + "\r\n\r\n";

A montagem da String Request na linha 41 que tem todo o texto acima, é o ponto de maior atenção, pois precisa resultar em algo semelhante ao exemplo abaixo:

Get /macros/s/AKfycbxpDJFU3kc6LfkqM_Yfq1mHYnz5t08GdCteX7X4MU1_2l01QU59/ exec?value1=113&value2=125&value3=55 HTTP/1.1\r\n Host: script.google.com\r\n
User-Agent: ESP8266\r\n Connection: close\r\n\r\n\r\n

E tudo isto enviado para o cliente que é o script do Google.


O que vem depois, fica para vocês olhar no Monitor Serial da IDE do Arduino...


FUNCIONAMENTO PRÁTICO COM APLICAÇÃO REAL: CPB32 COMO MEDIDORA DE CONSUMO DE ENERGIA ELÉTRICA


E aí o que achou desta aplicação?


1,406 visualizações9 comentários

Posts recentes

Ver tudo