Firebase Realtime Database (RTDB) is a powerful, low-latency cloud backend for IoT platforms. It allows embedded devices to sync telemetry data in real-time without the overhead of maintaining custom web servers or configuring MQTT brokers.
This guide provides a step-by-step setup to securely connect an ESP32 microcontroller to Firebase RTDB using Arduino C++.
Before writing any code, we need to configure our database in the Firebase Console:
https://your-project-default-rtdb.firebaseio.com/).To allow secure access, we need database rules that enforce authentication:
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
To connect our ESP32, we'll use the popular Firebase-ESP32 library by Mobizt:
Firebase ESP32 Client and install the latest version by Mobizt.ArduinoJson library by Benoit Blanchon (required for JSON serialization).Here is a complete, minimal sketch to connect your ESP32 to WiFi and stream periodic temperature and humidity readings to the database:
#include <WiFi.h>
#include <FirebaseESP32.h>
// 1. Define Network Credentials
#define WIFI_SSID "YOUR_WIFI_SSID"
#define WIFI_PASSWORD "YOUR_WIFI_PASSWORD"
// 2. Define Firebase Credentials
#define FIREBASE_HOST "your-project-default-rtdb.firebaseio.com"
#define FIREBASE_AUTH "YOUR_DATABASE_SECRET_OR_ID_TOKEN"
// Define Firebase Data Objects
FirebaseData firebaseData;
FirebaseAuth firebaseAuth;
FirebaseConfig firebaseConfig;
unsigned long lastSendTime = 0;
const unsigned long sendInterval = 30000; // 30 seconds
void setup() {
Serial.begin(115200);
// Connect to WiFi
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("\nConnected to WiFi!");
// Configure Firebase Host and Key
firebaseConfig.host = FIREBASE_HOST;
firebaseConfig.signer.tokens.legacy_token = FIREBASE_AUTH;
// Initialize Library
Firebase.begin(&firebaseConfig, &firebaseAuth);
Firebase.reconnectWiFi(true);
}
void loop() {
if (millis() - lastSendTime >= sendInterval) {
lastSendTime = millis();
// Create payload
float temperature = 24.5; // Replace with sensor reading
float humidity = 62.0; // Replace with sensor reading
FirebaseJson json;
json.set("temperature", temperature);
json.set("humidity", humidity);
Serial.println("Pushed telemetry to Firebase...");
if (Firebase.setJSON(firebaseData, "/devices/node_1/telemetry", json)) {
Serial.println("Success! Path: " + firebaseData.dataPath());
} else {
Serial.println("Error: " + firebaseData.errorReason());
}
}
}
For production environments, never commit database secrets or passwords to GitHub repositories. Always load configuration variables securely:
secrets.h header file containing your credentials and add it to your .gitignore.