見出し画像

100円ショップのグッツとマイコンで作る見守りbot

はじめに: このプロジェクトでは、一部界隈で流行っている100均のデバイスを使用し、100円ショップのグッズとM5Stack Atom Lite(以下M5)を組み合わせて見守りbotを作成します。これを例えばトイレに設置することで、離れて暮らす親の不調にいち早く気が付くことができます。また、野外での使用も想定し、さまざまな用途に活用できるように設計しています。

botの機能: このbotは起動と同時にGoogleスプレッドシートに書き込み、そのスプレッドシートの情報をGoogle Apps Script (GAS)で定時に確認します。もしも一定期間更新されていなかったら、LINEに通知が来るように設定されています。初期費用のみで、維持費がかからないのが魅力です。

構成と準備物:

  • ハードウェア:

    • M5Stack Atom Lite (M5): ESP32ベースのコンパクトな開発ボードで、WiFi接続機能が内蔵されています。

    • 人感センサーケーブル: 100円ショップで購入可能なケーブルです。

    • USBケーブル: M5をPCに接続し、プログラムをアップロードするために使用。また、人感センサーケーブルとM5を繋ぐのにも必要です。

  • サービス・API:

    • Googleスプレッドシート: 見守りの結果を保存するために使用します。

    • LINE Notify: 見守り結果に関する通知をLINEに送信するために使用します。APIトークンが必要です。

  • その他:

    • WiFiネットワーク: デバイスがインターネットに接続するために必要です。

下記が、人感センサーケーブルです。

構成のイメージは下記

人感センサーケーブルのおかげでハードのハードルが下がった

ステップ1:スプレッドシートとGASの準備 Googleのアカウントで、スプレッドシートを作成し、GASを作成してスクリプトIDを取得します。以下は、M5からスプレッドシートに書き込むためのGASスクリプトの例です。これをwebアプリとしてデプロイします。

// doGetが受け取ってM5書き込むスクリプトです。
function doGet(e) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var time = new Date();
  var action = e.parameter.action;
  
  sheet.appendRow([time, action]);
  return ContentService.createTextOutput("Recorded: " + action);
}

デプロイ後、デプロイIDをメモします。


ステップ2:M5AtomLiteに書き込む
M5AtomLiteからスプレッドシートに書き込むためのプログラムをアップロードします。WiFiManagerライブラリを使って、M5AtomをWiFiのアクセスポイントにし、家のWiFi設定が可能です。
WiFiManagerについては下記を参照。

書き込むまでの手順参考サイト:

ソースコード
M5AtomLite

#include <Arduino.h>
#include <HTTPClient.h>
#include <WiFi.h>
#include <WiFiManager.h> // WiFiManager ライブラリをインクルード
#include <M5Atom.h>

#define LED_PIN 27 // M5Atom Liteの内蔵LEDのピン番号
bool isConnected = false; // WiFi接続状態を追跡する変数

void sendToSpreadsheet(String action);

void setup() {
    M5.begin(true, false, true);
    M5.dis.drawpix(0, 0x0000FF); // 青色で起動中を表示

    pinMode(LED_PIN, OUTPUT); // LEDピンを出力として設定

    // WiFiManager
    WiFiManager wifiManager;

    // WiFi接続に失敗した場合、設定ポータルを開始
    if (!wifiManager.autoConnect("M5AtomAP")) {
        isConnected = false; // WiFi接続失敗
    } else {
        isConnected = true; // WiFiに接続成功
    }

    sendToSpreadsheet("connect");//見守る対象にしてください。例えば"Toilet"
}

void loop() {
    if (isConnected) {
        // WiFiに接続されている間、緑色で点滅
        M5.dis.drawpix(0, 0x00FF00); // 緑色で点灯
        delay(500);                  // 500ミリ秒待つ
        M5.dis.drawpix(0, 0x000000); // LEDをオフにする
        delay(500);                  // 500ミリ秒待つ
    } else {
        // WiFiに接続されていない間、赤色で点滅
        M5.dis.drawpix(0, 0xFF0000); // 赤色で点灯
        delay(500);                  // 500ミリ秒待つ
        M5.dis.drawpix(0, 0x000000); // LEDをオフにする
        delay(500);                  // 500ミリ秒待つ
    }

}


void sendToSpreadsheet(String action) {
    if(WiFi.status() == WL_CONNECTED) {
        HTTPClient http;
        String serverPath = "https://script.google.com/macros/s/xxxxx/exec";  //自分のScrpitIDを記入してください。

        // URLにアクションを追加
        serverPath += "?action=" + action;

        http.begin(serverPath);
        int httpResponseCode = http.GET();
        
        if (httpResponseCode > 0) {
            String payload = http.getString();
            M5.dis.drawpix(0, 0x00FF00); // 緑色で送信成功を表示
        }
        else {
            M5.dis.drawpix(0, 0xFF0000); // 赤色でエラーを表示
        }
        http.end();
    }
    else {
        M5.dis.drawpix(0, 0xFF0000); // 赤色でWi-Fi未接続を表示
    }
}

M5を起動して、wifiを設定して、通信を行なってみましょう。
うまくいけば以下の様になって、スプレッドシート上に書き込めているはずです。

ステップ3:LINE NOTIFYを使用して、トークンを獲得

ステップ4:スプレッドシートに書き込む仕組みとLINEに通知する仕組みを作る GASを使って、スプレッドシートに書き込むスクリプトとLINEに通知するスクリプトを作成します。以下は、スプレッドシートに書き込むためのスクリプトと、LINEに通知するスクリプトの例です。

// doGetが受け取ってM5書き込むスクリプトです。
function doGet(e) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var time = new Date();
  var action = e.parameter.action;
  
  sheet.appendRow([time, action]);
  return ContentService.createTextOutput("Recorded: " + action);
}
//以下がLINE通知するスクリプトです。
function checkLastUpdate() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var lastRow = sheet.getLastRow();
  var lastDateCell = sheet.getRange(lastRow, 1).getValue(); // A列の最後のセル(日付)
  var lastActionCell = sheet.getRange(lastRow, 2).getValue(); // B列の最後のセル(アクション)
  var lastDate = new Date(lastDateCell);
  var currentDate = new Date();

  // 日数の差分を計算
  var diff = (currentDate - lastDate) / (1000 * 60 * 60 * 24);
  // 最後の更新から、3日以上経ったら通知を行う様にする。
  if (diff > 3) {
    var message = "最後の「" + lastActionCell + "」から3日以上経過しました。";
    sendLineNotification(message);
  }
}


function sendLineNotification(message) {
  var lineToken = "xxx"; //自分のLINEトークンを記入してください。
  var options = {
    "method"  : "post",
    "payload" : "message=" + message,
    "headers" : {"Authorization" : "Bearer "+ lineToken}
  };

  UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
}

ソースの解説by chatgpt
checkLastUpdate関数:

  • この関数は、スプレッドシートの最後の行を確認し、最後のアクションが記録されてからの経過時間を計算します。

  • 最後のアクションから3日以上経過していた場合、LINE Notifyを通じて通知を送ります。

  • これにより、定期的な更新がなされていない場合に、ユーザーに警告を発することができます。

  1. sendLineNotification関数:

    • LINE Notify APIを使ってLINEへの通知を送るための関数です。

    • 引数として受け取ったメッセージをLINEに送信します。

    • LINEのトークンはユーザーが事前に設定しておく必要があります。

ステップ5:GASでデプロイを行い、定時に実行されるようにする
実行する関数は、checkLastUpdateに指定。
私の場合、毎日、1時から2時の間にスクリプトが走り、3日以上たってたら、通知が来る様にしています。

参考サイトは下記

下記の感じで通知が来てます。


まとめ

このプロジェクトでは、100円ショップのアイテムとM5Stack Atom Liteを使用して、コスト効率の良い見守りbotを作成しました。このbotは、特に高齢者の一人暮らしや子供の安全を見守るために役立ちます。GoogleスプレッドシートとGoogle Apps Script (GAS)を組み合わせることで、簡単かつ効率的にデータを管理し、必要な時にLINEを通じて即座に通知を送ることが可能です。人感センサーケーブルの採用により、ハードウェアの構築が容易になり、WiFiManagerの利用でデバイスの設定もスムーズに行えます。みんなで簡単に電子工作を初めてみませんか?

いいなと思ったら応援しよう!