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 разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Припой-паста для пайки SMD-компонентов

Припой-паста для пайки SMD-компонентов

Паста-припой в шприце XG-Z40Намазывается на контактные площадки платы, плавится при температуре >..

196.14грн.

Адаптер USB 2.0 в TTL UART

Адаптер USB 2.0 в TTL UART

Коммуникационный конвертер USB 2.0 в TTL UARTОснован на микросхеме CP2102Имеется самовоста..

125.05грн.

Концевик с колесом для 3D принтера или CNC ramps 1.4

Концевик с колесом для 3D принтера или CNC ramps 1.4

Концевой выключатель для установки на 3D-принтер или CNC-станок системы ramps 1.4В комплекте ка..

52.29грн.

Шестерня для зубчатого ремня на 20 зубьев под ось 8 мм

Шестерня для зубчатого ремня на 20 зубьев под ось 8 мм

Используется для передачи и редукции крутящего момента от двигателя до оси 8 ммКоличество зубьев 20 ..

29.41грн.

Таймеры Arduino UNO — Часть 5. Измерение длительности импульсов и частоты (Input Capture)

Таймеры Arduino UNO — Часть 5. Измерение длительности импульсов и частоты (Input Capture)

Таймеры Arduino UNO — Часть 5. Измерение длительности импульсов и частоты (Input Capture) Т..