与Arduino和电子表格集成 - 构建代码

힘센캥거루
2025년 10월 8일(수정됨)
5
37

在上一篇文章中,我们了解了与Arduino和电子表格集成的表格设置。

在这篇文章中,我们将了解如何通过Arduino D1板上的https通信传输数据。

1. 安装Arduino D1板的库

要使用Arduino D1板,首先需要安装板库。

进入Arduino IDE,选择文件-设置。

与Arduino和电子表格集成 - 构建代码-2

在下面的附加板管理器urls中输入以下地址。

http://arduino.esp8266.com/stable/package_esp8266com_index.json
与Arduino和电子表格集成 - 构建代码-3与Arduino和电子表格集成 - 构建代码-4

输入完成后,点击确认。

与Arduino和电子表格集成 - 构建代码-5

在左侧的板管理器中搜索arduino D1板并进行安装。

这样,板库安装就完成了。 

与Arduino和电子表格集成 - 构建代码-6

选择板后,进入文件-示例,检查ESP8266示例是否显示正常。 

首先像下面这样设置板。

与Arduino和电子表格集成 - 构建代码-7

如果示例显示正常,则安装成功。

与Arduino和电子表格集成 - 构建代码-8

2. 编译Arduino代码

现在是上传代码到Arduino的时候了。

首先调用模块并进行连接WiFi的基本设置。

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>

// int fan_pin = 8;

const char* ssid = "WiFi 名称";   // WiFi 名称
const char* password = "WiFi 密码"; // WiFi 密码

//----------------------------------------主机 & https端口(https 固定为443)
const char* host = "script.google.com";
const int httpsPort = 443;
//----------------------------------------

WiFiClientSecure client; // 创建WiFiClientSecure对象

// Google电子表格脚本ID
String GAS_ID = "Google电子表格脚本ID";

在setup中设置串行通信速度并连接WiFi。

ESP8266的默认串行通信速度是115,200。

通过WiFi.begin(ssid, password)尝试连接,并使用WiFi.status()检查连接状态。

使用client.setInsecure以允许https连接。

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password); // 连接WiFi路由器
  Serial.println("");
  //----------------------------------------等待连接
  Serial.print("连接中");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(1000);
    };
  //----------------------------------------
  Serial.println("");
  Serial.print("WiFi连接成功 : ");
  Serial.println(ssid);
  Serial.print("IP 地址: ");
  Serial.println(WiFi.localIP());
  Serial.println();
  //----------------------------------------
  client.setInsecure();
}

现在是编写主代码的时候了。 

目前没有连接Arduino的设备,所以我尝试通过Google表格传输两个指定变量。

void loop() {
  delay(1000);
  int v1 = 2000;
  int v2 = 3000;
  if (!client.connect(host, httpsPort)) {
    Serial.println("主机连接失败");
    return;
  };
  String value1 =  String(v1);
  String value2 =  String(v2);
  String url = "/macros/s/" + GAS_ID + "/exec?value1=" + value1 + "&value2=" + value2;
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
         "Host: " + host + "\r\n" +
         "User-Agent: BuildFailureDetectorESP8266\r\n" +
         "Connection: close\r\n\r\n");
  Serial.println("请求发送");
};

查看表格,可以看到值已成功传输。

与Arduino和电子表格集成 - 构建代码-9

现在将传输数据的部分制作成函数。

函数名为sendData,接受两个int作为参数。

如下函数所示,核心部分与上面相同,增加了对响应的处理部分。

void sendData(int data1, int data2) {
  Serial.println("==========");
  Serial.print("连接主机中");
  Serial.println(host);
  
  //----------------------------------------连接到Google主机
  if (!client.connect(host, httpsPort)) {
    Serial.println("主机连接失败");
    return;
  }
  //----------------------------------------
//----------------------------------------处理数据并发送数据
  String value1 =  String(data1);
  String value2 =  String(data2);
  String url = "/macros/s/" + GAS_ID + "/exec?value1=" + value1 + "&value2=" + value2;
  Serial.print("请求URL: ");
  Serial.println(url);

client.print(String("GET ") + url + " HTTP/1.1\r\n" +
         "Host: " + host + "\r\n" +
         "User-Agent: BuildFailureDetectorESP8266\r\n" +
         "Connection: close\r\n\r\n");

Serial.println("请求发送");
  //----------------------------------------

//----------------------------------------检查是否成功发送数据
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line == "\r") {
      Serial.println("接收头");
      break;
    }
  }
  String line = client.readStringUntil('\n');
  if (line.startsWith("{\"state\":\"success\"")) {
    Serial.println("数据发送成功");
  } else {
    Serial.println("数据发送失败");
    Serial.println(line);
  }
  Serial.print("响应 : ");
  Serial.println(line);
  Serial.println("正在关闭连接");
  Serial.println("==========");
  Serial.println();
  //----------------------------------------
}

将其放入循环代码中并检查是否正常工作。

void loop() {
  delay(1000);
  int v1 = 2000;
  int v2 = 3000;
  sendData(v1, v2);
}

3. 全部代码

完整代码如下。希望你能用得上,下一篇文章我们将尝试使用温湿度传感器测量温度和湿度。

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>

// int fan_pin = 8;

const char* ssid = "WiFi 名称";   // WiFi 名称
const char* password = "WiFi 密码"; // WiFi 密码

//----------------------------------------主机 & https端口(https 固定为443)
const char* host = "script.google.com";
const int httpsPort = 443;
//----------------------------------------

WiFiClientSecure client; // 创建WiFiClientSecure对象

// Google电子表格脚本ID
String GAS_ID = "Google电子表格脚本ID";

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password); // 连接WiFi路由器
  Serial.println("");
  //----------------------------------------等待连接
  Serial.print("连接中");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(1000);
    };
  //----------------------------------------
  Serial.println("");
  Serial.print("WiFi连接成功 : ");
  Serial.println(ssid);
  Serial.print("IP 地址: ");
  Serial.println(WiFi.localIP());
  Serial.println();
  //----------------------------------------

client.setInsecure();
};

void loop() {
  delay(1000);
  int v1 = 2000;
  int v2 = 3000;
  sendData(v1, v2);
};

// 向Google电子表格发送数据
void sendData(int data1, int data2) {
  Serial.println("==========");
  Serial.print("连接主机中");
  Serial.println(host);
  
  //----------------------------------------连接到Google主机
  if (!client.connect(host, httpsPort)) {
    Serial.println("主机连接失败");
    return;
  };
  //----------------------------------------

//----------------------------------------处理数据并发送数据
  String value1 =  String(data1);
  String value2 =  String(data2);
  String url = "/macros/s/" + GAS_ID + "/exec?value1=" + value1 + "&value2=" + value2;
  Serial.print("请求URL: ");
  Serial.println(url);

client.print(String("GET ") + url + " HTTP/1.1\r\n" +
         "Host: " + host + "\r\n" +
         "User-Agent: BuildFailureDetectorESP8266\r\n" +
         "Connection: close\r\n\r\n");

Serial.println("请求发送");
  //----------------------------------------

//----------------------------------------检查是否成功发送数据
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line == "\r") {
      Serial.println("接收头");
      break;
    };
  };
  String line = client.readStringUntil('\n');
  if (line.startsWith("{\"state\":\"success\"")) {
    Serial.println("数据发送成功");
  } else {
    Serial.println("数据发送失败");
    Serial.println(line);
  };
  Serial.print("响应 : ");
  Serial.println(line);
  Serial.println("正在关闭连接");
  Serial.println("==========");
  Serial.println();
  //----------------------------------------
}
与Arduino和电子表格集成 - 构建代码-10

관련 글

用 micro:bit 编程控制蜘蛛机器人
用 micro:bit 编程控制蜘蛛机器人
这次在一个与机器人技术相关的聚会中,开设了一门免费的讲座课程。是在再玄高等学校举行的,利用 micro:bit 来控制蜘蛛机器人的培训。一位认识的老师原本报了名,但当天和工作时间冲突,把名额让给了我,所以我就去参加了。从上溪站步行大约 10 分钟就到。校内停车场很大,开车来也不错。培训是在学校后方别...
用 Arduino 复制 RFID 卡
用 Arduino 复制 RFID 卡
今天打算写一写,如何用 Arduino 复制 RFID 卡。写下来就不容易忘,也算是复盘记录。1.RFID 卡的内部数据结构一般的 RFID 卡是&nbsp;MIFARE Classic 1K 卡。这张卡的存储结构如下:- 总 1024 bytes (1KB) - 16 个 Sector (0~15...
使用 Arduino ESP32 收集温湿度数据
使用 Arduino ESP32 收集温湿度数据
今天,我们将使用 Arduino ESP32 制作一个用于测量并传输温湿度数据的 Wi-Fi 百叶箱。这篇文章是基于在学校进行的 16+1 课程的稿件编写的。1. 准备材料准备工作很简单。ESP32, DHT-22, 三根电线首先简单介绍一下 ESP32...
Arduino D1 R2 使用心得
Arduino D1 R2 使用心得
本来用 Arduino Uno 就够了,偏偏想试试带内置 Wi‑Fi 的板子,结果用 wemos d1 r2 折腾了好一阵子。这篇文章是写给像 d1 r2 这样,使用与标准 Arduino 不同引脚映射的板子用户看的。1. IDE 设置因为 Arduino 种类很多,所以需要为每块板子安装对应的板卡...
在 MacBook 上解决 Arduino Timed out waiting for packet header 的方法
在 MacBook 上解决 Arduino Timed out waiting for packet header 的方法
在 MacBook 上连接 Arduino Wemos D1 R2 时解决 Timed out 问题的方法
Arduino与电子表格集成 - 设置Google表格
Arduino与电子表格集成 - 设置Google表格
最近,我和学生们决定使用Arduino观测学校周围的温度和湿度,进行数据分析。需要一张SD卡来存储Arduino测量的数据,而为检查数据,需要将SD卡插入和拔出。突然想到,如果将数据存储在网上会怎么样呢...

댓글을 불러오는 중...