Tutorial del Internet de las Cosas y Bluetooth con el ESP32
Juan 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++;
}
}
|
_______________________________
|