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 c параметрами (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);
}
// Можно использовать POST так же:
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 || "";
// Если пришёл NaN — пишем пустую ячейку
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 по таймеру — удобный и бесплатный способ построить надёжный журнал показаний для инженерных задач. Подход быстро разворачивается, легко расширяется и масштабируется на десятки устройств. Далее вы можете добавить графики, алерты, другие датчики и даже двусторонний обмен командами через Таблицу.
Модуль MP3-плеера GW
Полностью автономный mp3-плеер с питанием 5 В. Миниатюрный, имеет на борту кнопки управления. Читает..
89.24грн.
Умный дом #11: Коммуникационные сети
Умный дом #11: Коммуникационные сети Любая система умного дома невозможна без надежной ..
Измерение времени выполнения операций и функций в скетчах Arduino
Измерение времени выполнения операций и функций в скетчах Arduino Введение При разработк..
3 бесплатных MQTT-сервера для тестирования ESP32
3 бесплатных MQTT-сервера для тестирования ESP32 При разработке IoT-проектов на ESP32 почти все..
Монтажный модуль драйвера A4988 или DRV8825
Модуль для установки одного из самых распространенных драйверов A4988 или DRV8825 для управлени..
97.23грн.





