MicroCat.1のLTE通信でOpen-Meteoの天気予報を3色e-Paper ディスプレイに表示してみた

前回の記事(https://wohl-yz.net/archives/20251222)では、ADT7410センサーを使って周囲の温度を取得し、サーバーへ送信する処理を実装しました。
前回の実験は「LTEによるデータのアップロード」がメインでしたが、今回の目的は「LTEによるデータのダウンロード」に取り組むことです。(前回に引き続きLTEアップロードによるサーバーへの温度センサーデータ送信も継続します。)
外部の天気予報APIから取得した情報と温度センサーから取得した現在温度を e-Paper ディスプレイ に表示する「情報表示端末」へのアップグレードに挑戦します。

1. Open-Meteo APIの活用:商用利用でなければ登録不要な気象データ
今回のプロジェクトで採用した「Open-Meteo」は、開発者にとって非常に扱いやすい気象予報APIです。IoTデバイス、特にMicroCat.1のようなマイコン環境で外部データを取り入れる(ダウンロードする)際、Open-Meteoには以下のメリットがあります。
- APIキーが不要: 面倒なユーザー登録や認証キーの管理が必要なく、URLをリクエストするだけで言わば「情報のダウンロード」がすぐに行えます。
- 軽量なJSONレスポンス: 必要な項目だけを指定して取得できるため、メモリ制限のあるマイコンでもパースが容易です。
- 詳細なパラメータ指定: 緯度・経度を指定するだけで、世界中のピンポイントな予報を取得可能です。
1.1. リクエストURLの構造
今回のコードでは、八頭町(緯度:35.4093, 経度:134.2507)を対象に、以下のパラメータでリクエストを送信しています。
WEATHER_URL = f"https://api.open-meteo.com/v1/forecast?latitude=35.4093&longitude=134.2507&hourly=temperature_2m,weathercode,precipitation_probability&forecast_days=1"
- hourly: 1時間ごとの「気温(temperature_2m)」「天気コード(weathercode)」「降水確率(precipitation_probability)」を取得します。
- 降水確率の補正: 日本の天気予報の慣習に合わせ、取得した降水確率は
round(raw_precip / 10) * 10という計算式で10%単位に四捨五入して表示しています。
2. LTE回線経由でのデータ取得(ダウンロード)
インターネット接続には、LTE Cat.1モジュールを搭載した「MicroCat.1」を使用し、1NCEのSIMカードでネットワークに接続しました。
- モデム制御:
SIM7672.modem()ライブラリを使用し、APN設定(iot.1nce.net)を行って接続を確立します。 - HTTP GET通信:
requests.get()を用いてOpen-Meteo APIからデータをダウンロードし、直近6時間分の予報をパースしてリスト化しています。
3. 3色e-Paper ディスプレイへの表示制御
表示部には、Waveshareの「Pico-ePaper-2.66-B」を採用しました。
- ドライバの準備: 今回使用した
epd2in66b.pyは、Waveshare公式のデモコードPico_ePaper-2.66-B.pyを MicroPython のimport仕様(ハイフンを含めない)に合わせてリネームしたものです。 - 独自アイコンの描画: 天気コード(WMOコード)を解析し、
framebufの図形描画機能を使って「晴れ(赤い太陽)」「曇り(黒い雲)」「雨(黒い雲と雫)」などのアイコンを自作しました。 - 背景色と反転処理: 使用したドライバは内部でビット反転を行う仕様のため、背景を白にするために黒バッファを
0x00、赤バッファを0xffで塗りつぶす特殊な処理を行っています。 - 3色の使い分け: 視認性を高めるため、ヘッダーや予報時間は黒色、センサーの現在温度や予報気温は赤色、降水確率は黒色で描き分けています。
4. システム構成
4.1. 全体構成図
ハードウェアの物理接続とネットワークを介したデータフローを示します。
graph TD
subgraph Hardware_Layer ["ローカル・デバイス"]
direction TB
MCU["<b>MicroCat.1</b><br/>(Raspberry Pi Pico 2 互換 / RP2350)"]
Modem["<b>SIM7672 モデム</b><br/>(LTE Cat.1)"]
subgraph Sensors ["周辺デバイス"]
Sensor["ADT7410<br/>(16-bit 温度センサー)"]
EPD["Pico-ePaper-2.66-B<br/>(3色 e-Paper ディスプレイ)"]
end
end
subgraph Network_Layer ["ネットワーク層 (LTE Cat.1)"]
SIM["1NCE SIM"]
Internet(("インターネット"))
end
subgraph Cloud_Layer ["外部サービス / サーバー層"]
OpenMeteo["<b>Open-Meteo API</b><br/>(Rx: 天気予報データ)"]
UserServer["<b>ユーザーサーバー</b><br/>(Tx: PHP / ログ保存)"]
end
%% 接続関係
Sensor -- "I2C (GP4/GP5)" --> MCU
MCU -- "SPI (GP8~GP13)" --> EPD
MCU -- "UART/AT Commands" --> Modem
Modem -- "Cellular" --> SIM
SIM --- Internet
Internet -- "HTTP GET (JSON)" --- OpenMeteo
Internet -- "HTTP POST (JSON)" --- UserServer
%% スタイル定義
style Hardware_Layer fill:#f5f5f5,stroke:#333,stroke-width:2px
style Network_Layer fill:#e1f5fe,stroke:#01579b
style Cloud_Layer fill:#fff9c4,stroke:#fbc02d
style MCU fill:#ffccbc,stroke:#e64a19
4.2. 処理シーケンス図
5分周期(300秒)で実行される、センサー計測、データのダウンロード、アップロード、表示更新のサイクルを示しています。
sequenceDiagram
autonumber
participant S as ADT7410 (Sensor)
participant M as MicroCat.1 (MCU)
participant L as SIM7672 (LTE Cat.1)
participant API as Open-Meteo (Weather API)
participant E as e-Paper Display
participant SRV as User Server (PHP)
Note over M: 5分周期のメインループ開始
rect rgb(240, 240, 240)
Note right of M: [計測]
M->>S: I2C経由で温度データを読み取り
S-->>M: 16-bit デジタル温度データ
end
rect rgb(225, 245, 254)
Note right of M: [LTE接続 & ダウンロード (Rx)]
M->>L: ネットワーク接続確認
L->>API: HTTP GET (緯度経度指定)
API-->>L: JSONデータ (天気/気温/降水確率)
L-->>M: パース済み予報データ
end
rect rgb(255, 235, 238)
Note right of M: [描画更新]
M->>M: 10%単位に降水確率を四捨五入
M->>M: framebufに天気アイコンを描画
M->>E: SPI経由でVRAMデータを転送
M->>E: 画面リフレッシュ命令
E-->>M: 更新完了 (Busy解除)
M->>E: epd.sleep() 発行
end
rect rgb(232, 245, 233)
Note right of M: [アップロード (Tx)]
M->>L: HTTP POST (センサー温度データ)
L->>SRV: データ送信
SRV-->>L: HTTP 200 OK
end
Note over M: 300秒間のスリープ (Deep Sleep待機)
5. 自動更新とデバイスの寿命に関する注意点
このシステムは5分(300秒)間隔で「計測・取得・更新」のサイクルを繰り返します。運用にあたっては、e-Paper ディスプレイ 特有の性質に注意が必要です。
- 更新間隔の制限: e-Paper ディスプレイ は頻繁に画面更新を行うと寿命が短くなる特性があります。特に今回使用しているパネルは、最低180秒以上の更新間隔を空けることが推奨されています。今回は実験のため5分(300秒)間隔の設定にしていますが、実際に利用する場合は数時間ごとの画面更新がよいと考えます。
- 表示の維持と省電力: e-Paper ディスプレイ は一度書き込むと電源を切っても表示が消えないため、更新完了後には
epd.sleep()を実行してディスプレイ側の消費電力をほぼゼロに抑えています。 - 安定性: 通信のたびにモデムの接続状態を確認し、必要に応じて再接続を行うロジックを組み込むことで、長期間の安定稼働を実現しました。
6. まとめ
前回の「アップロード」から、今回の「ダウンロード」へとLTE通信の活用範囲を広げたことで、Wi-Fi環境がない場所でも動作する「スマート天気予報ボード」が完成しました。デバイスの寿命に配慮した更新設計や、3色表示を活かした直感的なアイコン表示により、実用的な情報端末として仕上げることができました。
7. サンプルコード
temperature_send.py: メインロジック(LTE接続・API取得・描画制御)epd2in66b.py: e-Paper ディスプレイ ドライバ(公式Pico_ePaper-2.66-B.pyをリネーム)adt7410.py: 温度センサードライバconfig.py: サーバーURL・デバイスID設定
microcat1 epaper (ZIP, 21.29 KB)
8. FAQ
- なぜ e-Paper ディスプレイの更新間隔を「180秒以上」にする必要があるのですか?
- e-Paper(電子ペーパー)は、電圧をかけて粒子を移動させることで表示を保持する仕組みです。頻繁に画面を書き換えると、パネル内に電荷が残留したり、物理的な劣化が進んだりして、「焼き付き」や表示品質の低下を招く恐れがあります。製品寿命を長く保つため、メーカー推奨の間隔(今回のパネルでは180秒以上)を守ることが重要です。
- ディスプレイドライバのファイル名を
epd2in66b.pyに変更したのはなぜですか? - MicroPythonの
import文では、ファイル名にハイフン(-)が含まれていると構文エラーになるためです。Waveshare公式のPico_ePaper-2.66-B.pyをそのまま扱うのではなく、アンダースコア(_)を使うか、今回のように英数字のみの名称に変更してインポートしやすくしています。 - 表示内容に「赤色」が含まれていますが、3色表示の制御は難しいですか?
- このディスプレイは「黒・白・赤」の3色に対応しており、制御には「黒用」と「赤用」の2つのバッファ(VRAM)を使用します。ブログ内でも触れている通り、ドライバの仕様によってはビット反転(0と1の解釈が逆)が必要な場合があるため、描画時に
0x00や0xffで塗りつぶす処理を使い分ける工夫が必要です。 - 他のセンサー(気圧や湿度など)を追加して表示することは可能ですか?
- はい、可能です。MicroCat.1には複数のGPIOやI2Cピンがあるため、別のセンサーを接続し、取得したデータを
framebufでテキストとして描画領域に追加すれば表示できます。ただし、画面サイズ(2.66インチ)に合わせてレイアウトを調整する必要があります。 - Open-Meteo APIを選んだ最大のメリットは何ですか?
- 最大のメリットは「APIキーが不要」である点です。多くの気象APIはユーザー登録とトークンの発行が必要ですが、Open-MeteoはURLを叩くだけでデータを取得できるため、プログラムの初期設定が非常にシンプルになります。また、商用利用でなければ無料という点も個人開発に適しています。
- 自分の住んでいる地域の天気予報を取得するにはどうすればいいですか?
WEATHER_URL内にあるlatitude(緯度)とlongitude(経度)の値を、お住まいの地域の座標に変更するだけで対応可能です。Googleマップなどで目的の場所を右クリックすれば、これらの数値を簡単に確認できます。- 1NCE以外のSIMカードでも動作しますか?
- はい、LTE Cat.1に対応しているSIMであれば動作可能です。ただし、使用するSIMカードに合わせて APN(Access Point Name)の設定を変更する必要があります。今回のコードでは
iot.1nce.netに設定されていますが、これを各キャリア指定の値に書き換えてください。

