Arduinoとスプレッドシートの連携 - コードの構成

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

前回の記事では、Arduinoとスプレッドシートの連携のためのシート設定について説明しました。

今回は、Arduino D1ボードを使ったHTTPS通信によるデータ送信方法について見ていきましょう。

1. Arduino D1ボードライブラリのインストール

Arduino D1ボードを利用するためには、まずボードライブラリをインストールする必要があります。

Arduino IDEでファイル-設定に入ります。

Arduinoとスプレッドシートの連携 - コードの構成-2

以下の追加のボードマネージャURLに以下のアドレスを入力します。

http://arduino.esp8266.com/stable/package_esp8266com_index.json
Arduinoとスプレッドシートの連携 - コードの構成-3Arduinoとスプレッドシートの連携 - コードの構成-4

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

Arduinoとスプレッドシートの連携 - コードの構成-5

左側のボードマネージャーでarduino D1ボードを検索し、インストールします。

これでボードライブラリのインストールは完了です。

Arduinoとスプレッドシートの連携 - コードの構成-6

ボードを選択したら、ファイル-例からESP8266の例が正しく表示されるか確認しましょう。

まずは以下のようにボードを設定します。

Arduinoとスプレッドシートの連携 - コードの構成-7

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

Arduinoとスプレッドシートの連携 - コードの構成-8

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("リクエスト送信");
};

シートを見ると、値がちゃんと送信されていることが確認できます。

Arduinoとスプレッドシートの連携 - コードの構成-9

次に、値を送信する部分を関数にしてみましょう。

関数名は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();
  //----------------------------------------
}
Arduinoとスプレッドシートの連携 - コードの構成-10

댓글을 불러오는 중...