ESP32 → Google Sheets: відправка даних у таблицю кожні 5 хвилин

У цьому прикладі ESP32 автоматично вимірює параметри (температуру та вологість для демонстрації) і кожні 5 хвилин додає новий рядок у Google Таблицю. Зв’язка реалізована через Google Apps Script (Web App), тому зовнішній сервер не потрібен: контролер робить HTTPS-запит напряму у ваш скрипт, а той додає дані у лист.

Необхідне обладнання

  • Плата ESP32 DevKit (WROOM/WROVER)
  • Датчик DHT22 (можна замінити будь-яким іншим; у коді легко підставити свій датчик)
  • Резистор для DHT22 (10 кОм, якщо потрібна підтяжка)
  • USB-кабель для прошивки та живлення
  • Доступ до Wi-Fi і обліковий запис Google

Принцип роботи

Ви створюєте Google Таблицю і скрипт (Apps Script), публікуєте його як Web App та отримуєте URL виду https://script.google.com/macros/s/AKfycb.../exec. ESP32 кожні 5 хвилин зчитує дані з датчика і відправляє HTTPS-запит (GET або POST) на цей URL. Скрипт приймає параметри і додає рядок у таблицю: час — температура — вологість — статус.

Поле Джерело Приклад значення
timestampСкрипт (new Date())2025-08-20 10:15:00
temperatureESP32 (DHT22)24.6
humidityESP32 (DHT22)51.2
statusESP32OK / SENSOR_ERROR

Приклад коду

// ======================= ЧАСТИНА 1: ESP32 (Arduino) =======================
// Бібліотеки: WiFi, WiFiClientSecure, HTTPClient, DHT (Adafruit DHT sensor library)
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <HTTPClient.h>
#include <DHT.h>

#define DHTPIN   4
#define DHTTYPE  DHT22
DHT dht(DHTPIN, DHTTYPE);

// --- Wi-Fi ---
const char* WIFI_SSID = "YOUR_WIFI_SSID";
const char* WIFI_PASS = "YOUR_WIFI_PASSWORD";

// --- URL опублікованого Web App (Apps Script) ---
// Формат GET: https://script.google.com/macros/s/AKfycb.../exec?temperature=24.6&humidity=51.2&status=OK
const char* WEB_APP_URL = "https://script.google.com/macros/s/AKfycb_your_deployed_id/exec";

// --- період відправки (мс) ---
const unsigned long SEND_PERIOD_MS = 5UL * 60UL * 1000UL; // 5 хвилин
unsigned long lastSend = 0;

WiFiClientSecure client;

void wifiConnect() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  Serial.print("WiFi connecting");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.printf("\nWiFi OK, IP: %s\n", WiFi.localIP().toString().c_str());
}

void setup() {
  Serial.begin(115200);
  dht.begin();
  wifiConnect();

  // Спрощений варіант TLS (без кореневого сертифіката)
  client.setInsecure(); // Для продакшн краще вказати кореневий сертифікат Google
}

bool sendToSheets(float t, float h, const String& status) {
  if (WiFi.status() != WL_CONNECTED) {
    wifiConnect();
  }

  HTTPClient https;
  // Формуємо URL з параметрами (GET)
  String url = String(WEB_APP_URL) + "?temperature=" + String(t, 1)
             + "&humidity=" + String(h, 1)
             + "&status=" + status;

  Serial.println("[HTTP] GET: " + url);
  if (https.begin(client, url)) {
    int code = https.GET();
    Serial.printf("[HTTP] code: %d\n", code);
    if (code > 0) {
      String payload = https.getString();
      Serial.println("[HTTP] response: " + payload);
    }
    https.end();
    return (code == 200);
  } else {
    Serial.println("[HTTP] unable to connect");
    return false;
  }
}

void loop() {
  const unsigned long now = millis();
  if (now - lastSend >= SEND_PERIOD_MS || lastSend == 0) {
    lastSend = now;

    float h = dht.readHumidity();
    float t = dht.readTemperature();
    String status = "OK";

    if (isnan(h) || isnan(t)) {
      Serial.println("DHT read error");
      // Можна відправити статус про помилку, щоб бачити збої у таблиці
      sendToSheets(NAN, NAN, "SENSOR_ERROR");
      return;
    }

    // Відправляємо дані
    bool ok = sendToSheets(t, h, status);
    if (!ok) {
      Serial.println("Send failed, will retry in 5 minutes.");
    }
  }

  // Додатково: можна перевести ESP32 у deep sleep і прокидатися раз на 5 хвилин,
  // щоб економити енергію в автономних системах.
}

// ================= ЧАСТИНА 2: Google Apps Script (код скрипта) =================
// У Таблиці: Extensions → Apps Script. Вставте цей код, вкажіть назву листа.
// Потім: Deploy → New deployment → Type: Web app → Execute as: Me → Access: Anyone with the link
// Після деплою отримаєте URL і вставте його в WEB_APP_URL вище.

function doGet(e) {
  return handleRequest_(e);
}

function doPost(e) {
  return handleRequest_(e);
}

function handleRequest_(e) {
  var ss   = SpreadsheetApp.getActiveSpreadsheet();
  var sh   = ss.getSheetByName("Data") || ss.insertSheet("Data");
  // Заголовок таблиці (автосоздання)
  if (sh.getLastRow() === 0) {
    sh.appendRow(["timestamp", "temperature", "humidity", "status"]);
  }

  var params = (e && e.parameter) ? e.parameter : {};
  var t = params.temperature || "";
  var h = params.humidity || "";
  var s = params.status || "";

  if (t === "NaN") t = "";
  if (h === "NaN") h = "";

  sh.appendRow([new Date(), t, h, s]);

  return ContentService
    .createTextOutput(JSON.stringify({ ok: true, rows: sh.getLastRow() }))
    .setMimeType(ContentService.MimeType.JSON);
}

Застосування та розширення проекту

  • Теплиця/склад/серверна: журнал температури та вологості з інтервалом 5–10 хв
  • Багатодатчикові системи: додайте ще поля (напруга батареї, тиск, CO₂) і відправляйте одним запитом
  • Графіки в Sheets: налаштуйте діаграми у таблиці для автооновлення
  • Алерти: додайте тригер у Apps Script (або Telegram-бота) — сповіщення при виході за пороги
  • Економія енергії: переведіть ESP32 у deep sleep на 5 хвилин між вимірюваннями
  • Безпека: обмежте доступ Web App (доступ лише за посиланням, перевірка секретного ключа у параметрах)

Висновок

Відправка даних з ESP32 у Google Sheets за таймером — зручний і безкоштовний спосіб побудувати надійний журнал показників для інженерних завдань. Метод швидко розгортається, легко масштабується і може бути розширений десятками пристроїв. Далі ви можете додати графіки, алерти, інші датчики та навіть двосторонній обмін командами через Таблицю.

<< Проекти << Усі товари >> Статті, уроки >>

Написати відгук

Примітка: HTML размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Модуль живлення збільшуючий 2...24В/5...28В 2А

Модуль живлення збільшуючий 2...24В/5...28В 2А

Модуль збільшуючий напругу постійного струму з 2 ... 24 В до 5 ... 28 ВНапруга на виході регулю..

36.78грн.

Ремінь зубчастий 6 мм для 3D-принтера

Ремінь зубчастий 6 мм для 3D-принтера

Відрізок зубчастого ременя шириною 6 мм.Застосовується для переміщення каретки 3D-принтера або CNC п..

49.26грн.

SIMWEM mini – GSM шилд для WeMos D1 Mini та SIM800L

SIMWEM mini – GSM шилд для WeMos D1 Mini та SIM800L

SIMWEM mini – це компактний та функціональний шилд, призначений для підключення GSM-модуля SIM800L д..

253.80грн.

SIM800 Arduino автоматичні команди

SIM800 Arduino автоматичні команди

Привіт друзі! Минулого відео ми розібрали ручне управління GSM-модулем набираючи команди в моніторі ..

Arduino SIM800 вихідний дзвінок ATD

Arduino SIM800 вихідний дзвінок ATD

Привіт друзі! Це продовження серії відео про роботу з SIM800. Усіх їх можна знайти на цьому каналі. ..