
ESP32でカメラ撮影した画像をネットで見れるようにしたいなあ
こうした悩みを解決します。
はじめに

この記事では、ESP32-S3カメラで撮影した画像をFTP経由でサーバにアップロードし、Webブラウザで閲覧する方法 を解説します。
リアルタイムのストリーミングではなく、一定間隔で更新される静止画の仕組みですが、初心者でも試せるIoT入門として最適です。
想定読者
- ESP32初心者(Arduino IDEは触ったことがある程度)
- IoTで「撮影 → アップロード → 表示」の流れを体験したい方
使用するキット
こちらのESP32S3キットを使用します。
ESP32-S3-WROOM スターターキット3
あと、サーバを用意しておく必要があります。
FTPとは?
FTP(File Transfer Protocol)は ファイルをネットワーク経由で送受信するためのルール(プロトコル) です。
今回の例では、ESP32が「FTPクライアント」として動き、サーバ(今回はConohaWING)上の指定フォルダに 撮影した画像ファイルをアップロード しています。
ポイント:
- サーバ側にログイン(アドレス・ユーザー名・パスワード)が必要
- 画像やテキストなど様々なファイルを簡単に転送できる
- 専用ソフト(FFFTPやFileZillaなど)を使うと手動でも確認可能
目標成果物
30秒おきにESP32カメラで撮影した画像をWEBブラウザ上に表示する
※予告なく終了していたら申し訳ありません。
「更新日時」が30秒経過しても変わらない場合は更新されておりません。
↓こんな感じ

更新日時: 取得中…
プログラム
こちらのサンプルプログラムをもとに進めていきます。
カメラサンプル

FTPサンプル
download_file.inoのサンプルを利用します。
動作
今回の仕組みは、以下の流れで動作します。
- WiFi接続
ESP32-S3を無線LANに接続します。 - FTPサーバ接続
ConoHa WINGなどのレンタルサーバをFTPで指定。ユーザー名・パスワードでログイン。 - カメラ撮影
ESP32-CAMライブラリを利用して静止画をJPEG形式で取得。 - 画像アップロード
FTPクライアントライブラリ(ESP32_FTPClient)を使って、撮影したJPEGをサーバにアップロード。 - WEBブラウザで確認
アップロード先をブラウザからアクセスすれば、最新の画像を表示可能。
つまずいたこと
FTP接続
ESP32でいきなりFTP操作せずに、PCのFTPソフトでまずはパソコンとサーバ間がFTPで接続できるか確認することをオススメします。
FFFTPとかFileZillaとか無料ソフトあるので、それを使うと良いでしょう。
容量不足
今回の内容には含んでいませんが、当初の計画では撮影毎にSDカードに画像に番号振って保存していました。
それでWifi、SD、カメラ、FTPと全て起動すると、最初はメモリ不足でエラーが出て動かなくて焦りましたが、PSRAMを有効にしたら解決しました!
SDかFTPかどちらかを未使用にすれば動作しましたが、
最終的には外付けのPSRAMを有効にすることで、全て動作でき解決しました。

このほか、実装時によくあるトラブルをまとめました。
- FTP接続エラー(530 You aren’t logged in)
→ ユーザー名・パスワードが間違っているか、サーバがFTPS専用になっている場合があります。まずはFFFTPやFileZillaで手動接続確認を推奨。 - RAM不足でクラッシュ
→ WiFi+カメラ+SD+FTPを同時に動かすとメモリ不足になる場合があります。menuconfig
から外付けPSRAMを有効にすることで解決できます。 - 画像がブラウザで更新されない
→ ブラウザキャッシュの影響です。画像ファイル名を固定する場合は、クエリ文字列をつけて表示しましょう。
例:latest.jpg?time=1690000000
課題
消費電力
定常的に100mA程度消費しています。カメラ動作+アップロード中は200mA程度消費します。
どの機能も必要なときだけ動作させるようにしないと、屋外使用を考えると、発熱や電力消費が大きく実用的ではないですね。
ディープスリープとか使わないとダメですね。
(そもそもESP32は高速でぶん回しすぎ感は否めない)

ディープスリープとは
ESP32は省電力機能として「ディープスリープモード」があります。
これは人間でいう「熟睡」のような状態で、ほとんどの機能を止めて待機することで、消費電流を数mA以下にまで下げることができます。
例えば今回のように 30秒ごとに撮影→アップロード を繰り返すなら、
- 通常時はディープスリープで待機
- タイマーで30秒後に自動で起きる
- カメラ撮影&アップロードが終わったらまた寝る
という流れにすると、常に動かしっぱなしにするよりもバッテリー持ちが何倍も良くなります。
👉 ポイント
esp_deep_sleep_start();
を呼ぶとスリープ開始esp_sleep_enable_timer_wakeup(30 * 1000000);
のように設定すると30秒後に復帰可能
屋外や電池駆動で使いたい場合は、この仕組みを組み込むのが実用化への第一歩です。
FTP以外の方法
今回FTPを採用しましたが、他にも手段があります。
- HTTPサーバ方式
ESP32をWebサーバ化して直接アクセス。ただし外部公開にはポート開放やセキュリティ設定が必要。 - MQTT方式
軽量プロトコルでクラウドに送信可能。ただし画像などの大きなデータ転送には不向き。 - クラウドストレージAPI
Google DriveやAWS S3に直接アップロードする方法もあるが、OAuth認証などが必要で実装が複雑。
👉 これらと比べて、FTPは「シンプルで導入が容易」というメリットがあります。
以下の理由からFTPを選択しました。
攻撃されるリスク低減 & 通信量少ない & 消費電力小さい
応用例アイデア
- 植物観察タイムラプス
毎日や一定間隔で撮影 → 画像をサーバにアップロード → 後でまとめて再生して「成長記録動画」にできる。 - 天気観測カメラ
屋外に設置して空模様を定期撮影 → サイトに公開すれば「簡易気象カメラ」。
(気温・湿度センサを追加すれば「環境観測ステーション」にもなる) - リモート確認カメラ
倉庫・ガレージ・水槽・ペット小屋など、遠隔地の状態を定期確認できる。 - 作業工程記録カメラ
工場や研究実験で、一定間隔で撮影 → 後で「作業の自動記録」として利用。 - IoTデータ連携
- 画像と一緒にセンサーデータ(温度、湿度、二酸化炭素濃度など)も同時にFTPアップロード
- サーバ側で「画像+数値ログ」をまとめて表示
- イベント用スナップカメラ
展示会やイベント会場で、一定時間ごとに自動撮影してサーバにアップロード → 会場サイトでリアルタイム更新される「雰囲気共有フォト」になる。 - 遠隔監視+通知
人感センサやドアセンサと組み合わせて「変化があったら撮影してアップロード&メール通知」みたいな簡易防犯カメラ。
まとめ
本記事では ESP32-S3カメラで撮影した画像をFTP経由でサーバにアップロードし、WEBブラウザから閲覧できる仕組み を紹介しました。
ストリーミングのようなリアルタイム性はありませんが、一定間隔で更新される画像を簡単に公開できるのが特徴です。
実装のポイントは以下のとおりです。
- ESP32をFTPクライアントとして動作させ、撮影データをサーバに送信
- WEBブラウザからは画像ファイルを直接閲覧(キャッシュ無効化で常に最新を表示)
- SDカードやPSRAMの使い分けでメモリ不足を回避
- ディープスリープ等の省電力制御が実用化のカギ
さらに、植物観察や気象観測、防犯カメラ、遠隔監視など、応用の幅も広がります。
シンプルな仕組みだからこそ、アイデア次第で多用途に展開できるのが魅力です。
👉 次のステップとしては、人感センサや環境センサと組み合わせて「必要なときだけ撮影・送信」する仕組みに発展させると、省電力化と実用性アップにつながります。
コメント