M5StackとLineNotifyを使って通知を飛ばしてみた

## 制作背景
M5Stack買ってから数か月放置してたのでそろそろ使いたいということと
LineNotifyを使ってLineに通知を送ってみたいということで作成しました。

## やりたいこと
ボタンを押すとランダムで設定したワードを通知させる
クリスマスが近いのでクリスマスっぽいワードを通知させたい

## 環境
M5Stack(ESP32)
ArduinoIDE 2.0.4
Windows 11

## 手順
1. 開発環境の構築と初期セットアップ
2. LineNotifyの公式ページでアクセストークンを発行
3. 実装
4. 実行

## 1.開発環境の構築と初期セットアップ
### M5StackをPCに接続し、ドライバーを更新
ドライバーの[ダウンロードページ](https://docs.m5stack.com/en/downloadhttps://docs.m5stack.com/en/download)でCP210x_VCP_Windowsをダウンロードし解凍しておく
![スクリーンショット_20221214_211138.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976481/df9fe777-0384-99fe-c520-d95c55ba51b2.png)
デバイスマネージャー内のほかのデバイスの中にあるM5Stackにダウンロードしたドライバーを更新する（画像を撮り忘れた）


### ArduinoIDEにESP32のボードを認識させる
ArduinoIDEの左上にあるFileからPreferencesを開く
![スクリーンショット_20221215_210519.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976481/ad877a27-3668-39d8-635c-a1e774f5bdf7.png)

下のほうにあるAdditional boards manager URLsのマークをクリック
![スクリーンショット 2022-12-15 211821.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976481/0f98898b-35b1-8cc3-2862-84c03928561e.png)

Arduino-ESP32の公式ドキュメントの[インストールページ](https://docs.espressif.com/projects/arduino-esp32/en/latest/installing.html)のStable release linkのリンクをコピーしてAdditional Boards Manager URLsに張り付けOKを押す
![スクリーンショット 2022-12-15 214102.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976481/0aead518-5922-bd46-5998-9be3a16ef478.png)

するとTools→BoardにESP32 が追加される。
どこかにあるM5Stack-Core-ESP32を選択できる。
![スクリーンショット_20221215_214503.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976481/4056020d-e31e-a735-12e2-a71f579fdde9.png)



### M5Stackのライブラリを入れる
ライブラリの検索欄にM5Stackと入力しインストールする。
![スクリーンショット_20221215_202400.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976481/85db58d1-32d0-6fef-8252-903f31ee7c39.png)


## 2.LineNotifyの公式ページでアクセストークンを発行
LineNotifyの[公式ページ](https://notify-bot.line.me/ja/)を開く
右上に「ログイン」とあるので自身のLineアカウントでログインする。
無事ログインに成功すると右上にアカウント名が表示されるのでクリックする。
マイページという欄があるのでクリックする
![スクリーンショット 2022-12-15 220233.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976481/5d5ca003-2a48-0141-ff3e-cc1b1b6e9d2e.png)

マイページを開くとアクセストークンの発行というのがあるので「トークンを発行する」をクリック
![スクリーンショット 2022-12-15 220326.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976481/d6c03c42-d60d-11da-7fc1-6c3fb136032f.png)

トークン名はわかりやすいものを任意で設定し、
「1:1でLINE Notifyから通知を受け取る」を選択
![スクリーンショット 2022-12-15 220436.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976481/a19006b1-6371-2644-8f9e-8b803157065e.png)

トークンが発行されるので必ずコピーを取る
![スクリーンショット 2022-12-15 220631.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976481/e34de74a-3046-3e32-ac7f-1df7e52e2743.png)



## 3.実装
### ソースコード

```
#include <M5Stack.h>
#include <WiFiClientSecure.h>
#include <ssl_client.h>

//wifiの設定
const char ssid[] = "Wi-Fiのssid";
const char password[] = "Wi-Fiのパスワード";

//LineNotifyの設定
const char host[] = "notify-api.line.me";
const char token[] = "LineNotifyのトークン";

//通知する内容
char* topics[] = {
  "サンタさん","今日も一日,おつかれさま","今日は七面鳥が食べたいなー","メリークリスマス！","ケーキ楽しみ"
};

//topicsの最大数-1
int maxTopics=5;

WiFiClientSecure client;

void setup() {
  //M5Stackのセットアップ
  M5.begin();
  //M5Stackのスピーカー設定とミュートにしておく
  M5.Speaker.begin();
  M5.Speaker.mute();
  // 文字サイズを変更
  M5.Lcd.setTextSize(1); 
  WiFi.disconnect();
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  M5.Lcd.println("initialize...");
  //Wifiの状態を監視
  while(WiFi.status() != WL_CONNECTED){
    delay(500);
    //文字表示の左上位置を設定
    M5.Lcd.setCursor(0, 10);
    M5.Lcd.println("wifi_disconnected");
  }
    M5.Lcd.println("wifi_Connected!");
  delay(1000);
}

//LineNotifyにメッセージを送信する部分
void Line_notify(String msg) {
  client.setInsecure();
  if (!client.connect(host, 443)) {
    delay(500);
    M5.Lcd.print("Line Notify disconnect");
    return;
  }
  String query = String("message=") + msg;
  String request = String("") +
               "POST /api/notify HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Authorization: Bearer " + token + "\r\n" +
               "Content-Length: " + String(query.length()) +  "\r\n" + 
               "Content-Type: application/x-www-form-urlencoded\r\n\r\n" +
                query + "\r\n";
  client.print(request);
  delay(500);
}

//Topicを抽選
char* randomTalk(){
   //ランダムで0~Topicsの最大数までの数字を生成
   int randNumber = random(0,maxTopics);
   return topics[randNumber];
}

//メインのloop部分
void loop() {
  M5.update();
  if (M5.BtnA.wasReleased()) {
    Line_notify(randomTalk());
  }  
}

```


この辺は人によって異なるので書き換えてください
```
//wifiの設定
const char ssid[] = "Wi-Fiのssid";
const char password[] = "Wi-Fiのパスワード";

//LineNotifyの設定
const char host[] = "notify-api.line.me";
const char token[] = "LineNotifyのトークン";
```

この辺の通知する内容をふやしたりしても面白いかも
```
//通知する内容
char* topics[] = {
  "サンタさん","今日も一日,おつかれさま","今日は七面鳥が食べたいなー","メリークリスマス！","ケーキ楽しみ"
};

//topicsの最大数-1
int maxTopics=5;
```

## 4.動作

wifi_Connected!と表示されている状態で一番左のボタンを押すと
![スクリーンショット 2022-12-15 221424.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976481/2153bbcf-a000-c51c-2935-bd135a0c9335.png)

ランダムで設定してあるメッセージが送ることができました！！！
![スクリーンショット 2022-12-15 221553.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2976481/6c4726a3-8f9a-bd9d-0a5b-0c72380c2a4d.jpeg)


## 課題
課題点としては
・LineNotifyとの接続が切れてしまう
・Wi-Fiがつながらないことがある
・ボタンのノイズが原因？で意図しないタイミングで通知が飛んでくる
・文字列の要素数を取得したい
の4点がありました。

## 今後やってみたいこと
ニュースと天気情報を通知、時間になったら今日の予定を教えてくれるモノとか作りたいなぁと思います。

## 参考サイト
https://docs.espressif.com/projects/arduino-esp32/en/latest/installing.html

http://www.musashinodenpa.com/arduino/ref/

https://karakuri-musha.com/inside-technology/arduino-02-install-board-manager/

https://www.kunimiyasoft.com/m5stickc-line-notify/