M5Stack と Smart Node でポモドーロタイマー作ってみた

## はじめに
この記事は[M5Stack Advent Calendar 2018](https://qiita.com/advent-calendar/2018/m5stack)の11日目の記事です。
個人的に予定が間に合わず、実際に公開する日は12/12になってしまいました。すいません。
今回M5StackのモジュールであるSmart Nodeを購入したので、それを使ってみたという話です。

## M5Stackとは
簡単に説明すると、Wi-FiとBLEとディスプレイとMicroSDスロットとボタンとバッテリーなどが入っている 5000円程度のマイクロコントローラで、Arduino IDEを使って開発ができます。

アドベントカレンダーなので、ここでは詳しい説明は省略させていただきます。下記など参照ください。
[Switch Science - M5Stackであそぼう](http://mag.switch-science.com/2018/02/28/getting-started-with-m5stack/)

色々搭載されているので、本体だけでも面白いものが作れるのですが、ユーザーが拡張できるようになっています。
2018年に日本に入ってきてから、毎月のようにどんどん拡張モジュールなどが発売されています。

500-2000円ほどお金を出せば、人感センサーやGPSや温度センサーなどが使えるようになります。

日本で購入する場合は[Switch-Science](https://www.switch-science.com/catalog/list/770/)から、中国から直接購入する場合はAliExpressの[公式ストア](https://ja.aliexpress.com/store/3226069?spm=a2g11.10010108.100005.1.7e326e98xkNEhs)から購入できます。

自分は秋月やセンサーや部品なども色々接続して今まで勉強がてら作ってきました。

まず最初に作ったのがデジタル名刺
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">今，懇親会用に即席で名刺っぽい使い方できるアプリケーション作ってみた．<br>ボタンで表示切り替えられる．<a href="https://twitter.com/hashtag/M5Stack_UGjp?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack_UGjp</a> <a href="https://t.co/BYhwDCCVQW">pic.twitter.com/BYhwDCCVQW</a></p>&mdash; 河原圭佑 / Keisuke KAWAHARA (@ktansai) <a href="https://twitter.com/ktansai/status/1014095927261315072?ref_src=twsrc%5Etfw">2018年7月3日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

それと、簡易測距計

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">夏休みの工作 第二弾<br>レーザー測距計 on M5stack <br>机の高さを0cmとして，センサーの下にものを置くとその高さを測ってくれる．<br>モレスキンは約14cmくらいなので精度はまぁまぁ<a href="https://twitter.com/hashtag/M5Stack?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack</a> <a href="https://t.co/7oOkLDzgEj">pic.twitter.com/7oOkLDzgEj</a></p>&mdash; 河原圭佑 / Keisuke KAWAHARA (@ktansai) <a href="https://twitter.com/ktansai/status/1029004504111312897?ref_src=twsrc%5Etfw">2018年8月13日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 今回買ったモジュール
そんな感じで、アイデアと部品さえ揃ってしまえば、デッサンをするように動くプロトタイプが作れるM5Stackですが、今回新しいモジュールを購入しました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Smart Node module and FaceJoystick is available now: <a href="https://t.co/X5n25cJNuG">https://t.co/X5n25cJNuG</a> <a href="https://twitter.com/hashtag/m5new?src=hash&amp;ref_src=twsrc%5Etfw">#m5new</a> <a href="https://t.co/yoVLSM7SWR">pic.twitter.com/yoVLSM7SWR</a></p>&mdash; M5Stack (@M5Stack) <a href="https://twitter.com/M5Stack/status/1057209123627036673?ref_src=twsrc%5Etfw">2018年10月30日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

以下スペック。
> 
- NeoPixel 12個
- マイク2つ,
- 赤外線LED4つ
- 赤外線受光部1つ
- バッテリー 500mAh
- スピーカー1つ
- 温度/湿度センサー(DHT12)

価格: 2000程度

今流行りのスマートスピーカーやスマートリモコンが自作できそうな拡張モジュールです。

これを買って、年内に色々スマートリモコンや自作スマートスピーカーなど作りたいなと思っていたのですが、なかなか時間が取れず、今回はNeoPixelの部分を使ってみました。



## 作りたいもの
![プロジェクト - スケッチ 1.jpg](https://qiita-image-store.s3.amazonaws.com/0/38001/a16c1055-a828-310e-7269-8d0232328ff8.jpeg)

自分は普段から集中力が持たない性格なので、作業をする時は[ポモドーロテクニック](https://www.lifehacker.jp/2014/07/140714pomodoro.html)という25分作業して、5分作業を中断して休むという方法で集中力を保っています。
普段はiPhoneアプリか、Mac/PCのポモドーロタイマーのアプリで測って作業しているのですが、

- iPhoneやPCの画面をそのために使いたくない
- ちょうどよい感じにカスタマイズしたい


という思いがあり、自作ポモドーロタイマーを作りたいとつくづく思っていました。

最終的には、赤外線リモコンのパターンを Arduino IRremoteなどのライブラリを使って、部屋のライトを若干雰囲気を変えるとか、スマホに通知だけ送るとか、自分用Slackに活動記録として投げたいと思っています。

今回はこのタイマー表示部分をSmart nodeで作ってみました。

## できたもの
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">m5stack smart node モジュールでタイマー <a href="https://t.co/XO71wKQJRg">pic.twitter.com/XO71wKQJRg</a></p>&mdash; 河原圭佑 / Keisuke KAWAHARA (@ktansai) <a href="https://twitter.com/ktansai/status/1072861255633760257?ref_src=twsrc%5Etfw">2018年12月12日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

単純にSmart nodeのLEDのリングの部分を使って、時間がなんとなく分かるようになっています。
動画は短縮版の30秒です。

ソースコード

```cpp
#include <NeoPixelBus.h>

#include <WiFi.h>

const uint16_t PixelCount = 12; // this example assumes 4 pixels, making it smaller will cause a failure
const uint8_t PixelPin = 15;  // make sure to set this to the correct pin, ignored for Esp8266

#define colorSaturation 128

NeoPixelBus<NeoGrbFeature, Neo800KbpsMethod> strip(PixelCount, PixelPin);

RgbColor red(colorSaturation, 0, 0);
RgbColor blue(0, 0, colorSaturation);


RgbColor black(0);

float pomodoro_max_minutes = 25;

void LEDAnimation(RgbColor color){
    for(int i = 0; i < 12; i++ ){
        for(int j = 0; j < 12; j++ ){
            strip.SetPixelColor(j, black);
        }
        strip.SetPixelColor(i, color);
        strip.Show();
        delay(100);
    }
}

void setup()
{
    
    Serial.begin(115200);
    delay(2000);
    Serial.println();
    Serial.println("Initializing...");
    Serial.flush();

    // this resets all the neopixels to an off state
    strip.Begin();
    strip.Show();

    LEDAnimation(blue);
    
    Serial.println();
    Serial.println("Running...");
    timer_millis_start = millis();
    for(int i = 0; i < 12; i++ ){
        strip.SetPixelColor(i, black);
        strip.Show();
    }
}

void loop(){
    float minutes = (float)(millis() - timer_millis_start ) / 1000 / 60;
    int LED_number = minutes / (float)pomodoro_max_minutes * 12.0;

    Serial.print(minutes);Serial.print(",");Serial.print(LED_number);Serial.print("\n");

    if(minutes < pomodoro_max_minutes){
        for(int i = 0; i < LED_number; i++ ){
            strip.SetPixelColor(i, red);
            strip.Show();
        }
    }   
    else{
        while(true){
            LEDAnimation(red);
        }
    }
    delay(500);
}
```

本当はNTPで時刻取得などして、外部のサービスなどに記録するのを考えていたのですが、時間の関係でLEDの表示部分だけ実装して動いてる雰囲気だけ確認してみました。

Firebaseとかで、Webページから設定したり、タイマースタートしたり、活動記録見れたら面白いなと思っています。
今後、なにか思いついたらまた実装してみます。