MachiKania

MachiKania type P ver 1.3 に、天気予報を喋らせる

2023年10月1日

MachiKania type P の ver 1.3 では、Raspberry Pi Pico W を使って、インターネットから情報を取ってくることが可能です。

作例として、天気予報の情報サイトからデーターを取ってきて、今日と明日の天気予報を得るような物を作ってみました。NTPから今日の日付も取ってこられるので、その情報も使います。今日の日付と天気予報は、画面に表示させるのではなくスピーカーで話させるようにしてみました。完成写真は、以下の通りです。小さな箱に、電源スイッチとスピーカーが取り付けられたものです。

2023-09-26-weatherBox.jpg

どんなものか

まずは、どんな動作をするのかの参考に、twitter.com に実行中の動画を載せましたので、ご覧ください(下の画像をクリックすると、twitter.comの該当ポストに移動します;音が出ます)。

2023-09-30-twitter.com.jpg

スイッチを入れておよそ10秒待つと、まず今日の日付と曜日、次に今日の天気予報と最高気温、続けて明日の天気予報と最低気温、最高気温を音声で知らせてくれます。紹介したものは英語のバージョンですが、日本語のバージョンも用意してあります。

箱の中身と、回路

箱の中は、こんな感じです。写真上は、電池・スピーカー・電源スイッチ。下は、Raspberry Pi Pico W。その左にあるDIP-8の石はアンプ IC (NJM2113D)です。

2023-09-30-inside1.jpg

別の角度からです。手前に見えるのは、micro-SDです。アダプターを、基板に半田付けしてあります。

2023-09-30-inside2.jpg

回路図は、下の通りです(クリックで、拡大)。Raspberry Pi Pico Wには、他にMachiKania の基本構成の通り、SDカードを接続しています。液晶ディスプレイは使用しないので、接続していません。

2023-09-30-schematic.png

プログラム

プログラムは、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.recfor.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」ディレクトリーに配置してあります。

コメント

コメントはありません

コメント送信