Чтение данных из Google Таблиц с помощью Nodemcu

Я хочу читать и записывать данные в таблицы Google с помощью ESP8266 WIfi Nodemcu, и я могу это сделать, но временной интервал между двумя строками записи составляет 3 секунды, что слишком много. Я могу читать данные, но я могу читать только первую строку, а не любые другие строки, которые я не могу прочитать, даже изменяя параметры URL.

Вот мой код -

#include "ESP8266WiFi.h"
#include "HTTPSRedirect.h"
#include "DebugMacros.h"

// Заполните ssid и пароль вашими сетевыми данными

const char* ssid = "Леобототехника";

const char* пароль = "leobotics123";

инт листвлажный = 1;

интервал времени листа = 2;

инт листакв = 3;

Строка readaqu = "";

const char* host = "script.google.com";

// Замените на свой собственный идентификатор скрипта, чтобы внести изменения на стороне сервера

const char *GScriptId = "AKfycbyu_JnX7F29Ea5cZUy7HdsFbv9W5UmedmNbhTwt5tznwRUiQhYS";

const int httpsPort = 443;

// эхо | openssl s_client -connect script.google.com:443 |& openssl x509 -fingerprint -noout

const char* отпечаток = "ED:83:75:6B:83:FE:01:DE:BA:72:84:05:71:FA:CE:54:FB:6E:23:CA";

//const uint8_t finger[20] = {};


// Запись в таблицу Google

String url = String("/macros/s/") + GScriptId + "/exec?value=Hello";

// Получаем события Календаря Google на 1 неделю вперед

String url2 = String("/macros/s/") + GScriptId + "/exec?cal";

// Чтение из таблицы Google

String url3 = String("/macros/s/") + GScriptId + "/exec?read";

String payload_base = "{\"command\": \"добавить строку\", \
\"имя_листа\": \"Лист1\", \
\"ценности\": ";
Полезная нагрузка строки = "";

HTTPSRedirect* клиент = nullptr;

// используется для хранения значений свободного стека и кучи
// перед созданием экземпляра объекта HTTPSRedirect
// чтобы их можно было записать в листы Google
// при создании экземпляра

беззнаковое целое free_heap_before = 10;

беззнаковое целое число free_stack_before = 20;

недействительная установка () {

Серийный.начать(115200);

Serial.print("Подключение к Wi-Fi: ");

Serial.println(ssid);

WiFi.begin(ssid, пароль);

в то время как (WiFi.status ()! = WL_CONNECTED) {

delay(500);

Серийный.принт(".");

}

Серийный.println("");

Serial.println("Wi-Fi подключен");

// Serial.println("IP-адрес: ");
// Serial.println(WiFi.localIP());

// Используйте класс HTTPSRedirect для создания нового соединения TLS

клиент = новый HTTPSRedirect (httpsPort);

клиент->setInsecure();

клиент->setPrintResponseBody(true);

клиент->setContentTypeHeader("приложение/json");

Serial.print("Подключение к");

Serial.println(хост);

// Попытаться подключиться максимум 5 раз
логический флаг = ложь;

for (int i=0; iconnect(host, httpsPort);

если (ретвал == 1) {

флаг = правда;

перерыв;
}

еще

Serial.println("Ошибка подключения. Повторная попытка...");
}

если (!флаг){

Serial.print("Не удалось подключиться к серверу: ");

Serial.println(хост);

Serial.println("Выход...");

возвращаться;
}

}

недействительный цикл () {

отправка данных();

статический интервал ошибок_счетчик = 0;

статический интервал connect_count = 0;

const беззнаковое целое MAX_CONNECT = 20;

статический логический флаг = ложь;

если (!флаг){

клиент = новый HTTPSRedirect (httpsPort);

клиент->setInsecure();

флаг = правда;

клиент->setPrintResponseBody(true);

клиент->setContentTypeHeader("приложение/json");

}

если (клиент != nullptr){

если (!клиент->подключен()){

клиент->подключить(хост, httpsPort);

payload = payload_base + "\"" + sheetaqu + "," + sheetTemp + "," + sheetHumid + "\"}";

клиент->POST(url2, host, payload, false);

}
}

еще{

DPRINTLN("Ошибка создания объекта клиента!");

число_ошибок = 5;

}

если (connect_count > MAX_CONNECT){

количество_подключений = 0;

флаг = ложь;

удалить клиента;

возвращаться;

}

Serial.println("Получить данные из ячейки 'A1':");

если (клиент-> ПОЛУЧИТЬ (url3, хост)) {

++connect_count;

payload = payload_base + "\"" + readaqu + "," + sheetaqu + "," + sheetTemp + "," + sheetHumid + "\"}";

Serial.println("ПОЛУЧЕННЫЕ ДАННЫЕ ПРИВЕДЕНЫ НИЖЕ");

Серийный.println(" ");

Серийный.println("1");

Serial.println(readaqu);

Серийный.println("2");

Serial.println (листовой);

Серийный.println("3");

Serial.println(Время листа);

Серийный.println("4");

Serial.println(листВлажный);

Серийный.println(" ");
Serial.println("ПЕЧАТЬ ПОЛУЧЕНИЯ ДАННЫХ ЗАВЕРШЕНА");

листовая вода++;

температура листа++;

листВлажный++;

}
еще{

++ число_ошибок;

DPRINT("Счетчик ошибок при подключении: ");

DPRINTLN(счетчик_ошибок);

}

Serial.println("POST добавить данные памяти в электронную таблицу:");

payload = payload_base + "\"" + sheetaqu + "," + sheetTemp + "," + sheetHumid + "\"}";

if(клиент->POST(url2, host, payload)){

;
}

еще{

++ число_ошибок;

DPRINT("Счетчик ошибок при подключении: ");

DPRINTLN(счетчик_ошибок);

}

если (количество_ошибок > 3){

Serial.println("Остановка процессора...");

удалить клиента;

клиент = nullptr;

}

delay(4000);

}


аннулировать отправку данных ()

{
// Отправляем данные памяти в Google Sheets

payload = payload_base + "\"" + sheetaqu + "," + sheetTemp + "," + sheetHumid + "\"}";

клиент->POST(url2, host, payload, false);

payload = payload_base + "\"" + sheetaqu + "," + sheetTemp + "," + sheetHumid + "\"}";

клиент->POST(url2, host, payload, false);

// Примечание: setup() должна завершиться в течение прибл. 1s, или сторожевой таймер
// сбросит чип. Следовательно, не помещайте слишком много запросов в setup()
// ссылка: https://github.com/esp8266/Arduino/issues/34

Serial.println("\nGET: записать в ячейку 'A1'");

Serial.println("=========================");

// получаем данные электронной таблицы

клиент-> ПОЛУЧИТЬ (url, хост);

// Отправляем данные памяти в Google Sheets

payload = payload_base + "\"" + sheetaqu + "," + sheetTemp + "," + sheetHumid + "\"}";

клиент->POST(url2, host, payload, false);

Serial.println("\nGET: Получить данные календаря Google:");

Serial.println("================================");

// получаем данные электронной таблицы

клиент-> ПОЛУЧИТЬ (url2, хост);

// Отправляем данные памяти в Google Sheets

payload = payload_base + "\"" + sheetaqu + "," + sheetTemp + "," + sheetHumid + "\"}";

клиент->POST(url2, host, payload, false);

Serial.println("\nСерии запросов GET и POST");

Serial.println("===============================");


// удаляем объект HTTPSRedirect

удалить клиента;

клиент = nullptr;
}

, 👍-2

Обсуждение

Почему задержка 4s в конце цикла?, @chrisl

На самом деле этот код скопирован с веб-сайта, я не знаю конкретной функции этой задержки в 4 секунды., @Ansari Aquib


1 ответ


Лучший ответ:

2

Я думаю, вам нужно изменить свой скрипт Google для этого листа, чтобы любая функция, которую вы вызываете для получения данных строки, принимала дополнительный параметр для значения строки.

Затем просто добавьте логику Javascript в эту функцию для извлечения данных по этому переданному индексу строки, которые должны быть возвращены.

Имеет ли это смысл?

,