You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP8266-01能否替代NodeMCU向Google Sheets传输温湿度数据?

ESP8266-01 对接Google Sheets 数据存储问题解决方案

问题描述

我正在开展一个将数据直接传输并保存至Google Sheets的项目,但多数同类项目使用NodeMCU或ESP32开发板。请问ESP8266-01 WiFi模块能否实现相同功能?我尝试使用了以下代码:

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include "HTTPSRedirect.h"

// Enter network credentials:
const char* ssid     = "network";
const char* password = "password";

// Enter Google Script Deployment ID:
const char *GScriptId = "AKfycpwCtWuN3BNIO5CR9BtZJAMaRNUgusldcAz6V7rtGCg1L5srZ5iAEZumVeb-        1ea5Y6mg3Q";

// Enter command (insert_row or append_row) and your Google Sheets sheet name (default is Sheet1):
String payload_base =  "{\"command\": \"insert_row\", \"sheet_name\": \"Sheet1\", \"values\": ";
String payload = "";

// Google Sheets setup (do not edit)
const char* host = "script.google.com";
const int httpsPort = 443;
const char* fingerprint = "";
String url = String("/macros/s/") + GScriptId + "/exec";
HTTPSRedirect* client = nullptr;

// Declare variables that will be published to Google Sheets
int value0 = 0;
int value1 = 0;
int value2 = 0;

void setup() {

  Serial.begin(9600);        
  delay(10);
  Serial.println('\n');

  // Connect to WiFi
  WiFi.begin(ssid, password);             
  Serial.print("Connecting to ");
  Serial.print(ssid); Serial.println(" ...");

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
   Serial.println('\n');
   Serial.println("Connection established!");  
   Serial.print("IP address:\t");
   Serial.println(WiFi.localIP());

  // Use HTTPSRedirect class to create a new TLS connection
  client = new HTTPSRedirect(httpsPort);
  client->setInsecure();
  client->setPrintResponseBody(true);
  client->setContentTypeHeader("application/json");

  Serial.print("Connecting to ");
  Serial.println(host);

  // Try to connect for a maximum of 5 times
  bool flag = false;
  for (int i=0; i<5; i++){ 
    int retval = client->connect(host, httpsPort);
    if (retval == 1){
       flag = true;
       Serial.println("Connected");
       break;
    }
    else
      Serial.println("Connection failed. Retrying...");
  }
  if (!flag){
    Serial.print("Could not connect to server: ");
    Serial.println(host);
    return;
  }
  delete client;    // delete HTTPSRedirect object
  client = nullptr; // delete HTTPSRedirect object
}


void loop() {

  // create some fake data to publish
  value0 ++;
  value1 = random(0,1000);
  value2 = random(0,100000);


  static bool flag = false;
  if (!flag){
    client = new HTTPSRedirect(httpsPort);
    client->setInsecure();
    flag = true;
    client->setPrintResponseBody(true);
    client->setContentTypeHeader("application/json");
  }
  if (client != nullptr){
    if (!client->connected()){
      client->connect(host, httpsPort);
    }
  }
  else{
    Serial.println("Error creating client object!");
  }

  // Create json object string to send to Google Sheets
  payload = payload_base + "\"" + value0 + "," + value1 + "," + value2 + "\"}";

  // Publish data to Google Sheets
  Serial.println("Publishing data...");
  Serial.println(payload);
  if(client->POST(url, host, payload)){ 
    // do stuff here if publish was successful
  }
  else{
    // do stuff here if publish was not successful
    Serial.println("Error while connecting");
  }

  // a delay of several seconds is required before publishing again    
  delay(5000);
}

运行该代码时出现“invalid head of packet (0x00)”错误,若有可用的正确代码方案,请告知,感谢您的帮助!

核心结论

ESP8266-01完全可以实现数据直接存储到Google Sheets的功能,它具备WiFi连接与HTTPS通信能力,报错的核心原因是代码的连接逻辑缺陷和JSON payload格式错误。

问题分析

  • 客户端连接逻辑错误:原代码在setup()中创建HTTPS客户端并成功连接后,立即销毁了客户端;loop()中重建客户端时的重连逻辑不完整,导致TLS握手过程异常,触发"invalid head of packet"错误。
  • JSON格式错误:构造的payload中values字段被包装成了字符串("1,2,3"),但Google Apps Script期望接收的是数组格式([1,2,3]),导致请求无法被正确解析。

修正后的代码

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include "HTTPSRedirect.h"

// WiFi网络凭据
const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";

// Google Apps Script部署ID
const char* GScriptId = "你的脚本部署ID";

// Google Sheets配置
const char* host = "script.google.com";
const int httpsPort = 443;
String url = String("/macros/s/") + GScriptId + "/exec";

HTTPSRedirect* client = nullptr;

// 待上传数据变量
int value0 = 0;
int value1 = 0;
int value2 = 0;

void setup() {
  Serial.begin(9600);
  delay(10);
  Serial.println();

  // 连接WiFi
  WiFi.begin(ssid, password);
  Serial.print("连接WiFi: ");
  Serial.println(ssid);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("\nWiFi连接成功!");
  Serial.print("IP地址: ");
  Serial.println(WiFi.localIP());

  // 初始化HTTPS客户端
  client = new HTTPSRedirect(httpsPort);
  client->setInsecure(); // 仅测试用,生产环境建议使用证书指纹
  client->setPrintResponseBody(true);
  client->setContentTypeHeader("application/json");

  // 尝试连接Google服务器
  Serial.print("连接服务器: ");
  Serial.println(host);
  bool connected = false;
  for (int i = 0; i < 5; i++) {
    if (client->connect(host, httpsPort)) {
      connected = true;
      Serial.println("服务器连接成功");
      break;
    }
    Serial.println("连接失败,重试...");
    delay(1000);
  }

  if (!connected) {
    Serial.println("无法连接到服务器");
    return;
  }
}

void loop() {
  // 生成测试数据
  value0++;
  value1 = random(0, 1000);
  value2 = random(0, 100000);

  // 检查客户端连接状态,断开则重连
  if (client && !client->connected()) {
    Serial.println("客户端断开,尝试重连...");
    bool reconnected = false;
    for (int i = 0; i < 3; i++) {
      if (client->connect(host, httpsPort)) {
        reconnected = true;
        Serial.println("重连成功");
        break;
      }
      delay(1000);
    }
    if (!reconnected) {
      Serial.println("重连失败");
      delay(5000);
      return;
    }
  }

  // 构造正确格式的JSON payload
  String payload = "{\"command\": \"append_row\", \"sheet_name\": \"Sheet1\", \"values\": [";
  payload += String(value0) + "," + String(value1) + "," + String(value2) + "]}";

  // 发送数据到Google Sheets
  Serial.println("上传数据...");
  Serial.println(payload);
  if (client->POST(url, host, payload)) {
    Serial.println("数据上传成功");
  } else {
    Serial.println("数据上传失败");
  }

  // 上传间隔,避免频繁请求被限制
  delay(10000);
}

注意事项

  • Google脚本权限设置:确保你的Google Apps Script部署时选择"任何人,甚至匿名"访问权限(注意:此设置会允许公开提交数据,需根据项目需求评估安全性)。
  • 内存优化:ESP8266-01内存有限,建议减少String类的使用,改用char数组拼接JSON,避免内存溢出。
  • 安全性优化:生产环境中不要使用setInsecure(),可以获取script.google.com的证书指纹,替换为client->setFingerprint("证书指纹")。

内容的提问来源于stack exchange,提问作者James Salvador

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 01:32:03