MachiKania type P ver 1.3 に、天気予報を喋らせる
2023年10月1日
MachiKania type P の ver 1.3 では、Raspberry Pi Pico W を使って、インターネットから情報を取ってくることが可能です。
作例として、天気予報の情報サイトからデーターを取ってきて、今日と明日の天気予報を得るような物を作ってみました。NTPから今日の日付も取ってこられるので、その情報も使います。今日の日付と天気予報は、画面に表示させるのではなくスピーカーで話させるようにしてみました。完成写真は、以下の通りです。小さな箱に、電源スイッチとスピーカーが取り付けられたものです。
どんなものか
まずは、どんな動作をするのかの参考に、twitter.com に実行中の動画を載せましたので、ご覧ください(下の画像をクリックすると、twitter.comの該当ポストに移動します;音が出ます)。
スイッチを入れておよそ10秒待つと、まず今日の日付と曜日、次に今日の天気予報と最高気温、続けて明日の天気予報と最低気温、最高気温を音声で知らせてくれます。紹介したものは英語のバージョンですが、日本語のバージョンも用意してあります。
箱の中身と、回路
箱の中は、こんな感じです。写真上は、電池・スピーカー・電源スイッチ。下は、Raspberry Pi Pico W。その左にあるDIP-8の石はアンプ IC (NJM2113D)です。
別の角度からです。手前に見えるのは、micro-SDです。アダプターを、基板に半田付けしてあります。
回路図は、下の通りです(クリックで、拡大)。Raspberry Pi Pico Wには、他にMachiKania の基本構成の通り、SDカードを接続しています。液晶ディスプレイは使用しないので、接続していません。
プログラム
プログラムは、MachiKania BASIC で書かれており、「MACHIKAP.BAS」のファイル名で保存してあります。
天気予報は、AccuWeather から得ています。上のコードの URL の所で「[AccuWeather API key]」は、私の個人用のAPIキーです。AccuWeatherは、登録すれば無料で使えますので、必要ならば登録して API key を取得してください。また「332097」は、私が住んでいる町(カリフォルニア・デービス)の番号です。これを他の番号に変えれば、別の町の情報を得ることができます。
上のコードとほぼ同じものを、GitHubレポジトリーに上げましたので、参考にしてください(ENGLISH.BASがそれ)。
https://github.com/kmorimatsu/machikania-basic/tree/main/weather
URLは、"http://www.rad51.net/projects/weather/tokyo.php"としています。これを使用する分には、AccuWeatherのアカウントは必要ありません。ただし、東京限定です(osaka.phpも使えます)。
GitHubには、「TOKYO.BAS」「OSAKA.BAS」の2つのプログラムも載せてあります。こちらは、日本語で今日の日付・曜日・天気予報を喋るものです。それぞれ、東京・大阪の天気予報バージョンです。
JSONクラスについて
このプロジェクトでは、WGET クラス以外に JSON クラスを用いています。JSON クラスも、WGET と同様に、ver 1.3 でライブラリーに追加しました。JSON 文字列の中から、目的のものを抽出するのに便利です。詳しい使い方は、help.txtを参照してください。
ここでは、JSON クラスをどのように使っているかを説明します。まず、「o=new(JSON,j$)」で JSON オブジェクトを作成しています。「j$」は、web サイトから得られた JSON 文字列です。
続けて、「o.FQUERY#(".DailyForecasts[0].Temperature.Minimum.Value")」のように使っています。「FQUERY#()」は、浮動小数点実数値を読み込むためのメソッドです。「".DailyForecasts[0].Temperature.Minimum.Value"」の部分で、どの情報を読み出すかを指定しています。この例では、「DailyForecasts」をまず見つけ、これが配列なので「[0]」で配列の一番初めの内容を調べます。続けて「Temperature」「Minimum」「Value」順で追っています。「IQUERY()」「SQUERY$()」も同様で、それぞれ、整数値・文字列の内容を調べて読み込むためのメソッドです。
音声データーについて
発声する音声データーは、実行時にその都度作成するのではなく、予めすべての可能性について発声させたものを WAVE ファイルにして保存してあり、その中から選んで再生しています。英語のデーターは https://ttsreader.com/ から取得して、「wav」ディレクトリーに配置しました。日本語のデーターは https://note.cman.jp/other/voice/ から取得して「wavjp」ディレクトリーに配置してあります。
作例として、天気予報の情報サイトからデーターを取ってきて、今日と明日の天気予報を得るような物を作ってみました。NTPから今日の日付も取ってこられるので、その情報も使います。今日の日付と天気予報は、画面に表示させるのではなくスピーカーで話させるようにしてみました。完成写真は、以下の通りです。小さな箱に、電源スイッチとスピーカーが取り付けられたものです。
どんなものか
まずは、どんな動作をするのかの参考に、twitter.com に実行中の動画を載せましたので、ご覧ください(下の画像をクリックすると、twitter.comの該当ポストに移動します;音が出ます)。
スイッチを入れておよそ10秒待つと、まず今日の日付と曜日、次に今日の天気予報と最高気温、続けて明日の天気予報と最低気温、最高気温を音声で知らせてくれます。紹介したものは英語のバージョンですが、日本語のバージョンも用意してあります。
箱の中身と、回路
箱の中は、こんな感じです。写真上は、電池・スピーカー・電源スイッチ。下は、Raspberry Pi Pico W。その左にあるDIP-8の石はアンプ IC (NJM2113D)です。
別の角度からです。手前に見えるのは、micro-SDです。アダプターを、基板に半田付けしてあります。
回路図は、下の通りです(クリックで、拡大)。Raspberry Pi Pico Wには、他にMachiKania の基本構成の通り、SDカードを接続しています。液晶ディスプレイは使用しないので、接続していません。
プログラム
プログラムは、MachiKania BASIC で書かれており、「MACHIKAP.BAS」のファイル名で保存してあります。
useclass JSON,WGET usevar Min0,Max0,Fnum0,Fstr0 usevar Min1,Max1,Fnum1,Fstr1 out 6,1 if val(strftime$("%Y"))<2023 then ntp j$=WGET::FORSTRING$("https://dataservice.accuweather.com/forecasts/v1/daily/5day/332097?apikey=[AccuWeather API key]") o=new(JSON,j$) Min0=int(o.FQUERY#(".DailyForecasts[0].Temperature.Minimum.Value")+0.5) Max0=int(o.FQUERY#(".DailyForecasts[0].Temperature.Maximum.Value")+0.5) Fnum0=o.IQUERY(".DailyForecasts[0].Day.Icon") Fstr0$=o.SQUERY$(".DailyForecasts[0].Day.IconPhrase") Min1=int(o.FQUERY#(".DailyForecasts[1].Temperature.Minimum.Value")+0.5) Max1=int(o.FQUERY#(".DailyForecasts[1].Temperature.Maximum.Value")+0.5) Fnum1=o.IQUERY(".DailyForecasts[1].Day.Icon") Fstr1$=o.SQUERY$(".DailyForecasts[1].Day.IconPhrase") do c=coretimer() setdir "/wav" out 6,0 gosub pwaveb,"todayis1.wav" gosub pwaveb,"todayis2.wav" gosub pwaveb,"week"+strftime$("%a")+".wav" gosub pwaveb,"month"+dec$(val(strftime$("%m")))+".wav" gosub pwaveb,"day"+dec$(val(strftime$("%d")))+".wav" gosub pwaveb,"forecas1.wav" gosub pwaveb,"weath"+dec$(Fnum0)+".wav" gosub pwaveb,"temp1.wav" gosub pwaveb,dec$(Max0)+"deg.wav" gosub pwaveb,"forecas2.wav" gosub pwaveb,"weath"+dec$(Fnum1)+".wav" gosub pwaveb,"temp3.wav" gosub pwaveb,dec$(Min1)+"deg.wav" gosub pwaveb,"temp4.wav" gosub pwaveb,dec$(Max1)+"deg.wav" out 6,1 do until 60000000<coretimer()-c : idle :loop loop label pwaveb print args$(1); PLAYWAVE args$(1) print " ... "; do while playwave(0) idle loop print "done" return
天気予報は、AccuWeather から得ています。上のコードの URL の所で「[AccuWeather API key]」は、私の個人用のAPIキーです。AccuWeatherは、登録すれば無料で使えますので、必要ならば登録して API key を取得してください。また「332097」は、私が住んでいる町(カリフォルニア・デービス)の番号です。これを他の番号に変えれば、別の町の情報を得ることができます。
上のコードとほぼ同じものを、GitHubレポジトリーに上げましたので、参考にしてください(ENGLISH.BASがそれ)。
https://github.com/kmorimatsu/machikania-basic/tree/main/weather
URLは、"http://www.rad51.net/projects/weather/tokyo.php"としています。これを使用する分には、AccuWeatherのアカウントは必要ありません。ただし、東京限定です(osaka.phpも使えます)。
GitHubには、「TOKYO.BAS」「OSAKA.BAS」の2つのプログラムも載せてあります。こちらは、日本語で今日の日付・曜日・天気予報を喋るものです。それぞれ、東京・大阪の天気予報バージョンです。
JSONクラスについて
このプロジェクトでは、WGET クラス以外に JSON クラスを用いています。JSON クラスも、WGET と同様に、ver 1.3 でライブラリーに追加しました。JSON 文字列の中から、目的のものを抽出するのに便利です。詳しい使い方は、help.txtを参照してください。
ここでは、JSON クラスをどのように使っているかを説明します。まず、「o=new(JSON,j$)」で JSON オブジェクトを作成しています。「j$」は、web サイトから得られた JSON 文字列です。
続けて、「o.FQUERY#(".DailyForecasts[0].Temperature.Minimum.Value")」のように使っています。「FQUERY#()」は、浮動小数点実数値を読み込むためのメソッドです。「".DailyForecasts[0].Temperature.Minimum.Value"」の部分で、どの情報を読み出すかを指定しています。この例では、「DailyForecasts」をまず見つけ、これが配列なので「[0]」で配列の一番初めの内容を調べます。続けて「Temperature」「Minimum」「Value」順で追っています。「IQUERY()」「SQUERY$()」も同様で、それぞれ、整数値・文字列の内容を調べて読み込むためのメソッドです。
音声データーについて
発声する音声データーは、実行時にその都度作成するのではなく、予めすべての可能性について発声させたものを WAVE ファイルにして保存してあり、その中から選んで再生しています。英語のデーターは https://ttsreader.com/ から取得して、「wav」ディレクトリーに配置しました。日本語のデーターは https://note.cman.jp/other/voice/ から取得して「wavjp」ディレクトリーに配置してあります。