朝のバタバタを解消する。LEDパネル時計を作成！

早く行かないと学校に遅れる！今日雨やで傘持った！？
を言い続けて８年が過ぎました。
これからも言い続ける可能性が高い状況を解消すべく

配送ミス品のLEDパネル（端が欠けている・・）を使って玄関前のバタバタを解消する時計を作ってみました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/a47b69dc-52ea-ca7e-b41b-f7fadd314eaa.png" width="50%"/>

## 欲しい機能
とりあえず毎日言ってることを代わってくれる以下の機能を実装することにしました。

* 時計
時間を見せることで、今何時だよ！とを言わなくても良くする　
* 遅刻チェック機能
今家を出たら何時に着くをわかるようにし、遅刻をするよ！を言わなくても良くする
* 天気予報
下校時間の天気情報を表示し、傘を持て！を言わなくても良くする


## システムについて

設定値の変更や、今後の機能拡張をも考え、データはGASから取得することにしました。
システム構成はこのような形に
※ゆくゆくは、あと何分後に家をでたら電車にぴったり間に合う等の機能も入れたい。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/e76865cf-14ca-9599-e549-b0ce25b7c7ff.png" width="50%"/>

#### お天気情報
お天気情報は、GASを利用して[Open-Meteo](https://open-meteo.com/)から取得！
タイマー設定で、1時間に１度取得し、スプレッドシートに転記しています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/61a672ef-c1d4-2c7a-fffc-e4ee28e7025b.png" width="48%"/>

### パネル制御

通信も入るのでZero2を予定していましたが、
Python系のライブラリ使用時のちらつきを解消できずにNGとしました・・

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/00c8a29a-161c-b420-f027-0729f6e14957.png" width="50%"/>


問題がなかったESP32を採用

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/366a8423-0b82-c389-a766-9ce5bf60c9af.png" width="48%"/> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/5ab10664-f323-c078-9eef-297649c0e785.png" width="48%"/>

#### LEDパネルの表示
LEDの制御は、こちらのライブラリを使用。

https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-DMA

いろいろ出来上がった後に気づいたのですが、[LovyanGFX](https://github.com/lovyan03/LovyanGFX)も使えそうだったので、こちらにしたほうがよかったと後悔してます。

#### 日本語フォントの利用

日本語フォントの表示とかはこちらを参考にさせてもらいました。

https://ogimotokin.hatenablog.com/entry/2020/12/19/100000

##### メモリ不足の解消
ESP32-WROOM-32D(4MB)において、WiFi系のライブラリと、フォント（SPIFFS）を同時に使うとFlashの不足が判明・・。
マイコンの変更も考えましたが、pertitionsにNO OTAの状態で、APP 1.5MB / SPIFFSを2.5MBを追加することでぎりぎり利用できました。

###### 各メモリの割り振り

esp32/tools/partitions/noota_25g.csv
という名称で以下の情報を追加
``` 
# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x5000,
otadata,  data, ota,     0xe000,  0x2000,
app0,     app,  ota_0,   0x10000, 0x180000,
spiffs,   data, spiffs,  0x190000,0x260000,
coredump, data, coredump,0x3F0000,0x10000,
```

Arduino IDEのメニューに追加するため、esp32/boards.txt　に以下の情報を追加
```
esp32.menu.PartitionScheme.noota_25g=No OTA (1.5MB APP/2.5MB SPIFFS)
esp32.menu.PartitionScheme.noota_25g.build.partitions=noota_25g
esp32.menu.PartitionScheme.noota_25g.upload.maximum_size=1572864
```

うまく追加できると以下のように項目が増えます。
![スクリーンショット 2023-12-17 23.19.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/fb148302-5005-d05c-4d53-c33f6a31d7fd.png)

#### GASへのアクセスについて

HTTPClientでGASにアクセスするとリダイレクトでデータ取得が失敗します。
以下のライブラリを使うことで、対応しています。

https://github.com/jbuszkie/HTTPSRedirect


## 筐体の作成
残念ながら我が家において基板や配線剥き出しの機器の設置は許可されません。
木造の家に合うように木をベースとした筐体を準備します。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/e0c6f6a7-e38f-9650-b323-b7e42cbeee03.png" width="48%"/> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/ee4e721e-5fff-9624-8324-c86ac2649cc6.png" width="48%"/>


### 木材と合体
３Dプリンターで、LEDパネルと木材のガワをくっつけるアタッチメントを出力
ネジで固定

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/26b8939d-6dbd-2cb2-e219-8dbb26ebb90a.png" width="48%"/> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/01797674-a210-8b68-cc32-e2686bdc6ca8.png" width="48%"/>

天然木の薄い木目シールを張るとこのような感じに。
光った部分が浮き出すため大変良い雰囲気になります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/1ada92d5-c76d-3f72-7344-cee550127abf.png" width="48%"/> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/e93b85f1-f259-f22e-3c62-2daedc647767.png" width="48%"/>






## いざ設置

### 電源伸ばす
設置予定の壁には電源がないので、逆の壁から延長コードを伸ばします。
玄関の下をうまく配線カバーで隠しながらシューズボックスにコンセントを設置
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/479e1e3f-c3c0-e0c3-765e-bd013bcf911b.png" width="48%"/> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/bf76367d-540e-426c-7158-a0e7d69bb8c8.png" width="48%"/>

### 壁に設置

人が来るところなので少しでも見栄えを良くするために配線カバーは必須になりました。
また、簡単に外れるよう配線カバーはマスキングテープを敷いた上から設置しています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/069567b9-2d7e-8b64-8752-4241cbe8bd35.png" width="49%"/> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/280db1c0-2d61-f061-2b46-659f4f1b2d21.png" width="49%"/>



## 設置後

午前、帰宅時の天気予報を表示する様にしています。
15時以降は、16時〜18時までの天気に切り替え、遊びに行く場合にも対応しています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/eeef7715-5c70-dee9-48e0-7d84a5a686ef.png"/>

到着時間は、Googleスプレッドシートに記載された推定の移動時間をから算出しています。
到着時間が授業開始時間を超える場合は、文字が赤くなる様にしています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/6b2cf9e6-8d96-f052-621b-ef3fd800984b.png"/>

実際の動作はこの様な感じ。

https://x.com/masaya3/status/1668410607161442304?s=20

## おまけ

静かになると、顔を出すようにしています。

https://x.com/masaya3/status/1668644961150201857?s=20


## 最後に

私よりも先に不具合に気づいてくれる程度には、活用してくれてるのかなと思います。
ただ、日常のバタバタはあまり減ってる気がしません。