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

힘센캥거루
2024년 6월 4일(수정됨)
15
arduino

在上一篇文章中,我们了解了与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

댓글을 불러오는 중...