M5Stackで計測した温度データをLINEに送信してみた

M5Stack

こんにちは、ぜろはちです。

以前の記事で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を使うとWebサービスからの通知をLINEで受信出来るようになります。

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
Hostnotify-api.line.me
AuthorizationBearer <access_token>
Content-Lengthqueryの長さ
Content-Typeapplication/x-www-form-urlencoded

<access_token>に先ほど発行したトークンを設定します。

リクエストパラメータ

リクエストパラメータ
messageString型最大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入門」を購入し、読みながら勉強してまーす。