05_API_OpenWeather_json
天気情報のJSONを読み取る
OpenWeather APIのJSONデータを解析し、必要な天気情報を取り出します。
準備する
CherryIoTをPCに接続する
CherryIoTをPCのUSB-A挿入口に接続します。
OpenWeatherを使用する
はじめに「04_API_OpenWeather」で、OpenWeather APIを使って天気情報を取得する基本の流れを確認してください。このサンプルでは、取得したJSONデータから必要な情報を取り出して利用します。
Arduino IDEに必要なライブラリをインストールする
このサンプルでは、次のライブラリを追加する必要があります。
- ArduinoJson
初めて使用する場合のみインストールしてください。
ライブラリをインストールするサンプルコード
GitHubで公開しているサンプルコードです。コードをコピーして Arduino IDEで使用します。
GitHubからコードを読み込んでいます...プログラムを書き込む
上のサンプルコードをコピーし、Arduino IDEに貼りつけます。
設定情報を書き換える
コード内の以下の箇所を、「1 準備する」で確認・取得した情報に 書き換えます。
| コード内の項目 | 入力する情報 |
|---|---|
ssid | 接続するWi-FiのSSID |
password | Wi-Fiのパスワード |
endpoint | 天気を取得する都市名と国コード(コードのq=から&の間に、Tokyo,JPのように「都市名,国コード」の形で入力します) |
key | OpenWeatherの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」で詳しい手順を確認してください。
動作確認
シリアルモニターで確認する
JSONから取り出した天気情報を確認する
CherryIoTがWi-Fiへ接続すると、「Connected to the WiFi network」と表示されます。その後に「200」とOpenWeatherから受信したJSON形式の天気情報が表示され、さらに「main:Clear」のようにJSONから取り出した天気の情報が表示されれば成功です。

OpenWeatherから受信したJSONと、そこから取り出した天気の情報がシリアルモニターに表示されるなら成功です。
コードの解説
APIの応答をJSONとして解析し、指定した項目の値を取り出して表示します。
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秒待ちます。