← Back to Blog

connecting-esp32-to-firebase-for-smart-speaker-iot-projects

Fapskom IT

Published

3 min read

Connecting ESP32 to Firebase for Smart Speaker IoT Projects

In the era of distributed computing and the Internet of Things (IoT), integrating low-power hardware with high-performance cloud services is a fundamental pillar. One extremely popular scenario is building an interactive Smart Speaker system connected in real-time to a cloud database.

This article explores in depth the architecture, hardware pinout configurations, Wi-Fi integration, Firebase Realtime Database setup, and C++ firmware coding (Arduino framework) for your ESP32 microcontroller.


1. Architectural Schema & ESP32 Pinout Connections

For a basic IoT Smart Speaker project, the ESP32 requires a few essential peripheral modules, such as an I2S DAC module (like the MAX98357A) for high-quality audio output, and physical buttons for user interaction (for push-to-talk triggers or volume controls).

Here is the recommended pinout mapping for the ESP32 DevKit V1:

Peripheral ModuleModule PinESP32 Pin (GPIO)Functional Description
I2S DAC MAX98357ALRC (Left-Right Clock)GPIO 25Audio channel synchronization signal
BCLK (Bit Clock)GPIO 26I2S clock signal
DIN (Data In)GPIO 22Serial digital audio data line
Push ButtonOUTGPIO 12Button input with internal pull-up
Status LEDVCCGPIO 2Internet & Firebase connection status indicator

2. Setting Up Google Firebase Realtime Database

Before writing code for the ESP32, we must prepare a database instance in the Google Firebase console:

  1. Open the Firebase Console and create a new project named Fapskom-Smart-Speaker.
  2. In the left navigation menu, select Realtime Database and click Create Database.
  3. Choose the closest server location (e.g., singapore for lowest latency from Southeast Asia).
  4. For the initial development phase, set the Rules to test mode so the database can be accessed without strict authentication, or use the following rules for token-authenticated access:
    {
      "rules": {
        ".read": "auth != null",
        ".write": "auth != null"
      }
    }
    
  5. Note down your Database URL (format: https://[project-id]-default-rtdb.firebaseio.com/).
  6. Retrieve your Database Secret Token via Project Settings > Service Accounts > Database Secrets to use as the authentication key in your firmware.

3. Arduino C++ Firmware: Wi-Fi & Firebase Integration

We will write the code using the Arduino IDE or PlatformIO. Make sure you have installed the Firebase ESP32 Client library by Mobizt via your Library Manager. This library is highly efficient in managing the persistent HTTP/Websocket connections needed by Firebase.

Here is the optimal firmware code to connect the ESP32 to Firebase:

#include <WiFi.h>
#include <FirebaseESP32.h>

// 1. Wi-Fi Network Credentials Configuration
#define WIFI_SSID "Fapskom_WiFi_Fiber"
#define WIFI_PASSWORD "KoneksiSuperCepat123"

// 2. Firebase Host & Secret Configuration
#define FIREBASE_HOST "https://fapskom-smart-speaker-default-rtdb.firebaseio.com/"
#define FIREBASE_AUTH "aBcdEfGhIjKlMnOpQrStUvWxYz1234567890"

// Define GPIO status LED pin
#define LED_PIN 2

// Instantiate Firebase objects
FirebaseData firebaseData;
FirebaseAuth auth;
FirebaseConfig config;

void setup() {
  Serial.begin(115200);
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);

  // Initialize Wi-Fi connection
  Serial.print("Connecting to Wi-Fi");
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi Connected!");
  Serial.print("IP Address: ");
  Serial.println(WiFi.localIP());

  // Turn on onboard LED once Wi-Fi is connected
  digitalWrite(LED_PIN, HIGH);

  // Configure Firebase Client
  config.host = FIREBASE_HOST;
  config.signer.tokens.legacy_token = FIREBASE_AUTH;

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

  // Set database connection timeout
  Firebase.setReadTimeout(firebaseData, 1000 * 60);
  Firebase.setwriteSizeLimit(firebaseData, "tiny");
  
  Serial.println("Firebase Initialization Completed!");
}

void loop() {
  // Example: Periodically read audio commands from Firebase
  if (Firebase.getString(firebaseData, "/speaker/command")) {
    if (firebaseData.dataType() == "string") {
      String command = firebaseData.stringData();
      Serial.print("Command Received from Cloud: ");
      Serial.println(command);
      
      // Action logic based on received command
      if (command == "PLAY_MUSIC") {
        Serial.println("Starting audio stream playback...");
        // Insert I2S audio driver trigger code here
      } else if (command == "STOP_MUSIC") {
        Serial.println("Stopping audio stream.");
      }
    }
  } else {
    Serial.print("Failed to read database. Error: ");
    Serial.println(firebaseData.errorReason());
  }

  // Polling delay to prevent server overload (use Firebase Stream for full real-time reactions)
  delay(3000);
}

4. Performance & Reliability Analysis

If you are designing a production-grade IoT device, keep these key points in mind:

  • Polling vs. Websocket Streams: The code above uses periodic polling (Firebase.getString). For sub-100ms response times, replace this with the Firebase.setStreamCallback handler so that the ESP32 receives instant push notifications from Firebase as soon as data changes in the cloud.
  • SRAM Memory Management: The Firebase library relies on dynamic heap buffer allocations. Always call firebaseData.clear() when done, or consider using the ESP32 WROVER variant with external PSRAM if you are processing large audio buffering tasks.

With this integrated architecture, your Fapskom Smart Speaker is now fully equipped to receive real-time text or voice instructions directly from your admin dashboard or mobile application! 🎙️⚡