先週買ってきたESP32で引き続き遊んでいる。
開発環境の変更
個人的な趣味の問題で、ArduinoIDEからEPS-IDFに環境を変更。
ESP-IDFもWindowsではなく、WSL2環境上のUbuntuに入れている。このページの内容に従って入れていったら、結構簡単に入った。
最初はLチカやってから
内蔵ADCを使った、電源の電圧測定を実装
最初、USB経由でシリアル出力していたんだけど、どうにもでたらめな数値しかでてこないので友人に泣きついた結果、USBからノイズ拾ってる可能性を指摘されたので、USBを外してLED3個の超簡易電圧計を作成。テスターの値とだいたい同じような結果になった。
サンプル見ながらどんどん実装
いくらなんでも3bitだけだと細かい値がわからないので、サンプル見ながらWifi接続を実装。ESP32のWifiモジュールが2.4GHzしか使えないっていうのに気づかず10分くらい悩んだくらいで、あっさり実装できた。
pythonで簡単なwebサーバーを実装して、ESP32から電圧をPOSTするようにした。
from http.server import HTTPServer, SimpleHTTPRequestHandler
import json
class RequestHandler(SimpleHTTPRequestHandler, object):
def do_POST(self) -> None:
request_length = int(self.headers.get("content-length"))
body = self.rfile.read(request_length).decode("utf-8")
print(body)
response = json.dumps({"response": "ok"}).encode("utf-8")
self.send_response(200)
self.send_header("Content-Type", "application/json")
self.send_header("Content-Length", str(len(response)))
self.end_headers()
self.wfile.write(response)
HTTPServer(("", 80), RequestHandler).serve_forever()
POSTで送られてきた値を画面に出して、クライアントにはJSONでOKを返すだけ。
BME680の実装
なんか色々一気に測定できるBME680をもっていたので、それも実装。
GithubにはESP-IDFでBME680を使うためのcomponentがあったけど、バージョンが古いのか、ビルドシステムが認識しなかったので、色々改造して使用。
とりあえず準備
とりあえず一式ダウンロードして、componentsディレクトリをmainと同じ階層にコピー。
CMakeLists.txtの作成
components/bme680にCMakeLists.txtを作成。内容は
idf_component_register(SRCS "bme680_platform.c" "bme680.c"
INCLUDE_DIRS "."
PRIV_REQUIRES "esp8266_wrapper")
.cファイルを取り込んで、esp8266_wrapperの依存を定義したらOK
次にcomponents/esp8266_wrapperのCMakeLists.txtの作成
idf_component_register(SRCS "esp8266_wrapper.c"
INCLUDE_DIRS "."
REQUIRES driver)
こちらも.cファイルの指定と、依存するdriver componentを指定して作成。
ソースの修正
ソースはほぼそのままだが、何箇所か修正。diff取ったけど、大体はformatterのせいになった
Only in b/bme680: CMakeLists.txt
Only in b/esp8266_wrapper: CMakeLists.txt
diff -cr a/esp8266_wrapper/esp8266_wrapper.c b/esp8266_wrapper/esp8266_wrapper.c
*** a/esp8266_wrapper/esp8266_wrapper.c 2023-09-10 17:24:28.999820500 +0900
--- b/esp8266_wrapper/esp8266_wrapper.c 2023-09-11 17:52:34.632671200 +0900
***************
*** 75,80 ****
--- 75,81 ----
conf.sda_pullup_en = GPIO_PULLUP_ENABLE;
conf.scl_pullup_en = GPIO_PULLUP_ENABLE;
conf.master.clk_speed = freq;
+ conf.clk_flags = I2C_SCLK_SRC_FLAG_FOR_NOMAL;
i2c_param_config(bus, &conf);
i2c_driver_install(bus, I2C_MODE_MASTER, 0, 0, 0);
}
diff -cr a/esp8266_wrapper/esp8266_wrapper.h b/esp8266_wrapper/esp8266_wrapper.h
*** a/esp8266_wrapper/esp8266_wrapper.h 2023-09-10 17:24:29.016370100 +0900
--- b/esp8266_wrapper/esp8266_wrapper.h 2023-09-11 17:51:57.362671056 +0900
***************
*** 17,22 ****
--- 17,23 ----
#include "driver/uart.h"
#include "driver/spi_common.h"
+ #include "driver/gpio.h"
/*
* esp-open-rtos SDK function wrapper
formatterによる修正がかなり多いけど、大事なところは
es8266_wrapper.hに#include “driver/gpio.h”の追加これしないと、いくつかの型が未定義になる
i2c_init関数でconfの初期化で、conf.clk_flags = I2C_SCLK_SRC_FLAG_FOR_NOMAL;の追加動かしてからi2cのエラーになったのを修正
2023/09/11修正: 最小限の変更だけのdiffを取った。CMakeLists.txtはそのまま。
これだけ修正したら動いた。早速送信データに測定値入れて実行。
なんかそれっぽい値が取れた。
作成したものは、ダイニングに設置。左からエネループ4本から3.3V作る電源モジュール、ESP32、BME680が刺さっている。
電源モジュールの右半分は電圧測定するために分圧するところ。BME680のブレッドボードに刺さってる基板は、RaspberryPIに接続するためのもの。抵抗の束は電流測定用に刺しまくった1Ω抵抗10個。
次はちゃんとしたサーバーと、これ用の基板作ろうかな。ユニバーサル基板で作れる気がしない……
「ESP32で遊んでみた (2)」への1件のフィードバック