明日の天気を予知してくれる魔法のランタンをつくる



# 魔法ひとつくださいな

魔法。
それが伝説やお伽噺の産物ではなく、現実の技術となってから1/4世紀[^1]が経とうとしていた。

[^1]: ピーター・H. サルス, UNIXの1/4世紀,  [Amazon](https://www.amazon.co.jp/UNIX%E3%81%AE1-4%E4%B8%96%E7%B4%80-Ascii-books-%E3%83%94%E3%83%BC%E3%82%BF%E3%83%BC%E3%83%BBH/dp/4756136591)

そして、春。
今年もgeekどもが魔法で新入生を脅す季節がやってきた...[^2]

[^2]: 佐島勤, 魔法科高校の劣等生, [Amazon](https://www.amazon.co.jp/dp/B01HAWPM1M)

---

明日の天気を予知して色で示してくれる魔法の石のはいったランタンを作ります。

![a.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204320/b258fc1a-665c-beaf-ed80-110b4ed87f5f.jpeg)



# 魔法の実装方法

マイコン制御のRGB LEDを使います。
信号線1本で1024個以上デイジーチェーン接続できるそうです。
ホスト側からデータを受け取ると、頭のデータをshiftして光ったあと次のデバイスに信号を回してくれるというシフトレジスタになります。

そのLEDを5つ接続し、その上に石英をレジンで固めたものを置き、石英を光らせます。
明日の天気はyahooの天気予報からとってきます。
天気を色で示し、もし気温が高い・低い場合は別の色との周期的変化をさせます。

![魔法石.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204320/652e3978-96fe-7f62-27f1-fd080b1deac4.jpeg)


## レシピ

| 品名 | 数量 | 調達方法例 | ランタン1台あたり価格 |
|:-:|:-:|:-:|:-:|
| GPIOピン  | 1  | 近くにあったESP32から拝借  | 0  |
| マイコン内蔵RGB LED  | 5  | [マイコン内蔵RGBLEDモジュール: LED(発光ダイオード) 秋月電子通商-電子部品・ネット通販](https://akizukidenshi.com/catalog/g/gM-08414/)  | 350円  |
| キャンドル用ランタン  | 1  | [キャンドルランタン｜IKEA【公式】家具・インテリア雑貨通販 - IKEA](https://www.ikea.com/jp/ja/cat/lanterns-20491/)  | 600円 |
| レジン | 数グラム | [Amazon \| パジコ UV-LED レジン 星の雫 ハード 10g 日本製 403239 \| UVレジン液 通販](https://www.amazon.co.jp/dp/B08NSHKY1L) | 300円 |
| レジン硬化用紫外線LED | 1 | または太陽ひとつ | 0 |
| 石英の結晶 | 適量 | [Amazon.co.jp: 風水グッズ 水晶ポイント 原石 100g 最高級AAAグレード 天然石 パワーストーン : ジュエリー](https://www.amazon.co.jp/dp/B077T33DLL) [^3]またはすすき野原の男の子から貰う[^4] | 500円 |
| フェイクグリーン | 適量 | [ラモス｜建築模型材料の通販＜光栄堂＞](https://koeido.jp.net/) （東急ハンズにあります） | 100円 |
| 抵抗、基盤、コネクタ、配線材料、ラップ、両面テープ、グルーガンなど | 適量 | | |

[^3]: パワーストーンといってもレギュレータICのことではありません。ニューエイジ運動に由来し、石に力が宿ると信仰することです。ムーン*クリスタルパワー*メイクアップ！
[^4]: 柊あおい, 星の瞳のシルエット, [Amazon](https://www.amazon.co.jp/dp/4088533704)

GPIOはラズパイでもArduinoでもESP8266でもいけるはずので、どこのご家庭にも転がっていることでしょう。
「適量」のものはたくさんは使いません。
おそらく一台あたりの単価は2000円行かないと思います。
ディズニーの光るポップコーンバスケットより安い！

## ハードウェア作成

### LED基盤

ティーキャンドルの大きさに基盤を切り、RGB LEDを5つ配線します。
前のデバイスのDoutを次のDinに繋げるディジーチェーン接続です。
最初のLEDのDinにはESP32の余っているGPIOをつなげます。
裏は絶縁しておきます。

![led.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204320/8e30a5dd-345f-480d-c934-fef5efc4b40f.jpeg)

自作するより高くなりますが、以下のような製品を使うという手もありますね。
[M5Stack用NeoPixel互換LED搭載 六角形ユニット - スイッチサイエンス](https://www.switch-science.com/catalog/6058/)

今回電源は5V、データ側は3.3VのGPIOをそのまま繋げています。
データシートによると電源は3.5V〜5.5V、データのLはVccの0.3倍以下でHは0.7倍以上だそうですので、電源5Vに対してGPIO 3.3Vは微妙に足りません。
今回は5つだけの接続なのでこれでもうまく動きましたが、状況によってはレベルシフタを使う必要がありそうです。
ただ、レベルシフタによっては却って波形が歪むということも考えられます。
[Cheating At 5V WS2812 Control To Use 3.3V Data | Hackaday](https://hackaday.com/2017/01/20/cheating-at-5v-ws2812-control-to-use-a-3-3v-data-line/)

### 石

LEDができたら、その上におく石を作ります。
ティーキャンドルの空き皿をラップで包み、レジンを入れ、石英をうまく並べて紫外線を当てます。
結晶が整いすぎているとLEDの光がうまく拡散しませんので、結晶は安いもので十分です。

![stone.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204320/c38bdecf-0af5-2bb0-d1cd-6a08b15fe631.jpeg)

あとはランタンの中に仕込んで完成。
配線や光の漏れを隠すために周囲に模型用造花をいれました。

## ソフトウェア作成

### ランタン側

このRGB LEDをドライブすることができるライブラリは、以下の3つがあります。

* [FastLED/FastLED: The FastLED library for colored LED animation on Arduino](https://github.com/FastLED/FastLED)
* [adafruit/Adafruit_NeoPixel: Arduino library for controlling single-wire LED pixels (NeoPixel, WS2812, etc.)](https://github.com/adafruit/Adafruit_NeoPixel)
* [Makuna/NeoPixelBus: An Arduino NeoPixel support library supporting a large variety of individually addressable LEDs. Please refer to the Wiki for more details. Please use the gitter channel to ask questions as the GitHub Issues feature is used for bug tracking.](https://github.com/Makuna/NeoPixelBus)

NeoPixelBusのリポジトリに比較があります。
[Library Comparisons · Makuna/NeoPixelBus Wiki](https://github.com/Makuna/NeoPixelBus/wiki/Library-Comparisons)

今回はLED5個ですので、初期化は
```c++:
// FastLEDの場合
#include <FastLED.h>
CRGB ledarray[5];
FastLED.addLeds<NEOPIXEL, PIN_LED>(ledarray, 5);

// Adafruit_NeoPixelの場合
#include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel ledc(5, PIN_LED, NEO_GRB + NEO_KHZ800);

// NeoPixelBusの場合
#include <NeoPixelBus.h>
NeoPixelBus<NeoGrbFeature, Neo800KbpsMethod> ledc(5, PIN_LED);
```
となります。

LED番号をシャッフルして、その順番に前のRGB値から新しいRGB値までゆっくり変化させていく作業を定期的に行うスレッドをつくります。

[M5Stack用NeoPixel互換LED搭載 六角形ユニット - スイッチサイエンス](https://www.switch-science.com/catalog/6058/) のようにLEDが多数ある場合まとめて書き込みたくなりますが、こまかく制御したほうが綺麗にグラデーションが出ます。
たとえばLED3つをまとめて一つの色とする場合でも、3つまとめて256階調にするのではなく3*256=768階調とします。

### サーバ側

サーバ側で天気予報を取得して色を決定し、MQTTで投げ込みます。
今回は同居先のプログラムが母艦に依存せざるをえないものですのでこうしていますが、頑張ってESP32自体にやらせると母艦に依存しない魔法石ができます。

#### Yahoo!天気予報

東京の場合、

[東京（東京）の天気 - Yahoo!天気・災害](https://weather.yahoo.co.jp/weather/jp/13/4410.html)

です。

当日および翌日の天気は
```xpath:
//span[contains(text(), 'mm月dd日')]/../..//p[@class="pict"]/img
```

でとってきた`img`の`alt`属性にはいります。

最高気温・最低気温は

```xpath:
//span[contains(text(), 'mm月dd日')]/../..//li[@class="high"]/em
//span[contains(text(), 'mm月dd日')]/../..//li[@class="low"]/em
```
のtextです。

あとは「雨なら青」「最高気温が高いときは赤と交互に表示」とか適当に割り当てます。

#### tenki.jp 花粉情報（春限定）

花粉症でもそうでなくても、スギ花粉を積極的に摂取したいという方は少ないことでしょう。

[花粉飛散情報 - 日本気象協会 tenki.jp](https://tenki.jp/pollen/)

こちらの基礎自治体レベルのページ（例えば千代田区なら https://tenki.jp/pollen/3/16/4410/13101/ )で

```xpath:
//h3[@class="left-style" and contains(., "mm月dd日")]/following-sibling::div//img[contains(@src, "pollen")]
```
の`src`属性`icon-large-([0-9])`にレベルがでます。

指数が高い時には注意を促すような表示をESP32に投げます

#### tenki.jp 熱中症指数 (夏限定)

WGBTという数値が熱中症指数として知られています。
米軍が兵士の活動のために作ったそうですが、温度湿度だけでは計算できず、自分で計測するには黒球と湿球も必要というなかなかハードルが高いものです。
その予報がtenki.jpにあります。

[熱中症に注意！ - 熱中症情報（WBGT近似値） - 日本気象協会 tenki.jp](https://tenki.jp/heatstroke/)

```xpath:
//tr[@class="wbgt-rank"]//td
```
8個の`td`が取れます。
前半4個が当日、後半4個が翌日となります（`class`に`past`がついている物は過去）。
ここから今日明日の熱中症指数の予報を取得できます。

#### tenki.jp 風邪ひき指数 (冬限定)

tenki.jpは「風邪ひき指数」というのを公表しています。

[風邪ひき指数 - 日本気象協会 tenki.jp](https://tenki.jp/indexes/cough/)

```xpath:
//h3[contains(text(), "今日")]/parent::*//img
```
この`alt`に`指数:([0-9]+)`として数値がでます。

# 魔法あたらねぇぞ！

残念ながら天気予報は魔法ではありませんので外れることもありますし、LEDも魔法ではありませんので壊れることもあります...

# 謝辞

以下の作品から発想を得て作成、執筆しました。

[天然石の鉱石ランタン - 異界商店 | minne 国内最大級のハンドメイド・手作り通販サイト](https://minne.com/items/24710448)
[魔法機械技師の日常（紙版/DL版） - 梟の栞 - BOOTH](https://booth.pm/ja/items/2765905)

# 追記

世の中ひろいものでして、似たようなものを作っている方がいらっしゃいました。
[ATOM Matrixで電子キャンドル(天気予報機能付き)を作る - Qiita](https://qiita.com/CIB-MC/items/6be72f96532c67a799ce)

我が家ではついでにポップコーンバスケットも光っており、風が強い時は室内の木製風車が回るようにステッピングモーターを仕込んでいます（動作音が予想以上に大きかったので停止中（笑））。
![らんたん](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204320/6133a1bd-1a3c-2363-2761-8a3ac27e0ed0.jpeg)