Arduino(ESP32) + BME280 + grafana

前回のPostでは、Raspberry Pi を使いBME280(測定器)からのデータを、別ノードにあるMySQLへ蓄積。蓄積したデータをGraganaで可視化するところまでを行いました。

構築後しばらく運用を続けていると、BME280からデータを受け取るだけの為に、Raspberry Piを利用するといのは、いささかオーバースペックではないか?と感じるようになってきました。

なにより電源を切るのにshutdownする必要があるというのが、結構面倒くさいポイントなのです。

部屋に昔買ったESP32という、Wi-Fi が搭載された低消費電力なマイクロプロセッサが転がっていました。普及している Arduino の開発環境を利用してプログラムを書き込めたりと触っていて楽しいおもちゃです。Arduino も転がっていましたが、こちらは、そのままでは Wi-Fi を使えないので 今回の用途ではESP32がベストマッチなのです。

Raspberry Pi の代わりにESP32を使う

部屋に転がっていたのは、ESP32-DevKitC というもので、一番開発に使いやすい標準的なボードです。

昔、秋月で購入しました。ESP32-DevKitC 4MB  メモリ8M版の価格があまり変わらないので、いろいろ実験したい方はそっちのが良いかもです。

この DevKitは横幅が割と広くて中国製の安い小さなブレッドボードに刺すと横幅が目一杯で使いにくいんですよね。このサンハヤトのブレッドボードなら、1列余裕ができるので各種信号を引き出しやすいのです。ESP32で遊ぶ方は一枚持っていると良いかも。

さて、先の記事で Raspberry Pi が担っていた仕事をESP32にさせられるかどうか軽く調べてみるとなんの問題も無さそうです。

サーバ側の仕組みは変わりませんので新しく調整するのは、ESP32から先だけになります。

スイッチサイエンスのサンプルを変更

Switch Scienceのリポジトリにあるサンプルコードをベースに、Wi-Fi に接続するコードとWebServerを立ち上げ、測定値を返すコードを追加していきます。

Wi-Fiのセットアップ

エラー処理が甘過ぎかもですが、SSIDとパスフレーズをWiFi.begin()へ渡すだけです。IPアドレスはDHCPで取得がデフォルトの動作です。

AsyncWebServerのセットアップ

GETメソッドで / へリクエストが届いたら、readBME280() をコールして返値をString型に変換し返します。

測定値読み出し部分の変更

サンプルコードでは定期的に測定値を読み出す為に loop() 内で読み出しを行っていましたが、今回はAsyncWebServerから呼び出されてから測定値を読み込みます。

loop()内のコードを、AsyncWebServerからコールされる関数内に移動します。

ごく希にセンサーからの数値が異常な値が返る事がありましたので、数値チェックをして、異常値だった場合に再取得するようなコードを入れました。

パッチファイル

サンプルファイルからの差分です。

Raspberry Pi と交換

かなりコンパクトになりました。しかしジャンパーが美しくないです。突然の電源OFFも問題なし。リセットボタンを押してから復帰まで5秒もかかりません。この状態で2,3日動かして問題がなかったのでユニバーサル基板に換えてみました。

すっきり!!!

最初のRaspberry Pi の半分以下の面積です。

軽いので、壁にぶら下げるのも簡単です 🙂

データの取得先をRaspberry PiのIPアドレスからESP32のIPアドレスへ書き換えるだけで、サーバ側の変更は完了です。

最初にセンサー側で複雑なことはさせないという設計方針は間違っていなかったようです。

BME280センサーモジュールを購入してから、かなりの期間放置してました。というのは、その時に浸かったジャンパーが接触不良でI2C通信が不安定で、その原因がよくわからなかったんです。

面倒くさがらずにさっさとオシロをつないでI2C信号を見ればよかった・・・

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)