概要
自宅の郵便受けは、外から中身の有無が分かりづらい構造になっている。
そのため、
- 郵便が来ているか確認する
- 開けてみる
- 何も入っていない
- 閉める
という作業を何度も繰り返していた。
そこで、「 郵便受けが開いたらスマホに通知してくれる仕組みを作れないか?」と思い、自作に挑戦してみることにした。
電子工作は今回が初挑戦だったが、AIと相談しながら進めれば何とかなるのではと思い開発を開始。
まだ完成していないため実運用はしていないが、今回はリードスイッチを使った開閉検知まで実装できたので紹介。
リポジトリ
開発手法
今回は ChatGPT と相談しながら開発を進めている。
普段であればコード生成は Claude Code に任せることが多いが、電子工作は未知の分野だったため、
- どの部品を買うべきか
- 配線はどうするのか
- 電池で動かすにはどうするのか
など、コード以外の用途が多かったのでChatGPTと相談しながら開発するスタイルで進めた。
作りたいもの
- 郵便受けの開閉を検知したい
- スマホへ通知したい(今回は Discord Webhook で通知)
- 郵便受けまでは Wi‑Fi が届く
- 郵便受けに電源はない
- 電池で1ヶ月以上動かしたい
基本構成
郵便受け(閉) ↓ 磁石 ←→ リードスイッチ ↓ ESP32C3 ↓ Wi‑Fi ↓ Discord Webhook ↓ スマホ通知
普段は磁石とリードスイッチが近接している状態。
郵便受けが開くと磁石が離れるため、その変化を ESP32C3 が検知して通知する。
購入したもの
XIAO ESP32C3
- 小型
- Wi‑Fi搭載
- Deep Sleep対応
- 電池駆動向き
郵便受けのような狭い場所に設置する用途に向いている。
リードスイッチ
磁石が近づくと導通するセンサー。
郵便受けの開閉検知に利用する。
ブレッドボード
はんだ付けなしで回路を試作できる基板。
はんだごて
ESP32C3 にピンヘッダを取り付けるために使用。
開発環境
Arduino IDE を使用する。
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 を使って、電池駆動向けに改善していく予定。
まとめ
初めての電子工作だったが、センサーが反応した瞬間はちょっと感動した。
ソフトウェア開発とはまた違う面白さがあるので、今後もいろいろ試していく予定。



