WeatherTime スクリーン

このスケッチはWi-Fiネットワークに接続し、毎分OpenWeatherMapから天気データを取得し、NTPサーバーから現在時刻を取得し、OLEDスクリーンに日付、時刻、天気情報を表示します。

必要なコンポーネント

このプロジェクトには以下のコンポーネントが必要です。

全体のキットを購入すると便利です。こちらがリンクです:

名称

このキットのアイテム数

リンク

Elite Explorer Kit

300+

Elite Explorer Kit

以下のリンクから別々に購入することもできます。

コンポーネント紹介

購入リンク

Arduino Uno R4 WiFi

-

ジャンパーワイヤー

BUY

OLEDディスプレイモジュール

BUY

配線図

../_images/06_weather_oled_bb.png

回路図

../_images/06_weather_oled_schematic.png

OpenWeather

OpenWeather APIキーの取得

OpenWeather は、OpenWeather Ltdが所有するオンラインサービスで、API経由でグローバルな天気データを提供しています。これには、現在の天気データ、予報、ナウキャスト、歴史的天気データが任意の地理的位置に含まれます。

  1. OpenWeatherにログインするか、アカウントを作成します。

    ../_images/06_owm_1.png
  2. ナビゲーションバーからAPIページに移動します。

    ../_images/06_owm_2.png
  3. Current Weather Data を見つけて、サブスクライブをクリックします。

    ../_images/06_owm_3.png
  4. Current weather and forecasts collection の下で、適切なサービスにサブスクライブします。私たちのプロジェクトでは、Freeで十分です。

    ../_images/06_owm_4.png
  5. API keys ページからキーをコピーします。

    ../_images/06_owm_5.png
  6. それを arduino_secrets.h にコピーします。

    #define SECRET_SSID "<SSID>"        // your network SSID (name)
    #define SECRET_PASS "<PASSWORD>"        // your network password
    #define API_KEY "<OpenWeather_API_KEY>"
    #define LOCATION "<YOUR CITY>"
    
  7. あなたの場所のタイムゾーンを設定します。

    スウェーデンの首都ストックホルムを例に取ります。Googleで「stockholm timezone」と検索します。

    ../_images/06_weather_oled_01.png

    検索結果で、「GMT+1」を見ることができますので、以下の関数のパラメータを 3600 * 1 秒に設定します。

    timeClient.setTimeOffset(3600 * 1);   // Adjust for your time zone (this is +1 hour)
    

ライブラリのインストール

ライブラリをインストールするには、Arduinoライブラリマネージャーを使用し、「ArduinoMqttClient」、「FastLED」、「Adafruit GFX」、「Adafruit SSD1306」を検索してインストールします。

ArduinoJson.h:JSONデータ(openweathermapから取得されたデータ)を扱うために使用します。

NTPClient.h:リアルタイムの時間を取得するために使用します。

Adafruit_GFX.hAdafruit_SSD1306.h:OLEDモジュール用に使用します。

コードの実行

注釈

  • ファイル 06_weather_oled.inoelite-explorer-kit-main\iot_project\06_weather_oled のパスから直接開くことができます。

  • または、このコードをArduino IDEにコピーしてください。

注釈

コード内で、SSIDとパスワードは arduino_secrets.h に格納されています。この例をアップロードする前に、自分のWiFiの認証情報でそれらを修正する必要があります。さらに、コードを共有または保存する際には、この情報を機密に保つためのセキュリティ対策を講じてください。

どのように動作するのか?

  1. ライブラリと定義:

    1. WiFiS3.h:これは、特定のWiFiモジュールやボードに特有のライブラリで、WiFi接続を管理します。

    2. ArduinoJson.h:このライブラリはJSONデータのデコード(およびエンコード)に使用されます。

    3. arduino_secrets.h:機密データ(WiFiの認証情報など)が格納されている別のファイルです。これは、認証情報をメインコードから外しておくための良い習慣です。

    4. NTPClient & WiFiUdp:NTP(Network Time Protocol)サーバーから現在時刻を取得するために使用されます。

    5. Adafruitライブラリ:OLEDディスプレイを管理するために使用されます。

    6. さまざまなグローバル変数:これにはWiFiの認証情報、サーバーの詳細などが含まれ、スクリプト全体で使用されます。

  2. setup():

    1. シリアル通信を初期化します。

    2. WiFiモジュールのファームウェアバージョンをチェックして印刷します。

    3. 提供されたSSIDとパスワードを使用してWiFiネットワークに接続を試みます。

    4. 接続されたWiFiのステータス(SSID、IP、信号強度)を印刷します。

    5. OLEDディスプレイを初期化します。

    6. NTPクライアントを開始して現在時刻を取得し、タイムオフセットを設定します(この場合は8時間で、特定のタイムゾーンに対応する可能性があります)。

  3. read_response():

    1. サーバーからの応答を読み取り、特にJSONデータ( { and } で示される)を探します。

    2. JSONデータが見つかった場合、データをデコードして、気温、湿度、気圧、風速、風向きなどの天気の詳細を抽出します。

    3. OLEDスクリーンに天気情報を表示する displayWeatherData 関数を呼び出します。

  4. httpRequest():

    1. 既存の接続を閉じて、WiFiモジュールのソケットが空いていることを確認します。

    2. OpenWeatherMapサーバーに接続を試みます。

    3. 接続された場合、 LOCATION で定義された特定の場所(おそらく arduino_secrets.h または他の場所で定義)の天気データを取得するためにHTTP GETリクエストを送信します。

    4. リクエストが行われた時間を記録します。

  5. loop():

    1. サーバーからの受信データを処理するために read_response 関数を呼び出します。

    2. NTPサーバーから時刻を更新します。

    3. 天気サーバーに別のリクエストを行う時刻かどうかをチェックします( postingInterval に基づいて)。そうであれば、 httpRequest 関数を呼び出します。

  6. printWifiStatus():

    1. 接続されているネットワークのSSID。

    2. ボードのローカルIPアドレス。

    3. 信号強度(RSSI)。

  7. displayWeatherData():

    1. OLEDスクリーンをクリアします。

    2. 現在の曜日を表示します。

    3. 現在時刻をHH:MM形式で表示します。

    4. 提供された天気データ(気温、湿度、気圧、風速)を表示します。