| Tutorial del Internet de las Cosas y Bluetooth con el ESP32Juan Antonio Villalpando
 Volver al índice del tutorial  ____________________________ 117B.- ESP8266. FirebaseDB y App Inventor.  https://community.appinventor.mit.edu/t/esp32-mqtt-broker-publish-subscribe-thingspeak/10490   - En el tutorial anterior vimos cómo podiamos cambiar los valores casi en tiempo real mediante el protocolo MQTT y varios Brokers. - Ahora vamos a crear una aplicación con App Inventor y FirebaseDB. Cuando cambie algún valor, casi automáticamente, sin necesidad de refrescar llegará al cliente. - En el ESP8266 pondremos un código que generará dos números aleatorios cada 5 segundos, enviará esos números a FireBaseDB y de ahí a App Inventor, de manera que veremos cómo esos números cambian su valor según vaya llegando a la aplicación. - Además desde App Inventor podremos enviar un número y un texto a FireBaseDB, de ahí llegará a ESP8266 y lo podremos visualizar en el Monitor Serie. _________________________________________________________ - Registro de FireBaseDB y creación de la base de datos.  - Previamente debemos registrarnos en FireBaseDB y crear una base de datos.  https://firebase.google.com/   
 -   
 
 
 
 - Database. Crear base de datos.  
 - Empezar con el modo de prueba.  
 
 
 - Nos situamos en Realtime Database. Esta es nuestra base de datos. - Observa la dirección: https://kio4-3c240.firebaseio.com/ la necesitaremos en el código del ESP32.
 - Más adelante entraremos en esta pantalla para ver los datos almacenados.  
 - Nos situamos en Realtime Database. Reglas y ponemos read y write en true. Pulsamos en Publicar.  
 - Vamos a obtener el código Secreto de la base de datos. 
 - Aquí tenemos el código secreto de la base de datos que necesitaremos para el ESP32.  
 _________________________________ - Código del ESP8266.  - Instalamos esta librería de  ESP8266 Firebase 
  https://github.com/Rupakpoddar/ESP8266Firebase/blob/master/examples/FirebaseDemo/FirebaseDemo.ino  - Esta librería no necesita la clave secret. - Es un poco lenta.   
        
          |  |  
          | 
// Juan A. Villalpando
// http://kio4.com/arduino/117_ESP8266_Firebase.htm
#include <ESP8266Firebase.h>
#include <ESP8266WiFi.h>
// SLOW BUT HASTLE-FREE METHOD FOR LONG TERM USAGE. 
// DOES NOT REQUIRE PERIODIC UPDATE OF FINGERPRINT
Firebase firebase("kio4b-3C240");
const char* ssid = "Nombre_Red_WiFi";
const char* password = "Clave_WiFi";
float temperatura = 25.0;
float humedad = 87.0;  
String texto = "Hola";
String numero = "123";
unsigned long tiempo_actual = 0;
void setup() {
  Serial.begin(115200);
  delay(10);
  Serial.println();
  Serial.print("Connecting with ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
  delay(500);
  Serial.print(".");
  }
  
  Serial.println("");
  Serial.print("WiFi conected. IP: ");
  Serial.println(WiFi.localIP());
}
void loop() {
// RECEIVE from App
    if (firebase.getString("ESP8266/numero")) {
      String numero_fb = firebase.getString("ESP8266/numero");
      if (numero_fb != numero) {
        numero = numero_fb;
        Serial.println(numero);
      }
    }
    if (firebase.getString("ESP8266/texto")) {
      String texto_fb = firebase.getString("ESP8266/texto");
      if (texto_fb != texto) {
        texto = texto_fb;
        Serial.println(texto);
      }
    }
///////////////////////////////////////
// SEND to App 2 random numbers every 5 seconds.
    if((millis()- tiempo_actual)>= 5000){
      temperatura = random(0,10000)/100.0;
      humedad =  random(0,10000)/100.0;
      String datos = (String) temperatura + "|" + (String) humedad;
      Serial.println(datos);
      //firebase.setFloat("ESP8266/temperatura", temperatura);
      //firebase.setFloat("ESP8266/humedad", humedad);
      firebase.setString("ESP8266/datos", datos);
      tiempo_actual = millis();
    }
}
 |  __________________________________________________ 1.- App Inventor. App envía número y texto. Recibe aleatorio.   p117_wemos_firebase_ESP8266.aia
 
 __________________________________________ - Diseño. - En FirebaseURL, debemos poner la dirección de la base de datos, en mi caso: https://kio4-3c240.firebaseio.com/ - En ProjectBucket, cualquier nombre, por ejemplo ESP8266.  
 ____________________________________________ - Bloques. 
 _________________________________________________ - Resultado. 
 __________________________________________________ 2.- Con otra librería. FirebaseArduino.  - Vamos a descargar la librería FirebaseArduino de... https://docs.particle.io/reference/device-os/libraries/f/FirebaseArduino/ - La copiamos en la subcarpeta libraries de Arduino con el nombre de FirebaseArduino. - Con esta librería es necesario la dirección del proyecto de Firebase y el código secret. - Esta librería es más rápida que la anterior.  - Cargamos este código en el ESP8266 
        
          |  |  
          | 
#include <ESP8266WiFi.h>                 
#include <FirebaseArduino.h>
const char* ssid = "Nombre_Red_WiFi";
const char* password = "Clave_WiFi";
float temperatura = 25.0;
float humedad = 87.0;  
String texto = "Hola";
String numero = "123";
unsigned long tiempo_actual = 0;
#define Firebase_direccion "kio4b-60981.firebaseio.com"      
#define Firebase_secret "C5PQ6-secret_Firebase_I22U3OpBx"  
void setup() {
  Firebase.begin(Firebase_direccion, Firebase_secret);
  Serial.begin(115200);
  delay(10);
  Serial.println();
  Serial.print("Connecting with ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
  delay(500);
  Serial.print(".");
  }
  
  Serial.println("");
  Serial.print("WiFi conected. IP: ");
  Serial.println(WiFi.localIP());                            
}
void loop() {
// RECEIVE from App
    if (firebase.getString("ESP8266/numero")) {
      String numero_fb = firebase.getString("ESP8266/numero");
      if (numero_fb != numero) {
        numero = numero_fb;
        Serial.println(numero);
      }
    }
    if (firebase.getString("ESP8266/texto")) {
      String texto_fb = firebase.getString("ESP8266/texto");
      if (texto_fb != texto) {
        texto = texto_fb;
        Serial.println(texto);
      }
    }
///////////////////////////////////////
// SEND to App 2 random numbers every 5 seconds.
    if((millis()- tiempo_actual)>= 5000){
      temperatura = random(0,10000)/100.0;
      humedad =  random(0,10000)/100.0;
      String datos = (String) temperatura + "|" + (String) humedad;
      Serial.println(datos);
      //firebase.setFloat("ESP8266/temperatura", temperatura);
      //firebase.setFloat("ESP8266/humedad", humedad);
     // firebase.setString("ESP8266/datos", datos);
        Firebase.setString("ESP8266/datos", datos); 
      // Firebase.setFloat ("ESP8266/temperatura", temperatura);  
      tiempo_actual = millis();
    }
}
 |  - Esta librería puede tener un problema de actualización. Si no te funciona debes abrir con un editor de texto el archivo de la librería de Arduino: library/FirebaseArduino/src/FirebaseHttpClient.h, al final de ese archivo verás... static const char kFirebaseFingerprint[] ="04 E0 BD B0 F8 63 22 3C 3A 19 7D 92 B6 79 2A 44 BF 77 FC DA";
 ese Fingerprint debe ser actualizado, para ello ve a https://www.grc.com/fingerprints.htm y en la dirección, escribe la dirección del proyecto de Firebase, en mi caso sería kio4b-60981.firebaseio.com Obtienes un número, lo pones en la línea indicada anteriormente, cambiando los dos puntos por espacio.  https://github.com/FirebaseExtended/firebase-arduino/issues/236 __________________________________________________ 3.- Con otra librería. FirebaseESP8266 - Esta es la librería más recomendable.  https://github.com/mobizt/Firebase-ESP8266 - La copiamos en la carpeta libraries/Firebase-ESP8266  - Esta librería vale para el ESP8266 y para el ESP32. - Es rápida. - Necesita la dirección del proyecto y su clave secret. 
        
          |  |  
          | 
#include <Arduino.h>
#if defined(ESP32)
#include <WiFi.h>
#include <FirebaseESP32.h>
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#include <FirebaseESP8266.h>
#elif defined(PICO_RP2040)
#include <WiFi.h>
#include <FirebaseESP8266.h>
#endif
#define WIFI_SSID "Nombre_Red_WiFi"
#define WIFI_PASSWORD "Clave_WiFi"
#define DATABASE_URL "kio4b-60981.firebaseio.com"
FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;
unsigned long sendDataPrevMillis = 0;
unsigned long count = 0;
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();
  config.signer.test_mode = true;
  config.database_url = DATABASE_URL;
  config.signer.tokens.legacy_token = "C5PQ6Ie_clave_secret_de_Firebase_n5I22U3OpBx";
  Firebase.begin(&config, &auth);
  Firebase.reconnectWiFi(true);
  Firebase.setDoubleDigits(5);
}
void loop(){
  if (Firebase.ready() && (millis() - sendDataPrevMillis > 5000 || sendDataPrevMillis == 0)){
    sendDataPrevMillis = millis();
    Serial.printf("Set bool... %s\n", Firebase.setBool(fbdo, F("/test/bool"), count % 2 == 0) ? "ok" : fbdo.errorReason().c_str());
    Serial.printf("Get bool... %s\n", Firebase.getBool(fbdo, FPSTR("/test/bool")) ? fbdo.to<bool>() ? "true" : "false" : fbdo.errorReason().c_str());
    bool bVal;
    Serial.printf("Get bool ref... %s\n", Firebase.getBool(fbdo, F("/test/bool"), &bVal) ? bVal ? "true" : "false" : fbdo.errorReason().c_str());
    Serial.printf("Set int... %s\n", Firebase.setInt(fbdo, F("/test/int"), count) ? "ok" : fbdo.errorReason().c_str());
    Serial.printf("Get int... %s\n", Firebase.getInt(fbdo, F("/test/int")) ? String(fbdo.to<int>()).c_str() : fbdo.errorReason().c_str());
    int iVal = 0;
    Serial.printf("Get int ref... %s\n", Firebase.getInt(fbdo, F("/test/int"), &iVal) ? String(iVal).c_str() : fbdo.errorReason().c_str());
    Serial.printf("Set float... %s\n", Firebase.setFloat(fbdo, F("/test/float"), count + 10.2) ? "ok" : fbdo.errorReason().c_str());
    Serial.printf("Get float... %s\n", Firebase.getFloat(fbdo, F("/test/float")) ? String(fbdo.to<float>()).c_str() : fbdo.errorReason().c_str());
    Serial.printf("Set double... %s\n", Firebase.setDouble(fbdo, F("/test/double"), count + 35.517549723765) ? "ok" : fbdo.errorReason().c_str());
    Serial.printf("Get double... %s\n", Firebase.getDouble(fbdo, F("/test/double")) ? String(fbdo.to<double>()).c_str() : fbdo.errorReason().c_str());
    Serial.printf("Set string... %s\n", Firebase.setString(fbdo, F("/test/string"), "Hello World!") ? "ok" : fbdo.errorReason().c_str());
    Serial.printf("Get string... %s\n", Firebase.getString(fbdo, F("/test/string")) ? fbdo.to<const char *>() : fbdo.errorReason().c_str());
    Serial.println();
    count++;
  }
}
 |    _______________________________ 
    		    |