🤳

農系IoT勉強会#4 その2 M5AtomS3からGoogleスプレッドシートに書き込んでみよう

2024/09/16に公開

農系IoT勉強会#4 その1ではQRコードリーダを使ってQRコードの内容を読み取り
M5AtomS3の画面やシリアルモニタに表示するところまでを説明しました。
https://zenn.dev/articles/c1a553a4d182a9/edit

この記事のゴール

本記事では、取得したデータをGoogleスプレッドシートに飛ばすことで
データの集積や加工が出来る状態を目指します。

Googleスプレッドシートの準備

まずはCromeなどのブラウザからグーグルドライブを開きます。※Googleアカウントが必要です

グーグルドライブにアクセスして画面左上の「+新規」ボタンからGoogleスプレッドシートを立ち上げます。
※任意の名前でフォルダなどを作って管理してください

適当な名前を付けて「拡張機能」⇒「Apps Script」をクリックします。

Apps Scriptが開いたらコンソールに下記のプログラムを書き込みます。

function doPost(e) {
  try {
    // テスト用のデータ作成
    if (!e) {
      e = {
        postData: {
          contents: "Test Data" // テストデータをここに入力
        }
      };
    }

    // スプレッドシートIDとシート名
    const spreadsheetId = 'YourspreadsheetIdID';
    const sheet = SpreadsheetApp.openById(spreadsheetId);
    const sheetName = 'QR'; // 必要に応じてシート名を変更してください
    const ws = sheet.getSheetByName(sheetName);

    if (!ws) {
      // シートが見つからない場合のエラー処理
      return ContentService.createTextOutput('Sheet not found').setMimeType(ContentService.MimeType.TEXT);
    }

    // リクエストからデータを取得
    const data = e.postData.contents;

    // データの検証(空チェックやフォーマットチェックなど)
    if (data) {
      // データを新しい行に追加
      ws.appendRow([new Date(), data]);
    } else {
      // データが空の場合のエラーレスポンス
      return ContentService.createTextOutput('No data received').setMimeType(ContentService.MimeType.TEXT);
    }

    // レスポンスを返す
    return ContentService.createTextOutput("Data received").setMimeType(ContentService.MimeType.TEXT);
  } catch (error) {
    // エラーハンドリング
    Logger.log(error.toString());

    // スプレッドシートIDが原因のエラーの確認
    if (error.message.includes('SpreadsheetApp.openById')) {
      return ContentService.createTextOutput('Error: Unable to access the spreadsheet. Check the spreadsheet ID and permissions.').setMimeType(ContentService.MimeType.TEXT);
    }

    return ContentService.createTextOutput('Error: ' + error.message).setMimeType(ContentService.MimeType.TEXT);
  }
}


スプレッドシートID: 'スプレッドシートのID' の部分を、実際のスプレッドシートIDに置き換えてください。スプレッドシートのURLからID部分(例えば、https://docs.google.com/spreadsheets/d/ID部分/edit)をコピーして使用します。

名前を付けて保存し、デプロイします。
デプロイは画面右上のボタンから出来ます。
「新しいデプロイ」を選択し下記の選択をします。

種類の選択⇒ウェブアプリ
ユーザー⇒自分
アクセスできるユーザー⇒全員 ※全員にしておかないとM5がアクセスできません
※全員の選択肢がない場合GoogleWorkSpaceの登録が必要です(無料)
https://workspace.google.com/intl/ja/

「デプロイ」をクリックします。
ここで「URL」をコピーしてください。※M5Atom側のプログラムで必要になります。

Arduinoに戻る前に一度GoogleAppsから実行をしてみてください
スプレッドシートにTest Dataを書き込まれれば問題なく設定が完了しています。

M5Atomを準備しましょう

農系IoT勉強会#4 その1で作成したコードに追加していく形で進めます。
https://zenn.dev/articles/c1a553a4d182a9/edit

ヘッダーファイルとwifi等の設定を5行目あたりに追加します。

#include <WiFi.h>
#include <HTTPClient.h>
// WiFi設定
const char* ssid = "YOUR_SSID";         // WiFiのSSID
const char* password = "YOUR_PASSWORD"; // WiFiのパスワード

// デプロイしたGoogle Apps ScriptのウェブアプリURL
const char* serverName = "https://script.google.com/macros/s/YOUR_SCRIPT_ID/exec";

wifiを立ち上げるためのコードをvoid setuo(){内に書き加えます。
私は25行目に書く加えました。

    // WiFi接続
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.print(".");
    }
    Serial.println("Connected to WiFi");

void loop() {内に取得した値をGoogleのウェブアプリにポストするためのコードを追加します。
私は59行目に追加しました。

            // Google Apps ScriptにデータをPOST
            if (WiFi.status() == WL_CONNECTED) {
                HTTPClient http;
                http.begin(serverName);
                http.addHeader("Content-Type", "application/x-www-form-urlencoded");

                // データをPOST
                int httpResponseCode = http.POST(data);
                if (httpResponseCode > 0) {
                    String response = http.getString();
                    Serial.println("Response:");
                    Serial.println(response);
                } else {
                    Serial.print("Error on sending POST: ");
                    Serial.println(httpResponseCode);
                }
                http.end();
            } else {
                Serial.println("WiFi Disconnected");
            }

全体のコードはこちらです。
https://github.com/nono112002/IoT_workshops_for_agriculture/blob/main/QR_code_reader_to_Google_spreadseet

先ほど準備したスプレッドシートが更新されていれば成功です。

以上です!

Discussion