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

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

前回の記事では、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

관련 글

ArduinoでRFIDカードを複製する
ArduinoでRFIDカードを複製する
今日はArduinoでRFIDカードを複製する方法について書いてみようと思う。一度文章にしておけば忘れないので、復習の意味も込めて残しておく。1.RFIDカードの内部データ構造一般的なRFIDカードは&nbsp;MIFARE Classic 1Kカードである。このカードのメモリ構造は次の通りだ。-...
Arduino ESP32で温湿度データを収集する
Arduino ESP32で温湿度データを収集する
今日はArduino ESP32で温湿度を測定し、データを送信するWiFi百葉箱を作ってみる。この内容は学校で行われる16+1授業の原稿を基にして書いた文章である。1. 準備物準備物は簡単だ。ESP32、DHT-22、電線3本まずESP32を簡単に説明すると、WiFiモジュールが内蔵されたArduinoである。一般的なArduinoよりもはるかに小さいサイズである。
Arduino D1 R2 使用記
Arduino D1 R2 使用記
ただArduino Unoを使えばよかったのに、内蔵WiFi付きのを試そうとして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を利用して学校周辺の温度と湿度を観測し、値を分析することにした。Arduinoで測定したデータを保存するにはSDカードが必要で、データを確認するためにはSDカードを抜き差しする手間があった。そこでデ...

댓글을 불러오는 중...