M5Stackでいろんなデータを取得・表示してみよう！

## M5Stackとは
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510723/f1ad944c-19f7-34ff-8557-345b801dcf12.jpeg" height=70%, width=70%>
> M5Stackは、320 x 240 TFTカラーディスプレイ、microSDカードスロット、スピーカーを備えたコンパクトで便利な開発モジュールです。ESP32を搭載しているため、Wi-FiおよびBluetooth通信を扱え、Arduino環境での開発が可能です。

引用元：[M5Stack Basic - スイッチサイエンス](https://www.switch-science.com/catalog/3647/)


Wi-Fi通信ができて、なおかつディスプレイがある。つまり・・・

**インターネットの情報が活用できて、取得したデータをもとにディスプレイに表示できる！！**

ということです。

ただ、ディスプレイに表示すると言っても取得結果を文字で表示するだけでは物足りなさを感じてしまいます:sleepy:
せっかくなら見た目もいい感じにしてみたい・・・。
そこで今回は、インターネットの情報を活用して、なおかつ手軽にリッチな見た目で表示する方法をご紹介します:bulb:

## 作品例
- お天気情報の表示:sunny:
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">天気予報を見る習慣がなさすぎて傘を忘れそうになることが多々あったので、天気予報を表示するガジェットをM5Stackで作りました。 <a href="https://t.co/Bx8FfiPjqe">pic.twitter.com/Bx8FfiPjqe</a></p>&mdash; クラクス (@kuracux) <a href="https://twitter.com/kuracux/status/1147666571227066373?ref_src=twsrc%5Etfw">July 7, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

- 電車の遅延状況の表示:tram:
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">人身事故等で電車が運休・遅延していることを通知するガジェットをM5Stackで作りました。<br>これがあれば、駅に着いたときに「電車が止まっている！」なんてことが減りそうです。 <a href="https://t.co/rBHoWwEoFk">pic.twitter.com/rBHoWwEoFk</a></p>&mdash; クラクス (@kuracux) <a href="https://twitter.com/kuracux/status/1207801196636884994?ref_src=twsrc%5Etfw">December 19, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 作り方
上記のような作品を作る時のおおまかな流れについて説明します。
具体的な作り方が気になる人は、上記のお天気情報の記事はありますので[こちら](https://kuracux.hatenablog.jp/entry/2019/07/13/101143)からどうぞ！

### 準備物
- M5Stack
- microSDカード

### 作りたいものを決める
まずはここからです。こういうものが作りたいなーというのを考えましょう。
特に思いつかなければ、次にご紹介するAPIの一覧から探すのも手です。

### APIの選定
何を作りたいかを決めたら、そのデータを取得できるAPIを探します。
私の場合ですが、お天気情報であれば[drk7.jp](https://www.drk7.jp/weather/)を、遅延状況であれば[鉄道遅延情報のjson](https://rti-giken.jp/fhc/api/train_tetsudo/)を利用しました。
[こちらの記事](https://qiita.com/mikan3rd/items/ba4737023f08bb2ca161)で一覧になっているので、参考にすると良いかもしれませんね。

使用するAPIを決めたら、そのAPIがどのようなデータが取得できるのかを頭の中に入れておきましょう。
次の「画像の作成」の際に、どこに何を表示するかを考えるためにです。

### 画像の作成
M5Stackのディスプレイサイズは320x240であるため、画像に関してもそのサイズに合わせる必要があります。
Windowsであればペイントを使ってサイズ指定をした上で画像の準備を進めていきます。
<img width=250px" alt="無題.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510723/1e67f48e-d47a-161e-1c1a-7f12fe4156ee.png">


画像作成時のポイントとしては・・・

**変動する値以外の文字は画像に入れ込もう！**

たとえば、お天気情報であれば、以下のような画像を利用しています。
<img width="160" alt="20190711224334.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510723/e42fcf5c-36d4-4c45-d551-e48d4cae38df.jpeg">
「0-」や「6-」はその時間からの降水確率を表していますが、時間の範囲は変わらないため画像に入れ込んでいます。
こういった文字の描画はM5Stack側でも出来ますが、文字の位置調整が少し大変で、また日本語の文字の描画は少し面倒なので、極力手間を減らすために画像に入れちゃいましょう:bulb:


### APIによるデータの取得
#### Wi-Fi接続
[こちらの記事](https://qiita.com/hilucky/items/3e74d28c03d71f2f3caa)を参考に、Wi-Fi接続してみましょう。

#### データの取得
HTTPClientを利用してAPIからデータを取得します。
下記では変数responseに取得結果が入ります。

```
#include <HTTPClient.h>
：
HTTPClient http;
http.begin("APIのURL");
int httpCode = http.GET();
if (httpCode > 0) {
    String response = http.getString();
    //以降、データに応じた処理
} else {
    Serial.println("Error on HTTP request");
}
http.end();
```

#### 取得したデータに応じた処理 
レスポンスの形式がJSONであれば、[deserializeJSON](https://arduinojson.org/v6/api/json/deserializejson/)を利用するのが良いです。keyを辿って目的の値を取得することができます。(実際に使っている例は[こちらの記事](https://kuracux.hatenablog.jp/entry/2019/07/13/101143)のコードを参考にしてください)

また、レスポンスにAという値が含まれていたら1を、含まれてなければ2を描画するものを考えているのであれば、deserializeJSONを利用しなくてもStringクラスのindexOf関数を利用すると良いかと思います。

#### 画像や文字の描画
画像に関しては``M5.Lcd.drawJpgFile``で描画をしましょう!
320x240で画像を用意すれば、M5Stackのスクリーン全体を使って表示されます。
サンプルコードは[こちら](https://github.com/m5stack/M5Stack/blob/master/examples/Advanced/Display/JpegDraw/JpegDraw.ino)。

文字に関しては以下の関数を使って描画しましょう！

- 色： ``M5.Lcd.setTextColor(COLOR);``
- テキストサイズ: ``M5.Lcd.setTextSize(SIZE);``
- 描画位置: ``M5.Lcd.setCursor(x,y);``
- 描画: ``M5.Lcd.print(TEXT);``

### おわりに
今回はM5StackのWi-Fi通信とディスプレイを活用した、データの取得・表示方法についてご紹介しました。
画像の準備をするだけで、見た目も良いものが手軽に作れるので、ぜひぜひ皆さんのアイディアを形にしてみてください！