【ESPDisplayUDP™】M5Atom で M5StickC の液晶を使う話

#1. はじめに
最近　雨の中現場での作業が多く
仕掛けてある M5Atom Lite の処理データをなんとなく確認したい場合が多々ありました
工具箱には M5Atom Lite と M5StickC しか無かったりしますが
クライアントさんは__いや直ぐに処理内容を見せて欲しい__ とか無理を仰います訳で...
得意の I2S Sleve で M5StickC を完全に液晶化することも頭にはあったのですが
考えたら小屋の中に入っている 制御基板上にはもう液晶を置くスペースも無く
マックでコーヒー飲みながら30分ほどがりがり書いたのがこれです💦
エラー等は当然無視してます
![0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2063214/dc5c2479-103b-321d-68d8-18b3a649cbef.jpeg)

https://github.com/chrmlinux/ESPDisplayUDP

* いやぁ　色々ライブラリ化してあって良かったわぁ
* こうやって Grove 端子から電源取るとちょっと不思議

#2. 仕組み
仕組みは単純な話で M5Atom Lite で__唯我独尊爆裂高速描画ライブラリ__[LovyanGFX](https://github.com/lovyan03/LovyanGFX)のlcdではなくspriteに描画した内容を前回爆誕した tinyUDP™ により高速転送を行い M5StickC で受信して描画するというお話
[いつかの投稿](https://qiita.com/chrmlinux03/items/2281f243f7a07d161b70)で らびあんさんにご助言を頂いた事もあり LovyanGFX の正しい使い方ではありませんがフレームバッファを素敵に使う等の参考にして頂ければと考えております

* 長い間 M5 シリーズを扱っていたんですが液晶が無いものに液晶表示機能を付加できるっては最近覚えました💦

```
+--------+          +-----------------------------+
| Atom   |          | M5StickC 160x80pix          |
|  Lite  |          |                             |
|        |          |                             |
+--------+          +-----------------------------+
    | Draw               ^
    |                    | tinyUDP™
+-----------------------------+
| Virtual Frame 160x80x8bit   |
| (12,800 Byte)               |
|                             |
+-----------------------------+

```
#3. 簡単な説明
M5StickC を用意し Recv.ino を書き込む
M5Atom Lite/Echo/Matrix を用意し Send.ino を書き込む
受信側は そのまま電源を入れておけば自動的に受信し液晶に表示します
送信側は __必要最低限の処理__さえすまして置けば問題は無いはずSend.ino の中の 
draw.h に色々書き込めばすぐに M5StickC の画面に表示されます

```Send.ino
#include "setup.h"

//===============================
// setup
//===============================
void setup()
{
  Serial.begin( 115200 );
  while (!Serial);
  tudp.setResult(0);
  tudp.begin(HEIGHT * WIDTH);
  setupSpr();
}

//===============================
// loop
//===============================
void loop()
{
  if (tudp.delay(20)) {
    draw();
    spr2udp();
    tudp.update(false);
  }
}
```
```Recv.ino
#include "setup.h"

//===============================
// setup
//===============================
void setup()
{
  Serial.begin( 115200 );
  while (!Serial);
  tudp.setResult(0);
  tudp.begin(HEIGHT * WIDTH);
  setupSpr();
}

//===============================
// loop
//===============================
void loop()
{
  udp2spr();
  tudp.update(false);
}

```

``` draw.h
// =============================================================
// textRain
// -------------------------------------------------------------
// usage textRain(column(1..40), row(1..max), fontheight(1..max)
// =============================================================
void px(int x, int y, int h, int c) {
  spr.setTextColor(spr.SETRGB(0, c, 0));
  spr.setCursor(x * h, y * h);
  spr.printf("%c", random(0x21, 0x7e));
}

void textRain(int x, int y, int h) {
  spr.clear(TFT_BLACK);
  static int yp[40] = {1};
  for (int i = 0; i < x; i++) {
    px(i, yp[i], h, 0xff);
    int p = 0;
    for (int j = yp[i] - y; j < yp[i]; j++) {
      px(i, j, h, (p << 3));
      p++;
    }
    if (yp[i] > y) {
      if (random(1000) > 975) yp[i] = 0;
    }
    yp[i]++;
  }
}

``` 

#4. さいごに
開発にあたり 毎度毎度の [lang-shipさん](https://github.com/tanakamasayuki/) さん [らびあんさん](https://github.com/lovyan03/) の github を参照させて頂きました
__アイデアさえあれば可能性はゼロではありません__
末永くよろしくお願い申し上げます

@chrmlinux03