Skip to main content

Overview

The Firebase RTDB module enables ESP32 devices to interact with Firebase Realtime Database. It supports authentication, real-time data synchronization, and structured data storage.

Basic Firebase Operations

This example demonstrates connecting to Firebase and performing basic read/write operations.
1

Include required libraries

Include Firebase and WiFi libraries:
#include "firebase-rtdbv2.h"
#include <WiFi.h>
#include <WiFiClientSecure.h>
2

Configure Firebase credentials

Set up your Firebase project credentials:
#define WIFI_SSID "YourWiFiSSID"
#define WIFI_PASSWORD "YourWiFiPassword"

#define API_KEY "YourFirebaseAPIKey"
#define USER_EMAIL "YourEmail@example.com"
#define USER_PASSWORD "YourPassword"
#define DATABASE_URL "https://your-project-id-default-rtdb.firebaseio.com/"
3

Create Firebase instance

Initialize WiFi client and Firebase:
WiFiClientSecure client;
FirebaseV2RTDB firebase;
4

Connect to Firebase

Set up connection in setup():
void setup() {
  Serial.begin(115200);
  
  // Connect to WiFi
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(300);
    Serial.print(".");
  }
  Serial.println("WiFi connected!");
  
  // Initialize Firebase
  client.setInsecure();
  
  if (!firebase.begin(client, DATABASE_URL, API_KEY, 
                      USER_EMAIL, USER_PASSWORD)) {
    Serial.println("Firebase init failed: " + firebase.getError());
    return;
  }
  
  // Wait for ready
  while (!firebase.ready()) {
    delay(100);
  }
  Serial.println("Firebase ready!");
}
5

Write data

Store values in the database:
// Write string
firebase.set("/test/string", "Hello World");

// Write integer
firebase.set("/test/integer", 42);

// Write boolean
firebase.set("/test/boolean", true);

// Write float with precision
firebase.set("/test/float", 3.14159, 2);
6

Read data

Retrieve values from the database:
String stringValue = firebase.getString("/test/string");
int intValue = firebase.getInt("/test/integer");
bool boolValue = firebase.getBool("/test/boolean");
float floatValue = firebase.getFloat("/test/float");

Complete Basic Example

#include "firebase-rtdbv2.h"
#include <WiFi.h>
#include <WiFiClientSecure.h>

#define WIFI_SSID "YourWiFiSSID"
#define WIFI_PASSWORD "YourWiFiPassword"
#define API_KEY "YourFirebaseAPIKey"
#define USER_EMAIL "YourEmail@example.com"
#define USER_PASSWORD "YourPassword"
#define DATABASE_URL "https://your-project-id-default-rtdb.firebaseio.com/"

WiFiClientSecure client;
FirebaseV2RTDB firebase;

void setup() {
  Serial.begin(115200);
  
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(300);
  }
  Serial.println("WiFi connected!");
  
  client.setInsecure();
  
  if (!firebase.begin(client, DATABASE_URL, API_KEY, 
                      USER_EMAIL, USER_PASSWORD)) {
    Serial.println("Firebase failed: " + firebase.getError());
    return;
  }
  
  while (!firebase.ready()) delay(100);
  
  // Write data
  firebase.set("/test/string", "Hello World");
  firebase.set("/test/integer", 42);
  firebase.set("/test/boolean", true);
  firebase.set("/test/float", 3.14159, 2);
  
  // Read data
  Serial.println("String: " + firebase.getString("/test/string"));
  Serial.println("Integer: " + String(firebase.getInt("/test/integer")));
  Serial.println("Boolean: " + String(firebase.getBool("/test/boolean")));
  Serial.println("Float: " + String(firebase.getFloat("/test/float")));
  
  // Check existence
  if (firebase.exists("/test")) {
    Serial.println("Test node exists!");
  }
}

void loop() {
  firebase.loop();  // Must be called regularly
  delay(1000);
}

Sensor Data Logger

A complete example for logging sensor data to Firebase with timestamps.

Setup Time Synchronization

#include <time.h>

#define NTP_SERVER "pool.ntp.org"
#define GMT_OFFSET_SEC 0
#define DAYLIGHT_OFFSET_SEC 0

void setupTime() {
  configTime(GMT_OFFSET_SEC, DAYLIGHT_OFFSET_SEC, NTP_SERVER);
  
  struct tm timeinfo;
  while (!getLocalTime(&timeinfo)) {
    delay(500);
  }
  Serial.println("Time synchronized!");
}

String getISOTimestamp() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    return "1970-01-01T00:00:00Z";
  }
  
  char buffer[30];
  strftime(buffer, sizeof(buffer), "%Y-%m-%dT%H:%M:%SZ", &timeinfo);
  return String(buffer);
}

Collect and Upload Sensor Data

void collectAndUploadData() {
  if (!firebase.ready()) {
    Serial.println("Firebase not ready");
    return;
  }
  
  // Read sensors
  float temperature = readTemperature();
  float humidity = readHumidity();
  int lightLevel = readLightLevel();
  String timestamp = getISOTimestamp();
  
  Serial.println("Temperature: " + String(temperature) + "°C");
  Serial.println("Humidity: " + String(humidity) + "%");
  Serial.println("Light: " + String(lightLevel) + " lux");
  
  // Create JSON object
  char jsonBuffer[256];
  snprintf(jsonBuffer, sizeof(jsonBuffer), 
    "{"
      "\"temperature\":%.2f,"
      "\"humidity\":%.2f,"
      "\"light\":%d,"
      "\"timestamp\":\"%s\","
      "\"deviceId\":\"%s\""
    "}",
    temperature, humidity, lightLevel, 
    timestamp.c_str(), deviceId.c_str()
  );
  
  // Push to time-series data
  String pushKey = firebase.push("/sensor_data", jsonBuffer);
  
  if (pushKey.length() > 0) {
    Serial.println("Data uploaded with key: " + pushKey);
  } else {
    Serial.println("Upload failed: " + firebase.getError());
  }
  
  // Update latest reading
  String latestPath = "/latest/" + deviceId;
  if (firebase.set(latestPath, jsonBuffer)) {
    Serial.println("Latest data updated");
  }
}

Complete Logger Example

#define UPLOAD_INTERVAL 60000  // Upload every 60 seconds

unsigned long lastUploadTime = 0;
String deviceId = "ESP32_";

void setup() {
  Serial.begin(115200);
  
  // Connect to WiFi
  setupWiFi();
  
  // Sync time
  setupTime();
  
  // Connect to Firebase
  setupFirebase();
  
  // Set device ID from MAC
  uint8_t mac[6];
  WiFi.macAddress(mac);
  char macStr[13];
  sprintf(macStr, "%02X%02X%02X%02X%02X%02X", 
          mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
  deviceId += macStr;
}

void loop() {
  firebase.loop();
  
  // Check WiFi
  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("WiFi lost, reconnecting...");
    setupWiFi();
  }
  
  // Upload data periodically
  if (millis() - lastUploadTime >= UPLOAD_INTERVAL) {
    lastUploadTime = millis();
    collectAndUploadData();
  }
  
  delay(1000);
}

Database Operations

Set (Write/Update)

// Simple values
firebase.set("/path/to/data", "value");
firebase.set("/count", 42);
firebase.set("/enabled", true);

// JSON strings
firebase.set("/user", "{\"name\":\"John\",\"age\":30}");

Push (Create with auto-generated key)

String key = firebase.push("/messages", "New message");
Serial.println("Created key: " + key);

Get (Read)

String value = firebase.getString("/path/to/data");
int count = firebase.getInt("/count");
bool enabled = firebase.getBool("/enabled");
float temp = firebase.getFloat("/temperature");

Remove (Delete)

if (firebase.remove("/path/to/delete")) {
  Serial.println("Deleted successfully");
}

Exists (Check)

if (firebase.exists("/user/profile")) {
  Serial.println("Profile exists");
} else {
  Serial.println("Profile not found");
}

Data Structure Best Practices

{
  "users": {
    "user1": { "name": "John", "email": "john@example.com" },
    "user2": { "name": "Jane", "email": "jane@example.com" }
  },
  "sensors": {
    "sensor1": { "temp": 22.5, "humidity": 45 }
  }
}

Avoid Deep Nesting

Don’t create structures more than 3-4 levels deep for better performance.

Error Handling

if (!firebase.set("/test", "value")) {
  Serial.println("Error: " + firebase.getError());
  
  // Check connection
  if (!firebase.ready()) {
    Serial.println("Reconnecting...");
    // Reinitialize if needed
  }
}

Key Methods

MethodDescription
begin(client, url, key, email, pass)Initialize Firebase
ready()Check if ready for operations
loop()Maintain connection (call in loop)
set(path, value)Write/update data
push(path, value)Create with auto key
getString(path)Read string value
getInt(path)Read integer value
getBool(path)Read boolean value
getFloat(path)Read float value
exists(path)Check if path exists
remove(path)Delete data
getError()Get last error message

Hardware Requirements

  • ESP32 (required for WiFiClientSecure)
  • WiFi connection
  • Firebase project with Realtime Database

Firebase Setup

  1. Create Firebase project at console.firebase.google.com
  2. Enable Email/Password authentication
  3. Create Realtime Database
  4. Get API key from Project Settings
  5. Note your database URL

Source Files

Example files located at:
  • Basic: example/modules/wifi/firebase/firebasev2/EXAMPLE-firebase-rtdbv2/basic-operations.ino
  • Logger: example/modules/wifi/firebase/firebasev2/EXAMPLE-firebase-rtdbv2/sensor-data-logger.ino

Build docs developers (and LLMs) love