注目キーワード

【Arduino】Raspberry Pi Pico W をArduinoでプログラミング!お天気情報を取得して表示する

すけろく
Raspberry Pi Pico Wをインターネットに
接続できたということは、
インターネット上のサービスを使えるということだな。
げんろく
うむ。
インターネット上の情報を取得することや、
データのアップロードなどができる。
すけろく
では、天気情報を取得することもできるのか?
げんろく
できるぞ!
今回は、インターネット上の天気情報サービスから
天気情報を取得して表示してみるか!
今回は記事では、「Raspberry Pi Pico W」をArduinoでプログラミングして、インターネット上の天気情報サービス「OpenWeather」から天気情報を取得してシリアルモニターに表示させてみます。
Raspberry Pi Pico W」を時刻同期することで、正確な時刻を元にデータ取得や、命令の実行を行うことができます。
この記事の前提となる「Raspberry Pi Pico W」のはじめかたについては、次の記事で紹介しています。
関連記事

すけろく ついに、国内でもRaspberry Pi Pico Wを手に入れたぞ! げんろく Wi-Fiモジュールがついているので、 国内の技適取得が必要だったからな。 すけろ[…]

記事内でご紹介する「Raspberry Pi Pico W」はこちら!

ピンヘッダ実装済み
created by Rinker
ノーブランド品
¥2,210 (2024/04/19 13:01:12時点 Amazon調べ-詳細)
ピンヘッダを自分ではんだ付けするもの
created by Rinker
Raspberrypi
¥1,650 (2024/04/20 04:28:42時点 Amazon調べ-詳細)

Arduino、C/C++、MicroPythonに対応している組み込み開発キットです。
正確なタイマ機能、温度センサーなどを備えたモデルです。ディスプレイ等がないため、消費電力を抑えた構成をとることができます。いろいろ遊べますよ~

今回の目標

今回は、インターネット上のお天気情報サービスである「OpenWeather」から、住んでいる場所の現在の天気を取得して、シリアルモニターに出力します。

全体の構成

全体の構成は次のようになります。

処理の流れ

プログラム内での処理の流れは次の通りです

  1. Wi-Fiアクセスポイントへの接続
  2. 時刻同期する
  3. OpenWeatherへアクセスする際のURLを生成
  4. OpenWeatherへ接続しJSON形式データを取得
  5. JSON形式データから対象の値を取得
  6. シリアルモニターに出力

お天気情報サービス「OpenWeather」って何?

OpenWeather」は、気象データの操作をより簡単にする、認知度の高い気象サービスを提供しています。

メリットとしては、次のように紹介されています。

私たちは24時間体制で何百万もの開発者と協力しており、これらのメリットは、複雑なエンタープライズシステムに至るまで、ほとんどのアプリケーションに適していると考えています。

すぐに使える気象製品のスペクトル

短期および長期の予測、歴史および観察

地球上の任意の場所

透明性のある価格設定とライセンス

当社の気象製品は、業界標準に準拠し、さまざまな種類のエンタープライズシステムと互換性のある高速で信頼性の高いAPIを介してアクセスできます。当社のすべての製品は、あらゆる場所に不可欠な気候変数を含んでいます。それに加えて、気象条件の影響を受ける産業に役立ついくつかの特別な製品があります。それらの中には、道路リスクと全国気象警報があります。

ー引用ー(https://openweathermap.org/guide)

簡単に言うと、「さまざまなシステムで利用できるように気象情報を提供するAPIを提供していますよ~」という感じです。

「API」とは、「Application Programming Interface」の頭文字です。簡単に言うと、「アプリケーションをプログラミングするためのインターフェース」です。インターフェイスとは、コンピュータ用語でいうと、「何か」と「何か」をつなぐものという意味を持ちます。ですので、プログラムとアプリケーション(ソフトウェア)をつなぐものを意味します。

今回使うOpenWeatherのAPIは、プログラムからOpenWeatherサービスに問い合わせを行いデータ取得をするインターフェイスとなります。

OpenWeatherを使う

では、「OpenWeather」を使ってみましょう。

以下に「OpenWeather」のサイトへのリンクを張っておきます。こちらからアクセスしてください。

OpenWeatherのサイトはこちら

アクセスすると次のような画面が表示されます。

APIキーを取得する

OpenWeather」でAPIを利用するためには、APIキーというものを発行する必要があります。

取得するためには、次の作業を行う必要があります。

  1. アカウントの作成
  2. APIキーの取得
ここで取得したAPIキーは、プログラムから「OpenWeather」へアクセスしてデータを取得する際に使います。
2022年5月時点で、アカウント利用プランは5つ(Free、Startup、Developer、Professional、Enterprise)あります。
プランは、月にどのくらい「OpenWeather」のサービスにアクセスするか、取得できる気象情報の条件(例えば何日後まで予報を取得できるか)によって変わります。
今回は個人利用を想定して「Free」プランを使用します。
アカウントを作成すると初めは「Free」プランに設定されるようです。

 アカウントの作成

所要時間:5分程度


サイトの右上にある「Sign In」をクリックします。


サインイン画面上で「Create an Account」をクリックします。


UserName、Emailアドレス、パスワードを入力し、年齢確認などチェックしたら「Create Account」をクリックします。
No Image


設定したEmailアドレスにメールが来るので有効化します。

以上で、アカウント作成の作業は完了です。

 APIキーの取得

所要時間:2分程度


サイトの右上にある「Sign In」をクリックして、作成したユーザーでログインします。


「API Keys」をクリックすると画面にKeyが表示されますので、赤線の部分をコピーします。
以上で、APIキーの取得は完了です。

東京の天気を取得してみる

取得したAPIキーを使用して、東京の現在の天気を取得してみます。

東京の緯度(lat:35.6828387)と経度(lon:139.7594549)を指定して天気を取得します。

 現在の天気を取得するためのAPIコマンドを作ります。
{API Key}の部分を、先ほど取得したAPIキーに差し替えてください。

https://api.openweathermap.org/data/2.5/weather?lat=35.6828387&lon=139.7594549&units=metric&lang=ja&appid={API Key}

 ブラウザ(ChromeやEdgeなど)を開き、先ほど作ったAPIコマンドをURL入力部分に入力し、Enterキーを押します。

 以下のようなJSON形式データが返ってくれば成功です。(天気なので、毎回データは変わります)

取得したJSON形式データを見てみる

では、「OpenWeather」から取得したJSON形式データを見てみましょう。

 データの特徴

OpenWeather」のデータは次の特徴があります。

  • 気象条件によりデータがない場合がある(「データの詳細説明」の赤字部分
  • 時刻はUTC基準の時刻になる
  • 温度はデフォルトではケルビン(0K=-273.15℃)で計算する
    ※リクエストに&units=metricを追加することで摂氏(℃)で取得することが可能
    (例:294.47Kの場合、294.47-273.15=21.32℃)
  • リクエストに&lang=jaを追加することで、天気説明などが日本語化される

※マイコン側で確保するメモリは、気象条件や地点によるデータ値の変動と、赤字部分の要素増減を含めて考慮する必要があります。

 データの詳細説明

データの各要素と値は次の通りです。

要素名 説明
coord “lon”:139.7595,
“lat”:35.6828
経度
緯度
weather  “id”:803,
“main”:”Clouds”,
“description”:”曇りがち”,
“icon”:”04d”
気象条件ID
気象パラメータのグループ(雨、雪、極端など)
指定言語による説明
天気アイコンのID
base “stations” 内部パラメータ
main  “temp”:14.95,
“feels_like”:14.8,
“temp_min”:13.84,
“temp_max”:15.98,
“pressure”:1019,
“humidity”:47
“sea_level”:
“grnd_level”:
温度(単位:摂氏℃)
体感温度(単位:摂氏℃)
温度:最低(単位:摂氏℃)
温度:最高(単位:摂氏℃)
大気圧(単位:hPa)
湿度(%)
海面の大気圧(単位:hPa)
地上の大気圧(単位:hPa)
visibility 10000 視界(最大10㎞)
wind “speed”:3.09,
“deg”:140
”wind.gust”:
風速(単位:m/s)
風向(度)
突風(単位m/s)
clouds “all”:75 曇り(単位%)
rain “rain.1h”
“rain.3h”
降雨量(過去1時間当たり)(単位㎜)
降雨量(過去3時間当たり)(単位㎜)
snow “snow.1h”
“snow.3h”
降雪量(過去1時間当たり)(単位㎜)
降雪量(過去3時間当たり)(単位㎜)
dt 1652243110 データ計算時刻:UNIX(UTC)
sys “type”:1,
“id”:8077,
“message”:
“country”:”JP”,
“sunrise”:1652211585,
“sunset”:1652261701
内部パラメータ
内部パラメータ
内部パラメータ
国コード(JPは日本)
日の出時刻:UNIX(UTC)
日の入り時刻:UNIX(UTC)
timezone 32400, UTCから秒単位でシフトする
※日本時間(+9時間)を秒に直すと32400s
id 1861060 都市ID
name “日本” 国名か都市名
cod 200 内部パラメータ

JSONを扱う際のメモリサイズを計算する

取得したJSON形式データを扱うためのメモリサイズを計算します。

計算には、過去記事でご紹介したArduinoのAssistantを使います。

ArduinoJson

The ArduinoJson Assistant is an online tool that computes th…

メモリの計算方法は、次の記事で紹介しています。

関連記事

すけろく Raspberry Pi Pico Wをインターネットに接続できたが インターネット上のサービスと連携させたいな。 げんろく それなら、インターネット上のサービスから データを取得する際に[…]

計算した結果、1024が妥当な感じですが、今回は倍の「2048」を、Arduino IDEで指定し、メモリを確保します。

Raspberry Pi Pico Wで現在の天気を表示してみよう

それでは、実際にプログラミングしてみましょう。

前述した、「OpenWeather」にhttpsリクエストを発行し、JSON形式のデータを取得します。

取得したJSONデータから天気情報を抜き出し、「Raspberry Pi Pico W」からシリアルモニタに情報を表示させてみます。

OpenWeatherのルート証明書を取得する

OpenWeather」へのリクエストはhttpsなのでルート証明書をプログラム内に含める必要があります。

ルート証明書の取得方法は、次の記事で紹介しています。

関連記事

すけろく 普段、何気なくブラウザでインターネットサイトを 見ているが、URLの最初のHttpsとはなんだ? げんろく httpsはHttpの通信を暗号化して行うものだ。 ちょっと違いを押さえてみるか[…]

ライブラリを追加する

今回使うため、次のライブラリをインストールします。

使用する情報 設定値(バージョン)
ライブラリ名 ArduinoJSON (6.21.1)

ライブラリのインストール手順については、次の記事を参考にしてください!

関連記事

「Arduino IDE」では、使用する機能やセンサー、ボードを使用するプログラムで使用できる有効なライブラリが公開されています。 ライブラリを使用すると、効率的かつ品質を確保したプログラミングが可能です。 この記事では、Ar[…]

現在の天気情報表示プログラム

Arduino IDEを起動して、「ファイル」メニューから「新規ファイル」を選択し、表示されるスケッチに以下のように記述します。

「OpenWeatherのAPIキー」、「OpenWeatherのルート証明書」は、プログラム内の次の部分で定義しています。
ご自分の環境に合わせて値を修正してください。
(スケッチ例では、「”Please correct it to the value that suits your environment.”」と記載しています。)

項目名 プログラム内の定義名(変数名)
OpenWeatherのAPIキー
const String Api_KEY
OpenWeatherのルート証明書
const char* ow_rootca

 Arduino IDE スケッチ例

Raspberry Pi Pico Wへの書き込み

2回目以降

  1.  Raspberry Pi PicoをパソコンにUSB接続します。
  2.  Arduino IDEで前述のプログラムを記載して、 「ファイル」メニューから「名前を付けて保存」で任意の名前を付けて保存します。
  3. 「ツール」メニューから「ボード」情報を確認し、次のものを選択します。
    「Raspberry Pi Pico/RP2040」-「Raspberry Pi Pico W」
  4. 「シリアルポート」にマイコンを接続したCOMポートが指定されているかも確認します。
  5. 「ツール」メニューから「シリアルモニタ」を選択してシリアルモニタを起動します。(転送速度は「9600」です)
  6. 「スケッチ」メニューから「マイコンボードに書き込む」を選択します。

プログラム実行結果

シリアルモニタ上に以下の通り表示されれば成功です。

Arduino IDE 2.xのシリアルモニタであれば、日本語も表示できるようですね!

Connecting to yourssid

WiFi connected
IP address: 
192.xxx.xxx.xxx
Current time: 2023-04-04 10:26:00
https://api.openweathermap.org/data/2.5/weather?lat=35.6828&lon=139.759&units=metric&lang=ja&appid=xxxxxxxxxxxxxxxxxxxxxxxxx
[HTTPS] begin...
[HTTPS] GET...
[HTTPS] GET... code: 200
{"coord":{"lon":139.7595,"lat":35.6828},"weather":[{"id":800,"main":"Clear","description":"晴天","icon":"01d"}],"base":"stations","main":{"temp":16.11,"feels_like":15.03,"temp_min":14.98,"temp_max":16.74,"pressure":1026,"humidity":48},"visibility":10000,"wind":{"speed":3.6,"deg":70},"clouds":{"all":0},"dt":1680571032,"sys":{"type":2,"id":268395,"country":"JP","sunrise":1680553454,"sunset":1680599026},"timezone":32400,"id":1857654,"name":"東京都千代田区丸の内","cod":200}
天気ID: 800
天気概況: 晴天
気温: 16.11
気圧: 1026.00
湿度: 48.00
Disconnect from WiFi

WiFi disconnected

 編集後記

今回は、「OpenWeather」というインターネット上のお天気情報サービスから、天気情報をJSON形式データとして受け取りました。

そして、JSON形式データから、必要な情報を取り出し、シリアルモニタに表示することができました。

これで、インターネット上のサービスと連携した、「Raspberry Pi Pico W」のプログラムの基礎が完成しましたね。

Raspberry Pi Pico W」のプログラミングといえば、「microPython」と考えていましたが、Arduino IDEでプログラムできるとうれしいです。

これで、他のマイコンと同じArduino IDEで開発できます!

Raspberry Pi Pico W」と同じRP2040というチップを搭載している機器にも使えるので応用ができそうです。

今回の記事は以上になります。

最後までご覧いただき、ありがとうございました。

記事内でご紹介した「Raspberry Pi Pico W」はこちら!

ピンヘッダ実装済み
created by Rinker
ノーブランド品
¥2,210 (2024/04/19 13:01:12時点 Amazon調べ-詳細)
ピンヘッダを自分ではんだ付けするもの
created by Rinker
Raspberrypi
¥1,650 (2024/04/20 04:28:42時点 Amazon調べ-詳細)

Arduino、C/C++、MicroPythonに対応している組み込み開発キットです。
正確なタイマ機能、温度センサーなどを備えたモデルです。ディスプレイ等がないため、消費電力を抑えた構成をとることができます。いろいろ遊べますよ~

Raspberry Pi Pico Wの他の記事はこちらからどうぞ!

すけろく うーむ。 どうしたものか。 げんろく どうした。 暗い顔をして。 すけろく カーモデルのウィンカー点滅を再現したくてな。 明滅回路を作ろうか悩んでおる。 げんろく ん!? そんなときは、メインプロセッサと切り離して 動作するPIOの出番ではないのか! この記事では、「Raspberry Pi  Pico/W」に実装されている「PIO(Programmable I/O」を実際に使ってみます […]

すけろく Raspberry Pi Pico/WのPIO機能を使ってUARTの送信には成功した。 しかし、まだ受信側ができていないのぉ。 げんろく そうだな。 今度は受信側を試してみるか。 すけろく どうせなら、パソコンから送った文字を返すような やり取りができるといいな。 げんろく よし。 UART送受信を実装してみよう。 この記事では、「Raspberry Pi  Pico/W」に実装されてい […]

すけろく Raspberry Pi Pico/WのPIO機能については前回調べた。 今度は実際に使ってみたいの~ げんろく そうだな。 実際にプログラムする際の注意事項などを見ていこう。 すけろく Arduino IDEでも使用できるのか? げんろく ああ。 使えるぞ! Arduino IDEで使う場合を例にやっていこう。 この記事では、「Raspberry Pi  Pico/W」に実装されている […]

すけろく Raspberry Pi Pico/Wには、PIOという機能があるらしいな。 げんろく そうだ。 UARTなどのインタフェース不足や、実装されていない機能を GPIOに対してプログラムできる機能だ。 すけろく Raspberry Pi Pico/Wをもっと知るために PIOを調べてみたい。 げんろく よし! PIOについて少し調べてみるか! この記事では、「Raspberry Pi  P […]

すけろく うーむ。 げんろく どうした浮かない顔して。 すけろく これまで、Raspberry Pi Pico / Wをいろいろ確認してきたが 外付けのボタンの認識ってやったかぇ? げんろく たしかに!まだ取り上げていない基本的なものがあるな よし、今回はボタン押下時の状態を Raspberry Pi Pico / Wで認識してみよう。 この記事では、「Raspberry Pi  Pico W」を […]

すけろく 宅内で使っているリモコンは、どういった仕組みで テレビなどをつけているのかな~? げんろく 赤外線を使って信号を送っているのだ。 すけろく しかし、たくさんある機器のリモコンが混信しないのは どういった仕組みなのかぇ? げんろく よし、今回は赤外線リモコンの通信を 調査してみるか! この記事では、「Raspberry Pi  Pico W」を使って、「赤外線リモコンの通信内容を分析する」 […]

すけろく うーむ。 対応付けが難しいな。 げんろく どうした? Raspberry Pi Picoで悩んでいるようだな。 すけろく Raspberry Pi PicoやPico Wの GPIOピンの情報がボード上にプリント されていないから資料との対応付けがやりづらくてな。 げんろく そうか。そういう課題があるのだな。 よし、解決するグッツを作って提供してみよう! 皆さんは、「Raspberry […]

すけろく うーむ。 モーターを毎回同じくらい回転させることはできんのかな。 げんろく DCモーターや、サーボモーターだと、 回転量を正確に制御することは難しいぞ。 すけろく では、何か解決策はあるのかぇ? げんろく ステッピングモーターというものがある。 モーターの回転をステップとして制御できる。 今回はこのあたりを動かしてみるか。 この記事では、「Raspberry Pi  Pico W」を使っ […]

すけろく 以前の記事で、Raspberry Pi Pico Wを Picoprobe経由でデバッグすることができた。 しかし、シリアルの入出力がArduino IDEで 読み込めないのだ。 げんろく そうだな。 Raspberry Pi PicoやRaspberry Pi Pico Wでは、 シリアル出力用の「Serial.println」では、 Picoprobe経由で取得できない。 すけろく […]

すけろく ん~。 このエラーの時の変数の値が知りたいな~ げんろく どうした? プログラムがうまく動かないのか? すけろく そうなのだ。 Raspberry Pi Pico Wでもデバック機能が使えると いいのだが。。。 げんろく ちなみに、Arduino IDE 2.1.0 のデバッグ機能で Raspberry Pi Pico / Wのデバッグができるぞ! やっとできたプログラムを動かしてみると […]