NodeMCU 1.0 ESP8266 та запити до Google Spreadsheets

опубліковано 2 квіт. 2017 р., 07:40 Максим Петренко   [ оновлено 7 квіт. 2017 р., 15:18 ]
Для початку створіть таблицю у своєму аккаунті Google.
Потрібно скопіювати URL з рядку адреси, та отримати від нього токен (код, за яким можна отримати доступ до таблиці). У цьому рядку на його місці зірочки:
https://docs.google.com/spreadsheets/d/************/edit
Далі потрібно зайти у «Інструменти – Редактор скриптів».
Коли завантажиться редактор, потрібно замінити його вміст на код, що наведений нижче:
function doGet(e){
 var tag = "";
 var value = "";
 try {
    tag = e.parameters.tag;
    value = e.parameters.value;
    return ContentService.createTextOutput(save_data(tag, value));
 } catch(error) { 
    Logger.log(error);    
    return ContentService.createTextOutput("Error" + error.message);
 }  
}

function save_data(tag, value){
  try {
    var dateTime = new Date();
    //замінити на токен від cвоєї таблиці
    var ss = SpreadsheetApp.openByUrl( "https://docs.google.com/spreadsheets/d/************************************/edit");
    var dataLoggerSheet = ss.getSheetByName("DataLogger");
    var row = dataLoggerSheet.getLastRow() + 1;
    dataLoggerSheet.getRange("A" + row).setValue(row -1);
    dataLoggerSheet.getRange("B" + row).setValue(dateTime);
    dataLoggerSheet.getRange("C" + row).setValue(tag);
    dataLoggerSheet.getRange("D" + row).setValue(value);
    return row - 1;// Count 
  } catch(error) {
    Logger.log(JSON.stringify(error));
  }
}
Далі збережіть його, натиснувши на дискету, та давши ім’я.
Після цього необхідно опублікувати його:
Публікація-Розгорнути як веб-додаток
Відкриється діалогове вікно.
Тут одразу можна скопіювати URL скрипту, оскільки він нам знадобиться при розробці додатку для мікроконтролера.
Не забувайте після кожного редагування обирати зі списку версію продукту «Новий». Інакше працюватиме стара версія.
Тепер модна відкрити Arduino IDE і вставити туди наступний скетч, у який необхідно буде внести відповідні зміни, щоб він працював через ваш WiFi з вашим скриптом (див.  коментарі у коді).

#include <ESP8266WiFi.h>
#include "HTTPSRedirect.h"

int i = 0;
//замінити на свій ідентифікатор мережі
const char* ssid = "**********";
//замінити на свій пароль до мережі
const char* password = "**********";
//інтервал у мілісекундах між з'єднаннями
const int dataPostDelay = 30000;
const char* host = "script.google.com";
const char* redirHost = "script.googleusercontent.com";
const int httpsPort = 443;
//замінити на токен від свого скрипта
const char* GScriptId = "....";
String url = String("/macros/s/") + GScriptId + "/exec?";
HTTPSRedirect client(httpsPort);

void setup() {
  Serial.begin(115200);
  Serial.println("Connecting to wifi: ");
  Serial.println(ssid);
  Serial.flush();

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" IP address: ");
  Serial.println(WiFi.localIP());

  Serial.print(String("Connecting to "));
  Serial.println(host);
  bool flag = false;
  for (int i = 0; i < 5; i++) {
    int retval = client.connect(host, httpsPort);
    if (retval == 1) {
      flag = true;
      break;
    }
    else
      Serial.println("Connection failed. Retrying…");
  }

  // 1 - є з'єднання
  Serial.println("CStatus: " + String(client.connected()));
  Serial.flush();

  if (!flag) {
    Serial.print("Could not connect to server: ");
    Serial.println(host);
    Serial.println("Exiting…");
    Serial.flush();
    return;
  }
}

void postData(String tag, float value) {
  if (!client.connected()) {
    Serial.println("Connecting to client again…");
    client.connect(host, httpsPort);
  }
  String urlFinal=url+"tag="+tag+"&value="+String(value);
Serial.println(client.printRedir(urlFinal,host,redirHost));
}

void loop() {
  postData("Text", i++);
  delay (dataPostDelay);
}
Для роботи коду вам знадобиться моя версія бібліотеки HTTPSRedirect.h, яку ви можете завантажити тут у архіві.
На момент початку роботи над цим завданням код цієї бібліотеки не дозволяв повертати відповідь на Get запит у програму, а лише виводив її через послідовний порт, що унеможливлювало обробку відповіді у програмі. Сае тому я й вніс невеликі зміни.
Як тільки код зальється, можете відкривати свою таблицю та слідкувати, як усе працює)
ċ
HTTPSRedirect.zip
(2k)
Максим Петренко,
2 квіт. 2017 р., 07:41
Comments