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 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 по таймеру — удобный и бесплатный способ построить надёжный журнал показаний для инженерных задач. Подход быстро разворачивается, легко расширяется и масштабируется на десятки устройств. Далее вы можете добавить графики, алерты, другие датчики и даже двусторонний обмен командами через Таблицу.

<< Проекты << Все товары >> Статьи, уроки >>

Написать отзыв

Примечание: HTML разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Модуль MP3-плеера GW

Модуль MP3-плеера GW

Полностью автономный mp3-плеер с питанием 5 В. Миниатюрный, имеет на борту кнопки управления. Читает..

89.24грн.

Умный дом #11: Коммуникационные сети

Умный дом #11: Коммуникационные сети

Умный дом #11: Коммуникационные сети Любая система умного дома невозможна без надежной ..

Измерение времени выполнения операций и функций в скетчах Arduino

Измерение времени выполнения операций и функций в скетчах Arduino

Измерение времени выполнения операций и функций в скетчах Arduino Введение При разработк..

3 бесплатных MQTT-сервера для тестирования ESP32

3 бесплатных MQTT-сервера для тестирования ESP32

3 бесплатных MQTT-сервера для тестирования ESP32 При разработке IoT-проектов на ESP32 почти все..

Монтажный модуль драйвера A4988 или DRV8825

Монтажный модуль драйвера A4988 или DRV8825

Модуль для установки одного из самых распространенных драйверов A4988 или DRV8825 для управлени..

97.23грн.