10日目です。今年のAdvent CalendarはPicoとCircuitPythonを擦りすぎな気がしていてアレ。
水温センサーもPicoとCircuitPythonで動かしてみる
先日Pimoroniから着弾したDS18B20の水温計型センサーは、なんとなく室内で飼育中の稚魚バケツで使いたいなあと思っているところですが、いつもどおりRaspberry Piでやるのもなんなので、これもPicoでやってみます。
DS18B20組み立て
DS18B20は水温計のかたちでも、4.7KΩの抵抗が必要です。そもそも、ケーブルの先端がワイヤーぶった切り状態なので、ピンヘッダなりピンソケットの取り付けも必要なので案外手間です。が、まあ見てなさい。こうじゃ!
ちくしょう!だいなしにしやがった!お前はいつもそうだ。お前はいつもうろ覚えでぶっつけ本番で作って失敗する。
誰もお前を愛さない。
正しい配線はこちらです。
あっ、こないだの有線LANを流用したろw
温度センサーだけつないで取得して終わるのは面白くないので、ネットワークと絡めたいです。先日遊んだW5500有線LANモジュールを片付けずに残してあったので、これにセンサーを付け足して、Zabbixにでも送りつけられるようにしてみましょう。
センサーを空いているGP6に配線しました。
いや、もっとだ……。適当なOLEDモジュールもぶっ刺して、IPアドレスと温度も見られるようにしよう。などと欲張った結果、ジャンパーケーブルが不足したので一本だけメチャクチャな配線ができてしまいましたが、まあいいでしょう。I2CのSDAとSCLをそれぞれGP4とGP5に配線しました。これでTiny2040のデジタル入出力GPIOは全部使い切りました。いいぞ。
というわけで、コード的にはこんな内容のものを作りました。
- ネットワーク接続
- 1-Wire初期化
- OLEDディスプレイ初期化
- IPアドレス表示
- 無限ループで
- 毎秒温度を取得
- Zabbixサーバーのアドレス変数にIPアドレスがあったら、60秒に1回温度のデータをZabbixに送りつける
- 温度をOLEDに表示
出来上がったコードはこちらです。先日のTOTP表示機もそうでしたが、ディスプレイ周りがコードの量をふくらませてしまう感じがあります。
Zabbixにデータを送りつけるコードは、以前PicoWirelessPackで送ったときのものが流用できると思っていたのですが、残念ながらあちらはMicroPythonかつPicoWirelessPackのライブラリでネットワーク通信をしていたので、socketライブラリを使って一部書き直しをしました。結果的には書き直したあとのが短くできました。どちらにせよ、MicroPythonとCircuitPythonの両方でZabbixにデータを送るやつができたのでヨシということで。
Zabbix側の設定
Zabbix側では、適当なホスト(スクリプトで「pico-w5500」と指定したのでそうする)を作り、作ったホストにZabbixトラッパータイプのアイテムを「ds18b20.temp」という名前で作っておきます。
あとはスクリプトを実行して、データが送られてくることを確認できればOKです。
まとめ
水温センサーのおかげで、前回作ったけど特に何もやらなかったW5500有線LANモジュールがそれっぽいことをする役立ちそうな物体に変身しました。たぶん。
CircuitPythonはAdafruitがかなり作り込んでくれているおかげで、何でもできるし何でもすでに用意されているので、サクサクやりたいことができてしまう。プログラミングと言うよりパズルっぽいレベル。本当にありがたいですね。
さて、実際に水温計を稚魚バケツに放り込んだ様子はこちらです。日中は20度あるっぽいですね。べランドにいる親の水槽と比べるとぬくぬくしてやがるな……(?)