ゆるく楽しむプログラミング

M5Stamp PICOで天気予報を表示 ~気象庁編~

M5Stamp PICOで気象庁の天気予報にアクセスして、天気予報データを取得しお天気アイコンを表示します。


気象庁からの天気予報データ取得方法

気象庁の天気予報サイトは、サーバかJSON形式の天気予報データを読み込んでJavascriptで表示ページを構築しています。
この、JSONデータを取得・加工して天気予報を表示します。
正式に公開されたAPIではなく、Webページ表示用のインターフェイスを勝手に使用するので
ある日突然使えなくなる、突然仕様が変わる可能性があります。

天気予報データ(JSON形式)は▼にアクセスすると取得できます。
https://www.jma.go.jp/bosai/forecast/data/forecast/{天気予報用地域コード}.json

天気予地区コードは あんこエディケーション にまとめがあります。

または、緯度経度から気象庁の天気予報用地域コードを取得するWebAPI から取得することもできます。
観測地の緯度{lat}経度{lon} の値は、Googlemapで観測地点を右クリックすれば表示されます。


取得した緯度経度を使用して
https://revgeo-forecastcode.herokuapp.com/lat={lat}+lon={lon} にアクセス
forecastcode が 天気予報用地域コード
class10s が 地域コード(西部とか東部とか○○地方とかの区域)
{"forecastcode":"140000","prefname":"神奈川県","cityname":"箱根町","centers":"010300","offices":"140000","class10s":"140020","class15s":"140024","class20s":"1438200"}

天気予報用地域コードを使ってJSONを取得
https://www.jma.go.jp/bosai/forecast/data/forecast/140000.json
返ってきたJSONの "area":{"name":"西部","code":"140020"} が class10s と同じ areaが目的のデータです。

★は説明用に追記したコメントです。実際のJSONファイルには含まれていません。
[
	{
		"publishingOffice":"横浜地方気象台",
		"reportDatetime":"2022-04-05T17:00:00+09:00",
		"timeSeries":[
			{	★天気予報
				"timeDefines":["2022-04-05T17:00:00+09:00","2022-04-06T00:00:00+09:00","2022-04-07T00:00:00+09:00"],
				"areas":[
					{
						"area":{"name":"東部","code":"140010"},
						"weatherCodes":["111","210","201"],
						"weathers":["晴れ 夜 くもり","くもり 昼前 から 時々 晴れ","くもり 時々 晴れ"],
						"winds":["東の風 後 南の風","南の風 海上 では 南西の風 やや強く","北の風 後 南の風"],
						"waves":["1.5メートル 後 1メートル うねり を伴う","1メートル 後 1.5メートル","1メートル"]
					},
					{
						"area":{"name":"西部","code":"140020"},
						"weatherCodes":["111","210","201"],
						"weathers":["晴れ 夜 くもり","くもり 昼前 から 時々 晴れ","くもり 時々 晴れ"],
						"winds":["東の風 後 南の風","南の風 海上 では 南西の風 やや強く","北西の風 後 南の風"],
						"waves":["1.5メートル 後 1メートル うねり を伴う","1メートル 後 1.5メートル","1メートル"]
					}
				]
			},

			{	★降水確率
				"timeDefines":["2022-04-05T18:00:00+09:00","2022-04-06T00:00:00+09:00","2022-04-06T06:00:00+09:00","2022-04-06T12:00:00+09:00","2022-04-06T18:00:00+09:00"],
				"areas":[
					{
						"area":{"name":"東部","code":"140010"},
						"pops":["10","10","10","0","10"]
					},
					{
						"area":{"name":"西部","code":"140020"},
						"pops":["10","10","10","0","10"]
					}
				]
			},

			{	★最低気温・最高気温
				"timeDefines":["2022-04-06T00:00:00+09:00","2022-04-06T09:00:00+09:00"],
				"areas":[
					{
						"area":{"name":"横浜","code":"46106"},
						"temps":["11","20"]
					},
					{
						"area":{"name":"小田原","code":"46166"},
						"temps":["10","22"]
					}
				]
			}
		]
	},

	{
		"publishingOffice":"横浜地方気象台",
		"reportDatetime":"2022-04-05T17:00:00+09:00",
 		"timeSeries":[
			{	★週間予報
				"timeDefines":["2022-04-06T00:00:00+09:00","2022-04-07T00:00:00+09:00","2022-04-08T00:00:00+09:00","2022-04-09T00:00:00+09:00","2022-04-10T00:00:00+09:00","2022-04-11T00:00:00+09:00","2022-04-12T00:00:00+09:00"],
				"areas":[
					 {
						"area":{"name":"神奈川県","code":"140000"},
						"weatherCodes":["210","201","101","101","101","101","200"],	★天気アイコン
						"pops":["","20","20","20","20","20","40"],	★降水確率
						"reliabilities":["","","A","A","A","A","C"]	★信頼度
					}
				]
			},

			{	★週間予報(気温)
				"timeDefines":["2022-04-06T00:00:00+09:00","2022-04-07T00:00:00+09:00","2022-04-08T00:00:00+09:00","2022-04-09T00:00:00+09:00","2022-04-10T00:00:00+09:00","2022-04-11T00:00:00+09:00","2022-04-12T00:00:00+09:00"],
  				"areas":[
					{
						"area":{"name":"横浜","code":"46106"},
  						"tempsMin":["","11","11","11","11","13","14"],
						"tempsMinUpper":["","12","12","13","13","14","15"],
						"tempsMinLower":["","9","9","9","10","9","12"],
						"tempsMax":["","18","20","22","23","22","20"],
						"tempsMaxUpper":["","21","23","24","26","24","24"],
						"tempsMaxLower":["","17","18","20","21","18","18"]
					}
				]
			}
		],
		"tempAverage":
			{	★7日間平均
				"areas":[
					{	★気温
						"area":{"name":"横浜","code":"46106"},
						"min":"9.6",
						"max":"17.9"
					}
				]
			},
		"precipAverage":
			{
				"areas":
					[
						{
							"area":{"name":"横浜","code":"46106"},
							"min":"14.1",
							"max":"41.6"
						}
					]
			}
	}
]


JSONデータの読み込み

JSONデータの読み込みに ArduinoJsonライブラリを利用します。
ArduinoIDEのライブラリ管理から ArduinoIDE by Benoit Blanchon をインストールします。


WeatherCodeとアイコン

WeatherCodeと天気(アイコン含む)の対応は 気象庁JSON ファイルにある weatherCode 一覧 でみることが出来ます。
WeatherCodeの数は多いですが、使用されているアイコンの数はそれほどでもありません。
個々のアイコンは https://www.jma.go.jp/bosai/forecast/img/{アイコン番号}.svg にアクセスすれば表示する事ができます。
表示したアイコンを比較すると、5種類3サイズのアイコンと、2種類のアイコン、1種類の矢印の組み合わせで全てのアイコンを作る事が出来るのが分かります。

このように作れば、後はアイコン番号に合わせて、重ね合わせて表示すれば、全てのアイコンを表現できます。

※気象庁の天気予報で使用しているアイコンはライセンスが明記されていないので、使用する事ができません。
なので、劣化コピーですが、似た種類のアイコンを作ってみました。


ガジェットの立体配線図


SPIのCSとMISOは省略
CSはSSD1331のRSTに使用
MISOは入力専用ピンなので出力には使えません。
DHT-11のプルアップ抵抗は4.7KΩを使用

スケッチの構造


 起動時の初期後にNTPサーバから時刻を取得してRTCに設定

loop( )
 1分毎に温湿度を取得して表示

 毎時00分にOpwnWatherMapから天気予報を取得

 3時間ごとの天気をアイコン表示


ソースコード

JMA-WatherData.ino に記載記述している ssidとssid はお使いのWi-Fi環境に合わせて変更してください。
JMA.cpp の AreaCode はお住いの地域に合わせたコードに変更してください。

JMA-Weather.zip


解説動画