M5CameraでLineに通知を送る最小限のサンプル


M5Cameraをルータに繋いだときのカメラのIPアドレスを知りたいときなど、
画面がないので何らかの方法で通知する必要があります。
シリアルコンソールにつないでいれば Serial.print 等で出力して確認できますが、
モバイルバッテリーにつないで動作させている場合はそれもできません。
そういった場合に Line に通知するとわかりやすいので、実現のためのプログラムを以下に示します。

Lineに通知するにはインターネットにつなげる必要があるので、
ソース中のSSID、PASSWORDを書き換えるのと、
LINE_TOKENに Line Notify から取得したトークンに書き換えてください。

Line Notify のトークンは
https://notify-bot.line.me/ja/
にログインしてマイページから発行できます。


プログラムソースは以下のとおりです。

#include <HTTPClient.h>
#include <WiFi.h>

//インターネットアクセスポイントのSSID、パスワード
#define SSID "(お使いのルータのSSID)"
#define PASSWORD "(お使いのルータのパスワード)"
//LINE Notify トークン
#define LINE_TOKEN "(Line Notifyで取得したトークン)"

// URLエンコード(URLに任意の文字を設定するときに使用)
String urlencode(const String &sourse) {
    static const char lookup[] = "0123456789abcdef";
    String result;
    for (const char* c = sourse.begin(); c != sourse.end(); c++) {
        if('0' <= *c && *c <= '9'
        || 'a' <= *c && *c <= 'z'
        || 'A' <= *c && *c <= 'Z'
        || *c=='-' || *c=='_' || *c=='.' || *c=='~') {
            result += *c;
        } else {
            result += '%';
            result += lookup[(*c >> 4) & 0xf];
            result += lookup[*c & 0xf];
        }
    }
    return result;
}

void setup() {
    // シリアル通信開始
    Serial.begin(115200);
    Serial.setDebugOutput(true);
    Serial.println("power on");

    // WiFi接続
    WiFi.mode(WIFI_STA);
    WiFi.begin(SSID, PASSWORD);
    for (int i = 0; WiFi.status() != WL_CONNECTED; i++) { // 接続できるまで最大30秒間試行
        if (i >= 30) esp_restart(); // 接続できない場合はリセット
        delay(1000);
        Serial.print(".");
    }
    Serial.println("\nconnected: " SSID);

    // Line Notify にメッセージ送信
    HTTPClient http;
    http.begin("https://notify-api.line.me/api/notify");
    http.addHeader("Authorization", "Bearer " LINE_TOKEN);
    http.addHeader("Content-Type", "application/x-www-form-urlencoded");
    http.POST("message=" + urlencode("M5Cameraからの通知"));
    http.end();
    Serial.println("posted");
}

void loop() {
}