scieee AI-readable full text Open interactive document viewer

Estudio de domotización y adaptación de una vivienda para personas con una minusvalía

Muñiz López, Andrea

Abstract

Este proyecto trata de la implementación de varias funciones de domotización que permiten facilitar algunas tareas diarias a una persona con alguna incapacidad física. Para ello, se han utilizado placas de desarrollo habituales y de software libre, como son ESP32 y Arduino, para que en un futuro si se tuviese que cambiar alguna pieza con el paso de los años, no se dependiese de una marca especifica a la que comprarla. Estas implementaciones consisten en una mirilla con cámara y sensor de movimiento que envía al usuario un mensaje de Telegram con una foto adjunta del mismo momento si se ha detectado algún movimiento. La segunda funcionalidad es la de una cerradura con apertura mediante huella dactilar. Por último, se ha querido implementar una segunda opción de mirilla en la que se pueda ver en tiempo real lo que está pasando al otro lado de la puerta.

Full text

Documento: Memoria Estudio de domotización y adaptación de una vivienda para personas con minusvalía Autor/Autora: Andrea Muñiz López Director/Directora - Codirector/Codirectora: Manuel Lamich Arocas Titulación: Grado en Ingeniería de Sistemas Audiovisuales Convocatoria: Primavera, 2022/2023 TRABAJO FIN DE ESTUDIOS 1 Agradecimientos Antes de comenzar con el desarrollo de este proyecto, me gustaría agradecérselo a todas aquellas personas que me han apoyado durante estos años de carrera. Primero a mi madre, quien me ha dado las facilidades para poder estudiar en la ciudad que quería, por aguantar mi agobio cuando algo no salía como debía y siempre apoyarme en todas las decisiones. A mi pareja, quien me ha ayudado y apoyado desde el minuto uno con mucha paciencia y amor y me ha acompañado en esta etapa tan importante. A toda mi familia y allegados que, aun estando a kilómetros de distancia, viven y celebran mis logros como suyos. También a todos los que me han acompañado en la carrera, compañeros y profesores. Y, por último, a aquella persona que no confió en mí y me “recomendó” hacer letras por motivarme aún más a conocer mis capacidades y ponerme a prueba a mí misma. Estudio de domotización y adaptación de una vivienda para personas con minusvalía 2 Resumen Este proyecto trata de la implementación de varias funciones de domotización que permiten facilitar algunas tareas diarias a una persona con alguna incapacidad física. Para ello, se han utilizado placas de desarrollo habituales y de software libre, como son ESP32 y Arduino, para que en un futuro si se tuviese que cambiar alguna pieza con el paso de los años, no se dependiese de una marca especifica a la que comprarla. Estas implementaciones consisten en una mirilla con cámara y sensor de movimiento que envía al usuario un mensaje de Telegram con una foto adjunta del mismo momento si se ha detectado algún movimiento. La segunda funcionalidad es la de una cerradura con apertura mediante huella dactilar. Por último, se ha querido implementar una segunda opción de mirilla en la que se pueda ver en tiempo real lo que está pasando al otro lado de la puerta. Abstract This project deals with the implementation of several domotisation functions that makes some daily tasks easily for a person with a physical disability. To do this, it has been used common development and free software boards, such as ESP32 and Arduino, so that in the future, if any part had to be changed over the years, it would not depend on a specific brand to buy it from. These implementations consist of a peephole with a camera and a motion sensor that sends the user a Telegram message with an attached photo done at that moment if any movement has been detected, a lock that can be opened by a fingerprint sensor and a second peephole option in which the user can see in real time what is happening on the other side of the door. 3 Sumario AGRADECIMIENTOS ...................................................................................................... 1 RESUMEN ........................................................................................................................ 2 ABSTRACT ...................................................................................................................... 2 SUMARIO ......................................................................................................................... 3 ÍNDICE DE FIGURAS ....................................................................................................... 5 LISTA DE ABREVIATURAS/GLOSARIO ......................................................................... 6 1. INTRODUCCIÓN .......................................................................................................... 7 1.1 OBJETIVO ............................................................................................................ 7 1.2 ALCANCE ............................................................................................................. 7 1.3 REQUISITOS ......................................................................................................... 8 1.4 JUSTIFICACIÓN ..................................................................................................... 8 2 ENTORNO DE PROGRAMACIÓN ............................................................................ 9 2.1 ARDUINO IDE ....................................................................................................... 9 3 SELECCIÓN DEL HARDWARE ...............................................................................10 3.1 MICROCONTROLADORES ......................................................................................10 3.1.1 ESP32-CAM ...................................................................................................10 3.1.2 Arduino Uno R3 ..............................................................................................10 3.2 SENSORES .......................................................................................................... 11 3.2.1 Sensor PIR ..................................................................................................... 11 3.2.2 Lector de huellas ............................................................................................12 3.3 OTROS COMPONENTES ........................................................................................13 3.3.1 Pantalla OLED ...............................................................................................13 3.3.2 Relé ...............................................................................................................13 3.3.3 Cerradura .......................................................................................................14 3.3.4 Pantalla ILI9341 .............................................................................................14 4 MIRILLA CON SENSOR DE MOVIMIENTO .............................................................16 4.1 DESCRIPCIÓN ......................................................................................................16 4.2 CONEXIONES HARDWARE ....................................................................................16 4.3 DESARROLLO SOFTWARE ....................................................................................18 4.3.1 Funcionalidad .................................................................................................18 4.3.2 Programa .......................................................................................................19 4.4 RESULTADOS .......................................................................................................28 5 CERRADURA BIOMÉTRICA ...................................................................................33 5.1 DESCRIPCIÓN ......................................................................................................33 5.2 CONEXIONES HARDWARE ....................................................................................33 5.3 DESARROLLO SOFTWARE ....................................................................................35 5.3.1 Funcionalidad .................................................................................................35 5.3.2 Programa .......................................................................................................35 5.4 RESULTADOS .......................................................................................................39 6 VIDEO-MIRILLA .......................................................................................................41 6.1 DESCRIPCIÓN ......................................................................................................41 6.2 CONEXIONES HARDWARE ....................................................................................41 6.3 DESARROLLO SOFTWARE ....................................................................................42 Estudio de domotización y adaptación de una vivienda para personas con minusvalía 4 6.3.1 Funcionalidad .................................................................................................42 6.3.2 Programa .......................................................................................................43 6.4 RESULTADOS .......................................................................................................45 7 PRESUPUESTO .......................................................................................................46 8 CONCLUSIONES .....................................................................................................47 9 FUTURAS MEJORAS DEL PROYECTO .................................................................48 10 BIBLIOGRAFÍA ........................................................................................................49 11 APÉNDICES Y LISTADOS DE PROGRAMACIÓN ..................................................50 11.1 APÉNDICE 1: DATA SHEET ESP32-CAM .................................................................50 11.2 APÉNDICE 2: DATA SHEET ARDUINO ......................................................................55 11.3 APÉNDICE 3: CÓDIGO LIBRERÍA CAMERA_PINS.H ....................................................68 5 Índice de figuras FIGURA 1 DIAGRAMA DE PINES ESP32-CAM (FUENTE: HTTPS://PROGRAMARFACIL.COM/ ) ......10 FIGURA 2 DIAGRAMA DE PINES ARDUINO UNO R3 (FUENTE: HTTPS://ROBU.IN/) ...................... 11 FIGURA 3 POWER JACK (FUENTE: HTTPS://SPANISH.ALIBABA.COM) ........................................ 11 FIGURA 4 TIPO DE USB (FUENTE: HTTPS://WWW.JVS-INFORMATICA.COM/) ............................ 11 FIGURA 5 SENSOR PIR (FUENTE: HTTPS://WWW.PROMETEC.NET/) ........................................12 FIGURA 6 FUNCIONAMIENTO SENSOR PIR (FUENTE: HTTPS://HOWTOMECHATRONICS.COM/) ...12 FIGURA 7 SENSOR DE HUELLAS DACTILARES (FUENTE: HTTPS://WWW.AMAZON.ES/) ...............13 FIGURA 8 PANTALLA SSD1306 (FUENTE: HTTPS://SOLECTROSHOP.COM/ES/) ........................13 FIGURA 9 RELÉ (FUENTE: HTTPS://LEANTEC.ES/) .................................................................14 FIGURA 10 CERRADURA SOLENOIDE (FUENTE: HTTPS://UELECTRONICS.COM/) .......................14 FIGURA 11 INTERIOR CERRADURA SOLENOIDE (FUENTE: HTTPS://M.ES.ALIEXPRESS.COM/) .....14 FIGURA 12 PANTALLA ILI9341 (FUENTE: HTTPS://UELECTRONICS.COM/) ................................15 FIGURA 13 CONEXIONADO ESP32-CAM/USB (FUENTE: PROPIA) ..........................................16 FIGURA 14 SENSOR PIR (FUENTE: HTTPS://WWW.PROMETEC.NET/) ......................................17 FIGURA 15 CONEXIONADO ESP32-CAM/SENSOR PIR (FUENTE: PROPIA) ..............................17 FIGURA 16 CONEXIONADO COMPLETO MIRILLA (FUENTE: PROPIA) .........................................18 FIGURA 17 CONEXIÓN Y ESTABILIZACIÓN DEL SENSOR PIR POR MONITOR SERIE, ARDUINO (FUENTE: PROPIA) ......................................................................................................28 FIGURA 18 CONFIRMACIÓN DE ESTABILIZACIÓN DEL SENSOR POR TELEGRAM (FUENTE: PROPIA) .................................................................................................................................29 FIGURA 19 INICIO DE LA CONEXIÓN + ÍNDICE DE ACCIONES POR TELEGRAM (FUENTE: PROPIA) 29 FIGURA 20 RECEPCIÓN MENSAJE POR MONITOR SERIE (FUENTE: PROPIA) .............................29 FIGURA 21 ACTIVACIÓN DEL SENSOR PIR POR TELEGRAM (FUENTE: PROPIA) ........................30 FIGURA 22 RECEPCIÓN MENSAJE DE COMANDO + ENVÍO DE IMAGEN (FUENTE: PROPIA) .........30 FIGURA 23 RECEPCIÓN IMAGEN POR TELEGRAM (FUENTE: PROPIA) ......................................30 FIGURA 24 ACTIVACIÓN DEL FLASH POR TELEGRAM (FUENTE: PROPIA) .................................31 FIGURA 25 ACTIVACIÓN DEL FLASH POR EL MONITOR SERIE (FUENTE: PROPIA) ......................31 FIGURA 26 ÍNDICE DE ACCIONES POR TELEGRAM (FUENTE: PROPIA) .....................................31 FIGURA 27 DESACTIVACIÓN DEL SENSOR PIR POR TELEGRAM (FUENTE: PROPIA) ..................31 FIGURA 28 DESACTIVACIÓN DEL SENSOR PIR POR MONITOS SERIE (FUENTE: PROPIA) ...........32 FIGURA 29 ÍNDICE DE COMANDOS Y AJUSTES POR TELEGRAM (FUENTE: PROPIA) ...................32 FIGURA 30 DESACTIVACIÓN DEL FLASH POR TELEGRAM (FUENTE: PROPIA)............................32 FIGURA 31 DESACTIVACIÓN DEL FLASH POR MONITOR SERIE (FUENTE: PROPIA) .....................32 FIGURA 32 CONEXIÓN ARDUINO CON SENSOR DE HUELLAS (FUENTE: PROPIA).......................33 FIGURA 33 CONEXIÓN ARDUINO CON CERRADURA (FUENTE: PROPIA) ...................................34 FIGURA 34 CONEXIÓN ARDUINO CON PANTALLA OLED (FUENTE: PROPIA) .............................34 FIGURA 35 CONEXIÓN COMPLETA DE CERRADURA BIOMÉTRICA (FUENTE: PROPIA) .................35 FIGURA 36 SIMULACIÓN IMAGEN PANTALLA (FUENTE: PROPIA) ..............................................39 FIGURA 37 RECONOCIMIENTO DEL SENSOR POR MONITOR SERIE (FUENTE: PROPIA) ..............39 FIGURA 38 SIMULACIÓN TEXTO PANTALLA (FUENTE: PROPIA) ................................................39 FIGURA 39 RECONOCIMIENTO DE HUELLA POR MONITOR SERIE (FUENTE: PROPIA) .................39 FIGURA 40 CERRADURA SOLENOIDE EN ESTADO NORMAL (FUENTE: PROPIA) .........................40 FIGURA 41 CERRADURA SOLENOIDE ABIERTA (FUENTE: PROPIA) ...........................................40 FIGURA 42 CONEXIÓN ESP32-CAM/MÓDULO USB (FUENTE: PROPIA) ..................................41 FIGURA 43 CONEXIÓN ESP32-CAM/PANTALLA TFT (FUENTE: PROPIA) ..................................42 FIGURA 44 CONEXIÓN COMPLETA VIDEOPORTERO (FUENTE: PROPIA) ....................................42 FIGURA 45 FUNCIONAMIENTO DE LA MIRILLA. (FUENTE: PROPIA) ...........................................45 Estudio de domotización y adaptación de una vivienda para personas con minusvalía 6 Lista de abreviaturas/Glosario CS: Chip Select IDE: Entorno de desarrollo integrado (por sus siglas en inglés Integrated Development Environment) I2C (IIC): Inter-Integrated Circuit LCD: Liquid Cristal Display MISO: Master-In, Slave-Out MOSI: Master-Out, Slave-In OLED: Organic Light-Emitting Diode SPI: Serial Peripheral Interface TFT: Thin Film Transistor TTL: Transistor - Transistor logic WiFi: Wireless Fidelity 7 1. Introducción 1.1 Objetivo En este trabajo, mediante el estudio y la programación, se busca implementar la automatización de dos funcionalidades cotidianas de casa, que pueden llegar a dificultar la comodidad de una persona que requiere de ayuda para llevarlas a cabo, ya sea por una condición física desfavorable o cualquier otro tipo de limitación, y que no cuenta con ella. Con esta domotización, no solo se busca ayudar a personas con esta condición, aunque el trabajo haya nacido desde esa perspectiva, también pretende una domotización barata, que cualquiera pueda implementar en su vivienda. Por esta misma razón, se quiere conseguir una implementación de código y sistema abierto, para que cualquiera pueda añadir su aportación, ya sea con nuevas aplicaciones o mejorando las ya implementadas, pudiendo conocer toda la información que exista de las placas y componentes utilizados. Siguiendo con esto, todos los componentes, podrán ser sustituidos por los de cualquier marca, de esta forma se consigue una amplitud de campo bastante grande creando infinidad de posibilidades sin tener que limitarse a unas piezas concretas que puede que con el tiempo se dejen de fabricar. El trabajo contará con una parte de hardware, la cual estará formada por todos los sensores y componentes necesarios, así como su cableado y las placas necesarias para su funcionamiento, y otra parte de software formada por los propios programas de implementación. 1.2 Alcance El alcance para este proyecto será la programación unitaria de diferentes aplicaciones que faciliten algunas de las tareas dentro de la vivienda, pudiendo incrementar su alcance o incluso llevar su uso a otros lugares diferentes (oficinas, locales…). Para ello se necesitará: - Diseño e implementación de una aplicación o servidor para interactuar con los elementos programados. - Diseño y creación de un prototipo hardware como muestra de funcionamiento. - Desarrollo e implementación del código necesario para la programación de los componentes utilizando Arduino IDE. Estudio de domotización y adaptación de una vivienda para personas con minusvalía 14 Figura 9 Relé (Fuente: https://leantec.es/) 3.3.3 Cerradura La cerradura utilizada en este trabajo es una cerradura solenoide, lo que significa que está formada por una bobina que crea un campo magnético cuando recibe una corriente continua. Si se observa el interior del componente, se puede ver un motor de corriente continua que es el que contiene la bobina. [9] Figura 10 Cerradura solenoide (Fuente: https://uelectronics.com/) Figura 11 Interior cerradura solenoide (Fuente: https://m.es.aliexpress.com/) Este componente es uno de los que más corriente pueden llegar a consumir de todo el proyecto, ya que, en vez de la corriente de 5V suministrada por el Arduino, es necesario una fuente externa de mínimo 12V para su correcto funcionamiento. 3.3.4 Pantalla ILI9341 Este modelo de pantalla se corresponde con una pantalla TFT. Este tipo de pantallas se caracteriza por su gran calidad a la hora de visualizar imágenes. Esto se debe a que está formado por láminas independientes compuestas de transistores accionados por electrodos. Además, con este método, se consigue que cada pixel de la pantalla se ilumine individualmente consiguiendo que en caso de perder uno, los que estén a su alrededor no se vean afectados. [10] En el caso de la pantalla utilizada en este proyecto, cuenta con algunos pines adicionales que hacen que pueda ser una pantalla táctil e incluso cuenta con un módulo para tarjetas SD, aunque en este proyecto no se han aprovechado estas características. 15 Figura 12 Pantalla ILI9341 (Fuente: https://uelectronics.com/) Estudio de domotización y adaptación de una vivienda para personas con minusvalía 16 4 Mirilla con sensor de movimiento En este apartado se tratarán más en detalle las conexiones del hardware, el software y el funcionamiento de la implementación relacionados con la funcionalidad de la mirilla por sensor de movimiento. 4.1 Descripción Esta implementación consiste en una “mirilla” formada principalmente por una cámara y un sensor de movimiento que se comunican con el usuario mediante mensajes haciendo uso de la aplicación de mensajería Telegram. 4.2 Conexiones Hardware La parte hardware de esta funcionalidad se podría dividir en dos partes. Por un lado, estaría la conexión existente entre la placa ESP32Cam y el adaptador USB y por otro lado la conexión entre dicha placa y los sensores o componentes pertinentes. La primera conexión es la utilizada para poder cargar el código a la placa, además del suministro de voltaje. Como se puede ver en la Figura 13, los pines utilizados para la conexión entre ambos módulos son los correspondientes a GND, +5V, Tx y Rx, en el caso del módulo USB CP2102, y GND, 5V, UOR y UOT, en el caso de la placa. Los dos primeros pines son los que le suministran la corriente necesaria a la placa, los dos siguientes son los que permiten transferir los datos a la misma para que pueda ejecutar el código implementado. Para la conexión de los pines Tx y Rx los cables se cruzan, es decir, el pin puerto Tx del módulo USB se conecta al pin Rx de la ESP32-cam (en la placa identificado como UOR), mientras que el pin Rx del módulo USB se conecta al pin Tx de la placa (UOT según la nomenclatura de Espressif). El intercambio de estos datos se hace mediante comunicación TTL. Su funcionamiento consta de tres fases: - Entrada por el emisor - Separador de fase: transistor conectado al emisor que produce señales en contrafase. - Driver: dos grupos de transistores donde el primero va conectado al emisor de la etapa anterior y drena la corriente para general un bajo nivel a la salida y el segundo va conectado al colector de la etapa anterior y produce el nivel alto a la salida. Figura 13 Conexionado ESP32-Cam/USB (Fuente: propia) 17 La segunda conexión es la que une la placa con el sensor de movimiento, una resistencia de 1kΩ y un diodo led. El sensor de movimiento cuenta con tres pines: - GND: pin encargado de la toma de tierra que se conecta al correspondiente GND de la placa. - VCC: pin que recibe la corriente necesaria para que el sensor funcione y que se conecta al pin 3.3V de la placa. - S: de su nombre en inglés “source”, se encarga de recibir y enviar los datos necesarios. En este caso, en vez de conectarse directamente con la placa ESP32-cam, se conecta a una placa PCB y la información procedente del sensor pasará por un led y una resistencia antes de llegar al microcontrolador. La finalidad de estos dos últimos componentes es saber visualmente cuándo se ha detectado movimiento. Esto se debe a que, durante la implementación del sistema, se desconocía cómo funcionaban los dos potenciómetros que forman parte del sensor y que permiten modificar el rango de alcance del sensor y su sensibilidad. Añadiendo la luz, se podía conocer realmente cuándo se detectaba o no movimiento. En la Figura 14 se pueden observar los potenciómetros citados. En la Figura 15 se pueden ver las conexiones entre sensor y placa y en la Figura 16 el conjunto de todas las conexiones. Figura 14 Sensor PIR (Fuente: https://www.prometec.net/) Figura 15 Conexionado ESP32-Cam/sensor PIR (Fuente: propia) Estudio de domotización y adaptación de una vivienda para personas con minusvalía 18 Figura 16 Conexionado completo mirilla (Fuente: propia) 4.3 Desarrollo Software 4.3.1 Funcionalidad La funcionalidad implementada con este hardware se basa en la idea de poder saber cuándo hay movimiento delante de la puerta de casa o del lugar donde se sitúe la mirilla y porqué. Una vez detectado ese movimiento mediante el sensor, éste avisa a la cámara y ésta se encarga de realizar una foto. Cuando ya se ha hecho la foto, se envía al usuario como un mensaje de Telegram. Desde la perspectiva del usuario, cuando se instala el dispositivo, primero tiene que iniciar la comunicación por Telegram con el comando /start. Cuando la placa recibe este mensaje, su respuesta es un texto en el que se muestran las opciones entre las que deberá escoger el usuario. En el apartado 4.4 Resultados, se pueden observar imágenes reales del funcionamiento. - Capturar foto: hace una foto en el momento sin necesidad de detectar movimiento - Habilitar foto con flash: A partir del momento en el que se realiza esta selección, todas las fotos realizadas por el dispositivo utilizarán el led del que dispone la placa ESP32cam como flash, hasta que se dé la orden contraria. - Deshabilitar la foto con flash: Comando que desactiva la opción anterior en caso de que ésta estuviese activada. - Habilitar foto con PIR: En esta opción es en la que actúa el sensor. Mediante ésta, se activa la comunicación de la placa con el sensor de forma que, si se detecta movimiento, automáticamente se hará una foto y ésta será enviada al usuario. - Deshabilitar foto con PIR: En contraposición a la opción anterior, ésta desactiva el sensor de movimiento, por lo que, si se quiere realizar una foto, se tendrá que hacer manualmente con la primera opción citada. Seguido de esta lista, aparece el estado en el que se encuentran el flash y el sensor. De forma predeterminada aparecerán como apagados (OFF), pero si se seleccionan las opciones 2 o 4, el elemento correspondiente aparecerá como encendido (ON). 19 Además, también se recibirá un mensaje a los 30 segundos de haber seleccionado la opción 4 en el que se informará al usuario de que el sensor ya está estabilizado. Dicha estabilización sirve para normalizar los valores del sensor. Como se ha explicado anteriormente, el sensor se basa en las emisiones infrarrojas, por lo que tiene que registrar los valores normales del entorno para poder compararlos con los del momento de lectura y saber así si hay un nuevo elemento como una persona. De esta forma, los resultados generados por el sensor son muy fiables y se reducen las posibilidades de detectar movimiento inexistente. Tras la recepción de este último mensaje, el usuario comenzará a recibir una imagen y un mensaje de confirmación cada vez que el sensor detecte movimiento. 4.3.2 Programa A continuación, se comentarán los diferentes comandos que conforman el programa implementado en Arduino IDE para la placa ESP32-Cam. Primero se definen las librerías necesarias para el correcto funcionamiento del programa y sus componentes. Entre ellas destacan las librerías de conexión de red (WiFi.h y WiFiClientSecure.h), conexión con Telegram (UniversalTelegramBot.h), procesado de imagen (ArduinoJson.h y img_converters.h) y la librería de la propia cámara (esp.camera.h). #include <Arduino.h> #include <WiFi.h> #include <WiFiClientSecure.h> #include "soc/soc.h" #include "soc/rtc_cntl_reg.h" #include "esp_camera.h" #include <UniversalTelegramBot.h> #include <ArduinoJson.h> #include <EEPROM.h> #include "esp_timer.h" #include "img_converters.h" #include "Arduino.h" #include "fb_gfx.h" #include "esp_http_server.h" Definición de los parámetros de los componentes (cámara, red WiFi y bot de Telegram entre otros). // Modelo de cámara #define PART_BOUNDARY "123456789000000000000987654321" #define CAMERA_MODEL_AI_THINKER //WiFi const char* ssid = "*******"; //Nombre de la red WiFi const char* password = "********"; //Contraseña de la red WiFi //Telegram String BOTtoken = "6116326742:AAGKbodVOG5RZtaTwVF1HK6Yv-GgUDP0wTg"; //Token del bot obtenido con BotFather String CHAT_ID = "908196854"; // ID del chat con el bot obtenido con myidbot // Inicialización del cliente TCP WiFiClientSecure clientTCP; //Inicialización del bot UniversalTelegramBot bot(BOTtoken, clientTCP); // Definición de los pines de la cámara #define PWDN_GPIO_NUM 32 #define RESET_GPIO_NUM -1 #define XCLK_GPIO_NUM 0 #define SIOD_GPIO_NUM 26 #define SIOC_GPIO_NUM 27 #define Y9_GPIO_NUM 35 #define Y8_GPIO_NUM 34 #define Y7_GPIO_NUM 39 #define Y6_GPIO_NUM 36 Estudio de domotización y adaptación de una vivienda para personas con minusvalía 20 #define Y5_GPIO_NUM 21 #define Y4_GPIO_NUM 19 #define Y3_GPIO_NUM 18 #define Y2_GPIO_NUM 5 #define VSYNC_GPIO_NUM 25 #define HREF_GPIO_NUM 23 #define PCLK_GPIO_NUM 22 // Definición de los estados del LED #define ON HIGH #define OFF LOW #define FLASH_LED_PIN 4 // Pin del LED #define PIR_SENSOR_PIN 12 // Pin del sensor #define EEPROM_SIZE 2 //Tamaño de la memoria interna del microcontrolador que se quiere usar Una vez declaradas todas las variables necesarias, se comienzan a desarrollar las diferentes funciones según las indicaciones obtenidas por Telegram. En el código se encuentran los comentarios descriptivos de lo qué hace cada función para mayor comprensión del mismo. //Comprobación cada segundo de si hay un mensaje nuevo int botRequestDelay = 1000; unsigned long lastTimeBotRan; //Estabilización del sensor PIR int countdown_interval_to_stabilize_PIR_Sensor = 1000; unsigned long lastTime_countdown_Ran; byte countdown_to_stabilize_PIR_Sensor = 30; bool sendPhoto = false; //Verificación de si se ha enviado la imagen bool PIR_Sensor_is_stable = false; //Verificación de si se ha estabilizado el sensor bool boolPIRState = false; //Estado del sensor PIR // Estado del envío de las fotos String getValue(String data, char separator, int index) { int found = 0; int strIndex[] = { 0, -1 }; int maxIndex = data.length() - 1; for (int i = 0; i <= maxIndex && found <= index; i++) { if (data.charAt(i) == separator || i == maxIndex) { found++; strIndex[0] = strIndex[1] + 1; strIndex[1] = (i == maxIndex) ? i+1 : i; } } return found > index ? data.substring(strIndex[0], strIndex[1]) : ""; } // Envío de una confirmación del éxito/fracaso del envío de la imagen void FB_MSG_is_photo_send_successfully (bool state) { String send_feedback_message = ""; if(state == false) { send_feedback_message += "ESP32-CAM:\n\n"; send_feedback_message += "Error enviando la imagen.\n"; send_feedback_message += "Sugerencia:\n"; send_feedback_message += "- Vuelve a probar, por favor.\n"; send_feedback_message += "- Resetea ESP32-CAM.\n"; send_feedback_message += "- Cambia el tamaño de visualización (FRAMESIZE). \n"; Serial.print(send_feedback_message); send_feedback_message += "\n\n"; send_feedback_message += "Utiliza el comando /start para ver todos los comandos."; bot.sendMessage(CHAT_ID, send_feedback_message, ""); } else { if(boolPIRState == true) { Serial.println("Imagen enviada con éxito."); send_feedback_message += "ESP32-CAM:\n\n"; send_feedback_message += "El sensor detecta objetos y movimientos.\n"; send_feedback_message += "Imagen enviada con éxito.\n\n"; send_feedback_message += "Utiliza el comando /start para ver todos los comandos."; bot.sendMessage(CHAT_ID, send_feedback_message, ""); } if(sendPhoto == true) { Serial.println("Imagen enviada con éxito."); 21 send_feedback_message += "ESP32-CAM:\n\n"; send_feedback_message += "Imagen enviada con éxito.\n\n"; send_feedback_message += "Utiliza el comando /start para ver todos los comandos."; bot.sendMessage(CHAT_ID, send_feedback_message, ""); } } } // Lectura del sensor PIR (HIGH/1 LOW/0) bool PIR_State() { bool PRS = digitalRead(PIR_SENSOR_PIN); return PRS; } // Apagado/encendido del LED void LEDFlash_State(bool ledState) { digitalWrite(FLASH_LED_PIN, ledState); } // Ajuste y guardado de ajustes para capturar fotos con flash void enable_capture_Photo_With_Flash(bool state) { EEPROM.write(0, state); EEPROM.commit(); delay(50); } // Lectura de los ajustes para capturar imágenes con flash bool capture_Photo_With_Flash_state() { bool capture_Photo_With_Flash = EEPROM.read(0); return capture_Photo_With_Flash; } // Ajuste y guardado de ajustes para capturar fotos con sensor PIR void enable_capture_Photo_with_PIR(bool state) { EEPROM.write(1, state); EEPROM.commit(); delay(50); } // Lectura de los ajustes para capturar fotos con sensor PIR bool capture_Photo_with_PIR_state() { bool capture_Photo_with_PIR = EEPROM.read(1); return capture_Photo_with_PIR; } // Confiuración de la cámara void configInitCamera(){ camera_config_t config; config.ledc_channel = LEDC_CHANNEL_0; config.ledc_timer = LEDC_TIMER_0; config.pin_d0 = Y2_GPIO_NUM; config.pin_d1 = Y3_GPIO_NUM; config.pin_d2 = Y4_GPIO_NUM; config.pin_d3 = Y5_GPIO_NUM; config.pin_d4 = Y6_GPIO_NUM; config.pin_d5 = Y7_GPIO_NUM; config.pin_d6 = Y8_GPIO_NUM; config.pin_d7 = Y9_GPIO_NUM; config.pin_xclk = XCLK_GPIO_NUM; config.pin_pclk = PCLK_GPIO_NUM; config.pin_vsync = VSYNC_GPIO_NUM; config.pin_href = HREF_GPIO_NUM; config.pin_sscb_sda = SIOD_GPIO_NUM; config.pin_sscb_scl = SIOC_GPIO_NUM; config.pin_pwdn = PWDN_GPIO_NUM; config.pin_reset = RESET_GPIO_NUM; config.xclk_freq_hz = 20000000; config.pixel_format = PIXFORMAT_JPEG; // Configuración del tamaño y la calidad de la imagen config.frame_size = FRAMESIZE_VGA; config.jpeg_quality = 30; // entre 10-80 cuanto mayor número menor calidad config.fb_count = 1; // inicialización de la cámara esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { Estudio de domotización y adaptación de una vivienda para personas con minusvalía 22 Serial.printf("Error inicializando la cámara. Error nr: 0x%x", err); Serial.println(); Serial.println("Reiniciar ESP32 Cam"); delay(1000); ESP.restart(); } sensor_t * s = esp_camera_sensor_get(); s->set_framesize(s, FRAMESIZE_SXGA); } // Reaccion ante un nuevo mensaje void handleNewMessages(int numNewMessages) { Serial.print("Nuevo mensaje: "); Serial.println(numNewMessages); // Comprobación del contenido del nuevo mensaje for (int i = 0; i < numNewMessages; i++) { //Comprobación del ID de la conversación // en caso de no coincidir con el definido, avisa String chat_id = String(bot.messages[i].chat_id); if (chat_id != CHAT_ID){ bot.sendMessage(chat_id, "Usuario no autorizado", ""); Serial.println("Usuario no autorizado"); Serial.println("------------"); continue; } // Impresión del mensaje recibido String text = bot.messages[i].text; Serial.println(text); // Comprobación de las condiciones a partir de los comandos recibidos por telegram String send_feedback_message = ""; String from_name = bot.messages[i].from_name; if (text == "/start") { send_feedback_message += "ESP32-CAM:\n\n"; send_feedback_message += "Bienvenido, " + from_name + "\n"; send_feedback_message += "Utiliza estos comandos para interactuar con ESP32CAM.\n\n"; send_feedback_message += "/capture_photo : Hacer una foto nueva\n\n"; send_feedback_message += "Ajustes:\n"; send_feedback_message += "/enable_capture_Photo_With_Flash: Hacer foto con flash LED\n"; send_feedback_message += "/disable_capture_Photo_With_Flash: Hacer foto sin flash LED\n"; send_feedback_message += "/enable_capture_Photo_with_PIR: Hacer foto con sensor PIR\n"; send_feedback_message += "/disable_capture_Photo_with_PIR: Hacer foto sin sensor PIR\n\n"; send_feedback_message += "Estado de los ajustes:\n"; if(capture_Photo_With_Flash_state() == ON) { send_feedback_message += "- Hacer foto con flash = ON\n"; } if(capture_Photo_With_Flash_state() == OFF) { send_feedback_message += "- Hacer foto con flash = OFF\n"; } if(capture_Photo_with_PIR_state() == ON) { send_feedback_message += "- Hacer foto con sensor = ON\n"; } if(capture_Photo_with_PIR_state() == OFF) { send_feedback_message += "- Hacer foto con sensor = OFF\n"; } if(PIR_Sensor_is_stable == false) { send_feedback_message += "\n Estado del sensor PIR:\n"; send_feedback_message += "El sensor PIR está estabilizándose.\n"; send_feedback_message += "Tiempo de estabilización " + String(countdown_to_stabilize_PIR_Sensor) + " segundos restantes. Por favor, espere.\n"; } bot.sendMessage(CHAT_ID, send_feedback_message, ""); Serial.println("------------"); } // Condición para el comando "/capture_photo". if (text == "/capture_photo") { sendPhoto = true; Serial.println("Petición de nueva imagen"); 23 } // Condición para el comando "/enable_capture_Photo_With_Flash". if (text == "/enable_capture_Photo_With_Flash") { enable_capture_Photo_With_Flash(ON); send_feedback_message += "ESP32-CAM:\n\n"; if(capture_Photo_With_Flash_state() == ON) { Serial.println("Hacer foto con flash = ON"); send_feedback_message += "Hacer foto con flash = ON\n\n"; } else { Serial.println("Error activando el flash. Pruebe de nuevo."); send_feedback_message += "Error activando el flash. Pruebe de nuevo.\n\n"; } Serial.println("------------"); send_feedback_message += "/start: Para ver todos los comandos."; bot.sendMessage(CHAT_ID, send_feedback_message, ""); } // Condición para el comando "/disable_capture_Photo_With_Flash". if (text == "/disable_capture_Photo_With_Flash") { enable_capture_Photo_With_Flash(OFF); send_feedback_message += "ESP32-CAM:\n\n"; if(capture_Photo_With_Flash_state() == OFF) { Serial.println("Hacer foto con flash = OFF"); send_feedback_message += "Hacer foto con flash = OFF\n\n"; } else { Serial.println("Error desactivando el flash. Pruebe de nuevo."); send_feedback_message += "Error desactivando el flash. Pruebe de nuevo.\n\n"; } Serial.println("------------"); send_feedback_message += "/start: Para ver todos los comandos."; bot.sendMessage(CHAT_ID, send_feedback_message, ""); } // Condición para el comando "/enable_capture_Photo_with_PIR". if (text == "/enable_capture_Photo_with_PIR") { enable_capture_Photo_with_PIR(ON); send_feedback_message += "ESP32-CAM :\n\n"; if(capture_Photo_with_PIR_state() == ON) { Serial.println("Hacer foto con sensor = ON"); send_feedback_message += "Hacer foto con sensor = ON\n\n"; botRequestDelay = 20000; } else { Serial.println("Error activando el sensor PIR. Pruebe de nuevo."); send_feedback_message += "Error activando el sensor PIR. Pruebe de nuevo.\n\n"; } Serial.println("------------"); send_feedback_message += "/start: Para ver todos los comandos."; bot.sendMessage(CHAT_ID, send_feedback_message, ""); } // Condición para el comando "/disable_capture_Photo_with_PIR". if (text == "/disable_capture_Photo_with_PIR") { enable_capture_Photo_with_PIR(OFF); send_feedback_message += "ESP32-CAM :\n\n"; if(capture_Photo_with_PIR_state() == OFF) { Serial.println("Hacer foto con sensor = OFF"); send_feedback_message += "Hacer foto con sensor = OFF\n\n"; botRequestDelay = 1000; } else { Serial.println("Error desactivando el sensor PIR. Pruebe de nuevo."); send_feedback_message += "Error desactivando el sensor PIR. Pruebe de nuevo.\n\n"; } Serial.println("------------"); send_feedback_message += "/start: Para ver todos los comandos."; bot.sendMessage(CHAT_ID, send_feedback_message, ""); } } } // Captura y envío de imágenes String sendPhotoTelegram() { const char* myDomain = "api.telegram.org"; String getAll = ""; String getBody = ""; // Captura de imágenes Estudio de domotización y adaptación de una vivienda para personas con minusvalía 30 Figura 21 Activación del sensor PIR por Telegram (Fuente: propia) Desde la elección de este comando, se comenzaría a recibir una imagen cada vez que se detectase movimiento por delante del dispositivo. Figura 22 Recepción mensaje de comando + envío de imagen (Fuente: propia) Cuando detecta movimiento el sensor, se observa el mensaje de la Figura 22 que en el chat con el usuario se traduce en el mensaje de la Figura 23. Figura 23 Recepción imagen por Telegram (Fuente: propia) Para cambiar la configuración de la cámara se vuelve al comando /start para volver al índice y se selecciona un nuevo comando. Además, se puede observar que en la parte de “Estado de ajustes” está el estado en el que se encuentran el sensor y el flash. Al haber activado el sensor PIR en el primer caso, se ve que el flash está desactivado, pero el sensor activado. 31 Figura 24 Activación del flash por Telegram (Fuente: propia) Figura 25 Activación del flash por el monitor serie (Fuente: propia) Si se activa el flash teniendo el sensor activado, a partir de ese momento, cada vez que detecte movimiento el sensor, se hará una foto utilizando también el flash del propio microcontrolador. En la Figura 26 se puede ver cómo en el índice aparecen activados tanto el sensor como el flash. Figura 26 Índice de acciones por Telegram (Fuente: propia) Si se seleccionase la opción de desactivar el sensor, se quedaría únicamente activado el flash que se utilizaría cuando se capturase una imagen con la opción /capture_photo. Figura 27 Desactivación del sensor PIR por Telegram (Fuente: propia) Estudio de domotización y adaptación de una vivienda para personas con minusvalía 32 Figura 28 Desactivación del sensor PIR por monitos serie (Fuente: propia) Figura 29 Índice de comandos y ajustes por Telegram (Fuente: propia) Si se desactivase el flash volvería a la configuración por defecto. Figura 30 Desactivación del flash por Telegram (Fuente: propia) Figura 31 Desactivación del flash por monitor serie (Fuente: propia) 33 5 Cerradura biométrica En este apartado se tratarán más en detalle las conexiones del hardware, el software y el funcionamiento de la implementación relacionados con la funcionalidad de la cerradura biométrica. 5.1 Descripción La siguiente implementación se trata del desbloqueo de una cerradura mediante la huella dactilar. En caso de coincidir con alguna de las huellas registradas previamente la puerta se abrirá, en caso contrario, no. 5.2 Conexiones Hardware Por un lado, se encuentra la conexión del sensor de huellas dactilares con el Arduino. Este sensor es el encargado de “leer” la huella y registrarla, en caso de que se estén configurando las huellas por primera vez; comparar la huella actual con alguna de las guardadas y en caso de coincidir compartir esa información con los demás componentes para poder abrir la cerradura, o en caso de no coincidir, denegar el acceso. Figura 32 Conexión Arduino con sensor de huellas (Fuente: propia) Por otro lado, se encuentran el resto de componentes que se encargan de abrir la cerradura en caso de que les llegue una señal afirmativa por parte del lector de huellas. Esta parte está compuesta por un relé el cual está en un estado cerrado hasta que le llega la información de apertura del sensor y entonces cabia su estado. Éste es el que se le comunica a la cerradura para que realice la apertura del resbalón. Además estos dos componentes, relé y cerradura, se encuentran conectados a una fuente de alimentación externa de 12V ya que la proporcionada por el Arduino era insuficiente para un correcto funcionamiento. Estudio de domotización y adaptación de una vivienda para personas con minusvalía 34 Figura 33 Conexión Arduino con cerradura (Fuente: propia) Como último componente se encuentra una pantalla OLED de 0,96” donde se podrán ver diferentes imágenes o textos según lo que esté pasando para informar al usuario del estado de la puerta. La comunicación entre esta pantalla y el arduino es I2C. Dicha comunicación se basa en una arquitectura master-slave, en la funcionalidad implementada el master sería el Arduino, mientras que el esclavo sería la propia pantalla. Este tipo de conexión consiste en que el master inicia una comunicación con el esclavo ya sea para mardarle o pedirle información, por lo que la comunicación es Full Duplex, lo que significa que el master puede recibir y enviar información simultáneamente. Además del intercambio de información, el master se encarga de mantener a todos los esclavos sincronizados gracias a la señal de reloj que proporciona, de esta manera, se consigue disminuir la complejidad del propio sistema en comparación a cómo sería en un sistema asíncrono.[14] Figura 34 Conexión Arduino con pantalla OLED (Fuente: propia) Respecto a la comunicación entre el sensor de huellas dactilares y el arduino, al igual que en la implementación de la mirilla con el sensor de movimiento, es una conexión TTL. 35 Figura 35 Conexión completa de cerradura biométrica (Fuente: propia) 5.3 Desarrollo Software 5.3.1 Funcionalidad La funcionlidad implementada se basa en la idea de poder personalizar al máximo la forma de acceder a una vivienda, siendo la biometría dactilar única en cada usuario, además de complicada de replicar. Esta aplicación funciona de la siguiente manera. Primero, mediante un programa, se registran las huellas a utilizar, existiendo una base de datos bastante amplia que permite registrar hasta 127 huellas. Una vez registradas las huellas escogidas, se utiliza un segundo programa para poner en funcionamiento el resto de componentes. Este segundo programa es el que hacer que puedan funcionar todos los componentes como un único conjunto. Desde el punto de vista del usuario, la forma de saber lo que está pasando en el circuito es mediante la pantalla OLED. Esta pantalla muestra una imagen de una huella mientras no se coloque el dedo en el sensor. Cuando se coloca el dedo, si la huella coincide con alguna de las ya registradas, da la bienvenida al usuario por el nombre con el que esté registrada la huella, en caso contrario sigue apareciendo el icono de la huella. 5.3.2 Programa A continuación, se comentarán los diferentes comandos que conforman el programa implementado en Arduino IDE para la placa Arduino Uno. Primero se definen las librerías necesarias. Entre ellas destacan las librerías referentes a la pantalla (Adafruit_GFX.h y Adafruit_SSC1306) y al sensor de huellas (Adafruit_Fingerprint.h). //Librerías #include <Adafruit_GFX.h> // Librería de gráficos para la pantalla #include <Adafruit_SSD1306.h> // Librería de funcionamiento de la pantalla //#include <SPI.h> // Librería para la comunicación #include <Wire.h> // Definir constantes Estudio de domotización y adaptación de una vivienda para personas con minusvalía 36 #define ANCHO_PANTALLA 128 // ancho pantalla OLED #define ALTO_PANTALLA 64 // alto pantalla OLED Adafruit_SSD1306 display(128, 32, &Wire, -1); #include <Adafruit_Fingerprint.h> #include <SoftwareSerial.h> Declaración de las variables a utilizar. // Imagen mostrada por la pantalla de una huella const unsigned char icon [] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x0f, 0xc1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x67, 0x80, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x30, 0x7c, 0xf1, 0x30, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x07, 0x8c, 0x00, 0x00, 0x00, 0x03, 0x11, 0x80, 0x0c, 0x62, 0x00, 0x00, 0x00, 0x04, 0x4c, 0x00, 0x3b, 0x19, 0x80, 0x00, 0x00, 0x09, 0xb3, 0x1f, 0xe6, 0x82, 0x40, 0x00, 0x00, 0x12, 0x44, 0x80, 0x0f, 0x69, 0x00, 0x00, 0x00, 0x24, 0x9a, 0x30, 0x63, 0x34, 0x80, 0x00, 0x00, 0x09, 0x24, 0xcf, 0x08, 0x94, 0x40, 0x00, 0x00, 0x0b, 0x49, 0xa0, 0x44, 0xda, 0x20, 0x00, 0x00, 0x12, 0x19, 0x65, 0x22, 0x0a, 0xa0, 0x00, 0x00, 0x12, 0x93, 0x48, 0x32, 0x4a, 0x90, 0x00, 0x00, 0x04, 0x92, 0x49, 0x32, 0x5a, 0x80, 0x00, 0x00, 0x04, 0xf2, 0x40, 0x52, 0xd2, 0x40, 0x00, 0x00, 0x04, 0x4e, 0x4f, 0x24, 0x96, 0x60, 0x00, 0x00, 0x04, 0xb4, 0x8f, 0x44, 0xa4, 0xa0, 0x00, 0x00, 0x00, 0xac, 0x90, 0x09, 0x64, 0x90, 0x00, 0x00, 0x01, 0x99, 0x31, 0x90, 0x88, 0x90, 0x00, 0x00, 0x01, 0xb2, 0x22, 0x28, 0x99, 0xa0, 0x00, 0x00, 0x00, 0x44, 0xcc, 0xc9, 0x91, 0x00, 0x00, 0x00, 0x00, 0x19, 0x11, 0x11, 0x2c, 0x40, 0x00, 0x00, 0x00, 0x06, 0x22, 0x32, 0x61, 0x00, 0x00, 0x00, 0x00, 0x08, 0x44, 0x44, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x99, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00 }; //Declaración del sensor de huellas y de su comunicación con la placa Arduino SoftwareSerial mySerial(10, 11); Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); int fingerprintID = 0; //Relé #define RELAY_PIN 4 #define ACCESS_DELAY 5000 Inicialización ejecutada una única vez por compilación al inicio del programa para establecer los valores por defecto de todas las variables y componentes. void setup() { Serial.begin(9600); delay(100); if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("SSD1306 no encontrado")); for(;;); } display.clearDisplay(); // Borrado del contenido de la pantalla display.setTextColor(WHITE); // Definición a nivel alto del texto (color blanco) display.setRotation(0); // Declaración de la orientación de la pantalla (0 = horizontal) display.setTextWrap(false); // Alineación del texto (libre) display.dim(0); //Ajuste del brillo de la pantalla (0 = máximo brillo) startFingerprintSensor(); displayLockScreen(); delay(5); 37 pinMode(RELAY_PIN, OUTPUT); digitalWrite(RELAY_PIN, LOW); } Función que compara la huella que se está leyendo en el momento con todas las que hay registradas. //Función bucle que comprueba si se está posicionando una huella válida void loop() { fingerprintID = getFingerprintID(); delay(50); if(fingerprintID == 1) { displayHuella1(); digitalWrite(RELAY_PIN, HIGH); delay(5000); displayLockScreen(); digitalWrite(RELAY_PIN, LOW); } if(fingerprintID == 2) { displayHuella2(); digitalWrite(RELAY_PIN, HIGH); delay(5000); displayLockScreen(); digitalWrite(RELAY_PIN, LOW); } if(fingerprintID == 3) { displayHuella3(); digitalWrite(RELAY_PIN, HIGH); delay(5000); displayLockScreen(); digitalWrite(RELAY_PIN, LOW); } if(fingerprintID == 4) { displayHuella4(); digitalWrite(RELAY_PIN, HIGH); delay(5000); displayLockScreen(); digitalWrite(RELAY_PIN, LOW); } } Muestra de un mensaje de apertura por la pantalla. // Declaración del mensaje según las huellas registradas void displayHuella1() { display.clearDisplay(); // Borrado de la pantalla display.setTextSize(0); display.setCursor(48, 5); // Posición del cursor display.println("ABIERTO"); // Texto display.setCursor(48, 15); display.println("Bienvenido!"); display.setCursor(48, 25); display.println("ANDREA"); display.display(); // Imprimir por pantalla el mensaje previo } void displayHuella2() { display.clearDisplay(); // Borrado de la pantalla display.setTextSize(0); display.setCursor(48, 5); // Posición del cursor display.println("ABIERTO"); // Texto display.setCursor(48, 15); display.println("Bienvenido!"); display.setCursor(48, 25); Estudio de domotización y adaptación de una vivienda para personas con minusvalía 38 display.println("ALEX"); display.display(); // Imprimir por pantalla el mensaje previo } void displayHuella3() { display.clearDisplay(); // Borrado de la pantalla display.setTextSize(0); display.setCursor(48, 5); // Posición del cursor display.println("ABIERTO"); // Texto display.setCursor(48, 15); display.println("Bienvenido!"); display.setCursor(48, 25); display.println("LUCAS"); display.display(); // Imprimir por pantalla el mensaje previo } void displayHuella4() { display.clearDisplay(); // Borrado de la pantalla display.setTextSize(0); display.setCursor(48, 5); // Posición del cursor display.println("ABIERTO"); // Texto display.setCursor(48, 15); display.println("Bienvenida!"); display.setCursor(48, 25); display.println("ARIEL"); display.display(); // Imprimir por pantalla el mensaje previo } En el caso de que la cerradura se encuentre cerrada y no se esté leyendo ninguna huella, se muestra por la pantalla un icono de una huella. // Visualización del dibujo de huella en la pantalla void displayLockScreen() { display.clearDisplay(); display.drawBitmap(32, 0, icon, 64, 32, 1); display.display(); } Inicialización del sensor void startFingerprintSensor() { Serial.begin(9600); finger.begin(57600); if (finger.verifyPassword()) { Serial.println("Sensor encontrado!"); } else { Serial.println("Sensor no encontrado"); } Serial.println("Esperando una huella válida..."); } Procesado de la imagen de la huella posicionada int getFingerprintID() { uint8_t p = finger.getImage(); if (p != FINGERPRINT_OK) return -1; p = finger.image2Tz(); if (p != FINGERPRINT_OK) return -1; p = finger.fingerFastSearch(); if (p != FINGERPRINT_OK) return -1; // Huella coincidente Serial.print("Encontrado ID #"); Serial.print(finger.fingerID); Serial.print(" con una coincidencia de "); Serial.println(finger.confidence); return finger.fingerID; } 39 5.4 Resultados En esta funcionalidad, los resultados obtenidos se pueden dividir entre los que se observan en los componentes y los que aparecen por el monitor serial. Por la pantalla, al conectar el dispositivo a la corriente, se observa el icono de una huella como se puede observar en la Figura 36. Figura 36 Simulación imagen pantalla (Fuente: propia) Mientras se muestra esa imagen, en el monitor serie se muestra el mensaje de la Figura 37. Figura 37 Reconocimiento del sensor por monitor serie (Fuente: propia) Cuando se posiciona la huella, si coincide con una de las registradas, aparece un mensaje en la pantalla informando sobre la apertura de la cerradura, mientras que en el monitor serie se puede ver cuán coincidente es con la registrada. Figura 38 Simulación texto pantalla (Fuente: propia) Figura 39 Reconocimiento de huella por monitor serie (Fuente: propia) Con la aparición de este último mensaje, el relé actúa pasándole la corriente necesaria a la cerradura y ésta reacciona contrayendo el resbalón permitiéndose así la apertura de la puerta. En caso contrario, la corriente no llegaría hasta el relé y la cerradura se mantendría en el estado por defecto. Estudio de domotización y adaptación de una vivienda para personas con minusvalía 46 7 Presupuesto Uno de los objetivos de este trabajo era conseguir domotizaciones útiles, pero económicas. Por ello, se han conseguido tres implementaciones distintas y con precios variados que no superan los 60€ de forma individual. Si se hace una búsqueda de productos que estén en el mercado parecidos a los implementados, se puede observar que cada uno puede llegar a rondar los 100€, siendo 90€ el precio aproximado de todas las implementaciones de este trabajo juntas, sin tener en cuenta la mano de obra que podría ahorrarse siendo uno mismo el que llevase a cabo la implementación e instalación de los dispositivos. A continuación se adjuntan los enlaces a algunos de estos ejemplos: https://www.amazon.es/JeaTone-Vigilancia-infrarrojos-Instant%C3%A1neamovimiento/dp/B09JSPYLKP/ref=psdc_2454134031_t1_B083M89WC2 https://www.amazon.es/AILRINNI-Cerradura-Inteligente-Contrase%C3%B1asElectr%C3%B3nica/dp/B0BLSDQGXZ/ref=sr_1_3?__mk_es_ES=%C3%85M%C3%85% C5%BD%C3%95%C3%91&crid=2YIGVEN1JYZXS&keywords=cerradura+con+huella&qi d=1686931649&s=tools&sprefix=cerradura+con+huella%2Cdiy%2C109&sr=1-3 Otro de los objetivos destacados es el uso de un software abierto. Al usarse el programa Arduino IDE se cumple con este objetivo evitando utilizar programas de pago que en su mayoría poseen un precio alto. 47 8 Conclusiones El resultado final del proyecto ha sido satisfactorio. Se han logrado los objetivos propuestos al inicio. - Las tres implementaciones del proyecto son de código abierto a nivel de hardware y de software. Todos los componentes utilizados tienen libre acceso a sus datasheet e información de funcionamiento, lo que ayuda a conocer sus posibilidades además de facilitar su implementación. - Los componentes son económicos lo que hace accesible a cualquier persona el poder imitar estas implementaciones. - Además de económicos, los componentes son estándares, es decir, no atan al usuario a consumir los de una marca en concreto, sino que, de ser necesario, con el tiempo se podrían sustituir por otros que haya disponibles en el mercado en ese momento. - Domotizaciones pensadas para personas con minusvalía o que simplemente quieran aprender y automatizar algunas partes de la vivienda. Estudio de domotización y adaptación de una vivienda para personas con minusvalía 48 9 Futuras mejoras del proyecto Respecto a las funcionalidades implementadas, como cualquier cosa, según desde qué perspectiva se mire, se podrían mejorar algunas cosas, por no hablar de que depende del momento en el que se mire, habrá nuevas tecnologías y componentes más baratos y sencillos. Desde el punto de vista del hardware, una futura mejora que podría implementarse es el hecho de utilizar en la cerradura biométrica un microprocesador más económico como puede ser uno de la gama ESP, ya que esto haría que el proyecto tuviese un gasto en materiales aún más bajo, si cabe. También podría unirse en una sola aplicación todas las implementadas en este proyecto. Una posible mejora o continuación del proyecto, habría sido el conectar la mirilla con pantalla al timbre de forma que la pantalla no esté activa todo el tiempo y así consuma menos electricidad, ya que se activaría únicamente si se ha tocado el timbre. Respecto al prototipo, debido a que no es algo definitivo ni que se vaya a comercializar, se podría mejorar en estética, aunque si se llevase a un nivel más real (implementándolo en una puerta real), se debería cambiar el modo de conectar todos los componentes. Los códigos de cada programa y conexiones se pueden consultar en el siguiente enlace: https://github.com/amunizlo/TFG_AndreaML.git 49 10 Bibliografía [1] "【 IDE de arduino 】¿qué es? + partes y versiones ▷ 2023". Internet Paso a Paso. https://internetpasoapaso.com/arduino-ide/ (accedido el 16 de junio de 2023). [2] "IDE Arduino". Aprendiendo Arduino. https://aprendiendoarduino.wordpress.com/2016/12/11/ide-arduino/ (accedido el 16 de junio de 2023). [3] "How PIR sensor works and how to use it with arduino". How To Mechatronics. https://howtomechatronics.com/tutorials/arduino/how-pir-sensor-works-and-how-touse-it-with-arduino/ (Último acceso el 16 de junio de 2023). [4] "¿Qué es un sensor PIR?" 330ohms. https://blog.330ohms.com/2020/12/09/que-es-unsensor-pir/ (Último acceso el 16 de junio de 2023). [5] "Qué es un sensor de movimiento PIR - microsegur blog seguridad". Microsegur. https://microsegur.com/que-es-un-sensor-de-movimiento-pir/ (Último acceso el 16 de junio de 2023). [6] Instructables. "Lector de huella digital arduino". Instructables. https://www.instructables.com/Lector-De-Huella-Digital-Arduino/ (Último acceso el 16 de junio de 2023). [7] "SSD1306 pantalla OLED con Arduino y ESP8266 I2C". Programar fácil con Arduino. https://programarfacil.com/blog/arduino-blog/ssd1306-pantalla-oled-con-arduino/#Que_es_una_pantalla_OLED (Último acceso el 16 de junio de 2023). [8] "El Relé: Para qué es, para qué sirve y qué tipos existen | Blog SEAS". Blog de SEAS. https://www.seas.es/blog/automatizacion/el-rele-para-que-es-para-que-sirve-yque-tipos-existen/ (Último acceso el 16 de junio de 2023). [9] "Arduino - solenoid lock | arduino tutorial". Arduino Getting Started. https://arduinogetstarted.com/tutorials/arduino-solenoid-lock (Último acceso el 16 de junio de 2023). [10] F. Blat. "Entendiendo lo que es TFT, LCD, Plasma y OLED". Xataka - Tecnología y gadgets, móviles, informática, electrónica. https://www.xataka.com/otros/entendiendo-loque-es-tft-lcd-plasma-y-oled (Último acceso el 16 de junio de 2023). [11] "¿Qué es una pantalla TFT? - Inelmatic". Inelmatic Electronics. https://www.inelmatic.com/ES/blog/noticias-1/post/que-es-una-pantalla-tft-30 (Último acceso el 16 de junio de 2023). [12] "Bus SPI – aprendiendo arduino". Aprendiendo Arduino. https://aprendiendoarduino.wordpress.com/category/bus-spi/ (Último acceso el 16 de junio de 2023). [13] M. Lamich, "Práctica 5: Buses de comunicación II (SPI)", 20 de abril de 2021, Practica6.MD.pdf. [14] M. Lamich, "PRACTICA 5: Buses de comunicación I (introducción y I2C)", 20 de abril de 2021, Practica5.MD.pdf. [15] E. Bruno. "#ESP32CAM – flash on / flash off 🔦🔦🔦". DEV Community. https://dev.to/azure/esp32cam-flash-on-flash-off-4nk9 (Último acceso el 16 de junio de 2023). [16] "Iamleon". iamleon. https://iamleon99.blogspot.com/ (Último acceso el 16 de junio de 2023). Estudio de domotización y adaptación de una vivienda para personas con minusvalía 50 11 Apéndices y listados de programación 11.1 Apéndice 1: Data sheet ESP32-Cam 51 Estudio de domotización y adaptación de una vivienda para personas con minusvalía 52 53 Estudio de domotización y adaptación de una vivienda para personas con minusvalía 54 55 11.2 Apéndice 2: Data sheet Arduino Estudio de domotización y adaptación de una vivienda para personas con minusvalía 62 63 Estudio de domotización y adaptación de una vivienda para personas con minusvalía 64 65 Estudio de domotización y adaptación de una vivienda para personas con minusvalía 66 67 Estudio de domotización y adaptación de una vivienda para personas con minusvalía 68 11.3 Apéndice 3: Código librería camera_pins.h #if defined(CAMERA_MODEL_WROVER_KIT) #define PWDN_GPIO_NUM -1 #define RESET_GPIO_NUM -1 #define XCLK_GPIO_NUM 21 #define SIOD_GPIO_NUM 26 #define SIOC_GPIO_NUM 27 #define Y9_GPIO_NUM 35 #define Y8_GPIO_NUM 34 #define Y7_GPIO_NUM 39 #define Y6_GPIO_NUM 36 #define Y5_GPIO_NUM 19 #define Y4_GPIO_NUM 18 #define Y3_GPIO_NUM 5 #define Y2_GPIO_NUM 4 #define VSYNC_GPIO_NUM 25 #define HREF_GPIO_NUM 23 #define PCLK_GPIO_NUM 22 #elif defined(CAMERA_MODEL_ESP_EYE) #define PWDN_GPIO_NUM -1 #define RESET_GPIO_NUM -1 #define XCLK_GPIO_NUM 4 #define SIOD_GPIO_NUM 18 #define SIOC_GPIO_NUM 23 #define Y9_GPIO_NUM 36 #define Y8_GPIO_NUM 37 #define Y7_GPIO_NUM 38 #define Y6_GPIO_NUM 39 #define Y5_GPIO_NUM 35 #define Y4_GPIO_NUM 14 #define Y3_GPIO_NUM 13 #define Y2_GPIO_NUM 34 #define VSYNC_GPIO_NUM 5 #define HREF_GPIO_NUM 27 #define PCLK_GPIO_NUM 25 #elif defined(CAMERA_MODEL_M5STACK_PSRAM) #define PWDN_GPIO_NUM -1 #define RESET_GPIO_NUM 15 #define XCLK_GPIO_NUM 27 #define SIOD_GPIO_NUM 25 #define SIOC_GPIO_NUM 23 #define Y9_GPIO_NUM 19 #define Y8_GPIO_NUM 36 #define Y7_GPIO_NUM 18 #define Y6_GPIO_NUM 39 #define Y5_GPIO_NUM 5 #define Y4_GPIO_NUM 34 #define Y3_GPIO_NUM 35 #define Y2_GPIO_NUM 32 #define VSYNC_GPIO_NUM 22 #define HREF_GPIO_NUM 26 #define PCLK_GPIO_NUM 21 #elif defined(CAMERA_MODEL_M5STACK_V2_PSRAM) #define PWDN_GPIO_NUM -1 69 #define RESET_GPIO_NUM 15 #define XCLK_GPIO_NUM 27 #define SIOD_GPIO_NUM 22 #define SIOC_GPIO_NUM 23 #define Y9_GPIO_NUM 19 #define Y8_GPIO_NUM 36 #define Y7_GPIO_NUM 18 #define Y6_GPIO_NUM 39 #define Y5_GPIO_NUM 5 #define Y4_GPIO_NUM 34 #define Y3_GPIO_NUM 35 #define Y2_GPIO_NUM 32 #define VSYNC_GPIO_NUM 25 #define HREF_GPIO_NUM 26 #define PCLK_GPIO_NUM 21 #elif defined(CAMERA_MODEL_M5STACK_WIDE) #define PWDN_GPIO_NUM -1 #define RESET_GPIO_NUM 15 #define XCLK_GPIO_NUM 27 #define SIOD_GPIO_NUM 22 #define SIOC_GPIO_NUM 23 #define Y9_GPIO_NUM 19 #define Y8_GPIO_NUM 36 #define Y7_GPIO_NUM 18 #define Y6_GPIO_NUM 39 #define Y5_GPIO_NUM 5 #define Y4_GPIO_NUM 34 #define Y3_GPIO_NUM 35 #define Y2_GPIO_NUM 32 #define VSYNC_GPIO_NUM 25 #define HREF_GPIO_NUM 26 #define PCLK_GPIO_NUM 21 #elif defined(CAMERA_MODEL_M5STACK_ESP32CAM) #define PWDN_GPIO_NUM -1 #define RESET_GPIO_NUM 15 #define XCLK_GPIO_NUM 27 #define SIOD_GPIO_NUM 25 #define SIOC_GPIO_NUM 23 #define Y9_GPIO_NUM 19 #define Y8_GPIO_NUM 36 #define Y7_GPIO_NUM 18 #define Y6_GPIO_NUM 39 #define Y5_GPIO_NUM 5 #define Y4_GPIO_NUM 34 #define Y3_GPIO_NUM 35 #define Y2_GPIO_NUM 17 #define VSYNC_GPIO_NUM 22 #define HREF_GPIO_NUM 26 #define PCLK_GPIO_NUM 21 #elif defined(CAMERA_MODEL_AI_THINKER) #define PWDN_GPIO_NUM 32 #define RESET_GPIO_NUM -1 #define XCLK_GPIO_NUM 0 #define SIOD_GPIO_NUM 26 #define SIOC_GPIO_NUM 27 Estudio de domotización y adaptación de una vivienda para personas con minusvalía 70 #define Y9_GPIO_NUM 35 #define Y8_GPIO_NUM 34 #define Y7_GPIO_NUM 39 #define Y6_GPIO_NUM 36 #define Y5_GPIO_NUM 21 #define Y4_GPIO_NUM 19 #define Y3_GPIO_NUM 18 #define Y2_GPIO_NUM 5 #define VSYNC_GPIO_NUM 25 #define HREF_GPIO_NUM 23 #define PCLK_GPIO_NUM 22 #elif defined(CAMERA_MODEL_TTGO_T_JOURNAL) #define PWDN_GPIO_NUM 0 #define RESET_GPIO_NUM 15 #define XCLK_GPIO_NUM 27 #define SIOD_GPIO_NUM 25 #define SIOC_GPIO_NUM 23 #define Y9_GPIO_NUM 19 #define Y8_GPIO_NUM 36 #define Y7_GPIO_NUM 18 #define Y6_GPIO_NUM 39 #define Y5_GPIO_NUM 5 #define Y4_GPIO_NUM 34 #define Y3_GPIO_NUM 35 #define Y2_GPIO_NUM 17 #define VSYNC_GPIO_NUM 22 #define HREF_GPIO_NUM 26 #define PCLK_GPIO_NUM 21 #else #error "Camera model not selected" #endif