※ソースコードとかは出てこないのでご容赦ください。
ラズパイ4×Pythonで部屋のCO2濃度とかがわかるセンサーを作ってGrafanaで表示させて喜んでたんですが、こんなことだけのために超高性能なラズパイ4を使ってることに疑問を感じ始めたところ、ESP32というArduino的な何かを教えてもらったので早速購入してみました。
ESP32の良いところは
- 安い!→本体1,500円~800円とか。
- 省エネ→0.5Wぐらいしか使ってない。ラズパイ4はアイドル3~4Wぐらい
- 電源ぶっこ抜いても大丈夫
- Wi-Fi付いてるので普通に家のWi-Fiにつなげられる
一方
- 言語がヤバい…C言語ってなに?
- 情報が少ない→使ってる人がラズパイより少ないのかあんま調べても出てこない。ただ英語読めれば大丈夫。
- IDEからシリアル通信でデータを送ってシリアル出力を読むのが基本。HD MIとかリッチなものはない。
- ルート証明書とかもちろん入ってないので簡単にTLSつなげない
的な感じで、ハードルは高まります。今回、爆安800円のやつとかもあったんですが、安心動作のEspressif純正のやつを購入してみました。日本語の説明書とか、シリアル通信用のドライバこっから落としてやみたいなTipsが書いてあるサイトへのリンクもついてたのですぐ使えました。ちょっと高いけど良かったです。おまけのLEDもついてたし。
温度計とCO2センサーをつないでみる
温度計とCO2センサーは前から使ってるこれらですね。CO2センサーは高いけど、高い方が精度は良いんじゃないかなーと思っています(比較対象がないのでわからない)。
#include <BME280I2C.h>
#include <MHZ19.h>
この2つのライブラリ使ったら読めました。簡単!ただ、MH-Z19はシリアル通信なんですが初期値115.2kbpsで通信しようとしたらエラー(っていうか値が返ってこない)が出てしまい、9600bpsに変更したら大丈夫でした。2時間ぐらいハマったけど。で、ディスプレイには #include <U8x8lib.h> を使って出力しました。4行表示にちょうどいいフォント探すのに難航したんですが、 u8x8_font_8x13B_1x2_r を使ったらいい感じに。
MySQLの接続でハマる
データは元から使ってたWordPress用のサーバへPythonからMySQL接続して送ってたんですが、ESP32は容易にTLS接続ができない上に、名前解決も上手くいかなくて(DNS Failedって言われる)IPアドレスでしか接続できないという事態が…というわけでサーバ側でデータをGETで受け取るAPIをPHPで作ってみました。GETのパラメータ読んできれいにしてMySQLへ投げるだけなんですぐです。自分用なのでアクセス制限した上で雑な感じで。 #include <HTTPClient.h> ってやつ使ったら容易にリクエストが作れたので値を入れて投げたら更新できました。
猫によるジャンパワイヤ噛みちぎられ事件の教訓を活かして既存の長さのワイヤだけで作ったらめちゃくちゃ大変でした…長さは自分で調節して綺麗にしてみようかな。
個人的にESP32使ってみて感じた最大のメリットは電源ぶっこ抜いて大丈夫なところですかねー。ラズパイって良くも悪くもパソコンなんで、そりゃディスプレイつなげたりルートストア最初から入ってるしで便利は便利ですけど、お気軽に電源切ったり入れたりが面倒くさくて好き勝手いじるの躊躇しちゃうんですよね。これはなんかあったら電源抜いたりリセットボタン押せばなんとかなるので非常に楽。もちろん起動も一瞬なのでストレスありません。シリアル通信でデータ転送するのだけがちょっと時間かかりますがそれでも数十秒ですし。
言語もC言語ベースは初めて見たのでよくわかりませんが、サンプルコードが結構たくさんあるので見よう見まねで書いていけば大丈夫でした。自分もエンジニアではないですがPHP読めるぐらいの知識あれば大抵のことはできそうです。単純にセンサー値取得してどっかに送るぐらいならESP32はちょうどいいと思いました。