こんにちは、なりかくんです。
夏ですねっ!!夏の自由工作をしていこうと思います。
作ったもの
まず最初に最終的に何を作ったのかを簡単に説明します。
Rasberry Pi Pico Wで、自宅内に置いてあるSwitchBot 温湿度計の計3台の温度と湿度をSwitchBot APIを通じて取得し、液晶ディスプレイに情報をまとめて表示するというものです。
作った経緯
作った経緯としては、筆者の家には猫を飼っているのですが猫はよく2階で寝ていて、筆者の作業場所が1階のため、猫の温度環境管理のためにSwitchBotを設置しています。
ですが、SwitchBotの温度を確認するには通常、スマホのロックを解除して、SwitchBotのアプリを開いて確認すると少し工程が多いです。
※常にエアコンをつけろと言われるかもしれないですが、電気代を察してください。お金がありません(´;ω;`)
これを何とかしたいと思い、
「Raspberry Piとディスプレイで作業場所から常に温度を確認できるようにすればいいのでは?」
という結果にたどり着きました。
購入したもの
今回は、Rasberry Piの中でも一番安くてWiFiも載っている、はんだ付けもめんどくさいという事から「Raspberry Pi Pico WH」という「Raspberry Pi Pico」に無線通信モジュールを搭載されており、さらにピンヘッダーも最初からついているものを選びました。
私が購入した2023年7月12日現在では、1,380円で購入しました。
https://www.marutsu.co.jp/pc/i/2737056/
また、液晶ディスプレイも欲しいという事でRaspberry Pi Pico Wをそのまま差し込めるという2.8インチタッチディスプレイ「WAVESHARE-19804」を購入しました。
私が購入した2023年7月12日現在では、2,240円で購入しました。
https://www.marutsu.co.jp/pc/i/2229759/
最初はタッチでエアコン操作を行えるようにしようと考えていたのですが、SwitchBotとエアコンのリモコンの同期が出来ないため、今回は無しになりました。タッチ機能は未使用なので今思えばタッチ機能が無いもう少し安いディスプレイでもよかったと後悔しています。
今回、マルツオンラインという電子部品や半導体パーツを扱っているオンライン通販で購入したのですが、注文してから1日という速さで届きました。Amazonかよって思いました。
(また、3,300円以上購入していたので送料も無料)
組み立てる
実際に届いたのがこちらです。まあ写真では伝わりにくいかもしれないですが、iPhone 12の2/5ぐらいの大きさです。
組み立て自体は、簡単で差し込むだけです(笑)
これで組み立ては完了です。
コードを組み込む
では、実際にコードを書いて書き込んでみます。
Raspberry Pi Picoと接続する方法などは、省略します。今回は、MicroPythonを使ってプログラムを動かします。
IDEはThonnyを使います。ソースコードは、GitHubに公開しているのでこちらと一緒に見ていただければと思います。
https://github.com/narikakun/raspberrypi-pico-w-switchbot-waveshares-1980
まず最初に、Raspberry Pi Pico Wの醍醐味でもあるWiFiにつないでみたいと思います。
(最初はLチカだろ。とかいう意見は受け付けてないです。)
以下のコードがWiFiにつなげるコードです。
最初に躓いたところは、Raspberry Pi Pico WはデフォルトでWiFiがアイドル時などは省電力モードになり、問題があったため8行目で省電力モードを無効化するコードを追加しています。
次にディスプレイに文字を表示します。
今回は、今回購入したディスプレイ「WAVESHARE-19804」の公式ドキュメントでも使用されていた、GUIライブラリである「micropython-nano-gui」を使いました。
次にSwitchBot APIをMicroPythonで使えるようにします。
ここが一番めんどくさかったですね。SwitchBotのAPIには、v1.0とv1.1があるのですが、SwitchBot v1.0は簡単に使えるのですがv1.1がより安全に使えるようにと認証が少しややこしくなっています。
古いバージョンはいつ廃止されてもおかしくないので、しっかりと最新のv1.1を使おうということでめんどくさい道に進みました。
何がめんどくさいかというと署名を作成しないといけないというところですね。また、MicroPythonのため自分でライブラリを追加する必要があります。
以下がSwitchBotでデバイスステータスを取得するコードです。このほかに以下のライブラリをインストール(設置)する必要があります。
・hashlib ・hmac ・base64 (ネットで探せば見つかります。)
後、署名の際にタイムスタンプを使うのですがRaspberry Pi Pico Wが正しい時間を取得してくれるのか分からないので、NTPで時間を自動で合わせるようにします。
MicroPythonに標準でntptimeライブラリが入ってるので2行で実装できます。
詳しくは、ググってください。
これらを組み合わせて、main.pyが完成します。コードが汚いのは許してください。
https://github.com/narikakun/raspberrypi-pico-w-switchbot-waveshares-1980/blob/main/main.py
Raspberry Pi Picoは、RAMが256KBでフラッシュメモリが2MBなので、実際にコードを書くときはガベージコレクションを行う必要があるのが少し気を付けるポイントです。
(やらないとすぐメモリが無くなる。ガベージコレクション → 使わなくなったメモリを開放する機能)
実際に動かしてみる
実際に動かしてみると、このようになります。1つずつAPIを叩いて少しずつ情報を切り替えるようにしています。
これで完成です☆
最後に
実はRaspberry Pi PicoとMicroPythonを使うのはこれを制作したのが初めてです。
メモリ等が少しきつかったりしましたが、実際に動いたときはうれしいですね、これが電子工作の沼。。。
最後までお読みいただきありがとうございました!
す、すげぇや。