今回は、最初にプログラム全体の仕組みを検討して、プログラムの作成を始めます。今回の説明内容これからいよいよ天気情報と鉄道運行情報をLEDに表示するプログラムを作成していきますが、その前にプログラム全体をどのように作っていくか検討します。プログラムの作り方ですが、最初にプログラム全体の流れを検討します。その後は、必要な要素技術(例えばLEDの点滅やWebからの情報取得)を検証して、最後に1本のプログラムにまとめたいと思います。今回の説明内容は以下になります。プログラム全体の構成を検討これから詳細に検討する動作確認項目LEDの点滅制御方法の検討PHPでLED点滅制御プログラムを作成PythonでLED点滅制御プログラムを作成プログラム全体の構成を検討LEDの点滅制御方法を検討する前に、全体のプログラムで行う最低限の処理を考えてみます。LEDの点滅処理ですが、Webから取得した情報に対応した特定のパターンで点滅させることになります。点滅パターンをあらかじめ配列などに定義しておいて、取得した情報に応じたパターンを作成して、実際の点滅はそのパターンに従って点滅させる、という方法になると思います。だいたい以下のことができれば最低限の動作はできそうな気がします。「晴れ」とか「曇り」とかのLEDの点滅パターンを定義するWebから情報を取得するWebから取得した情報に応じてLEDの点滅パターンを生成する。「曇り」のパターンなど(3)のパターンに従ってLEDを点滅させる最低限、このぐらいができれば動作しそうです。これだけの情報ではちょっとイマイチですよね。上のプログラムを作っても、起動した時にWebから情報を取得してLEDを点滅させますので、その後は情報が更新されません。そのため天気予報の情報は1日に数回、定時更新する必要がありそうです。鉄道運行情報は、出かけるちょっと前の時点の情報を知りたいです。そのためスイッチが押されたら情報更新する機能も追加したいです。これらの追加機能は、最低限の機能を実装してから追加していく方針にしたいと思います。考えていくと課題なども出てきそうです。それらについてはチャレンジ課題として最後にまとめたいと思います。これから詳細に検討する動作確認項目これから何回かにわたって、最低限動作に必要な項目の確認をしていきたいと思います。一つはLEDの点滅制御、もう一つはWebから情報を取得して解析する方法です。これらができれば、あとは組み合わせて最低限の動作はできると思います。いうことで、今回はLEDの点滅制御方法の検討、次回はWebから情報を取得して解析する方法の検討をしたいと思います。LEDの点滅制御方法の検討それでは、LEDの点滅制御方法の検討を始めましょう。パターンはいろいろあると思いますが、とりあえず以下のように考えてみました。最初は一番簡単な、「今日は1日中晴れ」など、予報されている天気の種類が1種類の場合です。点滅させることも考えましたが、点滅は「晴れ時々曇り」などの「時々」の表現に使いたいと思いますので、1種類の天気の場合は、その天気のLEDを点灯させたままにしたいと思います。「晴れのち曇り」など「のち」の天気の場合この場合は、「晴れ」のLEDを1秒間点灯させたあとに「曇り」のLEDを1秒間点灯させる、というパターンにしたいと思います。2種類の天気の点灯をした後は、1秒間LEDを消灯させたいと思います。「晴れのち曇り」の場合は、1秒間「晴れ」を点灯、1秒間「曇り」を点灯、1秒間休み、という感じです。「時々」は点滅で表現したいと思います。点滅のパターンは、0.25秒刻みで、点灯、消灯の繰り返しにします。第1回の動画では、「晴れ時々曇り」のパターンは、「晴れ」1秒間点灯、次に「晴れ」を消灯してから「曇り」を0.25秒刻みで点滅させていました。「晴れ時々曇り」というのは「晴れ」が主体でその合間に雲が出る、という感じなので、「晴れ」は点灯させたまま「曇り」を点滅させる、というパターンにしてみようかと思います。これは出来上がりを見て必要があれば見直したいと思います。いうことで、天気の点滅パターンをまとめると以下のようになります。次にこのパターンをプログラム制御する方法を考えてみます。最小の時間単位は0.25秒ですので、すべて0.25秒単位で考えてみます。「晴れ時々曇り」の「時々曇り」の部分ですが、これは0.25秒刻みの点滅になります。上のパターンで、1秒消灯部分も0.25秒単位で表現できますよね。「1秒間の消灯」という代わりに「0.25秒間の4回分の消灯」と考えます。同様に1秒間点灯する場合は「0.25秒間4回分の点灯」と考えることができます。このように考えると、すべての点灯パターンが0.25秒刻みの点滅パターンで表現できることになります。LEDの点滅制御をまとめてみます。最初に以下のように基本パターンを用意しておきます。次にWebから天気予報の情報を取得します。取得した情報が「晴れ時々曇り」であれば、各LEDの点滅パターンは上の基本パターンを組み合わせて、以下のように構成します。これで各LEDの点滅パターンが用意できましたので、これに従ってLEDの点滅制御をすればOKそうです。このパターンの点滅制御は以下のように繰り返し処理で行います。1]などの配列(タプル/リスト)にして、それを組み合わせて、各LEDのパターン配列を生成、その配列を元に上のような制御をする、という方法で実装してみたいと思います。PHPでLED点滅制御プログラムを作成まずPHPでプログラムを作成してみます。先ほど説明したように、最初に基本パターンを配列で用意して、それらを天気予報のに応じてつなぎ合わせます。基本パターン、LEDの点滅パターンは連想配列に入れることにします。C言語など、比較的アセンブラに近い言語を使われている方は連想配列に慣れていないかもしれませんので、ここで簡単に説明しておきます。通常、配列の要素を指定する場合、数字で何番目かを指定します。ここで、具体例を考えてみます。した宣言して、price_list[0]にはリンゴ(フジ)の値段、price_list[1]には温州みかんの値段、などと代入していくとします。このようにすると品物が増えた場合とか管理が大変ですよね。このようなケースでは連想配列が有効です。連想配列とは、キーと値の組み合わせの形で格納する配列です。キーと値、と言ってもわかりづらいですので、実際に具体例を見てみましょう。組をカンマで区切って書きます。398,];“apple_fuji”というキーに対応する値は「138」というように文字列と値を対応付けます。順番は気にせずに、データベースのような形で配列に格納できるようになっています。次に連想配列から値を取り出す方法です。$price_list["apple_fuji"];と書きます。連想配列に入っているキーと値を全て取得したい場合や全て表示をしたい場合はどうすればいいでしょうか。連想配列が実装されているプログラミング言語であれば、全てを取得する命令が用意されています。使い方は似ていますので、PHPで説明します。以下のように連想配列にキーと値を格納した場合を考えます。498,];この場合、以下のように書くと、格納されているキーと値の組み合わせ数の分、「処理」を実行してくれます。{処理}なお、「処理」の部分では、毎回、キーが$itemに、値が$priceに格納されるので、$itemと$priceを使用して処理ができます。$priceの変数名は任意です。した場合は、キーが$keyに、値が$valueに格納されます。上の連想配列の例では、1回目は、$itemに”apple_fuji”、$priceに138、2回目は、$itemに”unshu_mikan”、$priceに398、3回目は、$itemに”hassaku”、$priceに498が入ります。LEDの基本パターンや、それらを組み合わせた各LEDのパターンは、この連想配列に入れることにします。キーにして格納することにします。テスト用ですので、予報が「晴れ時々曇り」の状態を示す制御をしてみます。以下のようにプログラムを作成してみました。解説が必要と思われるところをプログラムの後に説明します。0`;}?&gt;31行目ここでは例として「晴れ時々曇り」のパターンについて、各LEDの点滅パターンを連想配列$led_patに格納しますが、最初に念のため空にしておきます。空にするには要素数ゼロの配列を代入すればOKです。34行目$led_patに、”fine”をキーとして、晴れのパターンを格納します。格納、というのはすでにある連想配列$led_patに追加することになります。書くのが普通ですが、+=表記が可能ですので、この表記にしました。...)を使用します。引数の配列を連結した新しい配列が返り値になります。43行目まで処理が終わると、連想配列$led_patは以下のようになります。0],]47行目テストですので、点滅制御は3回分にしました。0])を一つ一つ処理していきます。関数で引数に配列を渡して要素数を数えます。上の図「点滅パターン制御方法(一部拡大)」の処理の通り、パターンの最初の値に従って各GPIOピンの出力を設定します。連想配列$gpio_ledの格納しているすべての要素に対して処理を行えばOKです。56行目LEDの出力設定が完了しましたので、0.25秒待ちます。上のプログラムと全く同じ考えで、Pythonのプログラムを作成してみました。必要と思われる箇所について、プログラムの後に説明します。GPIOリセットfinally:GPIO.cleanup()10行目PHPでは連想配列と呼んでいましたが、Pythonでは辞書と呼んでいます。普通の辞書って、見出語とその後に意味が書かれていますよね。これは、キーと値が書かれている、とも考えられます。いうことで、キーと値の集合を辞書と呼んでいるのだと思います。29行目GPIO.setup関数でGPIOピンの初期化をしますが、この関数に渡すピン番号配列の引数は、辞書gpioLedの値として格納されていますので、value()関数で取り出します。以上で、LEDの点滅制御の目処がつきました。