2019年7月18日木曜日

Arduino+74HC595+8×8nマトリクスLED(8.3)

3.RTC(Real Time Clock)がない

単純なうっかりで、ハードウェア的に時刻を保持する仕組みを作っていませんでした。
こういう場合にはRTCモジュールを使って、コイン電池でバックアップすると完璧らしいです。

しかしながら、WiFiを介してインターネットにつながるんだから、NTPで時刻取得しちゃえばいいじゃない、ということで以下のリンクを参考にNTPで取得した時刻を文字列にする関数をこさえました。

Arduinoで遊ぶページ -SimpleTime

数時間使用したときにどれくらいズレがあるのか、ということについては未確認です。基本的に時計的に常時使う感じではなくて、気が向いたときに起動する、外出するときは電源切る、という運用ですので、起動時にNTPから時刻が取得できれば気になるズレは生じません。スクロール表示する以上は必然的に表示時に秒レベルでずれてしまいます(^^;;
time.hをインクルードするとNTP周りの実装が使えるようになるのですが、先に挙げたリンクを読んだ限りでは、getLocalTime()の度にgetConfig()で指定したNTPサーバーにリクエストが飛ぶのか、といったあたりがよくわかりません。


Arduino にしても Arduino Core for ESP32 にしても何かやろうとしていることが明確なら、まず使えそうな標準ライブラリなり外部ライブラリを探すことから始めると効率が良いですね。ライブラリ自体に豊富なサンプルがついてきますし、多分作例もググれば誰か作って公開してくれているとおもいます(笑)

1.データどこから取得する?
2.データの取得と解析はどうする?
3.RTCないけどどうする <--- 今ここ

Arduino+74HC595+8×8nマトリクスLED(8.2)

2.駅別時刻表をHTTP経由で取得・解析する

マイコンのメモリは限られていますので、大規模な文字列解析はやらないほうがよさそうです。

そこで、LAN上にWEBサーバーを立ててCGIを利用することにしました。①公式サイトのデータ取得→時刻表データファイルを作成するスクリプトと、②時刻表データファイル→直近1列車を表示するスクリプトがあれば要件を満たせます。
スクリプトを分割したおかげで、それぞれの機能のみ考えればよいのでコーディングも楽になりました。時刻表のデータそのものの更新頻度はせいぜいダイヤ改正ごと、つまり長期に渡って更新されないので①については、都度手動で取得・整形する形でもなんとかなります。

ESP32からは②直近1列車表示スクリプトからHTTPでゲットする形なので、固定の形式で取得できることが保証され、名鉄公式サイトが大規模改修したとしてもESP32側の解析ロジックを書き直す必要がなくなります。

①・②とも20年くらい前に遊んでいたperlで書くことにしました。当時はperlのcgiでBBS作るの流行りましたね。perlで作る掲示板なんて本まで出版されたような記憶が。
とはいえ、ど忘れしていて別の言語で書いても良かったんではないかと後悔(^^;;
今時の動的htmlってどんな言語を使うのかしら?


Arduino+74HC595+8×8nマトリクスLED(8.1)

1.名鉄公式サイトにAPIが存在しない

駅すぱ〜とに代表される時刻(というより乗り換え)検索系サービスと公共交通機関が契約、そのサービスのAPIを利用して公式サイトを構成している様な雰囲気なので、当然お金が絡みます。APIがあるはずだけど先の理由で公開されていない、と判断しました。名鉄の場合は駅探というサービスが挟まっています。
法的にはグレーですが、商用利用ではなく個人で閉じた利用ですので大丈夫でしょう。


Arduino+74HC595+8×8nマトリクスLED(8.0)

電光掲示板もどきプロジェクトの状況です。

さんざん同じネタで引っ張っていますが、行側制御部の方式検討はひとまずおいておくとして、ソフトウェア側を作り込むことにしました。
またLEDマトリクスで遊び始めた頃より、WiFi経由で最寄り駅の直近の列車を表示したいという願望がありましたので、Arduino に追加する WiFiモジュールを検討していたところ、ESP32というマイコンといいますかWiFiチップといいますか、多機能なものがあり、Arduino IDEで開発できることからESP32 DevKitC を 秋月さんから入手して、こちらに移行してしまうことにしました。


ESP32 Devkit C での疑問点

 前回の投稿から放置状態にあった当ブログですが、再び何かしら作ろうということで、スマートコンセントもどきに取り組んでいます。 回路なども一応動作するものができたのですが、ブレッドボードから移行するために基板に用意しておいたピンソケットにESP32を取り付けたところ、なぜか動作しま...