ارسال دیتا از ESP32 یا ESP8266 به Google Sheets (با 2 روش)

فهرست مطالب

مقدمه

شما هم از اینکه دیتای ESP32 را بصورت دستی ثبت و ذخیره کنید خسته شده‌اید؟ شما هم میخواهید فرایند ارسال و ذخیره دیتای دستگاه ESP32 به Google Sheets را خودکار کنید؟ خبر خوب اینکه اصلا کار سختی نیست و ما در این آموزش، ارسال دیتا از ESP32 یا ESP8266 به گوگل شیت را بصورت کامل و گام به گام توضیح داده ایم.
ESP32 یک میکروکنترلر قدرتمند با قابلیت اتصال به وایفای است و می تواند به دستگاه ها و سنسورهای مختلف متصل شود. برای جمع آوری اطلاعات دستگاه ها و مدیریت آنها، به یک سیستم هوشمندی نیاز دارید که بتواند حجم قابل توجهی از اطلاعات را در خود ذخیره و آنها را مدیریت کند. همچنین امکان کنترل و مدیریت از راه دور را به شما بدهد.
اینجاست که گوگل شیت به عنوان یک سرویس رایگان، آشنا و از همه مهمتر مطمئن، یک راه حل مناسب را فراهم می‌کند. این بستر، عملگرهای فراوانی را در درون خود داشته و از طریق API ها، با دیگر سرویس های گوگل تعامل بسیار خوبی دارد.

چرا از Google Sheets برای ثبت دیتای ESP32 استفاده کنیم؟

با ارسال و ثبت دیتای ESP32 به Google Sheets می توانید به راحتی از هرجا به آن دسترسی داشته باشید. چند مورد از مزایای استفاده از Google Sheets برای ثبت دیتای ESP32 عبارتند از:
• انجام Data Logging بسیار ساده است و نیازی به سرویس های خارجی ندارد
• با استفاده از توابع موجود، جمع آوری و تحلیل داده ها ساده است
• امکان دسترسی به آن از هر دستگاه متصل به اینترنت
• فرمت بندی داده ها، باعث خوانایی بهتر و آنالیز راحتتر داده ها می شود
در این پروژه، برای برقراری ارتباط دوطرفه با Google Sheets و ارسال و دریافت داده، از ESP32 استفاده می کنیم.
البته می توانید از ESP8266 نیز استفاده کنید. همه مراحل دقیقا یکسان است.

Logging Data from ESP32 to Google Sheets

آنچه در این آموزش یاد می گیرید

• استفاده از دو روش Google Sheets API و Google Apps Script برای ارسال داده از ESP32
• ایجاد فایل در Google Sheets توسط ESP32
• ارسال دیتا به Google Sheets و یا خواندن آن توسط ESP32
• فرمت بندی نوشته ها و استفاده از توابع موجود در Google Sheets

روش های ارسال دیتا از ESP32 به گوگل شیت

راه های مختلفی برای ارسال دیتا از ESP32 به Google Sheets وجود دارد. در اینجا سه روش را معرفی می کنیم.

1- ارسال دیتا به گوگل شیت با Google App Scripts

در این روش، تنها به یک اکانت گوگل نیاز دارید. فقط با انجام چند تنظیمات ساده در Google Sheets و وارد کردن یک Script در آن، ارتباط بین یک دستگاه متصل به اینترنت (مانند ESP32) و Google Sheets برقرار می شود.
مزیت این روش: برای بارگذاری داده های خود در Google Sheets، تنها یک URL با فرمت مشخص شده را در ESP32 باز می کنید.

ارسال دیتا به گوگل شیت با Google Sheets API​

2- ارسال دیتا به گوگل شیت با Google Sheets API

در این روش، نیازی به هیچگونه کدنویسی خارج از برنامه آردوینو وجود ندارد. تنها با انجام تنظیمات اولیه بر روی اکانت گوگل خود می توانید دیتا را با ESP32 به Google Sheets ارسال کنید.
از آنجا که در این روش از Google Sheets API استفاده میشود، می توانید از تمامی امکانات موجود در آن از جمله توابع کاربردی به راحتی استفاده کنید. ضمن اینکه ارسال و دریافت داده در این روش، بسیار ساده است.
همچنین به دلیل ارسال داده به صورت مستقیم، قابلیت اطمینان آن و امنیت داده های تبادل شده نسبت به روش سرویس های خارجی بالاتر است.

ارسال دیتا به گوگل شیت با Google Sheets API​

3- ارسال دیتا به گوگل شیت با IFTTT

در این روش، ESP32 برای ارسال دیتا به Google Sheets، به یک سرویس اینترنتی ثانویه متصل می شود. داده های ارسال شده از سوی میکروکنترلر، با استفاده از این سرویس، در Google Sheets مربوطه وارد می شود.
یک نمونه از این سرویس ها IFTTT است. مزیت این روش در مقایسه با دو روش دیگر: امکان برقراری ارتباط با انواع نرم افزارهای تحت وب به طور همزمان.

ارسال دیتا به گوگل شیت با IFTTT​

لوازمی که به آن احتیاج دارید

لوازم مورد نیاز برای ارسال دیتا esp32 به گوگل شیت

قطعات مورد نیاز

ESP32-WROOM** × 1
سنسور گاز مونو اکسید کربن و گاز اشتعالزا MQ-9*** × 1
MCU-680 BME680 Temperature Humidity Pressure Sensor Module*** × 1
سیم جامپر مادگی-مادگی × 1

**: می توانید از هر یک از انواع بردهای ESP32 یا ESP8266 استفاده کنید.
***: ما در این آموزش، دیتای سنسور MQ9 و BME680 را در گوگل شیت ثبت کرده ایم. شما می توانید از هر سنسور دیگری متناسب با نیاز خود استفاده کنید.

نرم افزارهای مورد نیاز

Arduino IDE

روش اول: ارسال دیتا از ESP32 به Google Sheets با استفاده از Google Sheets API

در این قسمت، ارسال دیتا از ESP32 به گوگل شیت با استفاده از Google Sheets API را توضیح می دهیم. برای انجام این کار، مراحل زیر را به ترتیب انجام دهید.

گام اول: آماده سازی Google Sheets

برای اینکار لازم است Service Account Private Key مخصوص خود را بسازید و Google Sheets API و Google Drive API را فعال کنید.
ابتدا وارد حساب کاربری گوگل خود شوید.

فعالسازی Google Sheets API و Google Drive API

برای این کار، بر روی این لینک کلیک کرده و در صفحه باز شده، بر روی دکمه Enable کلیک کنید.
سپس برای فعالسازی Google Drive API، به این لینک مراجعه و بر روی دکمه Enable بزنید.

ساخت Service Account Private Key

صفحه Google Cloud Console را باز کنید.
1. یک پروژه جدید بسازید تا Service Account برای شما ایجاد شود.
2. Service Account مورد نظر را انتخاب کنید.

3. بر روی دکمه CREATE SERVICE ACCOUNT+ کلیک کنید.

4. نام Service Account را وارد کنید.
5. در صورتی که با وارد کردن نام Service Account، بخش Service Account ID به طور خودکار تکمیل نشد، یا قصد انتخاب نام دیگری را دارید، این قسمت را با نام دلخواه پر کنید.
6. برروی دکمه Create and Continue کلیک کنید.

7. نوع Role را انتخاب کنید (در اینجا Owner).
8. بر روی دکمه Continue کلیک کنید.
9. در نهایت بر روی دکمه Done بزنید.
10. Service Account ایجاد شده را انتخاب کنید.

11. وارد قسمت KEYS شوید.
12. بر روی دکمه ADD KEY کلیک کنید.

13. نوع Key Type را برروی JSON قرار داده و بر روی CREATE کلیک کنید.

14. با این کار، کلید اختصاصی شما ایجاد شده و به طور خودکار دانلود می شود. بر روی دکمه CLOSE کلیک کنید.

15. فایل با پسوند .json دانلود شده را با نرم افزارهای ویرایش متن باز کنید. متنی مشابه زیر باز می شود:

{
  "type": "service_account",
  "project_id": "...",
  "private_key_id": "...",
  "private_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n",
  "client_email": "...",
  "client_id": "...",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "..."
}

در متن فوق، project_id، client_email، private_key_id و private_key را در محل مناسبی ذخیره کنید. برای کدنویسی آردوینو به این پارامترها احتیاج خواهید داشت.

گام دوم: سیم بندی

برای سیم بندی، کافی است پایه  های VCC و GND سنسور را به پایه های مشابه آن در برد ESP32 (VIN و GND یا 5V و GND) و پایه AO سنسور را به پایه 34 برد ESP32 متصل کنید. نوع برد ESP32 تفاوتی در سیم کشی ایجاد نمی کند.

سیم بندی ارسال دیتا سنسور به google sheet

گام سوم: نصب کتابخانه

برای شروع کد نویسی، ابتدا باید کتابخانه مورد نیاز را نصب کنید.
در نرم افزار Arduino IDE، وارد قسمت Sketch->Include Library->Manage Libraries شوید.
در پنجره Library manager، در قسمت جستجو، لغت Sheet را وارد کنید. از بین گزینه ها، ESP Spreadsheet Client را نصب کنید.
اگر برای نصب کتابخانه به راهنمایی بیشتری نیاز دارید، به این لینک مراجعه کنید.

گام چهارم: کد آردوینو برای ارسال دیتا از ESP32 به Google Sheets

پس از نصب کتابخانه، ابتدا یک اسکچ جدید Arduino بسازید و کد زیر را در آن کپی کنید.

/**
 Created by M.Merati

 Email: majid.merati.2012@gmail.com
*/

// This example shows how to create the spreadsheet, update and read the values.

#include <Arduino.h>
#if defined(ESP32) || defined(ARDUINO_RASPBERRY_PI_PICO_W)
#include <WiFi.h>
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#endif
#include <ESP_Google_Sheet_Client.h>
#include <stdlib.h>
#include "time.h"
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 19800;
const int daylightOffset_sec = 0;
int SensValue = 0;

// For SD/SD_MMC mounting helper
#include <GS_SDHelper.h>

#define WIFI_SSID "Galaxy S20 FEDF80"
#define WIFI_PASSWORD "kdbi8870"

#define PROJECT_ID "logical-utility-388206"

// Service Account's client email
#define CLIENT_EMAIL "esp32test20230529@logical-utility-388206.iam.gserviceaccount.com"

// Your email to share access to spreadsheet
#define USER_EMAIL "majid.merati.2022@gmail.com"

char numberArray[20];

// Service Account's private key
const char PRIVATE_KEY[] PROGMEM = "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCbBLtWIEx2OmTI\nzyNk53HtxjebDfGp0AcbAcC/ztN6CTPYKKO7k1jGcKkSUMe7oWGr4lB/QeS0XBFG\nkzjS3LpIuTMlBtf4erf7fcFqCF5VlYYWwuprOmZe3hyYvlc8oBUIcgQvOA6xQcxW\n0tJTAQXfT9g1IF3lRupZ6mCN1ILinxMQOA7zNLa7CLe2wq1hFX4kn8+YztHAiunp\nR7EMhzZAL9rwR2VpWoFZj24TZpQzEYS1S7n3iD8d0Ip3mVmoNcYDe39I5+ZE8xe1\nuqbc4Z5SzUe6RyytAMLL4tMAqDqvDTXtnD9Hw1f3DTymEWEFYjfjO3B6Pt90VLMG\n48r7veZvAgMBAAECggEAO5XzCGT73woNCV8NhNCt6y6g2xneBV7wDEJ9O30drq/w\n3KqqXQSDQCu34VFppMagi3g/ZtsGNQmanl0in3K2rBN8BESAKYPKSoIJIV+8GvuR\nghhEERlulhKcPV4UnDoQO6HP1/KdOydGiy0YKU2gWzkOq0UYsnOyywMbQAkqkj7n\n5ELfR//Leewx92zTiGrI4xns0sDm15rEYQvF8WQZeMFUblmJ+5FfuSK5hP0SaX4F\nvv9cx34TteUm1sro+v65HYTjY8Ozcur+ZjiuSNuAx4vs7CmpUM3kAjIN2451H9ka\ny3PY7I3bvFhy9tIHmQflFiokAFk3eH//HavpmBnroQKBgQDKJYElbW1b9L+5RHK4\nD8vRRbIgNVw1lcsBulwc4/VyAUORd3V9JQwfGvGBKykTVvJ75USR9T49BIDBZeR+\nfeO2RZtCaEXm5OtQgVM8p9GFUxhRk283CPf/uZbMkNkXXCLefcVWCBr+6+2extUV\nz+MMgghwFx4vjbJqe2RqFtA+vwKBgQDEURJ6zhKu7pJy1wNlPkfsnDwb2sbj/UmG\nmzA+9KEP9PQExxShRYBwyrsgGRB644kLtWv6tOTezib54SnWXAcVHXkkP1hWrw79\nfWY9tgPldwvlT9KMXTiG6NBHDZD/lwVtiMqulmKpXVr+AVSOp+t/vzquvOO8MKl2\nP5g5BvT0UQKBgQCX1S24uAWBIUd0V7Y3DB5R9KCDUrEMypMtnBWd2Zc85zgiJfEI\na3A8WNd25r02eoMtjho/602xNRWkrey/Gb2U5Zller6uW9lnoYusrnxQQQauFyhc\n1Q65dGORCWcWBa1nIl67bOEiAoF7VestM/VdKro9vw98NlkBY+cbTEFkLwKBgHno\nglpCR7XbrpOj05b2UwGqj2UYuXNwoUz2Z8JgdPgMu8+PtM7k8vqX2hX3mpVFYKAl\nu/UGii2VxPxdB3b21OsWz1hkAb5qnRtq2KevtMG06G0w4WWKqgSU5GmLEiS1qog3\nbu11s7TKpSugtdqUihhdLtq9r4n4ifNFUIjxOgHRAoGAbMlZi6KtyuIqfpnOvYej\nIO2SmKA85EBelrZCl2xKlIgGpLRITzfiQ5k+HH3ts22iw3ld+tBxpg82EX4Zuavj\niM57EIf6hzLsh8eLpic85ziD6PV14PBQUECS1Bb14fMJ4k3rcGcNFo2o9tgjlu9R\nKDx2yXeNgh/pToM7GLvlIOg=\n-----END PRIVATE KEY-----\n";

bool taskComplete = false;

#if defined(ARDUINO_RASPBERRY_PI_PICO_W)
WiFiMulti multi;
#endif

void tokenStatusCallback(TokenInfo info);

void setup()
{

 Serial.begin(115200);
 Serial.println();
 Serial.println();

#if defined(ESP32) || defined(ESP8266)
 WiFi.setAutoReconnect(true);
#endif

#if defined(ARDUINO_RASPBERRY_PI_PICO_W)
 multi.addAP(WIFI_SSID, WIFI_PASSWORD);
 multi.run();
#else
 WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
#endif

 Serial.print("Connecting to Wi-Fi");
 unsigned long ms = millis();
 while (WiFi.status() != WL_CONNECTED)
 {
 Serial.print(".");
 delay(300);
#if defined(ARDUINO_RASPBERRY_PI_PICO_W)
 if (millis() - ms > 10000)
 break;
#endif
 }
 Serial.println();
 Serial.print("Connected with IP: ");
 Serial.println(WiFi.localIP());
 Serial.println();

 // Set the callback for Google API access token generation status (for debug only)
 GSheet.setTokenCallback(tokenStatusCallback);

 // The WiFi credentials are required for Pico W
 // due to it does not have reconnect feature.
#if defined(ARDUINO_RASPBERRY_PI_PICO_W)
 GSheet.clearAP();
 GSheet.addAP(WIFI_SSID, WIFI_PASSWORD);
#endif

 // Set the seconds to refresh the auth token before expire (60 to 3540, default is 300 seconds)
 GSheet.setPrerefreshSeconds(10 * 60);

 // Begin the access token generation for Google API authentication
 GSheet.begin(CLIENT_EMAIL, PROJECT_ID, PRIVATE_KEY);

 configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
}

void loop()
{
 // Call ready() repeatedly in loop for authentication checking and processing
 bool ready = GSheet.ready();

 if (ready && !taskComplete)
 {
 FirebaseJson response;

 Serial.println("\nCreate spreadsheet...");
 Serial.println("------------------------");

 FirebaseJson spreadsheet;
 spreadsheet.set("properties/title", "Gas Sensor Data Log");
 spreadsheet.set("sheets/properties/gridProperties/rowCount", 100 );
 spreadsheet.set("sheets/properties/gridProperties/columnCount", 2);

 String spreadsheetId, spreadsheetURL;
 bool success = false;

 // For Google Sheet API ref doc, go to https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/create

 success = GSheet.create(&response /* returned response */, &spreadsheet /* spreadsheet object */, USER_EMAIL /* your email that this spreadsheet shared to */);
 response.toString(Serial, true);
 Serial.println();
 

 if (success)
 {
 // Get the spreadsheet id from already created file.
 FirebaseJsonData result;
 response.get(result, FPSTR("spreadsheetId")); // parse or deserialize the JSON response
 if (result.success)
 spreadsheetId = result.to<const char *>();

 // Get the spreadsheet URL.
 result.clear();
 response.get(result, FPSTR("spreadsheetUrl")); // parse or deserialize the JSON response
 if (result.success)
 {
 spreadsheetURL = result.to<const char *>();
 Serial.println("\nThe spreadsheet URL");
 Serial.println(spreadsheetURL);
 }

 struct tm timeinfo;
 char timeStringBuff[50];
 String asString;
 char buffer[40];


 FirebaseJson valueRange;
 for (int counter = 0; counter < 10; counter++)
 {
 Serial.println("\nUpdate spreadsheet values...");
 Serial.println("------------------------------");
 if (!getLocalTime(&timeinfo)) {
 Serial.println("Failed to obtain time");
 return;
 }
 strftime(timeStringBuff, sizeof(timeStringBuff), "%A, %B %d %Y %H:%M:%S", &timeinfo);
 asString = timeStringBuff;
 asString.replace(" ", "-");
 SensValue = analogRead(34);
 itoa(SensValue, numberArray, 10);

 sprintf(buffer, "values/[%d]/[1]", counter);
 valueRange.set(buffer, numberArray);
 sprintf(buffer, "values/[%d]/[0]", counter);
 valueRange.set(buffer, asString);
 sprintf(buffer, "Sheet1!A%d:B%d", 1 + counter, 10 + counter);

 success = GSheet.values.update(&response /* returned response */, spreadsheetId /* spreadsheet Id to update */, "Sheet1!A1:B1000" /* range to update */, &valueRange /* data to update */);
 response.toString(Serial, true);
 Serial.println();
 //valueRange.clear();
 delay(5000);
 }

 // For Google Sheet API ref doc, go to https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/update

 if (success)
 {

 Serial.println("\nGet spreadsheet values...");
 Serial.println("------------------------------");

 success = GSheet.values.get(&response /* returned response */, spreadsheetId /* spreadsheet Id to read */, "Sheet1!A1:B10" /* range to read */);
 response.toString(Serial, true);
 Serial.println();



#if defined(ESP32) || defined(ESP8266)
 Serial.println(ESP.getFreeHeap());
#elif defined(PICO_RP2040)
 Serial.println(rp2040.getFreeHeap());
#endif
 }
 }

 taskComplete = true;
 }
}

void tokenStatusCallback(TokenInfo info)
{
 if (info.status == esp_signer_token_status_error)
 {
 Serial.printf("Token info: type = %s, status = %s\n", GSheet.getTokenType(info).c_str(), GSheet.getTokenStatus(info).c_str());
 Serial.printf("Token error: %s\n", GSheet.getTokenError(info).c_str());
 }
 else
 {
 Serial.printf("Token info: type = %s, status = %s\n", GSheet.getTokenType(info).c_str(), GSheet.getTokenStatus(info).c_str());
 }
}

توضیحات کد

در ابتدای برنامه، کتابخانه های مورد استفاده را بارگذاری می کنیم.

#include <Arduino.h>
#if defined(ESP32) || defined(ARDUINO_RASPBERRY_PI_PICO_W)
#include <WiFi.h>
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#endif
#include <ESP_Google_Sheet_Client.h>
#include <stdlib.h>
#include "time.h"

کتابخانه WiFi.h برای برقراری اتصال WiFi است و کتابخانه ESP_Google_Sheet_Client.h برای برقراری ارتباط با Googel Sheets API استفاده می شود.
در ادامه، مشخصات WiFi را برای میکروکنترلر ESP32 معرفی می کنیم.

#define WIFI_SSID "**********"
#define WIFI_PASSWORD "**********"

در کد زیر، باید اطلاعات به دست آمده از گام های 15 و 16 مرحله قبل را وارد برنامه کنید.

#define PROJECT_ID "**************"

// Service Account's client email
#define CLIENT_EMAIL "*******************"

// Your email to share access to spreadsheet
#define USER_EMAIL "************"

char numberArray[20];

// Service Account's private key
const char PRIVATE_KEY[] PROGMEM = **********************"";

تابع setup():
در تابع setup()، ابتدا ارتباط سریال را برای بررسی عملکرد برنامه در مراحل مختلف برقرار می کنیم. سپس به شبکه WiFi معرفی شده به کد برنامه متصل می شویم. در صورت عدم بروز خطا، آی پی ESP32 در شبکه را در پورت سریال ارسال می کنیم.
در نهایت با استفاده از مشخصات CLIENT_EMAIL، PROJECT_ID و PRIVATE_KEY که قبلاً در کد وارد کرده بودیم، ESP32 را به سرویس Google Sheets API متصل می کنیم.

void setup()
{

 Serial.begin(115200);
 Serial.println();
 Serial.println();

#if defined(ESP32) || defined(ESP8266)
 WiFi.setAutoReconnect(true);
#endif

#if defined(ARDUINO_RASPBERRY_PI_PICO_W)
 multi.addAP(WIFI_SSID, WIFI_PASSWORD);
 multi.run();
#else
 WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
#endif

 Serial.print("Connecting to Wi-Fi");
 unsigned long ms = millis();
 while (WiFi.status() != WL_CONNECTED)
 {
 Serial.print(".");
 delay(300);
#if defined(ARDUINO_RASPBERRY_PI_PICO_W)
 if (millis() - ms > 10000)
 break;
#endif
 }
 Serial.println();
 Serial.print("Connected with IP: ");
 Serial.println(WiFi.localIP());
 Serial.println();
 
 // Set the callback for Google API access token generation status (for debug only)
 GSheet.setTokenCallback(tokenStatusCallback);

 // The WiFi credentials are required for Pico W
 // due to it does not have reconnect feature.
#if defined(ARDUINO_RASPBERRY_PI_PICO_W)
 GSheet.clearAP();
 GSheet.addAP(WIFI_SSID, WIFI_PASSWORD);
#endif

 // Set the seconds to refresh the auth token before expire (60 to 3540, default is 300 seconds)
 GSheet.setPrerefreshSeconds(10 * 60);

 // Begin the access token generation for Google API authentication
 GSheet.begin(CLIENT_EMAIL, PROJECT_ID, PRIVATE_KEY);

 configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
}

تابع ()loop:
در تابع loop()، ابتدا بررسی می کنیم که آیا ESP32 و Google Sheets آماده ارتباط با یکدیگر هستند.

bool ready = GSheet.ready();

یک instance برای response دریافتی از Google Sheets ایجاد کرده، و در صورت آماده بودن ارتباط، متن زیر را در پورت سریال چاپ می کنیم.

Serial.println("\nCreate spreadsheet...");
Serial.println("------------------------");

برای انجام کارهای مختلف بر روی Sheet، یک Instance به صورت زیر تعریف می کنیم.

FirebaseJson spreadsheet;

در خط 116، می توانید عنوان فایل Sheet ایجاد شده را با استفاده از instance فوق تغییر دهید. همچنین در خط 117 و 118، می توانید تعداد سطر و ستون شیت مورد نظر را تعریف کنید.

spreadsheet.set("properties/title", "Gas Sensor Data Log");
spreadsheet.set("sheets/properties/gridProperties/rowCount", 100 );
spreadsheet.set("sheets/properties/gridProperties/columnCount", 2);

برای تغییر سایر مشخصات از جمله نام Sheet، ID آن، نوع Sheet (در اینجا GRID)، تعداد سطر و ستون، می توانید کدهای زیر را در خط 120 به برنامه اضافه کنید.

       spreadsheet.set("properties/title", "ENTER YOUR FILE NAME HERE");

        spreadsheet.set("sheets/properties/title", "ENTER YOUR SHEET TITLE HERE");
        spreadsheet.set("sheets/properties/sheetId", TYPE SHEET ID HERE (Ex. 1));
        spreadsheet.set("sheets/properties/sheetType", “ENTER SHEET TYPE HERE (Ex. "GRID")”);
        spreadsheet.set("sheets/properties/gridProperties/rowCount", ENTER SHEET ROW COUNT HERE (EX. 20) );
        spreadsheet.set("sheets/properties/gridProperties/columnCount", ENTER SHEET COLUMN COUNT HERE (EX. 10));

پس از تعیین نام فایل، ، فایل با مشخصات تعریف شده را به وسیله کد خط 126 ایجاد کرده و پاسخ دریافتی از Google Sheets را در پورت سریال چاپ می کنیم.

    success = GSheet.create(&response /* returned response */, &spreadsheet /* spreadsheet object */, USER_EMAIL /* your email that this spreadsheet shared to */);
    response.toString(Serial, true);
    Serial.println();

اگر فایل با موفقیت ایجاد شد، spreadsheetId و spreadsheetUrl را از Google Sheets دریافت و در پورت سریال چاپ می کنیم.

response.get(result, FPSTR("spreadsheetId")); 
 if (result.success)
 spreadsheetId = result.to<const char *>();

 // Get the spreadsheet URL.
 result.clear();
 response.get(result, FPSTR("spreadsheetUrl")); 
 if (result.success)
 {
 spreadsheetURL = result.to<const char *>();
 Serial.println("\nThe spreadsheet URL");
 Serial.println(spreadsheetURL);
 }

ارسال داده از ESP32 به Google Sheets:
حال می توانید در فایل ایجاد شده، داده های مورد نظر خود را وارد کنید. ما در اینجا داده های سنسور گاز را که خروجی آن به صورت آنالوگ است، با استفاده از ADC وارد برنامه می کنیم.
می توانید به جای این سنسور، هر نوع خروجی سنسور و یا داده دیگری (عدد و یا متن) را در این قسمت به برنامه بدهید تا وارد Google Sheets کند.
در حلقه For زیر، ابتدا تاریخ و زمان فعلی سیستم را می خوانیم. سپس خروجی سنسور گاز را توسط ADC در متغیر SensValue ذخیره می کنیم. این دو داده را در یک سطر و دو ستون، به Google Sheets ارسال می کنیم. سپس نتیجه ارسال داده را در پورت سریال چاپ می کنیم.
این عملیات را به تعداد 10 بار و به فاصله زمانی 5 ثانیه تکرار می کنیم. شما می توانید تعداد نمونه گیری را تغییر دهید.

FirebaseJson valueRange;

 for (int counter = 0; counter < 10; counter++)
 {
 Serial.println("\nUpdate spreadsheet values...");
 Serial.println("------------------------------");
 if (!getLocalTime(&timeinfo)) {
 Serial.println("Failed to obtain time");
 return;
 }
 strftime(timeStringBuff, sizeof(timeStringBuff), "%A, %B %d %Y %H:%M:%S", &timeinfo);
 asString = timeStringBuff;
 asString.replace(" ", "-");
 SensValue = analogRead(34);
 itoa(SensValue, numberArray, 10);

 sprintf(buffer, "values/[%d]/[1]", counter);
 valueRange.set(buffer, numberArray);
 sprintf(buffer, "values/[%d]/[0]", counter);
 valueRange.set(buffer, asString);
 sprintf(buffer, "Sheet1!A%d:B%d", 1+counter,10+counter);

 success = GSheet.values.update(&response /* returned response */, spreadsheetId /* spreadsheet Id to update */, "Sheet1!A1:B1000" /* range to update */, &valueRange /* data to update */);
 response.toString(Serial, true);
 Serial.println();
 //valueRange.clear();
 delay(5000);
 }

در صورت موفق بودن عملیات ارسال داده، وارد مرحله دریافت داده از Google Sheets می شویم.
دریافت داده از Google Sheets توسط ESP32:

        success = GSheet.values.get(&response /* returned response */, spreadsheetId /* spreadsheet Id to read */, "Sheet1!A1:B10" /* range to read */);
        response.toString(Serial, true);
        Serial.println();

در کد فوق، داده های درج شده در محدوده خانه های A1 تا B10 را از روی Google Sheets می خوانیم. در صورت موفقیت، داده های خوانده شده را در پورت سریال نمایش می دهیم.
در صورت بروز خطا در هر یک از مراحل، پیام خطا و علت آن را در پورت سریال ارسال می کنیم.

گام پنجم: آپلود کد روی ESP32

 ESP32 را پروگرام کنید. با اجرای برنامه توسط ESP32، یک فایل Sheet به صورت زیر ایجاد می شود.
همانطور که مشاهده می کنید، در ستون A، تاریخ و زمان فعلی سیستم، و در ستون B ، داده های سنسور گاز درج شده است.

ESP32 to Google Sheets (API Results 1)

بعد از اجرای برنامه، مقادیری که ESP32 از روی Google Sheets می خواند، در پورت سریال نمایش داده می شود (عکس زیر).

ESP32 to Google Sheets (API Results 2)

مهمترین قسمت های خروجی چاپ شده در پورت سریال به صورت زیر است.

Connecting to Wi-Fi...
Connected with IP: 192.168.***.***

Token info: type = OAuth2.0 access token, status = on initializing
Token info: type = OAuth2.0 access token, status = on signing
Token info: type = OAuth2.0 access token, status = on exchange request
Token info: type = OAuth2.0 access token, status = ready

Create spreadsheet...
------------------------
{
 "spreadsheetId": "**********",
 "properties": {
 "title": "Gas Sensor Data Log",
 
 "spreadsheetUrl": "https://docs.google.com/spreadsheets/d/1vIeFO58uNubRK0As6nr-iJrRRYMdxR2-NhkrHE0rihE/edit"
}

The spreadsheet URL
https://docs.google.com/spreadsheets/d/1vIeFO58uNubRK0As6nr-iJrRRYMdxR2-NhkrHE0rihE/edit

Update spreadsheet values...
------------------------------
{
 "spreadsheetId": "1vIeFO58uNubRK0As6nr-iJrRRYMdxR2-NhkrHE0rihE",
 "updatedRange": "Sheet1!A1:B1",
 "updatedRows": 1,
 "updatedColumns": 2,
 "updatedCells": 2
}

Update spreadsheet values...
------------------------------
{
 "spreadsheetId": "1vIeFO58uNubRK0As6nr-iJrRRYMdxR2-NhkrHE0rihE",
 "updatedRange": "Sheet1!A1:B2",
 "updatedRows": 2,
 "updatedColumns": 2,
 "updatedCells": 4
}

Update spreadsheet values...
------------------------------
{
 "spreadsheetId": "1vIeFO58uNubRK0As6nr-iJrRRYMdxR2-NhkrHE0rihE",
 "updatedRange": "Sheet1!A1:B3",
 "updatedRows": 3,
 "updatedColumns": 2,
 "updatedCells": 6
}

Update spreadsheet values...
------------------------------
{
 "spreadsheetId": "1vIeFO58uNubRK0As6nr-iJrRRYMdxR2-NhkrHE0rihE",
 "updatedRange": "Sheet1!A1:B4",
 "updatedRows": 4,
 "updatedColumns": 2,
 "updatedCells": 8
}

Update spreadsheet values...
------------------------------
{
 "spreadsheetId": "1vIeFO58uNubRK0As6nr-iJrRRYMdxR2-NhkrHE0rihE",
 "updatedRange": "Sheet1!A1:B5",
 "updatedRows": 5,
 "updatedColumns": 2,
 "updatedCells": 10
}

Update spreadsheet values...
------------------------------
{
 "spreadsheetId": "1vIeFO58uNubRK0As6nr-iJrRRYMdxR2-NhkrHE0rihE",
 "updatedRange": "Sheet1!A1:B6",
 "updatedRows": 6,
 "updatedColumns": 2,
 "updatedCells": 12
}

Update spreadsheet values...
------------------------------
{
 "spreadsheetId": "1vIeFO58uNubRK0As6nr-iJrRRYMdxR2-NhkrHE0rihE",
 "updatedRange": "Sheet1!A1:B7",
 "updatedRows": 7,
 "updatedColumns": 2,
 "updatedCells": 14
}

Update spreadsheet values...
------------------------------
{
 "spreadsheetId": "1vIeFO58uNubRK0As6nr-iJrRRYMdxR2-NhkrHE0rihE",
 "updatedRange": "Sheet1!A1:B8",
 "updatedRows": 8,
 "updatedColumns": 2,
 "updatedCells": 16
}

Update spreadsheet values...
------------------------------
{
 "spreadsheetId": "1vIeFO58uNubRK0As6nr-iJrRRYMdxR2-NhkrHE0rihE",
 "updatedRange": "Sheet1!A1:B9",
 "updatedRows": 9,
 "updatedColumns": 2,
 "updatedCells": 18
}

Update spreadsheet values...
------------------------------
{
 "spreadsheetId": "1vIeFO58uNubRK0As6nr-iJrRRYMdxR2-NhkrHE0rihE",
 "updatedRange": "Sheet1!A1:B10",
 "updatedRows": 10,
 "updatedColumns": 2,
 "updatedCells": 20
}

Get spreadsheet values...
------------------------------
{
 "range": "Sheet1!A1:B10",
 "majorDimension": "ROWS",
 "values": [
 [
 "Saturday,-June-10-2023-09:57:18",
 "462"
 ],
 [
 "Saturday,-June-10-2023-09:57:24",
 "462"
 ],
 [
 "Saturday,-June-10-2023-09:57:30",
 "439"
 ],
 [
 "Saturday,-June-10-2023-09:57:35",
 "432"
 ],
 [
 "Saturday,-June-10-2023-09:57:41",
 "427"
 ],
 [
 "Saturday,-June-10-2023-09:57:46",
 "421"
 ],
 [
 "Saturday,-June-10-2023-09:57:52",
 "421"
 ],
 [
 "Saturday,-June-10-2023-09:57:57",
 "419"
 ],
 [
 "Saturday,-June-10-2023-09:58:03",
 "403"
 ],
 [
 "Saturday,-June-10-2023-09:58:08",
 "414"
 ]
 ]
}
193840

می توانید با مقایسه اعداد درج شده در Google Sheets و پورت سریال، از صحت مقادیر اطمینان حاصل کنید.

گام ششم: استفاده از توابع کاربردی Google Sheets

برای نمونه، خط زیر مجموع اعداد وارد شده در خانه های A1 تا A5 را محاسبه کرده و در خانه سطر اول و ستون دوم درج می کند.

valueRange.set("values/[0]/[1]", "=SUM(A1:A5)");

یا برای میانگین گیری از همین اعداد، می توانید از کد زیر استفاده کنید. عدد محاسبه شده در خانه سطر سوم و ستون دوم درج خواهد شد.

valueRange.set("values/[2]/[1]", "=AVERAGE(A1:A5)");

می توانید کلیه توابع قابل استفاده در Sheets Google را با باز کردن فایل در مرورگر و سپس از قسمت Insert-> Function، مشاهده کنید (به تصویر زیر دقت کنید).
تمامی فایل های Google Sheets موجود را می توانید در این لینک پیدا کنید.

ESP32 to Google Sheets (Functions)

روش دوم: ارسال دیتا از ESP32 به گوگل Sheets با استفاده از Google Apps Scripts

در این قسمت بجای سنسور MQ9 از سنسور دما و رطوبت BME680 استفاده کرده ایم.

گام اول: ساخت فایل جدید در گوگل Sheet

برای شروع باید یک Sheet بسازیم: وارد برنامه Sheets Google شوید، یک شیت جدید ایجاد کرده و اسم فایل و عناوین ستون ها را تعیین کنید.

ESP32 to Google Sheets (Creating a Sheet)

گام دوم: ساخت Script

1- در نوار بالا، گزینه Extensions را انتخاب کرده و بر روی Apps Script کلیک کنید تا یک Script جدید باز شود.

ESP32 to Google Sheets (Creating a Script 1)

2- کد زیر را در صفحه باز شده کپی کنید:

function doGet(e) { 
Logger.log( JSON.stringify(e) );
var result = 'Ok';
if (e.parameter == 'undefined') {
result = 'No Parameters';
}
else {
var sheet_id = '1Ffxy21v1vhflxuzJLBeuH0Y_nyqVw-DQq9pVF-66Xrc'; // Spreadsheet ID
var sheet = SpreadsheetApp.openById(sheet_id).getActiveSheet();
var newRow = sheet.getLastRow() + 1; 
var rowData = [];
var Curr_Date = new Date();
rowData[0] = Curr_Date; 
var Curr_Time = Utilities.formatDate(Curr_Date, "Asia/Tehran", 'HH:mm:ss');
rowData[1] = Curr_Time; 
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 'temperature':
rowData[2] = value; // Temperature in column C
result = 'Temperature Written on column C'; 
break;
case 'humidity':
rowData[3] = value; // Humidity in column D
result += ' ,Humidity Written on column D'; 
break; 
default:
result = "unsupported parameter";
}
}
Logger.log(JSON.stringify(rowData));
var newRange = sheet.getRange(newRow, 1, 1, rowData.length);
newRange.setValues([rowData]);
}
return ContentService.createTextOutput(result);
}
function stripQuotes( value ) {
return value.replace(/^["']|['"]$/g, "");
}
ESP32 to Google Sheets (Creating a Script 2)

3- sheet ID را با دقت و مطابق شکل کپی کرده و در کد Script جایگذاری کنید.

ESP32 to Google Sheets (Creating a Script 3)

4- بر روی Save و سپس Deploy کلیک کرده و New deployment را انتخاب کنید.

ESP32 to Google Sheets (Creating a Script 4)

5- در قسمت Select type بر روی گزینه Web app کلیک کنید.

ESP32 to Google Sheets (Creating a Script 5)

6- حال Description و Who has access را مطابق شکل تنظیم و بر روی Deploy کلیک کنید (بخش Description دلخواه می باشد).

ESP32 to Google Sheets (Creating a Script 6)

7- با کلیک بر روی Authorize access، اکانت گوگل خود را انتخاب کنید.

ESP32 to Google Sheets (Creating a Script 7)
ESP32 to Google Sheets (Creating a Script 8)

8- اگر با خطای Google Hasn’t Verified This App مواجه شدید، روی Advanced کلیک و پس از انتخاب گزینه unsafe بر روی Allow کلیک کنید.
9- حال یک Deployment ID و Web app URL به شما نشان داده می شود. Deployment ID را کپی و در جایی ذخیره کنید.

ESP32 to Google Sheets (Creating a Script 9)

توضیحات کد script

در این بخش، ابتدا Sheet ID را از Sheet مورد نظر کپی کرده و جایگذاری می کنیم. و در خط بعدی، صفحه script، با توجه به ID وارد شده، به Sheet شما دسترسی پیدا خواهد کرد.

var sheet_id = '1Ffxy21v1vhflxuzJLBeuH0Y_nyqVw-DQq9pVF-66Xrc'; // Spreadsheet ID
var sheet = SpreadsheetApp.openById(sheet_id).getActiveSheet();

در اینجا، ابتدا تاریخ روز را گرفته و در یک متغیر ذخیره می کنیم. سپس این متغیر را در ستون A از Sheet مورد نظر درج می کنیم. بعد از آن زمان را در منطقه و فرمت دلخواه گرفته و در ستون B ذخیره خواهیم کرد.

var Curr_Date = new Date();
rowData[0] = Curr_Date; 
var Curr_Time = Utilities.formatDate(Curr_Date, "Asia/China", 'HH:mm:ss');
rowData[1] = Curr_Time;

در این بخش از کد، متغیر های مربوط به دما و رطوبت را از ESP32 گرفته و در ستون های C و D شیت چاپ می کنیم.

case 'temperature':
rowData[2] = value; 
result = 'Temperature Written on column C'; 
break;
case 'humidity':
rowData[3] = value; 
result += ' ,Humidity Written on column D'; 
break;

گام سوم: سیم بندی

سیم بندی را مطابق شکل زیر انجام بدهید.

ESP32 to Google Sheets (Scripts Circuit)

گام چهارم: آپلود کد بر روی ESP32

نرم افزار آردوینو را باز کرده و پس از انتخاب Port و Board مورد نظر، تمام صفحه را پاک و کد زیر را بجای آن کپی کنید.

#if defined(ESP32) || defined(ARDUINO_RASPBERRY_PI_PICO_W)
#include <WiFi.h>
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#endif
#include <WiFiClientSecure.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME680 bme; // I2C
#define ON_Board_LED 2 //--> Defining an On Board LED, used for indicators when the process of connecting to a wifi router
const char* ssid = "Caferobot"; //--> Your wifi name or SSID.
const char* password = "**********"; //--> Your wifi password.

//----------------------------------------Host & httpsPort
const char* host = "script.google.com";
const int httpsPort = 443;
//----------------------------------------

WiFiClientSecure client; //--> Create a WiFiClientSecure object.

String GAS_ID = "AKfycbxGBAOSGsonYMhC44spCtQUwFCW3C-0P2NdZiAmrRFXMzpSB2DKD9cF8hL7F4QCRg7C"; //--> spreadsheet script ID

void setup() {
 // put your setup code here, to run once:
 Serial.begin(115200);
 delay(500);
 WiFi.begin(ssid, password); //--> Connect to your WiFi router
 Serial.println("");
 pinMode(ON_Board_LED,OUTPUT); //--> On Board LED port Direction output
 digitalWrite(ON_Board_LED, HIGH); //--> Turn off Led On Board
 //----------------------------------------Wait for connection
 Serial.print("Connecting");
 while (WiFi.status() != WL_CONNECTED) {
 Serial.print(".");
 //----------------------------------------Make the On Board Flashing LED on the process of connecting to the wifi router.
 digitalWrite(ON_Board_LED, LOW);
 delay(250);
 digitalWrite(ON_Board_LED, HIGH);
 delay(250);
 //----------------------------------------
 }
 //----------------------------------------
 digitalWrite(ON_Board_LED, HIGH); //--> Turn off the On Board LED when it is connected to the wifi router.
 Serial.println("");
 Serial.print("Successfully connected to : ");
 Serial.println(ssid);
 Serial.print("IP address: ");
 Serial.println(WiFi.localIP());
 Serial.println();
 //----------------------------------------

 while (!Serial);
 Serial.println(F("BME680 test"));
 if (!bme.begin()) {
 Serial.println("Could not find a valid BME680 sensor, check wiring!");
 while (1);
 }
 // Set up oversampling and filter initialization
 bme.setTemperatureOversampling(BME680_OS_8X);
 bme.setHumidityOversampling(BME680_OS_2X);
 bme.setPressureOversampling(BME680_OS_4X);
 bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
 bme.setGasHeater(320, 150); // 320*C for 150 ms
 client.setInsecure();
}

void loop() {
 // Reading temperature or humidity takes about 250 milliseconds!
 // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
 if (! bme.performReading()) {
 Serial.println("Failed to perform reading :(");
 return;
 }
 Serial.print("Temperature = ");
 Serial.print(bme.temperature);
 Serial.println(" *C");
 Serial.print("Pressure = ");
 Serial.print(bme.pressure / 100.0);
 Serial.println(" hPa");
 Serial.print("Humidity = ");
 Serial.print(bme.humidity);
 Serial.println(" %");
 Serial.print("Gas = ");
 Serial.print(bme.gas_resistance / 1000.0);
 Serial.println(" KOhms");

 Serial.print("Approx. Altitude = ");
 Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
 Serial.println(" m");
 Serial.println();
int h = bme.humidity;
 float t = bme.temperature;
 sendData(t, h); //--> Calls the sendData Subroutine
}

// Subroutine for sending data to Google Sheets
void sendData(float tem, int hum) {
 Serial.println("==========");
 Serial.print("connecting to ");
 Serial.println(host); 
 //----------------------------------------Connect to Google host
 if (!client.connect(host, httpsPort)) {
 Serial.println("connection failed");
 return;
 }
 //----------------------------------------

 //----------------------------------------Processing data and sending data
 String string_temperature = String(tem);
 // String string_temperature = String(tem, DEC); 
 String string_humidity = String(hum, DEC); 
 String url = "/macros/s/" + GAS_ID + "/exec?temperature=" + string_temperature + "&humidity=" + string_humidity;
 Serial.print("requesting URL: ");
 Serial.println(url);

 client.print(String("GET ") + url + " HTTP/1.1\r\n" +
 "Host: " + host + "\r\n" +
 "User-Agent: BuildFailureDetectorESP32 \r\n" +
 "Connection: close\r\n\r\n");

 Serial.println("request sent");
 //----------------------------------------

 //----------------------------------------Checking whether the data was sent successfully or not
 while (client.connected()) {
 String line = client.readStringUntil('\n');
 if (line == "\r") {
 Serial.println("headers received");
 break;
 }
 }
 String line = client.readStringUntil('\n');
 if (line.startsWith("{\"state\":\"success\"")) {
 Serial.println("ESP32 /Arduino CI successfull!");
 } else {
 Serial.println("ESP32 /Arduino CI has failed");
 }
 Serial.print("reply was : ");
 Serial.println(line);
 Serial.println("closing connection");
 Serial.println("==========");
 Serial.println();
}

سپس در قسمت GAS_ID باید Deployment ID که از قبل ذخیره کرده بودید را جایگذاری کنید. همچنین در قسمت ssid و password اطلاعات مربوط به خود را جایگذاری کرده و کد را Upload کنید.

ESP32 to Google Sheets (Code)

پس از اتمام کار، به Sheet ساخته شده باز میگردیم. خروجی مورد نظرمان به صورت دما و رطوبت و زمان و تاریخ قابل مشاهده است. این داده ها را در پنجره Serial Monitor نرم افزار آردوینو نیز میتوانیم مشاهده کنیم. این اعداد بر روی تلفن همراه و در نرم افزار Google Sheets نیز قابل رصد هستند.

ESP32 to Google Sheets (Creating a Script - Result)

توضیحات کد آردوینو

در ادامه کد آردوینو را به بخش های مختلفی تقسیم می کنیم و هدف از هر بخش را به طور خلاصه توضیح می دهیم.

ابتدا کتابخانه های مورد نیاز را تعریف می کنیم. بدیهی است که در صورت استفاده از سنسورهای متفاوت، کتابخانه ها نیز متناسب با آن تغییر خواهند کرد.

#if defined(ESP32) || defined(ARDUINO_RASPBERRY_PI_PICO_W)
#include <WiFi.h>
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#endif
#include <WiFiClientSecure.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"

مشخصات شبکه وای فای را با دقت وارد می کنیم تا در ادامه ESP32 به شبکه وای فای تعیین شده متصل گردد.

const char* ssid = "ElectroPeak"; //--> Your wifi name or SSID.
const char* password = "**********"; //--> Your wifi password.

Deployment ID را مطابق با روندی که اشاره شد به طور دقیق جایگزین می کنیم.

String GAS_ID = "AKfycbxGBAOSGsonYMhC44spCtQUwFCW3C-0P2NdZiAmrRFXMzpSB2DKD9cF8hL7F4QCRg7C"; //--> spreadsheet script ID

ESP32 به شبکه وای فای که خودمان تعریف کرده ایم متصل میگردد.

WiFi.begin(ssid, password); //--> Connect to your WiFi router

در صورتی که اتصال به وای فای به درستی صورت پذیرد نام شبکه و IP در پنجره Serial Monitor قابل مشاهده خواهند بود.

  Serial.println("");
  Serial.print("Successfully connected to : ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.println();

میزان دما و فشار هوا و رطوبت و گازهای آلاینده و ارتفاع از سطح دریا سنجیده خواهد شد و در پنجره Serial Monitor چاپ می شوند.

  Serial.print("Temperature = ");
  Serial.print(bme.temperature);
  Serial.println(" *C");
  Serial.print("Pressure = ");
  Serial.print(bme.pressure / 100.0);
  Serial.println(" hPa");
  Serial.print("Humidity = ");
  Serial.print(bme.humidity);
  Serial.println(" %");
  Serial.print("Gas = ");
  Serial.print(bme.gas_resistance / 1000.0);
  Serial.println(" KOhms");

  Serial.print("Approx. Altitude = ");
  Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
  Serial.println(" m");

دما و رطوبت سنجیده خواهند شد و در متغیر های t و h ریخته می شوند و توسط تابع sendDate برای Google Sheets ارسال خواهند شد.

float t = bme.temperature;
int h = bme.humidity;
sendData(t, h); //--> Calls the sendData Subroutine

در این بخش از کد که مربوط به تعریف تابع sendDate می باشد، ابتدا متغیر های دما و رطوبت به صورت رشته ای تعریف شده و سپس url مورد نیاز در یک متغیر آماده سازی، و در نهایت دیتای مورد نظر با دستور client.print به Google Sheets ارسال می شود.

String string_temperature = String(tem);
 String string_humidity = String(hum, DEC); 
 String url = "/macros/s/" + GAS_ID + "/exec?temperature=" + string_temperature + "&humidity=" + string_humidity;
 Serial.print("requesting URL: ");
 Serial.println(url);
 client.print(String("GET ") + url + " HTTP/1.1\r\n" +
 "Host: " + host + "\r\n" +
 "User-Agent: BuildFailureDetectorESP32 \r\n" +
 "Connection: close\r\n\r\n");

یک گام جلوتر

در این آموزش، توانستیم سیستم ارسال و دریافت داده بین ESP32 و Google Sheets را از دو طریق Google Sheets API و Google Apps Script ایجاد کنیم. سپس تاریخ و داده های خوانده شده از حسگرها را در Sheet ایجاد شده ذخیره کردیم.
با استفاده از sheet ایجادشده، کارهای بسیار متنوع و پیچیده تری را می توانید انجام دهید.
برای نمونه، می توانید هرگونه اطلاعات نوشتاری را با هر فرمت به Google Sheets ارسال کنید. این اطلاعات می تواند از طریق خواندن خروجی سنسورها و ماژول های مختلف به دست آید.
تنها با ارسال داده های سنسور به Sheet ایجاد شده، می توانید یک Data Logger ایجاد کرده و به تحلیل و بررسی داده های آن بپردازید.
و یا می توانید با تحلیل داده های موجود، یک سیستم مدیریتی شبکه IoT ایجاد کنید.

آموزش های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.