以前の記事でM5Stackで計測した温度データをWebブラウザ上で確認出来るシステムを作りました。これはこれで便利なのですが、毎日スマホで使っているLINEで送られてきたら便利ですよね。
今回、LINE Notifyというサービスを使うとこれが実現できることが分かりました。お金のかかるサービスではないですよ。
M5Stackで計測した温度データをLINEに送信する方法を記事にしたので是非読んで下さい。
こんな人におすすめ!
- M5Stackで何か作りたい電子工作初心者
- M5Stackで計測したデータをLINEで確認したい人
- LINE Notifyの利用方法が分からない人
準備するもの
- M5Stack Basic
- 温度センサ ADT7410
- ジャンパワイヤ オス-メス
- WiFiルーター
- LINEアプリがインストールされたスマホ
システム構成
LINEで温度データを取得する仕組みは図のようになります。Wifiを使ってインターネット経由でLINE Notifyサービスにリクエスト送信。LINE Notifyがスマホにデータ送信する仕組みとなります。
事前に必要な知識
Wifi接続方法
LINE Notifyのサービスを使用するにはM5StackをWifiに接続する必要があります。以前の記事で解説していますので、Wifi接続方法が分からないっていう方はこちらを参照して下さい。
温度計測方法
ADT7410という温度センサを使いました。このセンサはI2C通信でデータをやり取りします。温度計測方法は本題ではないので、興味ある方はこちらの記事を参考にして下さい。
LINE Notifyで文字を送信するだけなら、読み飛ばしてもらえれば良いですよ。
LINE Notifyの使い方
LINE Notify概要
LINE Notify API Documentによると認証系と通知系の2通りのサービスがあるようです。今回使うのは通知系サービス「POST https://notify-api.line.me/api/notify」。
POSTメソッドを使ってLINE Notifyへリクエストを送信します。リクエストを受けたLINE Notifyは、LINEでメッセージを送ってきます。
どんなリクエストを送れば良いかはAPI Documentに書かれていますが、ネットワークに詳しくない人にとっては何を言っているのかさっぱり。リクエスト送信方法については後ほど解説しますね。
トークンを発行する
LINE Notifyを利用するにはまずトークン発行が必要です。
LINE Notifyのホームページからログインし、トークンを発行しましょう。
トークン名を入力し、通知を送信するトークルームを選択した後、発行するボタンを押します。
グループラインにも通知を送信できますよ。
発行したトークンをコピーし、保管しておきます。2度と表示されないので注意しましょう。
POSTメソッドを使ったリクエスト送信方法
API Documentによるとリクエストメソッド/ヘッダ、パラメータは以下表の値を設定すればよいようです。
リクエストメソッド/ヘッダ
リクエストメソッド/ヘッダ | 値 |
---|---|
リクエストライン | api/notify |
Host | notify-api.line.me |
Authorization | Bearer <access_token> |
Content-Length | queryの長さ |
Content-Type | application/x-www-form-urlencoded |
<access_token>に先ほど発行したトークンを設定します。
リクエストパラメータ
リクエストパラメータ | 型 | 値 |
---|---|---|
message | String型 | 最大1000文字 |
この表だけ与えられてもプログラム書くのに困っちゃいますよね。APIを基にリクエストを作成したプログラム例を載せておきます。
const char* host = "notify-api.line.me";
const char* token = "<発行したトークン>";
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";
msgに温度データを設定すればリクエストの出来上がり。
プログラムを書いてみよう
M5Stackで温度測定し、LINE Notifyにリクエストを送信するプログラム例を紹介していきます。
#include <M5Stack.h>
#include <WiFiClientSecure.h>
void Line_notify(String msg);
float TempMeasurement();
const char* ssid = "************";
const char* password = "***************";
const char* host = "notify-api.line.me";
const char* token = "***********************************";
WiFiClientSecure client;
int address = 0x48; // ADT7410温度センサのアドレス
void setup() {
M5.begin();
M5.Lcd.setTextSize(2);
// 内部プルアップ抵抗有効化
pinMode(21, INPUT_PULLUP);
pinMode(22, INPUT_PULLUP);
Serial.begin(9600); // 通信速度を9600bpsに設定
Wire.begin(); // I2Cバスにマスタとして接続
WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED){
M5.Lcd.print('.');
delay(500);
}
M5.Lcd.print("\r\nWiFi connected\r\nIP address: ");
M5.Lcd.println(WiFi.localIP());
delay(2000);
}
void loop() {
M5.update();
if (M5.BtnA.pressedFor(100)) {
float temp = TempMeasurement(); // 温度データを取得
char msg[100];
sprintf(msg, "Teperature: %2.0f 'C", temp);
Line_notify(msg); // LINE Notifyへリクエスト送信
M5.Lcd.setTextSize(2);
M5.Lcd.println(msg);
}
}
LINE Notifyにリクエストを送信する関数です。
void Line_notify(String msg) {
client.setInsecure();
if (!client.connect(host, 443)) {
delay(2000);
M5.Lcd.print("Not Connected");
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);
M5.Lcd.setTextSize(1);
while (client.connected()) {
String line = client.readStringUntil('\n');
M5.Lcd.println(line);
if (line == "\r") {
break;
}
}
delay(2000);
}
温度計測する関数です。
float TempMeasurement(){
uint16_t data;
float temp;
Wire.requestFrom(address, 2); // ADT7410に2byteのデータを要求
data = Wire.read() << 8; // 1byte分読み取りし、1byte左シフト
data |= Wire.read(); // 1byte分読み取りし、前回値に加算
data >>= 3; // 3bit右シフト
if(data & 0x1000){ // bit 12が1のとき
temp = (float)(data-8192) / 16.0; // 負の温度換算
}
else{
temp = (float)data / 16.0; // 正の温度換算
}
return temp;
}
このプログラムを実行し、ボタンAを押したときのM5Stackの画面表示が下の写真です。温度データを送信し、LINE Notifyから成功である「200」のレスポンスが返答されてきました。
間もなく自分のスマホに温度データが送られてきました。感動!
まとめ
M5Stackで計測した温度データをLINEに送信する方法について解説しました。
LINE NotifyにPOSTメソッドを使ってリクエストを送信するだけで、毎日スマホで使っているLINEでメッセージが送られて来ます。
今回は例として温度データを送信しましたが、色々なことに応用出来そうですね。
是非、皆さんもM5Stackを使ってトライしてみて下さい。
最後までお読み頂きありがとうございました。
私はスイッチサイエンスさん(Amazon)でM5Stackを買いましたので、M5Stackを持っていない方はどうぞ。
書籍もKindleストアで「みんなのM5 Stack入門」を購入し、読みながら勉強してまーす。