ESP32 + Firebase Hostingで作るIoT Webダッシュボード
はじめに
ESP32は、Wi-Fiを内蔵した安価で扱いやすいマイコンです。センサー値の取得、リレー制御、設備状態の監視など、IoT機器の試作や小規模システムに非常に向いています。
一方で、ESP32単体では「遠隔地から見やすく監視する画面」を作るのは少し大変です。そこで活用できるのが Firebase Hosting です。
Firebase Hostingを使うと、HTML / CSS / JavaScriptで作成したWebダッシュボードをインターネット上に公開できます。
この記事では、ESP32で取得したセンサーデータをFirebaseに送信し、Firebase Hosting上のWeb画面でリアルタイム表示するIoTダッシュボード の構成例を紹介します。
今回作るもの
今回の構成では、ESP32で温度・湿度などのセンサーデータを取得し、Firebaseのデータベースへ送信します。
Webダッシュボード側では、Firebaseからデータを読み取り、ブラウザ上に現在値を表示します。
イメージとしては、次のようなシステムです。
[ センサー ]
↓
[ ESP32 ]
↓ Wi-Fi
[ Firebase Realtime Database / Cloud Firestore ]
↓
[ Firebase Hosting上のWebダッシュボード ]
↓
[ PC / スマートフォンのブラウザ ]ESP32は現場側のデータ収集装置、Firebaseはクラウド上のデータ保存・同期基盤、Firebase Hostingは表示画面の公開先、という役割分担になります。
Firebase Hostingとは
Firebase Hostingは、Webアプリケーションや静的サイトを公開するためのFirebaseの機能です。
HTML、CSS、JavaScriptで作成したWebページをFirebase Hostingにデプロイすることで、ブラウザからアクセスできるWebダッシュボードを公開できます。
Firebase Hosting自体は、ESP32から直接使う機能というより、ESP32がFirebaseへ送信したデータを人間が見るためのWeb画面を公開する場所 と考えると分かりやすいです。
つまり、ESP32とFirebase Hostingの関係は次のようになります。
ESP32 → Firebase Database → Webアプリ → Firebase HostingESP32がFirebase Hostingにデータを送るのではなく、ESP32はFirebaseのデータベースにデータを書き込み、Firebase Hosting上のWebアプリがそのデータを読み取って表示します。
データベースはRealtime DatabaseかFirestoreを使う
IoTダッシュボードを作る場合、Firebase側のデータ保存先として主に次の2つが候補になります。

Firebase Realtime Databaseは、データをJSONとして保存し、接続中のクライアントとリアルタイムに同期できます。センサー値の現在値表示のような用途には扱いやすい構成です。
Cloud Firestoreは、Google Cloud基盤上の柔軟でスケーラブルなNoSQLデータベースで、Webアプリやサーバーサイド開発でも使いやすい構造になっています。
ESP32から現在値を送信して、Web画面にすぐ表示するだけであれば、まずは Realtime Database から始めると分かりやすいです。
システム構成例
今回は、次のような構成を想定します。
ハードウェア
ESP32開発ボード
BME280などの温度・湿度・気圧センサー
Wi-Fi環境
PCまたはスマートフォン
クラウド側
Firebaseプロジェクト
Firebase Realtime Database
Firebase Hosting
Firebase Web SDK
開発環境
Arduino IDE
Firebase対応Arduinoライブラリ
Node.js
Firebase CLI
HTML / CSS / JavaScript
Arduino環境からFirebaseを扱うライブラリとしては、ESP32やESP8266向けにFirebase関連機能を扱えるArduinoライブラリが公開されています。たとえば、mobizt氏のFirebaseClientはRealtime Database、Cloud Firestore、Firebase Storageなど複数のFirebase / Google Cloud製品を扱えるArduino向けライブラリです。
Firebase側で準備すること
まずFirebaseコンソールで新しいプロジェクトを作成します。
その後、以下を準備します。
Realtime Databaseを有効化する
Webアプリを追加する
Firebase SDK設定情報を取得する
Firebase Hostingを有効化する
Firebase CLIをインストールする
Firebase Hostingの初期設定では、Firebase CLIを使ってプロジェクトの初期化とデプロイを行います。
データベース構造の例
IoTダッシュボードでは、最初はシンプルな構造にすると扱いやすくなります。
Realtime Databaseの場合、次のようなJSON構造にできます。
{
"devices": {
"esp32_001": {
"temperature": 25.4,
"humidity": 61.2,
"pressure": 1012.5,
"updatedAt": "2026-07-09 10:00:00"
}
}
}この構造では、`esp32_001` というデバイスIDの下に、温度、湿度、気圧、更新時刻を保存しています。
複数台のESP32を扱う場合は、次のようにデバイスごとに分けます。
{
"devices": {
"esp32_001": {
"temperature": 25.4,
"humidity": 61.2
},
"esp32_002": {
"temperature": 27.1,
"humidity": 58.4
}
}
}このようにしておくと、後から複数拠点や複数設備の監視に拡張しやすくなります。
ESP32側の役割
ESP32側では、主に次の処理を行います。
1. Wi-Fiへ接続する
2. センサー値を取得する
3. Firebaseへ接続する
4. Realtime Databaseへデータを書き込む
5. 一定周期で繰り返すESP32は、Web画面を直接表示する必要はありません。
ESP32の役割は、あくまで 現場データをクラウドへ送ること です。
たとえば、温度・湿度を5秒ごと、または1分ごとに送信します。
頻繁に送信しすぎると、通信量やデータベースの書き込み回数が増えるため、用途に応じて更新周期を決める必要があります。
ESP32側のArduinoコード例
以下は、ESP32からFirebase Realtime Databaseへセンサーデータを送信する処理のイメージです。
実際には、使用するFirebaseライブラリや認証方式に合わせてコードを調整してください。
#include <WiFi.h>
// Firebase用ライブラリは使用するものに合わせて追加する
// #include <FirebaseClient.h>
const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";
// Firebase設定
#define DATABASE_URL "https://your-project-id-default-rtdb.firebaseio.com/"
#define API_KEY "YOUR_FIREBASE_WEB_API_KEY"
float temperature = 25.4;
float humidity = 61.2;
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.print("WiFi connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected");
// Firebase初期化処理
// 使用するライブラリに合わせて記述
}
void loop() {
// 実際にはここでBME280などから値を取得する
temperature += 0.1;
humidity += 0.1;
Serial.print("Temperature: ");
Serial.println(temperature);
Serial.print("Humidity: ");
Serial.println(humidity);
// Firebase Realtime Databaseへ送信
// 例:
// /devices/esp32_001/temperature
// /devices/esp32_001/humidity
delay(5000);
}ここではコードを簡略化しています。
実際の運用では、次の点を追加します。
Wi-Fi切断時の再接続処理
Firebase送信失敗時のリトライ処理
センサー読み取りエラー処理
NTPによる時刻取得
デバイスIDの管理
認証情報の保護
Webダッシュボード側の役割
Webダッシュボード側では、Firebaseのデータベースを読み取り、ブラウザ画面に表示します。
構成はシンプルです。
public/
├── index.html
├── style.css
└── app.jsindex.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ESP32 IoT Dashboard</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="dashboard">
<h1>ESP32 IoT Dashboard</h1>
<section class="card">
<h2>温度</h2>
<p><span id="temperature">--</span> ℃</p>
</section>
<section class="card">
<h2>湿度</h2>
<p><span id="humidity">--</span> %</p>
</section>
<section class="card">
<h2>更新時刻</h2>
<p id="updatedAt">--</p>
</section>
</main>
<script type="module" src="app.js"></script>
</body>
</html>style.css
body {
margin: 0;
font-family: system-ui, sans-serif;
background: #f4f6f8;
color: #222;
}
.dashboard {
max-width: 800px;
margin: 40px auto;
padding: 20px;
}
h1 {
text-align: center;
}
.card {
background: #fff;
border-radius: 12px;
padding: 24px;
margin: 16px 0;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
}
.card h2 {
margin-top: 0;
color: #555;
}
.card p {
font-size: 2rem;
margin: 0;
}app.js
Firebase Web SDKを使ってRealtime Databaseからデータを読み取ります。
import { initializeApp } from "https://www.gstatic.com/firebasejs/10.12.0/firebase-app.js";
import {
getDatabase,
ref,
onValue
} from "https://www.gstatic.com/firebasejs/10.12.0/firebase-database.js";
const firebaseConfig = {
apiKey: "YOUR_API_KEY",
authDomain: "your-project-id.firebaseapp.com",
databaseURL: "https://your-project-id-default-rtdb.firebaseio.com",
projectId: "your-project-id",
storageBucket: "your-project-id.appspot.com",
messagingSenderId: "YOUR_SENDER_ID",
appId: "YOUR_APP_ID"
};
const app = initializeApp(firebaseConfig);
const db = getDatabase(app);
const deviceRef = ref(db, "devices/esp32_001");
onValue(deviceRef, (snapshot) => {
const data = snapshot.val();
if (!data) {
return;
}
document.getElementById("temperature").textContent =
data.temperature ?? "--";
document.getElementById("humidity").textContent =
data.humidity ?? "--";
document.getElementById("updatedAt").textContent =
data.updatedAt ?? "--";
});`onValue()` を使うことで、Firebase Realtime Databaseの値が更新されたときに、Web画面側も自動的に更新できます。
これにより、ブラウザを手動で再読み込みしなくても、ESP32から送られた最新データを表示できます。
Firebase Hostingへデプロイする
Webダッシュボードを作成したら、Firebase Hostingへデプロイします。
まずFirebase CLIをインストールします。
npm install -g firebase-toolsログインします。
firebase loginプロジェクトを初期化します。
firebase init hosting公開ディレクトリには、今回の場合 `public` を指定します。
What do you want to use as your public directory? publicその後、デプロイします。
firebase deployデプロイが完了すると、Firebase HostingのURLが表示されます。
そのURLへアクセスすると、ESP32のデータを表示するWebダッシュボードを確認できます。
セキュリティ上の注意点
IoTシステムでは、セキュリティ設定が非常に重要です。
特に注意すべき点は次の通りです。
1. データベースを全公開にしない
テスト目的で以下のようなルールにすることがあります。
{
"rules": {
".read": true,
".write": true
}
}しかし、この設定は誰でも読み書きできる状態になるため、公開環境では危険です。
本番運用では、Firebase Authenticationやデータベースルールを使って、読み取り・書き込み権限を制限する必要があります。
2. ESP32に重要な秘密情報を埋め込まない
ESP32のプログラム内にAPIキーや認証情報を記述する場合、ファームウェアを読み取られるリスクを考慮する必要があります。
個人の試作であれば許容できる場合もありますが、製品や外部公開システムでは、認証設計を慎重に行うべきです。
3. 書き込み周期を適切にする
センサー値を1秒未満の短周期でクラウドへ送信すると、通信量やデータベース負荷が増えます。
温度・湿度のように変化が緩やかなデータであれば、5秒、10秒、1分など、用途に応じた周期にするのが現実的です。
応用例
ESP32 + Firebase Hostingの構成は、さまざまなIoT用途に応用できます。
設備の稼働状態モニター
ESP32で入力信号を監視し、設備の運転中、停止中、異常停止などの状態をFirebaseへ送信します。
Webダッシュボードでは、現在の稼働状態や停止時間を表示できます。
温湿度監視システム
BME280やSHT31などのセンサーを使い、室内、倉庫、制御盤内の温湿度を監視します。
しきい値を超えた場合に、画面上で警告表示することもできます。
電力・電流モニター
電流センサーや電力量計から取得した値をESP32で読み取り、Firebaseに送信します。
Web画面では、現在の消費電力や簡易グラフを表示できます。
スマート農業向けモニター
土壌水分、気温、湿度、照度などをESP32で取得し、Webダッシュボードで確認します。
離れた場所からハウス内の状態を確認する用途に向いています。
リモート制御パネル
WebダッシュボードにON/OFFボタンを追加し、Firebase上の制御フラグを書き換えます。
ESP32側がそのフラグを読み取り、リレーやLEDを制御することで、簡易的な遠隔操作システムを作れます。
この構成のメリット
ESP32 + Firebase HostingによるIoT Webダッシュボードには、次のメリットがあります。
自前でWebサーバーを用意しなくてよい
ブラウザだけで監視画面を確認できる
PC、スマートフォン、タブレットからアクセスできる
Firebaseのデータ同期機能を利用できる
小規模なIoT試作を短時間で作れる
HTML / CSS / JavaScriptで画面を自由に作れる
特に、IoTの試作段階では、サーバー構築に時間をかけずに「まず動くもの」を作れる点が大きな利点です。
注意すべき点
一方で、以下のような点には注意が必要です。
Firebaseの料金体系を確認する
データベースルールを適切に設定する
ESP32の認証情報の扱いに注意する
通信が切れた場合の処理を入れる
長期保存データと現在値データを分けて設計する
本格運用ではログ保存や異常通知の設計も必要
特に、現在値だけを表示する用途と、過去データを長期間保存する用途では、データベース設計が変わります。
最初は現在値表示だけで作り、次の段階で履歴保存やグラフ表示を追加するのが進めやすいです。
まとめ
ESP32とFirebase Hostingを組み合わせることで、比較的簡単にIoT Webダッシュボードを作ることができます。
重要なのは、Firebase Hostingの役割を正しく理解することです。
Firebase Hostingは、ESP32のデータ送信先ではありません。
ESP32はFirebase Realtime DatabaseやCloud Firestoreへデータを書き込み、Firebase Hosting上のWebアプリがそのデータを読み取って表示します。
この構成を使えば、次のような流れでIoTシステムを作れます。
ESP32でセンサー値を取得
↓
Firebaseへデータ送信
↓
Webアプリでデータ取得
↓
Firebase Hostingで画面公開
↓
スマートフォンやPCから確認まずは、温度・湿度などの簡単なセンサー値を表示するところから始めるとよいでしょう。
そこから、グラフ表示、異常通知、複数デバイス対応、遠隔制御などへ発展させることができます。
ESP32とFirebaseは、IoTの試作や個人開発において非常に相性のよい組み合わせです。
いいなと思ったら応援しよう!
応援、よろしくお願いいたします。