ESP32 Publicando Dados na Nuvem (Google)
CONAENGE » ESP32 »Não existe dúvida de que o Arduino mudou a forma do mundo ver a eletrônica/automação, 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. A Crescer Engenharia está dando robustez a estas ideias, tornando-as usuais na indústria e como produto comercializável.
Lançaram 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 que é mostrado neste artigo 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 esse consumo periodicamente em uma planilha do Google, com isto poderemos ter os dados armazenados na nuvem (cloud). Este conceito pode ser expandido a muitos tipos de aplicações, como sensores de distância/presença, medições de nível em caixas d’ água, entre muitas outras aplicações.
O Google Sheets é uma das ferramentas disponibilizadas pelo Google, e está vinculada a outra ferramenta Google chamada Drive. Ela é gratuita, bastando você ter uma conta do Gmail / Google. Funciona de maneira semelhante ao Microsoft Excel. Certamente é um diferencial deste artigo usar essa ferramenta.
HARDWARE com ESP32:
1 – Fonte 24V / 1A
2 – CPB32
3 – Shield de Medição AC Crescer
4 – Sensor de corrente AC SCT013
SOFTWARE para ESP32:
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”:
Copie a parte da URL que nos interessa, e guardar num arquivo de apoio para usarmos no momento correto:
135Ws-8fP_QFqqtJd16GHyjVJvX5hKifp1gAA2WRwSTY
Agora vamos criar um script para rodar a Macro:
Por fim, 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.
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 a seguir:
https://github.com/casaautomacao/ESP32_GoogleSheets_v2
O código tem duas partes distintas, sendo uma em cada Tarefa (Task). A Tarefa que roda no Core 0 (Núcleo 0), é a atividade de envio para o Google Sheets e leva cerca de 4 segundos. Já a atividade do Core 1, é a medição da corrente e tensão da rede, já calculando o valor RMS destes sinais.
Caso você não conheça o conceito de Core, acesse este outro artigo: Usando o Dual Core do ESP32.
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 uma 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 do número de comentários neste blog, se forem muitos 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ê 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?
> > > Quero Saber Mais Sobre Automação!
FONTE: artigo originalmente publicado no website Crescer Engenharia.