I-Configurar nuestro proyecto de Firebase
Siguiendo con la serie de entradas para desarrollar un prototipo de IoT para Salud, vamos a ver cómo conectar el microcontrolador ESP32 con Firebase (plataforma integrada en la nube de Google) para poder enviar los datos de los sensores y gestionarlos en streaming.
Lo primero que vamos ha hacer para conectar la placa ESP32 con Firebase es acceder a Firebase (https://firebase.google.com/), pulsar en comenzar y a continuación añadir un proyecto de Firebase (que deberemos haber creado anteriormente en la consola de Google; si creamos un proyecto nuevo en Firebase no presente en la nube de Google, nos dará error más tarde cuando creemos la tabla e intente conectarse a Google).



Una vez seleccionado el proyecto y pulsado el botón de Continuar, Google te avisará de una serie de cosas que debes tener en cuenta al añadir un nuevo proyecto de Firebase (p.e. lo relativo al método de pago, sea Plan Blaze, Plan Spark u otra modalidad). Una vez leídas pulsamos Continuar y por último, Google te dará la opción de añadir Google Analytics a tu proyecto. Para este post no será necesario por lo que de-seleccionamos “Habilitar Google Analytics en este proyecto” y pulsamos Continuar.

Una vez creado se nos abrirá nuestro proyecto de Firebase.

Para nuestro código de Arduino necesitaremos indicarle el Host de nuestro proyecto y la clave de autentificación. Para saber cual es nuestro host pulsamos en el signo de Web que abrirá una ventana donde nos pedirá un apodo para nuestra aplicación y a continuación nos dará el SDK de la aplicación y de este copiaremos en una nota de texto el host .



Una vez que hemos copiado la dirección de nuestro host y hemos vuelto a la consola, tenemos que copiar la clave de autentificación en la nota de texto. Para conseguir la clave de autentificación debemos de pulsar en el icono de configuración de la barra de tareas y seleccionar “Configuración del proyecto”.


Una vez que estamos en la configuración del proyecto vamos a la ventana “Cuentas de servicio” y a continuación pulsamos en “Secretos de la base de datos”.

En la parte inferior veremos un Secreto oculto. Para poder copiar su contenido situamos el ratón encima de este y nos saldrá la opción de mostrar, la pulsamos y copiamos la clave en nuestra nota.

Ahora ya tenemos los datos necesarios para conectar la placa esp32 con nuestro proyecto de firebase.
Creación de base de datos dentro de Firebase
El siguiente paso es crear una base de datos para guardar nuestros datos recogidos por la placa esp32, para esto debemos de pulsar en el menu lateral “Database” o "Realtime Database" (lo han cambiado recientemente) y pulsar en el botón “Crear base de datos”.


Tras pulsar el botón “Crear base de datos” se nos abrirá un popup donde seleccionaremos el modo con el que deseamos empezar (en este caso yo seleccionaré modo de prueba) y pulsare siguiente (o Habilitar).

En el siguiente paso definimos la ubicación de Cloud Firestore y pulsamos el botón de “Listo”. Tras esto se nos creará la base de datos.
El último paso que debemos hacer para tener totalmente configurado nuestro proyecto de Firebase es comprobar que las reglas de nuestra base de datos estén correctamente configuradas. Para esto, seleccionaremos nos situaremos en nuestra base de datos en tiempo real.


Iremos a la pestaña de reglas y comprobaremos que la lectura y escritura de nuestra base de datos esté disponible

Veremos algo parecido a lo siguiente (para este pantallazo he cambiado el proyecto, no te lies con eso)

Y deberemos cambiar las reglas "read" and "write" a "true".
Deberemos ver algo así:

Una vez publicadas las nuevas reglas ya tenemos Firebase listo para recibir datos de Arduino.
II-Configuración y código de Arduino
Librerías necesarias
Lo primero que vamos ha hacer es instalar las librerías necesarias. La librería principal que necesitamos es la que se encargará de conectar Firebase con la placa Esp32.
Para descargarla debemos ir al siguiente enlace: https://github.com/mobizt/Firebase-ESP32.
Una vez el proyecto de Github nos instalamos descargamos la librería en .zip y la añadimos a Arduino.



Una vez añadida esta librería, iremos al Gestor de Librerías de Arduino (Programa -> Incluir Librería -> Administrar Bibliotecas…) y nos descargaremos la siguiente librería.

Para saber la fecha y hora a la que grabamos los datos vamos a incluir la siguiente librería: https://github.com/taranais/NTPClient
Es importante que esta última librería nos la descarguemos de github y no del Gestor de Librerías en el IDE de Arduino.
Código de Arduino
Al descargarnos la primera librería, nos descargamos una serie de ejemplos de la conexión de Firebase con Arduino. Estos los podemos localizar en:

En este caso no vamos a utilizar un ejemplo, el código es el siguiente (¡¡¡ojo con las comillas!!! Nuestra web y el html alteran caracteres en el código):
#include <WiFi.h>
#include
#include <NTPClient.h>
#include <WiFiUdp.h>
#define FIREBASE_HOST "YOUR_FIRABSE_HOST"
#define FIREBASE_AUTH "YOUR_FIREBASE_AUTH"
#define WIFI_SSID "YOUR_WIFI_SID"
#define WIFI_PASSWORD "YOUR_WIFI_PASSWORD"
// Define NTP Client to get time
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);
// Variables to save date and time
String formattedDate;
String dayStamp;
String timeStamp;
//Define FirebaseESP32 data object
FirebaseData firebaseData;
FirebaseJson json;
String path = "/esp32";
String user = "jazmin";
String sensor = "prueba";
int valuePrueba = 12;
void setup()
{
Serial.begin(115200);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(300);
}
Serial.println();
Serial.print("Connected with IP: ");
Serial.println(WiFi.localIP());
Serial.println();
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
Firebase.reconnectWiFi(true);
//Size and its write timeout e.g. tiny (1s), small (10s), medium (30s) and large (60s).
Firebase.setwriteSizeLimit(firebaseData, "tiny");
}
void loop()
{
while(!timeClient.update()) {
timeClient.forceUpdate();
}
formattedDate = timeClient.getFormattedDate();
json.clear().add("Value", valuePrueba);
json.add("Date", formattedDate);
if (Firebase.pushJSON(firebaseData, path + "/" + user + "/" + sensor, json))
{
Serial.println("PASSED");
Serial.println("PATH: " + firebaseData.dataPath());
Serial.print("PUSH NAME: ");
Serial.println(firebaseData.pushName());
Serial.println("ETag: " + firebaseData.ETag());
Serial.println("------------------------------------");
Serial.println();
}
else
{
Serial.println("FAILED");
Serial.println("REASON: " + firebaseData.errorReason());
Serial.println("------------------------------------");
Serial.println();
}
delay(1000);
}
Una vez añadidos el Host de nuestro proyecto, la clave de autentificación y los datos del wifi compilamos y subimos el proyecto.
Abrimos el monitor serie y si todo esta correctamente veremos como se van pasando los datos:

En nuestra base de datos de tiempo real veremos como se van añadiendo los diferentes datos. Para ello haremos click en "Realtime Database" del menú hamburguesa (a la izda. de Firebase) e iremos abriendo las ramas del árbol de la derecha: proyecto, base de datos, usuario, prueba, dato.
