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 |
| temperature | ESP32 (DHT22) | 24.6 |
| humidity | ESP32 (DHT22) | 51.2 |
| status | ESP32 | OK / 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 за таймером — зручний і безкоштовний спосіб побудувати надійний журнал показників для інженерних завдань. Метод швидко розгортається, легко масштабується і може бути розширений десятками пристроїв. Далі ви можете додати графіки, алерти, інші датчики та навіть двосторонній обмін командами через Таблицю.
Модуль живлення збільшуючий 2...24В/5...28В 2А
Модуль збільшуючий напругу постійного струму з 2 ... 24 В до 5 ... 28 ВНапруга на виході регулю..
36.78грн.
Ремінь зубчастий 6 мм для 3D-принтера
Відрізок зубчастого ременя шириною 6 мм.Застосовується для переміщення каретки 3D-принтера або CNC п..
49.26грн.
SIMWEM mini – GSM шилд для WeMos D1 Mini та SIM800L
SIMWEM mini – це компактний та функціональний шилд, призначений для підключення GSM-модуля SIM800L д..
253.80грн.
SIM800 Arduino автоматичні команди
Привіт друзі! Минулого відео ми розібрали ручне управління GSM-модулем набираючи команди в моніторі ..
Arduino SIM800 вихідний дзвінок ATD
Привіт друзі! Це продовження серії відео про роботу з SIM800. Усіх їх можна знайти на цьому каналі. ..





