7セグLED-8x4 汎用モニター

#はじめに
7セグメントLEDドライバーMAX7219を使った7セグメントLEDを購入したので汎用モニターとして作ってみた。

<img src="https://qiita-image-store.s3.amazonaws.com/0/203949/e7528f24-d4ab-ecaa-ede6-838600b4cbe6.png" width=50%>

MAX7219は、１つのICで8つの7セグLEDをドライブできてしまいます。7セグを8つベタに扱おうとすると配線だらけになり、実用的ではありません。今回は、(7セグメントLED ×8 + MAX7219) × 4 + ESP8266 という構成です。また MAX7219はカスケード接続できるので、配線数がかなり節約できます。

#ゴール
* ユーザ指定値
* 時計
* 地域の気温（現在、今日、明日）

の 3モード。ESP8266をWebServerにし、URLパラメータで切り替え。

### ユーザ指定値モード
```url
http://192.168.0.204/user?line1=12345678&line2=abcdefgh&line3=IJLoPUY&line4=--1.2.3.4.--
```
<img src="https://qiita-image-store.s3.amazonaws.com/0/203949/528890f6-caea-c0b0-0ade-6a7a3729e3c8.png" width=50%>

user:ユーザ指定値モード
line1～4:上から表示する値や文字列*1
(*1:一部文字は、使用ライブラリから追加しています。)

本来やりたかったのがこれ。
色々な測定値などを外部機器などから表示させたかった。
* 室温、湿度
* メール数、Tweet数
* 株価、為替

###時計モード
```url
http://192.168.0.204/clock
```
<img src="https://qiita-image-store.s3.amazonaws.com/0/203949/16d8ca94-8a14-bd33-ba09-11d52dc3d4b0.png" width=50%>

clock:時計モード

###気温モード
```url
http://192.168.0.204/temp
```
<img src="https://qiita-image-store.s3.amazonaws.com/0/203949/0835e6e9-6cc1-9e50-2121-45e3659d11f2.png" width=70%>

temp:気温モード

上記キャプチャは、2018/10/09 の 20:27:01 です。
曜日を表示する文字が表現できないのが残念です。何かいい方法があればご連絡を。

「[Dark Sky](https://darksky.net/dev)」というところのAPIを使用しました。
無料ですがメールアドレス登録が必要です。登録するとAPIキーが取得できるようになるのでこれをコードに埋め込みます。上記キャプチャの通りです。
APIは、JSON形式で取得できるのですが、esp8266ではJSONが大きすぎてParseできないので、ベタにテキスト検索になっています。折角APIを提供して頂いてるのですが、スクレイピングと変わらず申し訳ないです。

#ハード
* ESP8266(ESP-WROOM-02) or ESP32(ESP-WROOM-32) の開発ボード。
今回は、秋月電子の[AE-ESP-WROOM02-DEV](http://akizukidenshi.com/catalog/g/gK-12236/)
* [7seg-MAX7219キット×2](https://www.amazon.co.jp/HiLetgo%C2%AE-MAX7219-%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4-Arduino-STM32%E3%81%AB%E5%AF%BE%E5%BF%9C/dp/B01D0WSCJA)×2。今回はAmazonで購入。2個入りなので2セットで1,300円
* ブレッドボード 小型
* [ユニバーサル基板](http://akizukidenshi.com/catalog/g/gP-03232/)
* ワイヤー、ネジ、ケース、USBケーブル、半田

ケースはダイソーで買った名刺入れだったと思います。全部で3,500円くらいかと。

<img src="https://qiita-image-store.s3.amazonaws.com/0/203949/2b5927b5-1ec8-e55b-a6d1-a49b31eaa787.png" width=50%>


#ソフト
* 母艦(Windows10)
* ArduinoIDE1.8.7
* ESP8266拡張モジュール
* [LedControl(MAX7219用ライブラリ)](http://wayoda.github.io/LedControl/)

#組み立て
<img src="https://qiita-image-store.s3.amazonaws.com/0/203949/5414ccdf-94e6-5e64-e656-4ff1bcfb897d.png" width=50%>

ESP-WROOM-02とMAX7219をカスケードで繋ぐだけです。抵抗類も要りません。ただMAX7219の電圧が5.0Vとなっており、ESP-WROOM-02の出力が3.3Vなのでよろしくないかもしれません。動いたので良しとしています。

```
      +----------+           +--------------------------------+
      |          +-3.3v--VCC-+   -----             -----      |
      |   ESP    + GND --GND-+  |     |           |     |     |
 USB===   8266   + IO14--DIN-+   -----   MAX7219   -----    DIN->(2)DIN
      |          + IO12--CS--+  |     |           |     |   CS-->(2)CS
      |          + IO13--CLK-+   -----             -----    CLK->(2)CLK
      +----------+           +--------------------------------+
                             +--------------------------------+
            ESP8266-3.3v-VCC-+   -----             -----      |
                        -GND-+  |     |           |     |     |
                       ->DIN-+   -----   MAX7219   -----    DIN->(3)DIN
                       ->CS--+  |     |    (2)    |     |   CS-->(3)CS
                       ->CLK-+   -----             -----    CLK->(3)CLK
                             +--------------------------------+
                             +--------------------------------+
            ESP8266-3.3v-VCC-+   -----             -----      |
                        -GND-+  |     |           |     |     |
                       ->DIN-+   -----   MAX7219   -----    DIN->(4)DIN
                       ->CS--+  |     |    (2)    |     |   CS-->(4)CS
                       ->CLK-+   -----             -----    CLK->(4)CLK
                             +--------------------------------+
                             +--------------------------------+
            ESP8266-3.3v-VCC-+   -----             -----      |
                        -GND-+  |     |           |     |     |
                       ->DIN-+   -----   MAX7219   -----      |
                       ->CS--+  |     |    (4)    |     |     |
                       ->CLK-+   -----             -----      |
                             +--------------------------------+
```



#ソース
https://github.com/nori-dev-akg/7seg-monitor

WiFiClientSecure の readString() が、なんでかやたら遅いんです。以下のように自力でやると速くなりました。どなたか原因がわかる方いらしたらコメントにでも。

```cpp:7seg-monitor.ino[抜粋]
        String payload = "";
        //payload = client.readString(); // 遅い
        // Buffer size, 128 bytes in this case
        uint8_t *_buffer = new uint8_t[128];
        while (client.available())
        {
            int actualLength = client.read(_buffer, 128);
            if (actualLength <= 0)
                break;
            payload += String((char *)_buffer).substring(0, actualLength);
        }
        delete[] _buffer;
```

あと、ライブラリになかった文字を追加した差分を載せておきます。
ライブラリのヘッダを直接いじりました。

```cpp:LedControl.h
/*
const static byte charTable [] PROGMEM  = {
    B01111110,B00110000,B01101101,B01111001,B00110011,B01011011,B01011111,B01110000,
    B01111111,B01111011,B01110111,B00011111,B00001101,B00111101,B01001111,B01000111,
    B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
    B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
    B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
    B00000000,B00000000,B00000000,B00000000,B10000000,B00000001,B10000000,B00000000,
    B01111110,B00110000,B01101101,B01111001,B00110011,B01011011,B01011111,B01110000,
    B01111111,B01111011,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
    B00000000,B01110111,B00011111,B00001101,B00111101,B01001111,B01000111,B00000000,
    B00110111,B00000000,B00000000,B00000000,B00001110,B00000000,B00000000,B00000000,
    B01100111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
    B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001000,
    B00000000,B01110111,B00011111,B00001101,B00111101,B01001111,B01000111,B00000000,
    B00110111,B00000000,B00000000,B00000000,B00001110,B00000000,B00010101,B00011101,
    B01100111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
    B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000
};
*/
const static byte charTable [] PROGMEM  = {
    B01111110,B00110000,B01101101,B01111001,B00110011,B01011011,B01011111,B01110000,  // 0 - 7
    B01111111,B01111011,B01110111,B00011111,B00001101,B00111101,B01001111,B01000111,  // 8 9
    B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
    B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
    B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
    B00000000,B00000000,B00000000,B00000000,B10000000,B00000001,B10000000,B00000000,
    B01111110,B00110000,B01101101,B01111001,B00110011,B01011011,B01011111,B01110000,  // 0 - 7
    B01111111,B01111011,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
    B00000000,B01110111,B00011111,B01001110,B00111101,B01001111,B01000111,B01011110,  // # A b C d E F G
    B00110111,B00000110,B00111100,B00000000,B00001110,B00000000,B00010101,B01111110,  // H I J # L # n O
    B01100111,B00000000,B00000101,B01011011,B01110000,B00111110,B00000000,B00000000,  // P # r S T U # #
    B00000000,B00111011,B00000000,B00000000,B00000000,B00000000,B00000000,B00001000,  // # Y #
    B00000000,B01110111,B00011111,B00001101,B00111101,B01001111,B01000111,B01011110,  // # A b c d E F G
    B00010111,B00010000,B00111100,B00000000,B00001110,B00000000,B00010101,B00011101,  // h i J # L # n o
    B01100111,B00000000,B00000101,B01011011,B01110000,B00011100,B00000000,B00000000,  // P # r S T u # #
    B00000000,B00111011,B00000000,B00000000,B00000000,B00000000,B00000000,B00001000  // # Y #
};
```


#SpecialThanks!!
https://qiita.com/hnw/items/5319129fbfa6441ee52b
https://github.com/bbx10/WebServer_tng