El trinomio anterior nos va a permitir
AppInventor
-> Crear aplicaciones para móviles por medio de programación de bloques. No
es necesario conocer el lenguaje de programación.
Veremos que AppInventor genera algunos errores que nos impide avanzar. En ese caso, cambiaremos a la plataforma de kodular, que es similar pero que, aun mostrando los mismos errores, nos dejara crear la APK
Firebase -> Base de datos de google en tiempo real. Conociendo una clave y la dirección URL de la base de datos, vamos a poder guardar y leer datos para nuestros proyectos
NodeMcu, nuestra placa de desarrollo
Empezamos con App Inventor.
Importante:
1º Como las aplicaciones móviles son casi imprescindibles en todo proyecto, el primer paso es hacer algunas de las prácticas que tenemos en este Tutorial de App Inventor
2º Hacer una aplicación de forma que en pantalla aparezca el Cigala, y cuando se mueva de atrás a adelante, salga su sonido " atraassss"
3º Hacer la tarea que se indica en este tutorial pero con otras palabras diferentes a las mostradas en el video->https://www.youtube.com/watch?v=4JBYXEzrLAg
Tenemos otro video parecido en ->https://www.youtube.com/watch?v=oF59dQM-5YA
4º Si decidimos usar APP inventor, ampliar con proyectos que encontramos en la web ->http://kio4.com/
La base de datos se genera en la página oficial, que nos va a reconocer si ya estamos logeados
Ver y hacer la actividad que viene en ->https://www.youtube.com/watch?v=1vHqDSKnObk
Una vez que tengamos algo de conocimientos sobre el NodeMcu en un breve curso de Luis del Valle sobre Arduino en este LINK , pasaremos a los enlaces entre firebase y NodeMcu
5º Ver video de introducción de cómo crear una base firebase->https://www.youtube.com/watch?v=-DU41rcVcs0 y ->https://www.youtube.com/watch?v=c5_1DUZ5Oko
Visto la teoría general, vamos a por un proyecto concreto que use todo lo anterior.
Veremos cómo abrir la puerta del parking de nuestro Instituto con Kodular, firebase y NodeMcu
Abrimos
nuestro editor Kodular, donde ya hemos añadido las etiquetas para que
aparezcan los datos que necesitamos
Añadimos las etiquetas que necesitamos. He puesto 5, para latitud,
longitud, altura, localización de la calle y otro para mostrar si la puerta
esta abierta o cerrada. Además nuestro botón de abrir la puerta
Vamos al la sección de Blocks y explicamos que hemos añadido
En la imagen tenemos que Cuando el sensor de localización cambia la posición el sensor 1, entonces se ejecuta las siguientes tareas
a) Se pone el texto en la etiqueta 1 el obtenido al tomar la latitud ( esto lo hace el sensor de ubicación )
b ) Se pone el texto en la etiqueta 2 el obtenido al tomar la longitud
c ) Se pone el texto en la etiqueta 3 el obtenido al tomar la altitud
d ) Se pone el texto en la etiqueta 4 el obtenido al obtener la dirección actual
Bloque 2
En el bloque de arriba se trabaja con la base de datos
Cuando hacemos click en el botón, se ejecuta la llamada a la base de datos y guardamos el número 1 en la etiqueta valor ( si no existe, la base de datos, la crea )
Hemos tomado el valor 1 para referir que la puerta se abre. Veremos en nuestro NodeMcu, que si esto ocurre porque hemos dado orden de abrir la puerta, pasado un tiempo el nodemcu parará este valor a 0
En las dos siguientes líneas guardamos los valores de latitud y longitud, necesarias para saber si le coche está cerca de la puerta o no.
En la línea final, ponemos el color de fondo del botón en verde
Bloque 3:
En este bloque, ponemos la etiqueta 5 el contenido que tiene el campo valor de la base de datos
Primero aparece el cuando cambia la base de datos, luego un ejecutar tareas, pero con un condicional
Si comparamos las etiquetas de la base y vemos la denominada valor, entonces ponemos la etiqueta 5 el contenido que hemos obtenido en el campo valor
Luego ponemos el color de fondo del botón como azul
Conexión
del relé y el NodeMcu
En la imagen tenemos la conexión necesaria para nuestro sistema.
Hay que considerar que la salida de la placa es 3,3 voltios y la tensión de trabajo de la placa que tiene el relé es 5 voltios
Aún así, hemos comprobado que es suficiente para que se active el relé cuando recibe la señal
La conexión de la señal ( cable verde ) es la salida de D7 de la placa del NodeMCU
En la parte izquierda tenemos la salida del relé, siendo NA = Normalmente abierto
NC -> Normalmente cerrado
El terminal que falta es el común
Si queremos mandar la señal al motor de la puerta, tenemos que usar el común ( abajo ) y el NA
Esto va muy rápido. Queremos poner nuestra placa en marcha pero todavía no hemos hablado de la interface para programar y , sobre todo, los problemas que nos vamos a encontrar.
En otras secciones de esta web hemos dicho que para poder volcar nuestros proyectos a la placa necesitamos instalar el IDE de arduino, que tenemos en la página oficial, así que el primer paso es hacer la instalación de dicho programa,.
Consejo. Antes de entrar en aguas mas profundas, es mejor probar algo sencillo. Por ejemplo, elegir el ejemplo blink que ya viene en nuestro IDE y comprobar que podemos volcar programas sencillos a nuestra placa, para lo cual, tenemos que instalar el gestor de placa de la familia esp8266 ( ver punto 1 que se indica en caja roja )
Nuestro proyecto necesita librerías extra y en su instalación hemos encontrado los siguientes problemas que detallo:
1º Nuestra placa se llama NodeMcu, pero
al buscarla en el IDE no la encontramos. Tenemos que instalar todos los
gestores de tarjetas en el programa para que se pueda cargar nuestros
proyectos. Para ello, debemos seguir los pasos que se indican en este Manual
->https://www.esploradores.com/instalacion-del-gestor-del-microprocesador-es8266-en-el-ide-de-arduino/
2º Para nuestro proyecto necesitamos tener instalados varias
librerías.
Para ello vamos a Programa-> incluir libreria. Luego tenemos la opción de
añadir la librería si la tenemos en ZIP o bien buscarla ( Administrar
biblioteca ). La
pagina para descargar la primera librería es -> https://github.com/FirebaseExtended/firebase-arduino
3º
También tenemos que instalar la librería ArduinoJson.
JSON (acrónimo de JavaScript Object Notation) es un formato de texto sencillo para el intercambio de datos con base en el lenguaje Javascript, que desde el 2019 ya se considera lenguaje independiente, siendo una alternativa muy potente a XML dentro del intercambio de datos.
Para instalar esta librería, vamos a herramientas-> añadir librería -> Administrar librería y buscarnos arduinojson. Van a salir varias. Si elegimos la última, vamos a tener errores. Estas cosas pasan, así que elegimos la 5.13.5. Hemos comprobado que la última nos genera errores y tuvimos que desinstalar y pasar a la 5.13.5 ( funciones que están en una versión y en otras no )
4º Cuando intentamos cargar nuestro programa, eligiendo la placa Nodemcu 0.9, se muestra un error en la consola.
a la hora de instalar las placas, hemos instalado la úttima versión y este es el problema. El mensaje en el foro , como muchas nos dice
-->*** you might have installed 'esp8266 3.0.0', try changing it to 'esp8266 2.7.X' by the esp8266 community. <- ****
Otra vez tenemos que corregir la versión de alguna librería o gestor de
tarjetas. En este caso, vamos a gestor de placas , ponemos esp8266 y cuando se
muestra la versión cambiamos a la 2.7.0
Ya podemos entrar nuestro programa.
Recordamos que todo lo que empieza por // son comentarios y no se ejecutan en el programa
//Código de Arduino para crear una clave aleatoria en una base de datos firebase mas el código necesario para actuar sobre la variable valor que según sea , se abre ( valor=1 ) o no se abre ( valor=0 )
// Entramos las librerías necesarias
#include <ESP8266WiFi.h> // MODIFICAR SEGÚN VÍDEO!!!
#include <FirebaseArduino.h> // MODIFICAR SEGÚN VÍDEO!!!
#define DEBUG(a) Serial.println(a);
// En la anterior, las funciones DEBUG se usan para visualizar los resultados . mas Info en ->https://www.luisllamas.es/convertir-texto-a-numero-arduino/
int ledPin = 13; // este es el puerto que coincide con D7 marcado en la placa
// Las dos siguientes líneas es para la conexión WIFI
#define SSID "Red wifi" // nombre del wifi
#define PASSWORD "Clave de la wifi" // password del wifi
// Las dos siguientes son para la url de la base de datos y la clave de seguridad
#define FIREBASE_HOST "url de la firebase" //poner direccion de la database de Firebase sin https:// ni el ultimo /
#define FIREBASE_AUTH "mi clave secreta"// poner código secreto. Ruta->>>> Configuración: proyecto-cuentas servicio-secretos de la base de datos. Hay que tener en cuenta que una de las librerías que se usan para (FirebaseArduino), necesita cambiar la clave de fingerprint. Si no se hace, no va a funcionar. Para hacerlo, seguir el manual que viene en ->https://www.youtube.com/watch?v=ZZ5JvSA-Ed8 o bien el resumen que dejamos en el siguiente cuadro
Hay una "huella de dedo" que representa un valor para poder verificar
una conexión de modo seguro, sin ser replicadas por otros que la puedan
interceptar. Para ello, tenemos que añadir el código en hexadecimal a
uno de nuestros archivos. Vemos los pasos
1º Tenemos visitar la web ->https://www.grc.com/fingerprints.htm<-
donde vamos a añadir la url de nuestra firebase, por ejemplo, https://europa-cce982-default-rtdb.europe-west1.firebasedatabase.app/
2º Una vez que tengamos el código en hexadecimal, vamos a la ruta ->
Documents\Arduino\libraries\firebase-arduino-master\src
El nombre del archivo que tenemos que abrir es FirebaseHttpClient.h
3º Al final del archivo tenemos la línea :
static const char kFirebaseFingerprint[] =
"03:D6:42:23:03:D1:0C:06:73:F7:E2:BD:29:47:13:C3:22:71:37:1B"; //
2020-02
donde la clave la tenemos que cambiar por la generada anteriormente.
Guardamos, cerrados el IDE y abrimos de nuevo nuestro proyecto.
Seguimos explicando nuestro programa
int randomNumber; // Se crea una variable para usar como número aleatorio. Esta parte la usamos para comprobar la grabación de un dato en la base de datos. No es útil por ahora en nuestro sistema, se puede usar para completar la práctica con una función más.
void setup() { // Empieza la configuración
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT); // el diodo de la placa lo ponemos como salida. Veremos que ahora mismo enciende de vez en cuando. Si vemos el la respuesta por el puerto serie, observamos un error que tenemos que solucionar. Podemos seguir trabajando sobre el proyecto, pero este error hay que solucionarlo. Posible solución en ->https://youtu.be/9DNS_3Cu7NU
pinMode(ledPin, OUTPUT); // Ponemos nuestro puerto como salida. De ahí al relé
// Secuencias para empezar la conexión a la red WIFI
WiFi.begin(SSID, PASSWORD); // sustituimos por nuestros valores de la red WIFI
Serial.print("Conectamos");
while (WiFi.status() != WL_CONNECTED) { // si no se conecta, imprimimos un punto y esperamos 500 milisegundos.
Serial.print(".");
delay(500);
}
Serial.println(); // estamos aquí porque hemos conectado
Serial.print("Conectado: ");
Serial.println(WiFi.localIP()); // Se imprime la dirección IP
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH); // Ahora conectamos con la base de datos
int n = 0; // valor n a cero ??
void loop() { // empieza el bucle de ejecución del programa
randomNumber = random(1,100);// generamos un número aleatorio del 1 al 100
// Aquí crearemos una etiqueta en Firebase y le asignaremos un valor.
Firebase.setInt("ejemplo", randomNumber);// Se crea la variable entera ejemplo dentro de la base de datos y se pone el valor que se ha generado antes ( ramdomNumber).
//Firebase.SetInt se puede sustituir por otras como Firebase.setString. En vez de crear una variable numérica, se crea una de string. Investigar esto para poder reducir el código y no usar la conversión de string a float que estamos usando en este programa ...
// Mostramos error si no conseguimos la conexión a la base de datos
if (Firebase.failed()) {
Serial.print("Tenemos problemas con la conexión:");
Serial.println(Firebase.error()); // se imprime el error
return; }
delay(100); // esperamos 100 milisegundos
// En la firebase hemos creado la etiqueta Prueba donde se van a guardar los datos que se envían desde la APK. Vamos a mostrarlos
Serial.print("resultado AppInventor: ");
Serial.print("Latitud: "); // imprimimos en consola la palabra Latitud
Serial.println(Firebase.getString("Prueba/latitud"));// Mostramos la variable que hemos obtenido en la conexión. Fijaros que después de Firebase se encuentra getString, que significa Obtener cadena
Serial.print("Longitud: ");
Serial.println(Firebase.getString("Prueba/longitud"));// Lo mismo para la longitud
// tenemos que pasar ahora de string a float para poder comparar valores numéricos. Con los string no se puede
float longitud;
longitud = Firebase.getString("Prueba/longitud").toFloat(); // pasamos de string a float
DEBUG(longitud);
float latitud; // lo mismo para latitud
latitud = Firebase.getString("Prueba/latitud").toFloat();
DEBUG(latitud);
Serial.println(longitud);
Serial.print("Valor del mando: "); // leemos el valor del mando, que recordamos se guarda en el campo "valor". Si es 1 se tiene que poner a funcionar ( abrir puerta )
Serial.println(Firebase.getString("Prueba/valor"));// Se imprime el resultado del campo valor
delay(500);
// Ponemos el condicional para que , cumpliendo unas condiciones, se active. Esas condiciones son que el valor está a 1, que la longitud sea mayor de un determinado valor, que tambien sea menor que otro ( estamos acotando zona ), que la latitud esté entre los dos valores que se indican...
// Tenemos que cambiar esos valores por lo dados en la puerta del IES Mare Nostrum. También se puede reducir código si usamos la expresión a< valor <b. Modificar cuando se compruebe que funciona
if (Firebase.getString("Prueba/valor")=="\"1\"" and longitud > -4.7 and longitud < -4.5 and latitud > 36.2 and latitud < 36.8 );
{Serial.println("Se debe encender el mando: ");
digitalWrite(LED_BUILTIN, LOW);// Se activa led de la placa
digitalWrite(ledPin, HIGH);// se activa puerto de la placa y el reé funciona
delay(5000); // Dejamos 5 segundos el relé encendido
// ahora ponemos el valor a cero a todos los campos de la
base de datos, incluido el campo Valor. Es necesario para no tener la puerta
siempre abierta
Firebase.setString("Prueba/valor", "0");
Firebase.setString("Prueba/latitud", "0");
Firebase.setString("Prueba/longitud", "0");
}
Serial.println("Puerta cerrada: "); // No se da orden de abrir
digitalWrite(LED_BUILTIN, HIGH);// Apagamos el led de la placa
digitalWrite(ledPin, LOW);// apagamos el puerto de la placa
}
Mejoras
A nuestro proyecto básico le podemos añadir mejoras como la activación del sistema cuando se detecte que el coche se aproxima o un sistema de autentificación de usuarios
Respecto a lo primero
Diseñar un sistema ( APK ) que detecte un cambio brusco de movimiento, de forma dada unas condiciones establecidas ( el coche se aproxima a nuestro zona de influencia ( coordenadas ) ) se detecte una parada en seco en la puerta del garaje y, de esa forma, provocando la apertura de la misma
Sería interesante saber los sistemas sobre posicionamiento y decisión. Por ejemplo, que se detecte el coche que llega por la calle y si se detiene antes de la puerta , se abra de forma automática.
¿ Con el podómetro quizás ?.
¿ Grabando las coordenadas a 50 metros de la puerta y tomar la decisión de abrir? .
Trabaja sobre ello para una posible incorporación al proyecto
Práctica final. Desarrollar una aplicación para móviles ( APK ) para controlar la apertura de la puerta de nuestro Instituto, con las mejoras que puedas crear en cuento a facilidad de uso, control de usuarios, bloqueos , mejorar imagen de la APK, aportar información que consideres adecuado, programar horas que no pueda abrirse, etc.
La originalidad y desarrollo dará lugar a mayor o menor nota
Diseño PCB Principios básicos de antenas