
ログハウスに置いてある鉛蓄電池の電圧と室内温度を、スマホやPCからいつでも見られるようにした記録です。
ESP32 WROVER + カメラモジュールで電圧 / 温度 / 動体検知をまとめて監視、温度に応じて換気扇を ON/OFF する SSR 制御も追加しました。
できること
- バッテリー電圧監視: 0〜20V を分圧抵抗で読み取り、ブラウザにリアルタイム表示
- 室内温度監視: NTC サーミスタ (AT-THMS / SEMITEC 103AT-11) で温度計測
- 温度連動 SSR 制御: 設定温度を超えたら GPIO13 → SSR → 換気扇を ON(ヒステリシス制御)
- カメラ映像 + 動体検知: VGA グレースケールでフレーム差分検知、検知時は ntfy.sh で通知
- 電圧異常通知: 注意 / 警告レベルを超えると ntfy.sh にプッシュ通知
- 1日1ファイルの CSV ログ: 10分間隔で SPIFFS に保存、31日で自動削除、Webからダウンロード
- 固定IPでローカルWebサーバー + MyDNS.jp DDNS で外部からもアクセス可能
- WiFiManager: 初回設定は AP モードのキャプティブポータルから
ハードウェア構成
- マイコン
- Freenove ESP32 WROVER (CAM-OV2640 内蔵)
- 電圧計測
- GPIO33 ← 分圧抵抗 R1=12kΩ + R2=2.2kΩ
- 温度計測
- GPIO32 ← 10kΩ + NTC サーミスタ (B=3435K, R₀=10kΩ@25℃)
- SSR出力
- GPIO13 (HIGH=+3.3V) → DC-DC SSR →DC-ACインバータ→ AC100V換気扇
- 電源
- USB 5V
- OS
- Arduino IDE / ESP32 core 3.3.8
分圧回路(電圧計測)
バッテリー(+) ──[ R1 = 12kΩ ]──┬── GPIO33 (ADC)
│
[ R2 = 2.2kΩ ]
│
バッテリー(-) ───────────────────┴── GND
分圧比は R2 / (R1+R2) = 2.2 / 14.2 ≒ 0.155。ADC レンジ 3.3V いっぱいで約 21.3V まで計測可能。校正は実測値ベースの 10 点区分線形補間。
温度分圧回路
3.3V ──[ 10kΩ ]──┬── GPIO32 (ADC)
│
[ NTC 10kΩ @25℃ ]
│
GND
B 定数法で抵抗値から温度に換算。T[K] = 1 / (1/T₀ + ln(R/R₀)/B)
状態判定しきい値
| 電圧 | 状態 |
|---|---|
| 12.0V 以上 | 正常 |
| 10.0V 〜 12.0V 未満 | 注意 |
| 10.0V 未満 | 警告 |
注意レベルに入ると ntfy.sh で「優先度:高」、警告レベルでは「優先度:緊急」の通知を送信。連続通知を防ぐため 60 秒のクールダウンを設けています。
Web ダッシュボード
ブラウザで https://www.shinjo.tokyo:8080/ を開くと:
- バッテリー電圧の大きな数字 + 正常/注意/警告 のバッジ表示
- 室内温度の大きな数字 + 制御ピン(GPIO13)の ON/OFF 状態
- カメラのライブ画像(10秒間隔で更新)
- 動体検知インジケータ(赤いドットが点滅)
- SSR 制御の ON/OFF 温度をブラウザ上から個別設定 → SPIFFS に保存
- 電圧ログ CSV ファイル一覧 + ダウンロード
- WiFi 設定リセット(Basic 認証 + 確認ページの2段階)
1.SSR のヒステリシス制御
ON 温度と OFF 温度を独立して設定できる方式に変更。たとえば「30℃ 以上で ON、25℃ 以下で OFF」と設定すれば、両閾値の間(25〜30℃)では直前の状態を維持するので、温度が閾値付近を行ったり来たりしても無駄な ON/OFF が発生しません。
2. WiFiManager でハードコードから卒業
以前はソース内に SSID/パスワードを書いてビルドしていましたが、現バージョンは初回起動時に VoltageMonitor-Setup という AP が立ち上がるので、スマホから接続してキャプティブポータルで WiFi を設定する方式に。
3. /wifi-reset は Basic 認証 + 確認ページ
誤って WiFi 設定をリセットすると再設定が面倒なので、ダッシュボードの「WiFi 設定リセット」ボタンには 2 段階の防御をかけています:
- クリック → Basic 認証ダイアログ → ユーザー名 / パスワード入力
- 認証 OK → 「実行 / キャンセル」ボタンの確認ページ表示
- 「実行」を押した時のみ POST で実リセット実行
4. CSV ログは 1日1ファイル / 31日で自動削除
10分ごとに /voltage_YYYY-MM-DD.csv に追記。31日経過したファイルは自動削除されるので SPIFFS が溢れません。NTP 同期成功直後にも 1 回書き込みを行うので、起動から 10 分待たなくても最初のレコードが見えます。
使ったライブラリ・サービス
- arduino-esp32 (core 3.3.8)
- WiFiManager (キャプティブポータル)
esp_camera(Espressif 公式)- MyDNS.jp (Dynamic DNS)
- ntfy.sh (プッシュ通知)
