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

ESP32 LED PWM: управление яркостью светодиодов LEDC

ESP32 LED PWM Controller: управление яркостью светодиодов ESP32 имеет встроенный модуль LED..

Клавиатура для панели управления аналоговая

Клавиатура для панели управления аналоговая

Аналоговая клавиатура может использоваться как джойстик управления или как панель управления менюшко..

100.02грн.

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

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

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

148.24грн.

Осциллограф на ардуино

Осциллограф на ардуино

Простой осциллограф своими руками без паяльникаОсциллографы бывают дорогие или очень дорогие. Как же..

Понижающий преобразователь напряжения 4...35В в 1,23...30В

Понижающий преобразователь напряжения 4...35В в 1,23...30В

Подстраиваемый понижающий преобразователь напряжения постоянного тока.Держит стабильное заданное рез..

63.45грн.