Primeros pasos con NodeMCU y Firebase


Hoy en día muchos dispositivos que usamos día a día se conectan a internet como la televisión, altavoces inteligentes, refrigeradores, Aires Acondicionados , etc …, dispositivos  que extienden sus funciones primarias  permitiéndoles  interactuar con otros dispositivos en internet siendo de  este modo  posible controlar estos  remotamente.

Como  podemos ver en este blog en numeras  entradas que hablamos de dispositivos de IoT, es  relativamente sencillo construir nuestros  propios dispositivos de IoT con algunos sensores y microcontroladores  como Arduino, NodeMCU, Raspberry  Pi, etcétera , lo cual le permitirán automatizar su hogar apoyándose en estos dispositivos como por ejemplo usando el servicio de Cayenne .

Como ejemplo de lo  sencillo  que puede ser  la construcción de dispositivos   IoT desde un punto de vista más empírico , vamos a ver como usando NodeMCU ESP-12E podemos  acceder a Firebase  para encender y apagar un  LED remoto. 

 

 NodeMCU ESP-12E  es muy barato (unos 6€)   ,  y al tener  wifi incorporado para conectarse a internet,  ya tenemos los elementos suficientes  para conectarnos a  bases de datos avanzadas  gracias a un hardware tan eficiente  y por supuesto los servicios de Firebase.

En esta ocasión aunque  NodeMCU ESP-12E cuenta con un puerto analogico  denominado A0 y 13 pines digitales numerados del D0 al D12, vamos a usar un puerto  interno al que  esta conectado el led interno denominado LED_BUILTIN y  de este modo no hace falta usar ningún componte externo

 

 

NodeMCU 

ESP12E   está basado en Arduino  pero cuenta   también conectividad wifi integrando la propia antena en la placa de circuito impreso en unas  dimensiones de  25.6mm x 34.2mm .  Además, por motivos de reducción de espacio . las  versiones más antiguas  de esta placa no integraban conexión usb  ( para lo cual necesitaremos un USB FTDI   para programarlo o un  controlador Setup CH340g).

Las características principales son las siguientes:

  • Incorpora una MCU de 32-bit de bajo consumo (Tensilica L106)
  • Módulo WiFi de 2.4 GHz
  • RAM de unos 50 kB
  • 1 entrada analógica de 10-bit (ADC)
  • 17 pines de entrada y salida GPIO (de propósito general)

Dentro de los diferentes módulos del ESP8266,(ESP01,ESP03,ESP04,ESP05,…ESP12)  destaca el ESP-12 o el ESP-12E, módulo que utiliza usando NodeMCU ESP-12E para procesar la información.

Básicamente estos módulos incorpora la memoria Flash para almacenar los programas o sketchs y la antena estando internamente los pines del ESP8266 cableados hasta los pines del módulo ESP-12 siendo así más fácil su acceso. 

En todo caso,  esta familia de placas todas cuentan con 11 pines digitales de entrada / salida, todos los pines tienen interruptor / pwm / I2C / 1-wire    siendo su chip principal el  ESP8266 CH340G , siendo una gran diferencia con una placa Arduino es que sólo cuenta  con 1 entrada analógica (entrada máxima de 3,3 V)

 

Respecto al firmware necesitará  subir el código a NodeMCU, pera el cual debería   programar el NodeMCU con el IDE de Arduino,

Veamos con mas detalles  como conseguimos configurar entorno de desarrollo tanto de Arduino como Firebase para que ambos puedan interaccionar entre si

 

Configuracion IDE de Arduino

1. Vamos a usar Arduino IDE para escribir el código . Si no lo tiene instalado  puede descargar la última versión del IDE aquí.

2. Puesto que estamos usando NodeMCU que no es oficialmente compatible con IDE de Arduino, tenemos que agregar el archivo JSON del dispositivo. En el IDE de Arduino añadir esta URL en  :

Archivo  > Preferencias >Gestor de URL’s Adicionales de Tarjetas : http://arduino.esp8266.com/stable/package_esp8266com_index.json

4. Seleccione la placa  pulsando en 

Herramientas > Placa >NodeMCU 1.0

4. Para utilizar la base de datos bases avanzadas en NodeMCU puede descargar la biblioteca de bases avanzadas-arduino que abstrae la API REST de las bases avanzadas  por los qeu necesitamos descargar la librería de Firebase desde github aquí.

5. Incluir el archivo zip descargado (firebase-arduino-master.zip)  en el IDE de Arduino.

Programa > Incluir Libreria  > Añadir .zip >  Seleccionar archivo  .zip descargado en el paso anterior

6. También necesitará instalar la biblioteca de ArduinoJson que puede descargarse desde el IDE de Arduino así mismo. Tenga en cuenta que la versión de la biblioteca no debe 6.x.x  por lo que debe utilizar la última 5.x.x

Programa > Incluir Libreria  > Añadir biblioteca .zip >Buscar  ArduinoJson  por Benoit Blanchon

 

Creación de una base de datos Firebase

7. Cree un nuevo proyecto de Firebase  desde la consola (necesitará   tener  cuenta de google   para crear proyecto de FireBase) y diríjase hacia la sección de base de datos. Seleccione la base de datos en tiempo real de bases avanzadas (firebase real-time database).

8. Necesitamos copiarnos   el código secreto de la base de datos para la autenticación desde el Panel de configuración > Cuentas de servicio.>Mostrar

 
 
 
Una vez copiado la clave secreta  ( que colocaremos en el código de arduino en #define FIREBASE_AUTH «XXXXXXXXXXX»),  nos iremos a la opción de DataBase, y  Realtime Database

9.Ahora debemos agregar un nodo asociado  a la base de datos de firebase. Tenemos que seleccionar Realtime Database  y  pulsar el botón de +  añadiendo el campo led . POsteriormente como veremos mas  adelante,  el  valor de  este campo decidirá si activar o desactivar el LED.

 


El tipo de dato  es booleano  ya  que según lo  pongamos a true o false esto accionará el led en el  NodeMCU ESP-12E  

 

Debemos actualizar la configuración de uso compartido de datos del proyecto NodeMCU.

 
Usar la configuración predeterminada para compartir datos de Google Analytics for Firebase , lo cual tendrá las siguientes consecuencias :
  • Compartir tus datos de Analytics con todas las funciones de Firebase
  • Comparte tus datos de Analytics con nosotros para ayudarnos a mejorar nuestros productos y servicios.
  • Comparte tus datos de Analytics con nosotros para habilitar el servicio de asistencia técnica.
  • Comparte tus datos de Analytics con nosotros para habilitar las comparativas.
  • Comparte tus datos de Analytics con los especialistas en cuentas de Google.
  • Aceptar las condiciones entre responsables del tratamiento de datos. Es obligatorio marcar esta casilla si vas a compartir tus datos de Analytics para mejorar los productos y servicios de Google. Más información


Asimismo  tenemos dos opciones de modo de uso de la BBDD:en modo bloqueo  o en  modo de prueba para el caso que nos corresponde para probar la  funcionalidad
Por último apuntaremos la  instancia de firebase  de acceso  que luego  insertamos en el código de Arduino  en  #define FIREBASE_HOST «xxxxxxxxxx.firebaseio.com/»
 
 
 
 

Configurar el IDE de Arduino y base de datos de Firebase a trabajar juntos

Ahora que hemos realizado todos los procedimientos de configuración,  vamos a comenzar la codificación  del código que ejecutaremos en  nuestro módulo NodeMCU

Para simplificar, vamos a escribir un código sencillo para encender y apagar  el LED interno  del NodeMCU    aunque realmente seria exactamente el mismo código si decidimos usar alguno de los 17 pines de entrada y salida GPIO (de propósito general), pues simplemente tendremos que conectar un led entre masa  y uno de los pines , cambiando la constante LED_BUILTIN  por un valor entero del 0 al 16  correspondiente al  número del puerto al  que hayamos conectado el led.

 

El código empleado es el siguiente:

 

         // By CRN   mayo-2019

#include <ArduinoJson.h>

#include <ESP8266WiFi.h>  

#include <FirebaseArduino.h>

// Firebase

#define FIREBASE_HOST «xxxxxxxxxxxxxxx.firebaseio.com»

#define FIREBASE_AUTH «xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx»

// Wifi

#define WIFI_SSID «wwwwwwwwwwwww»

#define WIFI_PASSWORD «pppppppppppppppppppp»


void setup()

{

Serial.begin(115200); //inicializa el puerto de salida a 115200

pinMode(LED_BUILTIN, OUTPUT);   //configurar el puerto interno como salida 
digitalWrite(LED_BUILTIN, HIGH);   //enciende el led interno

// conectando a la red wifi.

WiFi.begin(WIFI_SSID, WIFI_PASSWORD);  //conexión a la red wifi

delay(2000);   //espera la  conexión

Serial.println(«Conectando…»); 

while (WiFi.status() != WL_CONNECTED)  //bucle para esperar la conexión

{

Serial.println(«.»);  //mientras pintamos un puntito que sacamos por consola

delay(3000);

}

Serial.println(«Conectado»);   // ya hemos conseguido conectar por wifi

Serial.println(WiFi.localIP());   // pintamos la ip asignada 

 

// Configurando conexión a firebase

Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);  //intentamos conectarnos a la base de datos Firebase con nuestras credenciales

//fin configuración

}

 

void loop()  //bucle principal

{

//leer estado en Firebase el valor del registro led  y observar que el valor recuperado al ser booleano se asigna directamente a la variables es booleana

bool isLedOn = Firebase.getBool(«led»); // recuperamos el valor del objeto led de la sesión firebase

 

if (isLedOn)   // condicional  para decidir en función del valor recuperado de firebase si se enciende o no el led

{

digitalWrite(LED_BUILTIN, HIGH);  //encendemos el led 
Serial.println(«LED ON «); 
delay(2000);

}

else

{

digitalWrite(LED_BUILTIN, LOW);    //apagamos el  led 
Serial.println(«LED OFF»);
delay(2000);

}

 

}

 

 

En  el código anterior     en primer lugar se incluyen las librerías  necesarias  para hacer  toda gestión de conexión con Fireabase, así como las comunes de arduino para gestionar json  y las propias del ESP8266 

  • #include <ArduinoJson.h>
  • #include <ESP8266WiFi.h>  
  • #include <FirebaseArduino.h>

 

Después  se definen cuatro variables de tipo constante para almacenar: 

  • #define WIFI_SSID «Nombre de Router Wifi» Cambiaremos en esa a línea  la red del router WiFi al que nos vayamos a conectar
  • #define WIFI_PASSWORD «Contraseña del Router» Cambiaremos en esa  línea contraseña de su router WiFi 
  • #define FIREBASE_HOST «xxxxxxxxx.firebaseio.com» Insertaremos quie elnombre de la instancia de Firebase asociada a su usuario, para ello haremos clic en base de datos ahora se verá el nombre de host .Pulsamos Mostrar en imagen.Copiar el nombre sin el http en el código de Arduino 
  • #define FIREBASE_AUTH «xxxxxxxxxxxxxxxxxxxxxxxxxxx»Insertaremos la palabra secreta de Forebase ,para ello iremos  a Configuración > configuración del proyecto > cuentas de servicio > base de datos secreta .Copiar y pegar la palabra secreta  en el código 

Ahora   toca inicializa el puerto de salida a 115200,  ,configurar el puerto interno como salida  enciende el led interno

Asimismo es necesario  conectar la red wifi, que hacemos con un bucle para esperar la conexión  mientras pintamos un puntito que sacamos por consola

La última parte del bloque de configuración es la  conexión a firebase donde intentamos conectarnos a la base de datos Firebase con nuestras credenciales

LLegamos  ahora al cuerpo  principal (loop )    donde leeremos el  estado en Firebase el valor del objeto  led   y actuaremos   según su valor en el estado lógico de  un pin del GPIO   donde es  interesante  observar que el valor recuperado al ser booleano se asigna directamente a la variables que también es booleana.

La magia  se hace   justo con   esta línea «bool isLedOn = Firebase.getBool(«led»); «  donde  recuperamos el valor del objeto led de la sesión firebase

Finalmente mediante  condicional   decidiremos  en función del valor recuperado de firebase si se enciende o no el led

 

 
 

 

Este código ,  donde  incluiremos nuestras  credenciales del Firebase  y de nuestra red wifi,    lo subiremos   desde el IDE de Arduino  Programas > Subir y en seguida  deberíamos ver el led interno luciendo o apagado en función del estado del objeto led en su base de datos Febase

 

Ahora intente cambiar el valor del objeto led en  la base de datos a verdadero y falso. El led debería  encenderse  o apagarse en función del valor que hayamos seleccionado en el objeto led en Firebase .

Por supuesto   puede ampliar este proyecto si decidimos cualquiera de  los 17 pines de entrada y salida GPIO (de propósito general)  asi  como  manejar  estos    mediante la creación de una aplicación web   o móvil   que accionará los  puertos en lugar de cambiar manualmente el valor de la base de datos Firebase.

Además en este articulo hemos hablado de leer un objeto de Firebase desde  un  NodeMCU   pero también   es posible  enviar datos desde la placa para salvarlos en Firebase  y luego leer estos mediante una aplicación móvil o web, Sin duda el limite esta en nuestra imaginación …

 

 

Cómo corregir errores al reproducir ficheros wav


WAV (o WAVE),  es un formato de audio digital  propiedad de IBM  y de  Microsoft( de ahí que fuese en el pasado  el formato principal usado por Windows) ,  que  ademas admite codificar archivos mono y estéreo a diversas resoluciones y velocidades de muestreo

A pesar de que el formato WAV es compatible con casi cualquier códec de audio se  suele  utilizar principalmente con el formato PCM (no comprimido) , es decir  sin compresión.

La calidad de una grabación de audio digital depende en gran medida de dos factores: la frecuencia de muestreo y el formato de muestra o profundidad de bits. El aumento de la frecuencia de muestreo o el número de bits de cada muestra aumenta la calidad de la grabación, pero también aumenta la cantidad de espacio utilizado por los archivos de audio en un ordenador o en un disco.

 Las frecuencias que son más de la mitad de la frecuencia de muestreo no pueden representarse correctamente en muestras digitales, y, si está presente en el audio original, debe ser eliminado antes de la conversión a digital. «La mitad de la frecuencia de muestreo» representa por lo tanto un límite superior llamada la frecuencia de Nyquist , y la forma de onda analógica debe ser completamente debajo de este límite a estar representados correctamente digitalmente. El oído humano es sensible al sonido patrones con frecuencias entre aproximadamente 20 Hz y 20.000 Hz. Suena fuera de ese rango son inaudibles. Por lo tanto una velocidad de muestreo de 40.000 Hz es el mínimo absoluto necesario reproducir la gama completa de sonidos audibles. Precisamente por este motivo,en un
CD de audio se necesita que el sonido se grabe a 44100 Hz y a 16 bits por cada canal de audio  lo que equivale  a 10Mb /min  de grabación de sonido se consumen unos 10 megabytes de espacio en disco.

 

Al no tener pérdida de calidad, es adecuado para uso profesional    pero   hay que tener en cuenta que   se puede grabar archivos como máximo de 4 gigabytes (equivalentes  aproximadamente a 6,6 horas en calidad de CD de audio) debido a que en la cabecera del fichero se indica la longitud del mismo con un número entero de 32 bits.

Este formato tan popular en los 90’s actualmente  esta en desuso básicamente porque los archivos sin compresión son muy grandes  prefiriéndose actualmente formatos comprimidos con pérdida, como el MP3 o el Ogg Vorbis ya que al ocupar menos espacio  la transferencia a través de Internet es mucho más rápida.

 

 

 

Formatos wav problemáticos

La extensión .wav tiene, internamente, multitud de variantes dependiendo de la compresión, tipo numérico, chunks, etc.

Por tanto, no todos los ficheros  wav se suelen poder  abren  con programas de  reproducción multimedia standard  , pudiéndose reproducir  con estos solo algunos  formatos  como son el raw PCM ( sin compresión) así como los  formatos soportados por microsoft (ADPCM, A law,etc)

Normalmente con programas  standard   no  son soportados   formatos  DVI/IMA ADPCM.

¿Y que podemos hacer cuando nuestro reproductor mutimedia standard como Windows Media Player ,VLC   o Quicktime  Player  dan error al intentar reproducir un fichero wav?

Pues se puede usar un editor de sonido como adobe audition o Audacity para investigar  el formato de ese   fichero wav y cambiarlo a uno soportado o buscar e instalar el codec adecuado para ese formato , pero tenga en cuenta que hay formatos en desuso para los que posiblemente no encuentres un codec adecuado.

Audacity es un editor de audio gratuito y de código abierto que  permite transformar ogg en mp3, transformar mp3 en ogg, transformar vinilos en mp3 u ogg, hacer cualquier tipo de grabación en casa, eliminar ruidos, etc.

Para poder reproducir todos  los formatos necesitamos descargar la dll avformat-55.dll  . Con este motivo existe la aplicación lame para Audiocity que podemos descargar https://lame.buanzo.org/#lamewindl


Para usar LAME (o FFmpeg) con Audacity, puede ponerlo en cualquier lugar que desee, pero la primera vez que quiera exportar un archivo MP3, Audacity le preguntará la ubicación de este archivo, por lo que deseará recordar dónde lo colocó. eso.

Una vez descargada e instalada la aplicación  nos iremos a Editar-> Preferencias->Bibliotecas-> bibliotecas  de importación/exportación

A través de Importar   deberíamos  poder reproducir dicho fichero, pero si no es aun no le es posible , podemos intentar reproducirlo directamente con el propio programa ffmepg desde linea  de comandos

 

ffmpeg

FFmpeg es un marco multimedia gratuito y open software   para decodificar, codificar, transcodificar, mux, demux, transmitir, filtrar y reproducir ficheros de audio .

Todas las compilaciones requieren al menos Windows 7 o Mac OS X 10.10 y tienen licencia como GNU GPL 3.0. T

Podemos descargar ffmpeg en https://ffmpeg.zeranoe.com/builds/

Un descargado el paquete  , descomprimimos  este  dejándolo en una carpeta que nos sea reconocible

Para  probar  si se puede reproducir un fichero wav ,  usaremos este como parámetro  a la utilidad ffplay, es decir  desde el interfaz de comandos ejecutaremos:

>ffplay fichero.wav

 

Veamos un ejemplo :

D:\t124984\Downloads\ffmpeg-20190425-1ae5a64-win64-static\bin>ffplay 708268006750110.wav
ffplay version N-93664-g1ae5a64457 Copyright (c) 2003-2019 the FFmpeg developers
built with gcc 8.3.1 (GCC) 20190414
configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt
libavutil 56. 26.100 / 56. 26.100
libavcodec 58. 52.100 / 58. 52.100
libavformat 58. 27.103 / 58. 27.103
libavdevice 58. 7.100 / 58. 7.100
libavfilter 7. 49.100 / 7. 49.100
libswscale 5. 4.100 / 5. 4.100
libswresample 3. 4.100 / 3. 4.100
libpostproc 55. 4.100 / 55. 4.100
Input #0, wav, from '708268006750110.wav':
Duration: 00:01:19.20, bitrate: 8 kb/s
Stream #0:0: Audio: g729 ([131][0][0][0] / 0x0083), 8000 Hz, 1 channels, s16p, 8 kb/s
79.16 M-A: 0.000 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0

 

 

Si bien esta utilidad suele ser infalible , otra opción  mas practica gráfica es usar un reproductor que incluya la mayoría de los formatos de audio  como puede ser el programa k-lite

 

 K-Lite Codec Pack

Hay cuatro variantes diferentes del paquete de códec K-Lite. Desde un paquete muy pequeño que contiene solo los decodificadores más esenciales hasta un paquete grande y más completo. 

Estos paquetes de códecs son compatibles con Windows XP, Vista, Windows 7, 8, 8.1 y 10. 
Los paquetes incluyen códecs de 32 y 64 bits, por lo que funcionan muy bien en las variantes x86 y x64 de Windows.

Se puede descargar de https://www.codecguide.com/download_k-lite_codec_pack_mega.htm

Como se puede observar este programa prácticamente soporta cualquier formato conocido de codificación , teniendo un interfaz muy limpia e intuitiva capaz de proporcionarnos  incluso la información del tipo de codec utilizado para codificar el fichero wav:

 

 

Este sw tiene  tres  versiones cuyas  diferencias se pueden encontrar detalladas en la comparación de habilidades y la comparación de páginas de contenido .

 

BASIC ¡Pequeño pero extremadamente poderoso!Ya contiene todo lo que necesita para reproducir todos los formatos comunes de archivos de audio y video.Admite la reproducción de:AVI, MKV, MP4, FLV, MPEG, MOV, TS, M2TS, WMV, RM, RMVB, OGM, WebMMP3, FLAC, M4A, AAC, OGG, 3GP, AMR, APE, MKA, Opus, Wavpack, MusepackDVD y Blu-ray (después de descifrado)y muchos mas formatos de audio y video!Proporciona muchas funcionalidades útiles, tales como:Visualización de subtítulosDescodificación de video acelerada por hardwareBitstreaming de audioMiniaturas de videos en ExplorerOpciones de asociación de archivosDetección de códec roto¡y mucho más!  
Estándar Igual que Basic, más:Reproductor multimedia de cine en casa clásico (MPC-HC) 
Este es un excelente reproductor de video. ¡Muy recomendable!MadVR 
Un renderizador de video avanzado con escalado de alta calidad.MediaInfo Lite 
Esta es una herramienta para obtener detalles sobre los archivos multimedia.Esta es la variante recomendada para el usuario promedio. Use esto si no sabe lo que necesita.
 
Completo Igual que el estándar, más:Fuente DC-Bass Mod 
Para decodificar archivos de audio OptimFrog y Tracker (formatos muy raros).GraphStudioSiguiente 
Una herramienta para crear y probar gráficos de DirectShow.
 
Mega Igual que Full, más:Codecs ACM y VFW 
Este tipo de códec se utiliza para la codificación y edición de videos. No son necesarios para la reproducción.Y algunos otros extras opcionales:procesador de audio / video ffdshow 
Esto no es algo que los usuarios regulares necesitan.decodificador de audio / video ffdshow 
Una opción alternativa para el decodificador de audio / video LAV.Recomendamos encarecidamente utilizar los decodificadores LAV (predeterminados), ya que ofrecen el mejor rendimiento, calidad, estabilidad y compatibilidad. ¡Los decodificadores alternativos NO te permiten reproducir más archivos!Filtro AC3 
Una opción alternativa para el decodificador de audio LAV.Haali Media Splitter 
Una opción alternativa para LAV Splitter.Haali Matroska Muxer