цифровая электроника
вычислительная техника
встраиваемые системы

 

Отправляем данные с датчика в Google Sheets с помощью ESP8266 NodeMCU

Автор: Mike(admin) от 5-11-2019, 07:35

Возможность получать данные в реальном времени из разных источников, хранить их и обрабатывать их для практического использования для преобразования и оптимизации процессов в режиме реального времени имеет огромное значение для проектов Интернета вещей (IoT). Это одна из причин, по которой облако устройств является одной из наиболее важной (а иногда и самой дорогой) частью архитектуры любого IoT-решения или проекта, поскольку данные должны храниться там, где к ним можно легко получить доступ для дальнейшего анализа.


Отправляем данные с датчика в Google Sheets с помощью ESP8266 NodeMCU

Для людей, желающих развернуть пилотные проекты и прототипы масштабируемых проектов с ограниченным бюджетом, выкладывание огромных сумм, необходимых для хранения данных на платформах, таких как Azure, может оказаться довольно обременительным, и хотя существует множество бесплатных платформ IoT, которые они могут использовать, иногда есть одно ограничение или что-то другое, что делает их непригодными в определенных ситуациях. В сегодняшнем уроке мы рассмотрим дешевый/бесплатный альтернативный способ хранения ваших данных в облаке. Мы рассмотрим, как вы можете подключить свои устройства Интернета вещей к Google Sheet, чтобы иметь возможность регистрировать данные.


Google Sheets чаще всего используется вместо Microsoft Excel для разработки электронных таблиц. Этот инструмент обеспечивает хороший способ хранения или обработки данных в форме электронных таблиц и может быть интегрирован с десятками других сервисов, предоставляемых Google, таких как Maps, для создания действительно инновационных решений. С помощью API и использования скрипта Google (Gscript) Google упростил разработчикам программное заполнение данных в Google Sheets, упрощая тем самым создание решений с использованием их сервисов, и именно это мы будем использовать в этом руководстве.


В качестве примера, демонстрирующего использование Google Sheets в качестве облака устройств, мы создадим простой монитор погоды на основе температуры и влажности. Устройство будет получать температуру и влажность из окружающей среды с помощью датчика DHT11 и загружать данные через WiFi в файл Google Sheet. NodeMCU на основе ESP8266 здесь используется из-за его популярности и надежной реализации WiFi. Любая из других плат на базе ESP-12 также может использоваться без особых изменений в настройке и коде.


Схема для этого проекта довольно проста. Нам нужно только подключить светодиод и датчик DHT11 к Nodemcu, как показано на рисунке далее.


Отправляем данные с датчика в Google Sheets с помощью ESP8266 NodeMCU

Чтобы отправить данные в Google Sheets, нам нужно сначала создать лист, а затем подготовить его для получения данных с устройства, создав Gscript (Google Script), чтобы привязать лист к нашему устройству. Сначала введите в своем браузере docs.google.com. Возможно, вам потребуется войти в свою учетную запись Google или создать новую, чтобы получить доступ к ссылке. Когда страница откроется, нажмите на кнопку меню и выберите Google sheet из выпадающего списка приложений. Выше будет запущена новая страница, где вы можете выбрать вариант создания нового листа.


Когда откроется новая электронная таблица (preadsheet), присвойте ей имя (название документа), на которое легко ссылаться. Под каждым документом GoogleSheet вы можете создавать несколько листов, но для этого проекта мы будем использовать только лист по умолчанию 1, а также изменим имя листа на то, что вам нравится, например, IoTDanceHall, а имя листа temphum.


Отправляем данные с датчика в Google Sheets с помощью ESP8266 NodeMCU

Теперь пришло время создать файл листа Google для проекта. Зайдите в Tools (Инструменты) в строке меню и выберите Script Editor (редактор скриптов), как показано на рисунке ниже.


Отправляем данные с датчика в Google Sheets с помощью ESP8266 NodeMCU

Откроется новая вкладка, в которой откроется редактор скриптов Google. Переименуйте файл скрипта Google на имя, с которым вы можете связать. Для этого урока мы дадим название файла «temphum_log».


Далее мы заимствуем скрипт, разработанный Sujay (github.com/electronicsguy), который использует календарь Google для создания бланков на назначенном листе Google для данных, отправляемых с устройства, для заполнения, что упрощает чтение и запись в GoogleSheet. Скопируйте содержимое скрипта и вставьте в редактор.


Отправляем данные с датчика в Google Sheets с помощью ESP8266 NodeMCU

Измените имя листа и идентификатор листа в коде так, чтобы оно совпадало с вашим собственным именем листа («temphum») и вашим собственным идентификатором листа.


Отправляем данные с датчика в Google Sheets с помощью ESP8266 NodeMCU

Идентификатор вашего листа является частью URL вашего листа. Он занимает позицию между обратной косой чертой после «d» и той, что перед «edit», это выделено ниже в URL.


Отправляем данные с датчика в Google Sheets с помощью ESP8266 NodeMCU

Дважды проверьте его перед вставкой, чтобы убедиться, что ничего не пропущено, так как скрипт не сможет взаимодействовать с вашим листом, если идентификатор неверен. Также держите этот идентификатор в безопасности для будущего использования. Завершив редактирование Gscript, нажмите кнопку публикации на верхней панели инструментов и выберите «deploy as web app» (развернуть как веб-приложение) в раскрывающемся списке.


Отправляем данные с датчика в Google Sheets с помощью ESP8266 NodeMCU

Это запустит интерфейс, где вам нужно будет заполнить кучу информации. Заполните, как показано на рисунке ниже, с версией Project, установленной на New, с выбранным идентификатором вашей электронной почты и предоставьте любому, даже анонимный доступ к приложению. Сделав это, нажмите кнопку Deploy.


Отправляем данные с датчика в Google Sheets с помощью ESP8266 NodeMCU

Развертывание потребует, чтобы вы дали сценарию некоторые разрешения. Нажмите на review permissions (разрешения просмотра), когда будет предложено. Поскольку скрипт не является проверенным приложением Google, он выдаст предупреждение, как показано ниже. Проверьте это, нажав кнопку «advanced» на изображении ниже.


Отправляем данные с датчика в Google Sheets с помощью ESP8266 NodeMCU

Для продолжения нажмите кнопку «your script name (unsafe)», выделенную ниже.


Отправляем данные с датчика в Google Sheets с помощью ESP8266 NodeMCU

Присвойте права доступа к сценарию и разрешите его подключение к вашей учетной записи Google и к созданному нами листу Google, нажав кнопку «allow».


Отправляем данные с датчика в Google Sheets с помощью ESP8266 NodeMCU

После этого вы должны увидеть страницу успешного завершения. Она предоставит вам URL веб-приложения. Скопируйте этот URL и сохраните его в безопасности, так как идентификатор скрипта, встроенный в URL веб-приложения, будет использоваться кодом Arduino для доступа к листу Google.


Отправляем данные с датчика в Google Sheets с помощью ESP8266 NodeMCU

После этого мы готовы написать код для нашего ESP8266. Алгоритм, лежащий в основе скетча для сегодняшнего проекта, довольно прост, но его реализация для тех, кто не знаком с https и JSON, может потребовать некоторого уровня практики. Основная задача кода – получить данные о температуре и влажности с DHT11 и переслать данные в Google Sheets через Wi-Fi соединение с Интернетом.


Чтобы упростить код и сократить объем работы, которую необходимо выполнить, мы будем использовать 4 основные библиотеки, в том числе; библиотека ESP8266WiFi, библиотека HTTPSRedirect (github.com/electronicsguy/ESP8266/tree/master/HTTPSRedirect), DebugMacros, которая является частью библиотеки HTTPSRedirect, и библиотека DHT. Библиотека ESP8266WiFi устанавливается при установке файлов поддержки платы ESP8266 для Arduino IDE. Она предоставляет пользователям простой способ доступа к надежной реализации WiFi на NodeMCU. Библиотека HTTPSRedirect основана на библиотеке Wifi. Она предоставляет пользователю широкие возможности для легкого общения с серверами через http или https. Одним из требований для связи по протоколу HTTPS являются сертификаты подключения или в этом случае «отпечатки пальцев» веб-сайтов SHA-1. Библиотека отладочных макросов помогает хранить и обрабатывать запросы в этой строке. Наконец, у нас есть библиотека DHT. Она используется для облегчения взаимодействия с DHT11 для получения данных о температуре и влажности с помощью нескольких строк кода. Полный код проекта представлен далее.



#include <ESP8266WiFi.h>
#include "HTTPSRedirect.h"
#include "DebugMacros.h"
#include <DHT.h>
#define DHTPIN D4  
#define DHTTYPE DHT11 
DHT dht(DHTPIN, DHTTYPE);
float h;
float t;
String sheetHumid = "";
String sheetTemp = "";
const char* ssid = " ";  
const char* password = " ";  
const char* host = "script.google.com";
const char *GScriptId = "enter your GSCript ID here"; 
const int httpsPort = 443; 
const char* fingerprint = "";
String url = String("/macros/s/") + GScriptId + "/exec?value=Temperature"; 
String url2 = String("/macros/s/") + GScriptId + "/exec?cal"; 
String payload_base =  "{\"command\": \"appendRow\", \
                    \"sheet_name\": \"temphum\", \
                       \"values\": ";
String payload = "";
HTTPSRedirect* client = nullptr;

void setup() {
  delay(1000);
  Serial.begin(115200);
  dht.begin();
  Serial.println();
  Serial.print("Connecting to wifi: ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  client = new HTTPSRedirect(httpsPort);
  client->setInsecure();
  client->setPrintResponseBody(true);
  client->setContentTypeHeader("application/json");
  Serial.print("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...");
  }
  if (!flag) {
    Serial.print("Could not connect to server: ");
    Serial.println(host);
    Serial.println("Exiting...");
    return;
  }
  Serial.println("\nWrite into cell 'A1'");
  Serial.println("------>");
  client->GET(url, host);
  
  Serial.println("\nGET: Fetch Google Calendar Data:");
  Serial.println("------>");
  client->GET(url2, host);
 Serial.println("\nStart Sending Sensor Data to Google Spreadsheet");
  
  delete client;
  client = nullptr;
}
void loop() {
  h = dht.readHumidity();
  t = dht.readTemperature();
  if (isnan(h) || isnan(t)) { 
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }
  Serial.print("Humidity: ");  Serial.print(h);
  sheetHumid = String(h) + String("%");
  Serial.print("%  Temperature: ");  Serial.print(t);  Serial.println("&#194;°C ");
  sheetTemp = String(t) + String("&#194;°C");
  static int error_count = 0;
  static int connect_count = 0;
  const unsigned int MAX_CONNECT = 20;
  static bool flag = false;
  payload = payload_base + "\"" + sheetTemp + "," + sheetHumid + "\"}";
  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);
      client->POST(url2, host, payload, false);
      Serial.print("Sent : ");  Serial.println("Temp and Humid");
    }
  }
  else {
    DPRINTLN("Error creating client object!");
    error_count = 5;
  }
  if (connect_count > MAX_CONNECT) {
    connect_count = 0;
    flag = false;
    delete client;
    return;
  }
  Serial.println("POST or SEND Sensor data to Google Spreadsheet:");
  if (client->POST(url2, host, payload)) {
    ;
  }
  else {
    ++error_count;
    DPRINT("Error-count while connecting: ");
    DPRINTLN(error_count);
  }
  if (error_count > 3) {
    Serial.println("Halting processor...");
    delete client;
    client = nullptr;
    Serial.printf("Final free heap: %u\n", ESP.getFreeHeap());
    Serial.printf("Final stack: %u\n", ESP.getFreeContStack());
    Serial.flush();
    ESP.deepSleep(0);
  }
  
  delay(2000)
}

Запустите Arduino IDE, вставьте код, проверьте и загрузите на свою плату. После завершения загрузки откройте последовательный монитор, чтобы убедиться, что WiFi подключен и проблем нет. Перейдите на страницу Google Sheets, теперь вы должны видеть данные о температуре и влажности, которые передаются в облачную среду с вашего устройства.


Отправляем данные с датчика в Google Sheets с помощью ESP8266 NodeMCU

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




© digitrode.ru


Теги: ESP8266, Интернет вещей, DHT11, датчик температуры, датчик влажности



   Благодарим Вас за интерес к информационному проекту digitrode.ru.
   Если Вы хотите, чтобы интересные и полезные материалы выходили чаще, и было меньше рекламы,
   Вы можее поддержать наш проект, пожертвовав любую сумму на его развитие.


Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий