💻 Programacion de Hardware

Uso de Firebase con esp32

Automatizacion con firebase

JH
Jorge Henao · 8 de mayo de 2026 · 5 min de lectura · 16 visitas
Este proyecto implementa un sistema de control remoto de un dispositivo conectado a un ESP32 a través de Internet, utilizando la plataforma de Firebase Realtime Database. En términos simples, el ESP32 se conecta a una red WiFi y luego se comunica con una base de datos en la nube. Desde esa base de datos se puede cambiar un valor (/control/estado), y el ESP32 lo consulta periódicamente cada 2 segundos. Cuando el valor cambia: Si el estado es 1, el ESP32 activa el pin 2 (enciende un dispositivo, como un relé, LED o actuador). Si el estado es 0, lo desactiva. Además, el sistema incluye: Reconexión automática al WiFi si se pierde la conexión. Sincronización de tiempo (NTP) para garantizar comunicación segura (SSL). Manejo de errores tanto de WiFi como de Firebase. Autenticación anónima para conectarse a la base de datos. En resumen, este proyecto funciona como un interruptor inteligente IoT, donde puedes controlar un dispositivo físico en tiempo real desde cualquier lugar modificando un valor en Firebase.
Firebase es una plataforma de desarrollo de aplicaciones web y móviles de Google, respaldada por la infraestructura de Google Cloud, que actúa como un BaaS (Backend as a Service o backend como servicio). Permite a los desarrolladores crear apps rápidamente sin gestionar servidores, ofreciendo herramientas de autenticación, bases de datos en tiempo real, almacenamiento y análisis.
firebase.ino



// ============================================================

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

// ============================================================
//  CONFIGURACIÓN - Edita estos valores
// ============================================================
#define WIFI_SSID     "George Henao"
#define WIFI_PASSWORD "jorge0"
#define API_KEY       "AIzaSy########hJ2PyE7-yemlNVldn1ye6DqQ"
#define DATABASE_URL  "https://econtrol-2######efault-rtdb.firebaseio.com/"
// ============================================================

#define PIN_CONTROL 2

FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;

unsigned long lastUpdate = 0;
const unsigned long INTERVALO = 2000;

// CORRECCIÓN: usar fbdo.errorReason() en lugar de Firebase.errorReason()
void tokenStatusCallback(TokenInfo info) {
  if (info.status == token_status_error) {
    Serial.printf("Token error: %s\n", fbdo.errorReason().c_str());
  } else {
    Serial.printf("Token estado: %d\n", info.status);
  }
}

void conectarWiFi() {
  Serial.print("Conectando a WiFi");
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

  int intentos = 0;
  while (WiFi.status() != WL_CONNECTED && intentos < 30) {
    delay(500);
    Serial.print(".");
    intentos++;
  }

  if (WiFi.status() == WL_CONNECTED) {
    Serial.println();
    Serial.print("Conectado. IP: ");
    Serial.println(WiFi.localIP());
    Serial.print("RSSI: ");
    Serial.print(WiFi.RSSI());
    Serial.println(" dBm");
  } else {
    Serial.println("\nFallo WiFi. Reiniciando...");
    delay(3000);
    ESP.restart();
  }
}

void setup() {
  Serial.begin(115200);
  delay(500);
  Serial.println("\n=== ESP32 + Firebase ===");

  pinMode(PIN_CONTROL, OUTPUT);
  digitalWrite(PIN_CONTROL, LOW);

  conectarWiFi();

  // Sincronizar tiempo NTP (necesario para SSL)
  Serial.print("Sincronizando tiempo NTP");
  configTime(0, 0, "pool.ntp.org", "time.nist.gov");
  struct tm timeinfo;
  int intentosNTP = 0;
  while (!getLocalTime(&timeinfo) && intentosNTP < 20) {
    delay(500);
    Serial.print(".");
    intentosNTP++;
  }
  Serial.println(intentosNTP < 20 ? "\nTiempo sincronizado!" : "\nNTP falló, continuando...");

  // Configurar Firebase
  config.api_key      = API_KEY;
  config.database_url = DATABASE_URL;
  config.token_status_callback = tokenStatusCallback;

  // Acceso anónimo (strings vacíos = token anónimo)
  Firebase.signUp(&config, &auth, "", "");

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

  fbdo.setResponseSize(4096);

  Serial.print("Conectando a Firebase");
  int intentosFB = 0;
  while (!Firebase.ready() && intentosFB < 20) {
    delay(500);
    Serial.print(".");
    intentosFB++;
  }
  Serial.println(Firebase.ready() ? "\nFirebase listo!" : "\nFirebase timeout.");
}

void loop() {
  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("WiFi perdido. Reconectando...");
    conectarWiFi();
    return;
  }

  if (!Firebase.ready()) {
    Serial.println("Firebase no disponible, esperando...");
    delay(2000);
    return;
  }

  if (millis() - lastUpdate >= INTERVALO) {
    lastUpdate = millis();

    if (Firebase.getInt(fbdo, "/control/estado")) {
      int estado = fbdo.intData();
      Serial.printf("[Firebase] estado = %d -> PIN 2 %s\n",
                    estado, estado == 1 ? "ENCENDIDO" : "APAGADO");
      digitalWrite(PIN_CONTROL, estado == 1 ? HIGH : LOW);
    } else {
      Serial.print("Error Firebase: ");
      Serial.println(fbdo.errorReason());
    }
  }
}