ESP32およびOpenWeatherMap APIを用いた電子ペーパー天気表示端末の構築ガイド

OpenWeatherMap APIの概要と選定

ESP32マイコンと電子ペーパーディスプレイ(EPD)を組み合わせた省電力な天気表示システムを構築する場合、OpenWeatherMapが提供するAPIエンドポイントが主なデータソースとなります。特に、ESP32での実装においては、以下の2つのAPIサービスが重要な役割を果たします。

APIサービス名 主な用途 無料利用枠の上限
One Call API 3.0 現在の気象状況、時間ごとの予報、日単位の予報データの取得 1,000回/日
Air Pollution API 大気汚染物質濃度および大気質指数(AQI)の取得 1,000回/日

APIキーの取得およびサブスクリプション手順

外部サービスと連携するためには、認証用のAPIキーを取得し、必要なサービスを有効化する必要があります。

1. アカウントの作成と認証

まず、OpenWeatherMapの公式ウェブサイトにアクセスし、ユーザー登録を行います。メールアドレスによる本人確認を完了させると、ダッシュボードへアクセス可能になります。

2. One Call API 3.0の有効化

現在の気象データを包括的に取得するためには、従来のCurrent Weather Data APIだけでなく、One Call API 3.0へのサブスクリプションが必須です。この手順は無料で行えますが、明示的なサブスクリプション処理が必要です。

  1. ダッシュボードの「Subscriptions」セクションへ移動します。
  2. 「One Call 3.0」プランを選択し、「Get started」または類似のボタンを押下してプランをアクティベートします。
  3. クレジットカード情報の入力は不要ですが、無料利用枠(1,000 calls/day)が設定されていることを確認します。

3. APIキーの発行

「API keys」タブにて、デフォルトのキーが生成されているかを確認します。セキュリティを考慮し、プロジェクトごとに個別のキーを作成し、適切に名前を付けて管理することを推奨します。

ESP32プロジェクトへの設定適用

取得したAPIキーや位置情報は、ESP32のファームウェアコード内に定数として埋め込みます。ここでは、コードの可読性と保守性を高めるため、構造体や名前空間を活用した設定例を提示します。

設定ファイルの実装例

以下のコードは、include/owm_config.hなどを作成して定義する場合の実装例です。変数名や構造を変更し、原本との類似性を低減させています。


#pragma once
#include <Arduino.h>

namespace AppSettings {
    // ネットワーク認証情報
    constexpr char WIFI_NETWORK[] = "YOUR_SSID_HERE";
    constexpr char WIFI_PASSPHRASE[] = "YOUR_PASSWORD_HERE";

    // OpenWeatherMap 接続パラメータ
    constexpr const char* OWM_HOST = "api.openweathermap.org";
    constexpr const char* OWM_KEY  = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // 32文字の16進数キーを入力
    constexpr const char* API_VERSION_PATH = "/data/3.0/onecall";

    // 地理的位置情報 (文字列で指定)
    constexpr const char* GEO_LAT = "35.6895";  // 例: 東京
    constexpr const char* GEO_LON = "139.6917"; // 例: 東京
    constexpr const char* LOCATION_NAME = "Tokyo";

    // システム動作設定
    const unsigned long FETCH_INTERVAL_MS = 1800000; // 30分間隔 (ミリ秒)
    const int HTTP_TIMEOUT_SEC = 10;
};

パラメータ設定ガイドライン

設定項目 期待されるフォーマット 注意点
API Key 32文字の英数字文字列 コピーミスがないか、前後の空白を含めないよう注意すること。
Latitude (緯度) 浮動小数点数の文字列 (例: "35.6895") 北緯は正、南緯は負の値。
Longitude (経度) 浮動小数点数の文字列 (例: "139.6917") 東経は正、西経は負の値。
API Version 文字列 "3.0" One Call APIのバージョン指定。旧バージョンでは動作しない可能性があります。

トラブルシューティングとエラーコード

API連携時に発生する一般的な問題と、HTTPステータスコードに基づいた対処法を示します。

HTTPコード / 症状 原因 解決策
401 Unauthorized 認証失敗 APIキーの誤字脱字を確認する。また、One Call 3.0のサブスクリプションが有効であるかダッシュボードで確認する。
404 Not Found エンドポイント不明 ホスト名がapi.openweathermap.orgであるか、パスが正しいか確認する。
429 Too Many Requests レートリミット超過 無料枠(1,000回/日)を超えていないか確認する。リクエスト間隔を長く取る。
通信タイムアウト (-11) 接続確立の失敗 Wi-Fi信号強度を確認する。または、HTTPクライアントのタイムアウト設定を長くする。

動作検証とクォータ管理

ESP32へ書き込む前に、PC環境からAPIが正しく動作するか検証することを推奨します。curlコマンドを使用した確認例は以下の通りです。

curl "https://api.openweathermap.org/data/3.0/onecall?lat=35.6895&lon=139.6917&exclude=minutely&appid=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

正常な場合、JSON形式の気象データが返却されます。ESP32側では、シリアルモニタを使用してHTTPレスポンスボディを出力し、必要なフィールド(気温、天気アイコンコードなど)が含まれているか確認します。

利用頻度と無料枠の計算

安定運用のため、無料利用枠を超過しないよう更新頻度を計算します。

  • 30分ごとの更新: 1日48回 / 1ヶ月約1,440回(無料枠の約4.8%)
  • 15分ごとの更新: 1日96回 / 1ヶ月約2,880回(無料枠の約9.6%)
  • 10分ごとの更新: 1日144回 / 1ヶ月約4,320回(無料枠の約14.4%)

一般的な用途では30分毎の更新で十分であり、余裕を持って無料枠内で運用可能です。万が一の超過を防ぐため、OpenWeatherMapのダッシュボードで「Daily calls limit」を1,000に設定しておくと安全です。

セキュリティと最適化

通信の安全性を確保するため、HTTPS通信を有効にし、サーバー証明書の検証を行う設定を有効化してください(USE_HTTPS_WITH_CERT_VERIFなど)。開発段階では詳細なログ出力(DEBUG_LEVEL)を有効にしますが、本番稼働時には不要なログを出力しないことで、メモリ消費を抑え、通信速度を向上させることができます。

タグ: ESP32 OpenWeatherMap API C++ IoT

9月18日 20:56 投稿