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
相关产品推荐
相关产品推荐

