05_API_OpenWeather_json

天気情報のJSONを読み取る

OpenWeather APIのJSONデータを解析し、必要な天気情報を取り出します。

Wi-Fi通信
1

準備する

CherryIoTをPCに接続する

CherryIoTをPCのUSB-A挿入口に接続します。

OpenWeatherを使用する

はじめに「04_API_OpenWeather」で、OpenWeather APIを使って天気情報を取得する基本の流れを確認してください。このサンプルでは、取得したJSONデータから必要な情報を取り出して利用します。

Arduino IDEに必要なライブラリをインストールする

このサンプルでは、次のライブラリを追加する必要があります。

  • ArduinoJson by Benoit Blanchon

初めて使用する場合のみインストールしてください。

ライブラリをインストールする
2

サンプルコード

GitHubで公開しているサンプルコードです。コードをコピーして Arduino IDEで使用します。

05_API_OpenWeather_json.ino
GitHubで開く
GitHubからコードを読み込んでいます...
3

プログラムを書き込む

上のサンプルコードをコピーし、Arduino IDEに貼りつけます。

設定情報を書き換える

コード内の以下の箇所を、「1 準備する」で確認・取得した情報に 書き換えます。

コード内の項目入力する情報
ssid接続するWi-FiのSSID
passwordWi-Fiのパスワード
endpoint天気を取得する都市名と国コード(コードのq=から&の間に、Tokyo,JPのように「都市名,国コード」の形で入力します)
keyOpenWeatherのAPIキー
const char* ssid = "ここにSSIDを入力";const char* password = "ここにパスワードを入力";const String endpoint = "http://api.openweathermap.org/data/2.5/weather?q=kofu,jp&APPID=";const String key = "ここにAPIキーを入力";

コードの左側にある項目名や記号は残し、例を参考に値の部分だけを 書き換えます。値を囲む"、行末の;、 証明書の開始・終了行などは削除しません。書き換えたあと、xxxxxなどの仮の文字が残っていないことを確認してください。

Wi-Fiのパスワード、APIキー、トークン、証明書などを入力したコードは、 Webサイト、SNS、GitHubなどへ公開しないでください。

ボードとポートの設定を確認し、左上の 「→(書き込みボタン)」を押してCherryIoTに書き込みます。

初めて書き込む方は「はじめてのCherryIoT」で詳しい手順を確認してください。

4

動作確認

シリアルモニターで確認する

JSONから取り出した天気情報を確認する

CherryIoTがWi-Fiへ接続すると、「Connected to the WiFi network」と表示されます。その後に「200」とOpenWeatherから受信したJSON形式の天気情報が表示され、さらに「main:Clear」のようにJSONから取り出した天気の情報が表示されれば成功です。

Arduino IDEのシリアルモニターにOpenWeatherのJSONと取り出した天気情報が表示された画面

OpenWeatherから受信したJSONと、そこから取り出した天気の情報がシリアルモニターに表示されるなら成功です。

5

コードの解説

APIの応答をJSONとして解析し、指定した項目の値を取り出して表示します。

05_API_OpenWeather_json.ino
GitHubで開く
GitHubからコードを読み込んでいます...

Serial.begin(115200);シリアルモニターへ文字や測定値を表示するため、通信速度を115200bpsに設定します。

#include <ArduinoJson.h>受信したJSONを項目ごとに読み取るため、ArduinoJsonライブラリを読み込みます。JSONは、項目名と値の組み合わせでデータを表す形式です。

const String endpoint = "http://api.openweathermap.org/data/2.5/weather?q=kofu,jp&APPID=";取得する地域を含むOpenWeather APIの接続先を設定します。

const String key = "xxxxxxxxxxxxxxxxx";OpenWeatherで取得したAPIキーを設定します。

int httpCode = http.GET();OpenWeatherへGETリクエストを送ります。

String payload = http.getString();APIから返された応答本文を文字列として取得します。JSONは、項目名と値を組み合わせてデータを表す形式で、天気や温度など複数の情報をまとめて受け取るときによく使われます。

DynamicJsonDocument forecaseDoc(1024);受信したJSONを解析して項目ごとに保存するため、1024バイトの領域を用意します。容量が小さすぎるとJSON全体を格納できないため、受信データに合わせた大きさが必要です。

deserializeJson(forecaseDoc, json);受信した文字列を解析し、項目ごとに取り出せるJSONオブジェクトへ変換します。

String main = forecaseDoc["weather"][0]["main"];weather配列の最初のデータから、天気の概要を取り出します。

Serial.printf("main:%s\n", main);取り出した天気の概要をシリアルモニターへ表示します。

int wheatherId = forecaseDoc["weather"][0]["id"];天気を表すID番号を取り出します。

String discription = forecaseDoc["weather"][0]["description"];天気の詳しい説明を取り出します。

float rain = forecaseDoc["rain"]["1h"];直近1時間の雨量を取り出し、rainへ保存します。

float snow = forecaseDoc["snow"]["1h"];直近1時間の積雪量を取り出し、snowへ保存します。

Serial.printf("wheatherId:%d discription:%s rain:%.2f snow:%.2f\n", wheatherId, discription.c_str(), rain, snow);天気ID、説明、雨量、積雪量を1行にまとめて表示します。

else {ifの条件(HTTP応答が返された)を満たさないとき、次の処理を実行します。

Serial.println("Error on HTTP request");HTTPリクエストでエラーが起きたことを表示します。

http.end();HTTP通信を終了します。

delay(30000);30秒待ちます。