📫

ESP32(XIAOなど)でFirebase RealtimeDBを使う方法

に公開

はじめに

本記事では、ESP32搭載マイコン を使って、Firebase Realtime Database にデータを送信する方法を解説します。IoTデバイスからクラウドに状態を記録したり、遠隔監視を実現する際に便利な技術です。Webアプリ等と連携することで簡単にスマート家電っぽいものが自作できます!

🔧 前提・準備

使用環境

  • マイコン:XIAO ESP32S3(ESP32系なら他でも可、ESP32-WROOM等でも動作確認済みですが、Wi-Fi通信がADCと干渉してしまうためアナログセンサーと併用すると使い物になりません。XIAOシリーズを強く推奨します。)
  • 開発環境:Arduino IDE
  • ネット接続:SSID・パスワード方式(一般的なWi-Fi)
    • 大学のWi-Fi(eduroam)などの802.1x方式での接続方法については、ぜひこちらを参考にしてください!
  • FirebaseAuth認証方式:Email / Password

使用ライブラリ

Arduino IDEのライブラリマネージャーで以下のライブラリをインストールしてください。

  • Firebase ESP Client by Mobizt
    私の環境では v4.4.17 を使用。ライブラリの詳細はこちら

🔥 Firebaseの設定

Firebaseのコンソールで以下の設定を行います。

  1. プロジェクトを新規作成
  2. 「Realtime Database」→「データベースを作成」→ 「本番環境」にする
  3. DBのルールを以下のように設定(書き込みはログイン中のユーザーのみ、読み取りは誰でも可能)
{
  "rules": {
    ".read": true,
    ".write": "auth != null"
  }
}

読み取りも公開したくない場合、特定のユーザーごとに権限を設定したい場合は適宜ルールを書き換えてください

  1. 「Authentication」→「Email / Password」を有効化

  2. ユーザーを登録(例:hoge@example.com / hogehoge

    • ここで登録するアドレスは、形式を守っていれば実在する必要はありません。

🔑 APIキーとDatabase URLを確認

  1. Firebaseコンソール → 歯車アイコン「プロジェクトの設定」へ
  2. 「全般」タブ → 下部にある「マイアプリ」→ Webアプリを追加
  3. 表示されたコード内に apiKeydatabaseURL が記載されています。
const firebaseConfig = {
  apiKey: "your-api-key",
  databaseURL: "https://your-project-id.firebaseio.com",
  ...
};

databaseURL は、Realtime Database のタブからも確認できます。

🧪 マイコンにDB書き込み処理を実装

ここでは、最小限のコードでデータを1回だけ書き込んでみます。

#include <WiFi.h>
#include <Firebase_ESP_Client.h>

// Wi-Fi情報
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";

// Firebase情報(前節で確認したものに置き換えてください)
#define API_KEY "AIzaSyDxxxxxxxxxxxxxxxxxxxxxxxx"
#define DATABASE_URL "https://your-project-id.firebaseio.com/"

// FirebaseAuth情報(Authに登録したものに置き換えてください)
#define USER_EMAIL "hoge@example.com"
#define USER_PASSWORD "hogehoge"

FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;

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

  // Wi-Fi接続
  WiFi.begin(ssid, password);
  Serial.print("WiFi接続中");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi接続成功");

  // Firebase設定
  config.api_key = API_KEY;
  config.database_url = DATABASE_URL;
  auth.user.email = USER_EMAIL;
  auth.user.password = USER_PASSWORD;

  Firebase.begin(&config, &auth);
  Firebase.reconnectWiFi(true);

  // 書き込みテスト
  if (Firebase.ready()) {
    FirebaseJson json;
    json.set("test", "hello from ESP32");

    bool success = Firebase.RTDB.updateNode(&fbdo, "/test", &json);
    if (success) {
      Serial.println("✅ 書き込み成功!");
    } else {
      Serial.printf("❌ 書き込み失敗: %s\n", fbdo.errorReason().c_str());
    }
  }
}

void loop() {
  // 何もしない(1回だけ書き込み)
}
  • /test ノードに書き込まれます
  • シリアルモニター でログを確認してください
  • Firebase.ready() は内部的にトークンの更新などを自動処理してくれます
  • SSL通信に必要な証明書処理もライブラリ内で完結しています

✅ 結果を確認する

Firebase Console の「Realtime Database」画面を開いて、/test ノードに次のようなデータが表示されていれば成功です:

{
  "test": "hello from ESP32"
}

ノードは / 区切りで自由に階層化できます。

🧩 補足:Firebase RTDBの主な書き込みメソッドまとめ

今回のサンプルコードでは updateNode() を使用しましたが、他にも以下のようなメソッドがあります。

メソッド 用途・特徴
set<T>() データを完全に置き換える。Tはint, float, bool, String等
setJSON() JSON形式で複数のデータを一括書き込み(置き換え)
updateNode() 既存ノードの一部だけを更新(部分更新)
deleteNode() ノードを削除する

🔤 set() の例:単一データの書き込み

Firebase.RTDB.setBool(&fbdo, "/led", true);
Firebase.RTDB.setInt(&fbdo, "/count", 42);
Firebase.RTDB.setString(&fbdo, "/name", "ESP32");

おわりに

これでマイコンから Firebase Realtime Database への基本的な書き込みができるようになりました。IoT開発の幅が一気に広がります。センサーデータの記録、状態の通知、Webアプリとの連携など、ぜひ応用してみてください

Discussion