wheatandcatの開発ブログ

技術系記事を投稿してます

ESP32C3で郵便受け開閉センサーを自作してみる①リードセンサーのハンドリングまで

概要

自宅の郵便受けは、外から中身の有無が分かりづらい構造になっている。

そのため、

  • 郵便が来ているか確認する
  • 開けてみる
  • 何も入っていない
  • 閉める

という作業を何度も繰り返していた。

そこで、「 郵便受けが開いたらスマホに通知してくれる仕組みを作れないか?」と思い、自作に挑戦してみることにした。

電子工作は今回が初挑戦だったが、AIと相談しながら進めれば何とかなるのではと思い開発を開始。

まだ完成していないため実運用はしていないが、今回はリードスイッチを使った開閉検知まで実装できたので紹介。


リポジトリ

github.com


開発手法

今回は ChatGPT と相談しながら開発を進めている。

普段であればコード生成は Claude Code に任せることが多いが、電子工作は未知の分野だったため、

  • どの部品を買うべきか
  • 配線はどうするのか
  • 電池で動かすにはどうするのか

など、コード以外の用途が多かったのでChatGPTと相談しながら開発するスタイルで進めた。


作りたいもの

  • 郵便受けの開閉を検知したい
  • スマホへ通知したい(今回は Discord Webhook で通知)
  • 郵便受けまでは Wi‑Fi が届く
  • 郵便受けに電源はない
  • 電池で1ヶ月以上動かしたい

基本構成

郵便受け(閉)
↓
磁石 ←→ リードスイッチ
↓
ESP32C3
↓
Wi‑Fi
↓
Discord Webhook
↓
スマホ通知

普段は磁石とリードスイッチが近接している状態。

郵便受けが開くと磁石が離れるため、その変化を ESP32C3 が検知して通知する。


購入したもの

XIAO ESP32C3

  • 小型
  • Wi‑Fi搭載
  • Deep Sleep対応
  • 電池駆動向き

郵便受けのような狭い場所に設置する用途に向いている。

リードスイッチ

磁石が近づくと導通するセンサー。

郵便受けの開閉検知に利用する。

ブレッドボード

はんだ付けなしで回路を試作できる基板。

はんだごて

ESP32C3 にピンヘッダを取り付けるために使用。


開発環境

Arduino IDE を使用する。

support.arduino.cc

Arduino IDE はマイコン向けの開発環境で、

  • コードを書く
  • ESP32へ書き込む
  • シリアルログを確認する

といった作業を行える。


開発手順

ESP32C3に書き込んで動作確認

まず ESP32C3 を USB で Mac と接続する。

Arduino IDE を起動してボードから XIAO ESP32C3 を選択する。

以下のコードを書き込む。

void setup() {
  Serial.begin(115200);
}

void loop() {
  Serial.println("Hello ESP32");
  delay(1000);
}

Arduino IDE の左上の「→」ボタンを押して書き込む。

シリアルモニタで以下のように表示されれば成功。

これで ESP32C3 にプログラムを書き込めることを確認できた。


ESP32C3にピンヘッダをはんだ付け

購入時は以下の状態。

このままではブレッドボードに挿せないため、ピンヘッダをはんだ付けする。


リードスイッチを接続

配線は以下。

D2
↓
リードスイッチ
↓
GND

実際の配線。


開閉確認コードを作成

secrets.h

const char* WIFI_SSID = "WifiのSSID";
const char* WIFI_PASSWORD = "Wifiのパスワード";
const char* DISCORD_WEBHOOK_URL = "通知用のDiscord Webhook URL";

mailbox-sensor.ino

#include <WiFi.h>
#include <HTTPClient.h>
#include "secrets.h"

/**
 * @brief リードスイッチの状態変化をDiscordへ通知する
 *
 * @example
 * 磁石を離して OPEN になったタイミングでDiscordに通知する。
 */
const int reedPin = D2;

int previousState = HIGH;

/**
 * @brief Wi-Fiへ接続する
 */
void connectWiFi() {
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

  Serial.print("Connecting to WiFi");

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("WiFi connected");
}

/**
 * @brief Discord Webhookへメッセージを送信する
 *
 * @param message Discordに送る本文
 */
void sendDiscordMessage(const String& message) {
  if (WiFi.status() != WL_CONNECTED) {
    connectWiFi();
  }

  HTTPClient http;
  http.begin(DISCORD_WEBHOOK_URL);
  http.addHeader("Content-Type", "application/json");

  String payload = "{\"content\":\"" + message + "\"}";

  int httpCode = http.POST(payload);

  Serial.print("Discord response: ");
  Serial.println(httpCode);

  http.end();
}

void setup() {
  Serial.begin(115200);
  delay(1000);

  pinMode(reedPin, INPUT_PULLUP);

  connectWiFi();

  previousState = digitalRead(reedPin);

  Serial.println("Mailbox sensor started");
}

void loop() {
  int currentState = digitalRead(reedPin);

  if (currentState != previousState) {
    if (currentState == LOW) {
      Serial.println("CLOSED");
    } else {
      Serial.println("OPEN");
      sendDiscordMessage("📬 郵便受けが開きました");
    }

    previousState = currentState;
  }

  delay(50);
}

実装内容は以下。

  • D2 を INPUT_PULLUP で監視
  • 状態変化を検知
  • OPEN になったら Discord に通知

動作確認

磁石を付けた状態で起動し、磁石を離すと Discord に通知が飛ぶ。


次回

ここまでで開閉検知は実装できた。

ただし現状は loop() で常時監視しているため、ESP32 がずっと起きたままになっている。

これでは電池駆動には向かない。

実運用するためには、

  • Deep Sleep
  • GPIOウェイクアップ
  • 必要な時だけWi‑Fi接続

といった実装が必要になる。

次回は ESP32C3 の Deep Sleep を使って、電池駆動向けに改善していく予定。


まとめ

初めての電子工作だったが、センサーが反応した瞬間はちょっと感動した。

ソフトウェア開発とはまた違う面白さがあるので、今後もいろいろ試していく予定。