在上一篇文章中,我们了解了与Arduino和电子表格集成的表格设置。
在这篇文章中,我们将了解如何通过Arduino D1板上的https通信传输数据。
1. 安装Arduino D1板的库
要使用Arduino D1板,首先需要安装板库。
进入Arduino IDE,选择文件-设置。

在下面的附加板管理器urls中输入以下地址。
http://arduino.esp8266.com/stable/package_esp8266com_index.json

输入完成后,点击确认。

在左侧的板管理器中搜索arduino D1板并进行安装。
这样,板库安装就完成了。

选择板后,进入文件-示例,检查ESP8266示例是否显示正常。
首先像下面这样设置板。

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

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("请求发送");
};查看表格,可以看到值已成功传输。

现在将传输数据的部分制作成函数。
函数名为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();
//----------------------------------------
}

댓글을 불러오는 중...