Czech English

7. Meteostanice 4

s ukladáním dat do Google Sheets

Další možností kam ukládát měřená data je využití služeb Google Drive. Výhodou je přehledné zobrazení dat v Google Sheets a jejich snadné zpracování.


Google Sheets

Pro ukládání dat si na Google Drivu vytvoříme novou tabulku. V ní si pojmenujeme záhlaví sloupců dle obrázku.
Z adresního řádku prohlížeče si zkopírujeme adresu pro přístup do této tabulky.

Script pro ukládání dat

Pro automatizované vkládání dat musíme napsat script, jehož voláním dojde vždy k přidání naměřených hodnot do nového řádku tabulky.
Script vytvoříme volbou menu: Nástroje - Editor scriptu
Do programového okna vložíme script:
V tomto scriptu nahradíme adresu tabulky získanou v předchozím kroku. Uložíme script a vygenerujeme URL adresu pro jeho spouštění volbou menu: Publikovat - Zprovoznit jako webovou aplikace ...
Z řádku Aktuální adresa URL webové aplikace si zkopírujeme Id scriptu, např.:
https://script.google.com/macros/s/AKfycbzU7sSL2vZyRk9hyhYRw-JEP2WKet6p0g5MrF4XeuicTkNY2/exec

ESP8266 client

Na straně měřicího zařízení potřebujeme opět periodicky měřit požadované veličiny a odesílat je na server. Posílání dat poněkud komplikuje fakt, že google vyžaduje šifrované připojení (to je již v novějších verzích vyvojových nástrojů pro ESP vyřešeno), ale horší je skutečnost, že dochází k přesměrování na jiný server, a to standardní knihovny neřeší.
Objevilo se již řešení knihovna HTTPS Redirect, díky němuž lze vše zprovoznit. Zdrojový kód webové stránky:
ESP8266_GoogleSheets.ino
#include <ESP8266WiFi.h>
#include "HTTPSRedirect.h"
#include "DebugMacros.h"

#include "Adafruit_BMP280.h"
#include "Adafruit_HTU21DF.h"

// EPS 12 SDA - GPIO5(D1), SCL - GPIO4(D2)

#define SDA 5
#define SCL 4

#define BMP280_ADRESA (0x77)
Adafruit_BMP280 bmp;
Adafruit_HTU21DF htu; 

#define TIME_INTERVAL 60000

// Fill ssid and password with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID"; // Nahradte vasim jmenem site SSID
const char* password = "REPLACE_WITH_YOUR_PASSWORD"; // Nahradte heslem do vasi site

const char* host = "script.google.com";
// Replace with your own script id to make server side changes
const char *GScriptId = "AKfycbzU7sSL2vZyRk9hyhYRw-JEP2WKet6p0g5MrF4XeuicTkNY2";

const int httpsPort = 443;

// echo | openssl s_client -connect script.google.com:443 |& openssl x509 -fingerprint -noout
const char* fingerprint = "D8 4E 4F 08 10 7A FC A7 07 EA BF 2C 0B 4D 8C B9 F4 C5 7F EF";

// Write to Google Spreadsheet
String url = String("/macros/s/") + GScriptId + "/exec?func=addData";

HTTPSRedirect* client = nullptr;

void setup() {
  Wire.begin(SDA, SCL); // SDA, SCL 
  bmp.begin(BMP280_ADRESA);
  htu.begin(); 
  
  Serial.begin(115200);
  Serial.flush();
  delay(100);

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.mode(WIFI_STA);
  WiFi.persistent(false);
  WiFi.begin(ssid, password); 
  while (WiFi.status() != WL_CONNECTED) 
  {
    delay(500);
    Serial.print(".");
  }
 
  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.print("Netmask: ");
  Serial.println(WiFi.subnetMask());
  Serial.print("Gateway: ");
  Serial.println(WiFi.gatewayIP());
}

uint32_t timeStamp = millis();

float teplota, tlak, vlhkost;
 
void loop() {
  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{
    DPRINTLN("Error creating client object!");
  }

  if (client->connected() && millis() - timeStamp > TIME_INTERVAL) {
    timeStamp += TIME_INTERVAL; 
    
    teplota = bmp.readTemperature();
    tlak = (bmp.readPressure()/100.00);
    vlhkost = htu.readHumidity(); 

    String payload = (String)"&temperature=" + teplota;
    payload += (String)"&pressure=" + tlak;
    payload += (String)"&humidity=" + vlhkost;
    
    Serial.println(payload);    
    client->GET(url + payload, host);
  }
}
V tomto zdrojovém kódu musíme upravit dvě věci:
1. Id scriptu z předchozího kroku vložíme na místo přiřazení do proměnné GScriptId
2. musíme vygenerovat fingerprint pro šifrované připojení k serveru googlu, dle návodu v HTTPS redirect. Vygenerovaným otiskem nahradíme řetězec ve zdrojovém kódu.

WWW stránky se zdroji