前回の記事では、Arduinoとスプレッドシートの連携のためのシート設定について説明しました。
今回は、Arduino D1ボードを使ったHTTPS通信によるデータ送信方法について見ていきましょう。
1. Arduino D1ボードライブラリのインストール
Arduino D1ボードを利用するためには、まずボードライブラリをインストールする必要があります。
Arduino IDEでファイル-設定に入ります。

以下の追加のボードマネージャURLに以下のアドレスを入力します。
http://arduino.esp8266.com/stable/package_esp8266com_index.json

入力が完了したら確認をクリックします。

左側のボードマネージャーでarduino D1ボードを検索し、インストールします。
これでボードライブラリのインストールは完了です。

ボードを選択したら、ファイル-例からESP8266の例が正しく表示されるか確認しましょう。
まずは以下のようにボードを設定します。

このように例が正しく見えればインストール成功です。

2. Arduinoコードをコンパイルする
さて、Arduinoにコードをアップロードする時間です。
まずモジュールを呼び出し、Wi-Fiに接続するための基本設定を行います。
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
// int fan_pin = 8;
const char* ssid = "Wi-Fi名"; // Wi-Fi名
const char* password = "Wi-Fiパスワード"; // Wi-Fiパスワード
//----------------------------------------Host & httpsポート(httpsは443固定)
const char* host = "script.google.com";
const int httpsPort = 443;
//----------------------------------------
WiFiClientSecure client; // WiFiClientSecureオブジェクト生成
// GoogleスプレッドシートスクリプトID
String GAS_ID = "GoogleスプレッドシートスクリプトID";セットアップでシリアル通信速度を決め、Wi-Fi接続をします。
ESP8266の基本シリアル通信速度は115,200です。
WiFi.begin(ssid, password)を通じて接続を試み、WiFi.status()を利用して接続状態を確認します。
client.setInsecureを利用してhttps接続が可能になるようにします。
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password); // Wi-Fiルーターと接続
Serial.println("");
//----------------------------------------接続待機
Serial.print("接続中");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(1000);
};
//----------------------------------------
Serial.println("");
Serial.print("Wi-Fi接続成功: ");
Serial.println(ssid);
Serial.print("IPアドレス: ");
Serial.println(WiFi.localIP());
Serial.println();
//----------------------------------------
client.setInsecure();
}次はメインコードを書く番です。
現在、Arduinoに接続されているものはないので、2つの指定された変数だけを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で、この関数は2つの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();
//----------------------------------------
}これをloop文に入れて正常に動作するか確認してください。
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 = "Wi-Fi名"; // Wi-Fi名
const char* password = "Wi-Fiパスワード"; // Wi-Fiパスワード
//----------------------------------------Host & 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); // Wi-Fiルーターと接続
Serial.println("");
//----------------------------------------接続待機
Serial.print("接続中");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(1000);
};
//----------------------------------------
Serial.println("");
Serial.print("Wi-Fi接続成功: ");
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();
//----------------------------------------
}

댓글을 불러오는 중...