制作背景
M5Stack買ってから数か月放置してたのでそろそろ使いたいということと
LineNotifyを使ってLineに通知を送ってみたいということで作成しました。
やりたいこと
ボタンを押すとランダムで設定したワードを通知させる
クリスマスが近いのでクリスマスっぽいワードを通知させたい
環境
M5Stack(ESP32)
ArduinoIDE 2.0.4
Windows 11
手順
- 開発環境の構築と初期セットアップ
- LineNotifyの公式ページでアクセストークンを発行
- 実装
- 実行
1.開発環境の構築と初期セットアップ
M5StackをPCに接続し、ドライバーを更新
ドライバーのダウンロードページでCP210x_VCP_Windowsをダウンロードし解凍しておく
デバイスマネージャー内のほかのデバイスの中にあるM5Stackにダウンロードしたドライバーを更新する(画像を撮り忘れた)
ArduinoIDEにESP32のボードを認識させる
ArduinoIDEの左上にあるFileからPreferencesを開く
下のほうにあるAdditional boards manager URLsのマークをクリック
Arduino-ESP32の公式ドキュメントのインストールページのStable release linkのリンクをコピーしてAdditional Boards Manager URLsに張り付けOKを押す
するとTools→BoardにESP32 が追加される。
どこかにあるM5Stack-Core-ESP32を選択できる。
M5Stackのライブラリを入れる
ライブラリの検索欄にM5Stackと入力しインストールする。
2.LineNotifyの公式ページでアクセストークンを発行
LineNotifyの公式ページを開く
右上に「ログイン」とあるので自身のLineアカウントでログインする。
無事ログインに成功すると右上にアカウント名が表示されるのでクリックする。
マイページという欄があるのでクリックする
マイページを開くとアクセストークンの発行というのがあるので「トークンを発行する」をクリック
トークン名はわかりやすいものを任意で設定し、
「1:1でLINE Notifyから通知を受け取る」を選択
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!と表示されている状態で一番左のボタンを押すと
ランダムで設定してあるメッセージが送ることができました!!!
課題
課題点としては
・LineNotifyとの接続が切れてしまう
・Wi-Fiがつながらないことがある
・ボタンのノイズが原因?で意図しないタイミングで通知が飛んでくる
・文字列の要素数を取得したい
の4点がありました。
今後やってみたいこと
ニュースと天気情報を通知、時間になったら今日の予定を教えてくれるモノとか作りたいなぁと思います。
参考サイト