3 AGRADECIMIENTOS En primer lugar, agradezco sinceramente a mi mamá, quien siempre creyó que lograría mis metas y me brindó su apoyo incondicional en todas las etapas de mi vida, las cuales formaron la persona que soy. Agradezco también su compañía y ayuda durante la implementación de este trabajo. A mi familia, quienes me acompañaron en esta importante etapa, en especial a mi abuela, por cuidarme y orientarme con sus consejos, a mis hermanos, por su tolerancia y preocupación. A todos los profesores que formaron parte de la etapa Universitaria y que me inculcaron sus conocimientos y experiencias, ayudando a mi formación profesional, permitiendo concretar y finalizar este trabajo de titulación. Especialmente a quienes forman parte de la revisión de este trabajo. 4 INDICE RESUMEN 9 ABSTRACT 10 INTRODUCCIÓN 11 OBJETIVO GENERAL 12 OBJETIVOS ESPECÍFICOS 12 RESTRICCIONES 13 MÉTODO DE TRABAJO 13 CAPÍTULO I: PLANTEAMIENTO DEL PROBLEMA 14 1.1. Panorama actual de energía Eléctrica en Chile 14 1.2. Consumo energía eléctrica en Sector Residencial 15 1.3. Conclusión de estudios 18 CAPÍTULO II: PROPUESTA GENERAL DE SOLUCIÓN 19 2.1. Interfaz de control 20 2.2. Esquema general 21 CAPÍTULO III: DISCUSIÓN BIBLIOGRÁFICA Y TEORÍA ASOCIADA 22 3.1. Trabajos relacionados 22 3.2. Conceptos previos 26 5 CAPÍTULO IV: DISEÑO HARDWARE 30 4.1. Requerimientos del proyecto 30 4.2. Diseño general de solución 32 4.3. Comunicación entre nodos de procesamiento y maestro 33 4.4. Sistema de control de iluminación 35 4.5. Sistema de control de calefacción 36 4.6. Sistema de control de dispositivos standby 37 4.7. Sistema de control de grifos e inundación 38 4.8. Sistema de monitoreo de fugas de calor y gas 39 4.9. Sistema de interfaz de usuario, control remoto 39 4.10. Comunicación mediante servidor TCP/IP 40 4.11. Suministro energético de sistema domótico 41 CAPITULO V: ELECCIÓN DE COMPONENTES 43 5.1. Nodo maestro 43 5.2. Nodo de procesamiento 44 5.3. Actuadores 45 5.4. Sensores 47 5.5. Dispositivo de suministro de energía 51 CAPÍTULO VI: DESCRIPCIÓN DE PROTOTIPO A CONSTRUIR 52 6.1. 52 Descripción de casa para diseñar e implementar prototipo 6 6.2. Planificación de sistema 53 CAPÍTULO VII: DISEÑO DE SOFTWARE Y PROGRAMACIÓN DE TARJETAS 56 7.1. Descripción de aplicación desarrollada para interfaz usuario 57 7.2. Descripción de aplicación desarrollada para nodo maestro 61 7.3. Descripción de aplicación desarrollada para nodo de procesamiento 61 CAPÍTULO VIII: IMPLEMENTACIÓN DEL SISTEMA 63 8.1. Descripción de método de implementación 63 8.2. Especificación de maqueta 63 8.3. Montaje de sistema eléctrico 64 8.4. Montaje electrónico 66 8.5. Conexión de nodo maestro y red LAN 68 8.6. Control remoto en distintos dispositivos 68 CAPÍTULO IX: RESULTADOS DE PROTOTIPO Y CÁLCULO DE AHORRO 71 9.1. 71 Resultado prototipo 9.1.1. Etapa nodo de procesamiento 71 9.1.2. Etapa comunicación entre nodo maestro y procesamiento 71 9.1.3. Etapa de control remoto 72 9.1.4. Resultados Finales 73 9.2. 9.2.1. Estimación de ahorro energético Consumo real de sistema domótico 73 73 7 9.2.2. Ahorro estimado por iluminación 75 9.2.3. Ahorro estimado por consumo Standby 77 9.2.4. Ahorro estimado por consumo agua potable 78 9.2.5. Ahorro general del sistema 79 9.3. Costos de componentes utilizados 81 CAPÍTULO X: CONCLUSIONES 82 BIBLIOGRAFIA 84 ANEXO 85 Anexo I: Programa de Interfaz Gráfica 85 1.1. Cabecera clase “Grifos” 85 1.2. Cabecera clase “Calefactor” 85 1.3. Cabecera clase “Conexión” 86 1.4. Cabecera clase “Enchufe” 87 1.5. Cabecera clase “Fugas” 88 1.6. Cabecera clase “Iluminación” 88 1.7. Cabecera clase “Login” 89 1.8. Cabecera clase “Sensores” 90 1.9. Cabecera clase “Ventana Principal” 90 1.10. Código fuente clase “Grifos” 92 1.11. Código fuente clase “Calefactor” 94 8 1.12. Código fuente clase “Conexión” 97 1.13. Código fuente clase “Enchufe” 100 1.14. Codigo fuente clase “Fugas” 101 1.15. Código fuente clase “Iluminación” 102 1.16. Código fuente clase “Login” 104 1.17. Código fuente clase “Sensores” 105 1.18. Código fuente clase “Ventana Principal” 106 1.19. Código fuente programa 113 Anexo II: Programa de Nodo Maestro 114 2.1. Cabecera 114 2.2. Código fuente de programa 114 2.3. Código fuente programa principal 117 Anexo III: Programa Arduino 118 9 RESUMEN En el presente trabajo se expone el desarrollo de un sistema de control automático para el hogar, enfocado en el ahorro energético, que permite gestionar una casa a través de una red WLAN y por internet. Lo anterior, permitirá conocer los parámetros y estados en que se encuentran distintos dispositivos en tiempo real, utilizando tarjetas de desarrollo tales como Arduino y Raspberry Pi, en conjunto con una interfaz de control para múltiples sistemas operativos tales como Windows y Android. El capítulo I plantea el problema a solucionar basándose en información estadística a nivel nacional, describiendo el panorama actual de energía y cuál es el comportamiento del sector residencial en cuanto a uso de energía eléctrica. El capítulo II elabora una solución general, especificando cuáles deben ser los aspectos a controlar, entre los que se destacan el consumo eléctrico enfocado en calefacción, iluminación y consumo standby, así como también regular y automatizar el consumo de agua potable. El capítulo III describe trabajos relacionados, en los cuales se plantean el uso de tecnologías similares al sistema diseñado. También se mencionan conceptos que se utilizan para el desarrollo del sistema, por ejemplo, comunicación serie UART, redireccionamiento de puertos, entre otros. En los capítulos IV y V se diseña y selecciona todo lo referente a hardware. En primera instancia se definen los requerimientos de funcionamiento del sistema, con lo cual se elaboran los subsistemas y finalmente se eligen de acuerdo a esto los componentes a utilizar. En el capítulo VI se define la dimensión de una casa para montar el prototipo, con el cual se definen las entradas y salidas al sistema. Teniendo esto, en el capítulo VII se explica el funcionamiento de los programas hechos para las distintas etapas. Finalmente en los capítulos VIII y IX se realiza el montaje en una maqueta, donde se establece un prototipo del sistema diseñado y se describen los resultados obtenidos respectivamente, sumado a esto se plantean distintos escenarios y se estima el ahorro que generaría, basado en mediciones y cálculos teóricos. 10 ABSTRACT The following project is about the development of a system of automatic control for houses, focused in energy savings, which can be used in a house through a WLAN net and for internet. This will allow to know the parameters and states in which the different gadgets are in real time, using development boards like Arduino and Raspberry Pi, together with a control interface for many operative systems such as Windows and Android. Chapter I is about the problem based on the statistics information to national level, describing the energy actual view and which is the behaviour in the residential sector according to the use of electric energy. Chapter II creates a general solution, specifying which must be the aspects to control, one of the most important is the one about heater, lightning and consumption standby, as well as regulate and automate the consumption of drinking water. Chapter III describes related projects referred to similar technologies to the design system. There are also some concepts that are used for the development of the system, for example, UART communication, port forwarding, among others. In chapter IV and V are the design and selection referred to a hardware. At the beginning, the requirements of functioning of the system are defined, with which the subsystems are elaborated, and finally according to this information, the components are chosen to be used. Chapter VI refers to the dimension of a house to assemble the prototype, with which inputs and outputs of the system are defined. With all this information, in chapter VII is explained the functioning of the programs for the different stages. Finally, in chapter VIII and IX the assembling of a model is done, where a prototype of a design system is established, and the results found are described. Moreover, different sceneries are analyzed and the estimated savings, that this will generate, based on measurements and theoretical calculations. 11 INTRODUCCIÓN Con el avance de la tecnología se han podido establecer diversas opciones como solución a problemas de automatización de procesos en distintos rubros. Especialmente destaca la masificación del internet, ya que hoy en día gran parte de la población tiene acceso en sus casas, con lo cual se hace más fácil la conectividad de múltiples elementos a una red WLAN (Wireless Local Area Network) generada por un dispositivo o punto de acceso. Por otra parte, se ha llegado a un punto donde siempre se habla sobre cómo aumentar la matriz de energía eléctrica en nuestro país, no obstante, es necesario evaluar si el consumo del sector residencial es eficiente. Lo anterior, es el eje en el que se sustenta este trabajo. Enfocándose en la conectividad a internet y eficiencia energética, se realiza un sistema de ahorro pensado en una solución que permita consumir menos electricidad y agua potable, considerando que la inversión que conlleva instalar dicho sistema sea con elementos electrónicos de bajo costo, manteniendo el nivel de confiabilidad. Se destaca que este sistema brinda un mayor nivel de confort puesto que a través de éste, el o los usuarios pueden controlar a distancia su casa en distintos parámetros. Finalmente debido al gran aumento de Teléfonos Móviles inteligentes y Tablet, que utilizan sistema operativo Android, se desarrolla una interfaz gráfica pensada en estos dispositivos, así como también en equipos con sistema operativo Windows (Computadores, Notebooks). 12 OBJETIVO GENERAL Diseñar un sistema domótico e implementar un prototipo que permita generar un ahorro de energía eléctrica y consumo de agua, controlado a través de internet. OBJETIVOS ESPECÍFICOS Investigar principales fuentes de consumo de energía eléctrica en los hogares. Automatizar la iluminación en interior y exterior, en función de detección de presencia, de luz solar y/o horarios preestablecidos. Controlar el sistema de calefacción efectuando un monitoreo en tiempo real de temperatura. Eliminar consumo de artefactos en standby, activando y desactivando su alimentación. Establecer alarmas que le permita al usuario identificar fugas de calor al permanecer abiertas puertas y ventanas de la casa, puerta de algún congelador, así como también fugas de gas en la cocina. Regular el consumo de agua automatizando los grifos utilizados en baños y cocina, siendo activados por presencia. Implementar un sistema de control que contenga un servidor TCP/IP que pueda soportar múltiples usuarios e interactúe con ellos en tiempo real. Elaborar un software para usuarios, que les permita gestionar directamente su casa desde cualquier parte, siempre que estén conectados a internet. 13 RESTRICCIONES Debido a que no se dispone de una casa o departamento en el cual montar el sistema diseñado, se realiza un prototipo sobre una maqueta de una casa con dimensiones específicas mencionadas en este trabajo, no obstante, el sistema eléctrico y electrónico se realiza tal cual como se implementaría en una casa real. MÉTODO DE TRABAJO La metodología de trabajo utilizada consiste en buscar información para determinar el consumo energético, con el fin de establecer una solución general de ahorro. Posteriormente se consultan trabajos relacionados para determinar qué tecnologías se están utilizando para dichos propósitos. Considerando los datos, se definen los requerimientos que debería cumplir el sistema para elaborar el proyecto en cuestión. Una vez diseñado se construye la maqueta para implementar el prototipo y, evaluar su desempeño obteniendo los resultados pertinentes. Finalmente se estima el ahorro energético que generaría en distintas situaciones de uso. 14 CAPÍTULO I: Planteamiento del problema 1.1. Panorama actual de energía Eléctrica en Chile El panorama actual en Chile indica que cada año aumenta la demanda energética de los sectores residenciales, industriales y de transporte. En el sector residencial la causa es evidente, ya que el nivel de ingreso de los habitantes ha ido en aumento y a su vez adquieren más tecnologías, por ejemplo, artefactos domésticos, más televisores, computadores, entre otros. En la Fig. 1, se muestra en términos totales el aumento de la demanda tomando como referencia el año 1970, donde se aprecia que cada 10 años se duplica la demanda, y la tendencia es al alza. Además se deduce que este aumento de demanda energética es proporcional al aumento del PIB (Producto Interno Bruto). Figura 1: Demanda eléctrica total anual y producto interno bruto real anual. Fuente: AIE & Ministerio de Energía (Balance de Energía). En el sector residencial, la problemática no es sólo el considerable aumento energético que se produjo y continuará produciendo, sino que también aumenta el valor por kWh que se debe pagar, esto se muestra en la Fig. 2, donde se observa un incremento constante hasta el 2010, generando una tendencia al alza. 15 Se realiza una comparación con el promedio de los países pertenecientes a la OCDE (Organización para la Cooperación y el Desarrollo Económicos), y el costo asociado a los habitantes crece en mayor proporción para Chile. Figura 2: Evolución de precios a cliente residencial. Fuente: Subsecretaria de energía, Estrategia Nacional de Energía 2012 – 2030. Debido a lo anterior es que se hace necesario plantear propuestas no sólo para incrementar la matriz energética, sino que también realizar un consumo responsable de ésta, es decir, no derrochar energía con el objetivo de reducir el consumo así como el costo asociado a las viviendas por energía eléctrica. 1.2. Consumo energía eléctrica en Sector Residencial Para determinar una solución óptima al problema y reducir la energía consumida, es necesario estudiar el comportamiento en gasto eléctrico por parte de los hogares chilenos. Dicho comportamiento, está ligado directamente a la cantidad de dispositivos eléctricos que poseen. En la Fig. 3 se muestra el porcentaje de tenencia de distintos equipos a nivel nacional, donde la mayor concentración se presenta en televisores, refrigeradores, lavadoras, cargadores, equipos de música, entre otros. 16 Figura 3: Gráfico de tenencia de equipos a nivel nacional. Fuente: Cámara de la Construcción, Estudio de usos finales y curva de la oferta de la conservación de la energía en el sector residencial 2010. La importancia de determinar qué dispositivos hay en una casa, es que éstos no sólo consumen durante su periodo de funcionamiento, sino que también cuando están conectados sin funcionar a la red eléctrica, con un porcentaje menor de gasto. A este estado se le llama “standby”. Por lo tanto, si individualmente el consumo es bajo, la totalidad dentro de un hogar puede llegar a ser considerable, lo que conlleva un gasto energético y monetario innecesario, ya que el consumidor termina pagando por algo que no se utilizó. 17 En la Fig. 4, se plantea el porcentaje con respecto al consumo total residencial que ocupan los distintos artefactos eléctricos, según un estudio realizado por la Cámara de la Construcción, en donde se observa qué tipo de dispositivos son los que producen mayor consumo. Refrigerador 28,6% Iluminación 16,0% Televisión 12,4% Stand-by 10,3% Computador 4,9% Figura 4: Distribución de consumo energía eléctrica nivel residencial, total país. Fuente: Cámara de la construcción, Estudio de usos finales y curva de la oferta de la conservación de la energía en el sector residencial 2010. Entre los aspectos de más consumo destacan la iluminación, televisión y standby, debido principalmente a un uso ineficiente por parte de los ciudadanos. Es habitual tener ampolletas encendidas en habitaciones sin personas, o la televisión encendida sin que se esté viendo, y finalmente el consumo standby que se menciona anteriormente, el cual es energía desperdiciada. 18 Otro estudio realizado (ver Fig. 5) presenta la distribución del consumo eléctrico a nivel residencial sobre una muestra de 113 casas, donde nuevamente destacan los mismo aspectos como principales fuentes de consumo, siendo éstas, el refrigerador, iluminación, standby y televisión. Figura 5: Consumo anual de electricidad en la Vivienda. Fuente: N. Romero Ramos, Consumo de energía a nivel residencial en Chile y análisis de eficiencia energética en calefacción. 1.3. Conclusión de estudios De acuerdo al estudio realizado se observa que para disminuir el consumo eléctrico es necesario reducir tiempos de iluminación innecesarios y artefactos que no se estén utilizando, pero igual están encendidos, como es el caso de la televisión. Se observa además que el porcentaje de casas que utilizan calefacción con electricidad es bajo, pero su consumo es alto, por lo tanto también resulta evidente controlar este tipo de dispositivos. Asociado al gasto eléctrico, también existe el consumo de agua potable en exceso, esto se observa al dejar fluyendo agua por los grifos cuando no se utilizan; el caso más habitual es el de lavarse los dientes. Por lo tanto, también es conveniente enfocar la solución en este aspecto, ya que para que el agua llegue a los hogares se requiere de consumo energético. 19 CAPÍTULO II: Propuesta general de solución La solución planteada se enfoca en diseñar un sistema domótico que permita automatizar distintos aspectos para disminuir el consumo energético, y que cumpla en cierta medida con mejorar el nivel de confort en el hogar. En términos generales, el sistema debe ser de instalación simple y bajo costo de inversión, con el fin de que pueda ser implementado y así disminuir el consumo energético de una vivienda, mejorando la calidad de vida de sus habitantes. Como ya se determinaron los aspectos que influyen mayoritariamente en el consumo eléctrico y agua potable, se plantean las siguientes funciones. Control de Iluminación indoor (interior) y outdoor (exterior). Control de calefacción eléctrica. Monitoreo de temperatura y humedad relativa ambiental. Control de consumo equipos en standby. Control de grifos de agua potable e inundación. Monitoreo de fugas de calor y gas. Todas estas funciones están enfocadas en monitorear magnitudes físicas y aumentar la eficiencia energética de una vivienda. En el caso de control de iluminación, el problema radica en estar iluminando cuando no hay personas en el sector, para solucionar esto es necesario establecer un sistema que detecte la presencia de personas y pueda distinguir si existe iluminación solar o no para su encendido. Agregando inteligencia para mayor confort, se establece que debe realizarse de manera automática sin interacción por el usuario. No obstante, cuando éste lo desee, puede gobernar el encendido y apagado por sobre el sistema automático. Para el caso de calefacción eléctrica, se establece que debe monitorearse la temperatura y ésta ser comparada con ciertos niveles de histéresis para determinar si debe o no accionarse la calefacción, este método soluciona el problema de que siga funcionando cuando 20 ya se logró el nivel de temperatura deseada. El usuario debiese ser capaz de modificar estos niveles o decidir directamente si se debe activar o no el sistema de calefacción. Para el control de dispositivos standby, se determina que la única manera de eliminar este consumo es desacoplarlo de la red eléctrica, de esta manera no seguirá consumiendo. Para ello el usuario determina qué dispositivos se conectan o no, inhabilitando los distintos enchufes de las habitaciones de la vivienda. La inteligencia va asociada al monitoreo y control por medio de una interfaz gráfica que permite su acceso desde cualquier lugar, sin necesidad de ir directamente al enchufe. Respecto del consumo de agua potable, debe haber un sistema que permita fluir el agua solamente cuando sea necesario, esto se puede lograr por medio de detección de presencia, así se evita que fluya el agua cuando no se utilice. También se asocia al control de grifos, un monitoreo de inundación, el cual avise al usuario y corte el suministro de agua, lo que generalmente ocurre en el lugar donde se ubica la lavadora de ropa. También se incorpora un monitoreo de fugas de calor, como apoyo al sistema de calefacción, considerando los estados de todas las ventanas y puertas que puedan permitir corrientes de aire que interfieran con la temperatura interior de una vivienda. Se establece además, un monitoreo de fuga de gas, lo que permite un mayor nivel de seguridad en términos de que se acumule éste en el aire y pueda explotar. 2.1. Interfaz de control Para aumentar el nivel de confort de los habitantes en el hogar, se plantea que es necesario una interfaz de control múltiple y móvil, es decir, que todas las personas puedan acceder al mismo tiempo manejando las funciones y a su vez el monitoreo sea en tiempo real. La movilidad se relaciona con un control inalámbrico, el que pueda ser utilizado desde cualquier lugar, por ejemplo, encender las luces del baño desde la habitación. Para cumplir con estas especificaciones se plantea que es necesario una interfaz gráfica, debiendo estar implementada en equipos de uso cotidiano, los que utilizan los usuarios o habitantes de la vivienda, por ejemplo, computador, teléfono móvil inteligente, Tablet, entre otros. 21 Aprovechando la capacidad de estos dispositivos con conexión Wi-Fi, se puede establecer la comunicación a través de un router hacia el nodo maestro del sistema de control, y de esta manera si la vivienda posee una conexión a internet, se puede controlar desde cualquier parte del mundo mediante este medio. 2.2. Esquema general De acuerdo a los planteamientos de solución se obtiene un esquema general del sistema, el que se muestra en la Fig. 6, donde existen elementos sensores para obtener información y poder actuar en base a ellos, posteriormente estos datos pasan a los nodos de procesamiento. Éstos deciden la acción a ejecutar por los actuadores e informa al nodo maestro. Éste se encarga de gestionar la información y enviarla a los dispositivos asociados a la interfaz de control, también se debe encargar de recibir las órdenes por parte de los usuarios e informar hacia los nodos posteriores la acción solicitada, teniendo prioridad sobre la lógica relacionada con los sensores. Figura 6: Esquema general de solución sistema domótico. Fuente: Propia. La cantidad de nodos dependerá de la estructura de la vivienda, es decir, ya planteadas todas las funciones a controlar, la cantidad de entradas y salidas que posea un sistema obedecerá netamente al tamaño de una casa, es decir, un hogar de 2 habitaciones tendrá menos fuentes de iluminación y enchufes que uno de 4, lo mismo ocurre con la cantidad de baños, ya que aumenta además el número de grifos. Por lo tanto, los nodos se pueden extender de acuerdo a las necesidades de la vivienda. 22 CAPÍTULO III: Discusión bibliográfica y teoría asociada 3.1. Trabajos relacionados Para determinar eficientemente la forma de llevar a cabo la solución del problema energético se plantean trabajos similares, los que sirven de referencia para la realización del sistema. Éstos corresponden a investigaciones presentadas y publicadas a través de la IEEE, (Instituto de Ingeniería Eléctrico y Electrónico) principalmente enfocado en sistemas domóticos controlados a través de internet. 3.1.1. Sistema domótico de bajo costo basado en Arduino y Android En [5] se plantea un sistema de automatización del hogar enfocado en ahorro energético, activando o desactivando distintos procesos en base a conjunto de eventos de disparo. En la Fig. 7 [5] se observa el diagrama funcional del sistema, el cual se divide en subsistemas. Éstos están asociados al nodo principal de control, nodos finales e interfaz Android. Figura 7: Diagrama funcional del sistema. 23 Unidad central de control: Como controlador central se utiliza una tarjeta Arduino, la cual recibe los comandos de usuarios a través de conexión a internet acoplando un shield Ethernet. Con este shield se monta una arquitectura cliente servidor, donde Arduino actúa como servidor, respondiendo a teléfonos móviles con sistema operativo Android (clientes), comunicándose vía protocolo HTTP. Nodos finales: En este sistema se destacan dos tipos distintos de nodos, actuadores y sensores. Los últimos se encargan de recibir información, y los actuadores de modificar los procesos, por ejemplo, activar un interruptor o controlar el nivel de intensidad de luz. Estos nodos pueden conectarse mediante cable o inalámbricamente bajo los protocolos X10 y Zigbee. En resumen, los usuarios envían comandos desde un dispositivo móvil basado en Android, luego la placa Arduino recibe esta información a través de un router y la envía hacia los nodos finales mediante comunicación inalámbrica o por cable. Los nodos sensores captan información la que es enviada al coordinador de la red; posteriormente esta información la recibe la tarjeta Arduino y almacena en una base de datos, procesándola y enviándola hacia los usuarios, visualizando los datos en la aplicación creada para Android. 3.1.2. Sistema domótico basado en Bluetooth y celular. En [6] se presenta un sistema domótico a menor escala, estableciendo una comunicación entre una tarjeta Arduino y una interfaz en un teléfono móvil con sistema operativo Android mediante protocolo Bluetooth, es decir, sin acceso a través de internet. El diseño se basa en un sistema centralizado (ver Fig. 8) [6], donde la tarjeta Arduino es la unidad de procesamiento, encargándose de activar o desactivar una serie de relés asociados a distintos artefactos o ampolletas. El dispositivo móvil está programado en Python, mientras que el microcontrolador Arduino en C. Para la comunicación entre ambos dispositivos, se acopla un módulo Bluetooth a la tarjeta Arduino, dispositivo a través del cual se envían los comandos de activación de relés. Para asegurar el correcto funcionamiento, se mide la corriente que circula por el dispositivo a activar y se envía una confirmación al usuario sobre la acción ejecutada. 24 Figura 8: Diagrama en bloque de sistema de automatización. Las pruebas realizadas a este sistema fueron sobre dos relés asociados a ampolletas de 25W a 240V, logrando una distancia entre dispositivo controlador y usuario menor a 50 metros, y en espacios abiertos menor a 100m. 3.1.3. Sistema domótico basado en Wi-Fi. Gang et. al. [7] presentan un sistema donde los usuarios pueden intercambiar información con electrodomésticos, monitorear y controlar equipos remotamente. El sistema incluye cuatro módulos, red externa, puerta de enlace, servidor y red de área local. La red externa puede ser de tipo Ethernet, o bien una red inalámbrica como Wi-Fi o WiMAX, la puerta de enlace comunica las redes internas y externas, las que comúnmente son el computador servidor o un dispositivo de procesamiento. Como la conexión se puede realizar a través de red externa mediante conexión Wi-Fi e Internet, los usuarios pueden acceder al sistema domótico mediante dispositivos inteligentes como teléfonos móviles, notebook, o Tablet, conectados a internet (ver Fig. 9) [7]. 25 Figura 9: Arquitectura de sistema casa inteligente. En la Fig. 10 (a) [7] se observa cómo es la estructura del sistema inteligente. Cada electrodoméstico debe poseer un módulo de esta naturaleza, por ejemplo, un microprocesador con compatibilidad de comunicación con el AP (Access Point), se puede utilizar con dispositivos de última tecnología que posean estas características o de lo contrario acoplar un módulo, lo que significa incrementar considerablemente el costo del sistema. Los usuarios envían comandos para controlar equipos, verificando los estados de éstos mismos, recibiendo información y alarmas en casos específicos, por ejemplo, incendios. El método de conexión entre estos dispositivos es a través de un servidor que posee una base de datos, que pueda estar basado en la nube, sin necesidad de tener una arquitectura física que lo contenga (ver Fig. 10 b) [7]. Toda información es enviada en paquetes de datos. 26 Figura 10: (a) estructura casa inteligente, (b) modelo de transmisión y recepción de información. 3.2. Conceptos previos En esta sección se presentan conceptos que se utilizarán para el diseño del sistema domótico, principalmente enfocados en aspectos de comunicación. 3.2.1. Comunicación serie UART Corresponde al tipo de comunicación más común utilizada por microcontroladores y placas de desarrollo para sistemas embebidos. Se suelen transmitir caracteres alfanuméricos a periféricos o entre ellas. El parámetro de comunicación de velocidad se mide en baudios, que corresponde al N° de bits por segundo que se transmiten. Al ser asíncrona, no se establece una temporización rígida, los datos pueden ser transmitidos en cualquier momento, pero el transmisor debe indicar al receptor mediante alguna señal cuándo se va a enviar un dato válido por la línea en forma de serie de bits, además de los datos se necesitan bits auxiliares para sincronismo. A nivel de hardware se debe establecer una tierra común entre ambos dispositivos a comunicar. Cada uno debe poseer una conexión para transmisor y receptor, es decir, dos pines, dependiendo del protocolo utilizado los niveles de tensión varían, y por ende la distancia máxima lograda, por ejemplo, los microcontroladores usualmente trabajan con niveles TTL a 5V o 3,3V. 27 La trama de comunicación (ver Fig. 11) se inicia por un nivel lógico 0 durante un tiempo de bit, éste se denomina bit de arranque, luego siguen los bits por caracter (5, 7 u 8), siendo transmitido el menos significativo primero, posteriormente se concluye con un bit de parada, el cual puede ser de duración 1, 1,5 o 2 tiempos de bit. Adicionalmente se puede incluir un bit de paridad después del bit más significativo para detección de errores. Figura 11: Trama de datos comunicación seria asíncrona. 3.2.2. Dirección IP Es una etiqueta numérica que identifica de manera lógica y jerárquica a una interfaz (elemento de comunicación/conexión) de un dispositivo dentro de una red que utilice el protocolo IP (Internet Protocol), que corresponde al nivel de red del Modelo OSI. Ésta puede cambiar muy a menudo por variaciones en la red o porque el dispositivo encargado de asignar las direcciones IP decida establecer otra IP, por ejemplo, el protocolo DHCP. A esta forma se le denomina también dirección IP dinámica. Las direcciones IPv4 se expresan por un número binario de 32 bits, permitiendo un espacio de direcciones de hasta 4.294.967.296 posibles. Éstas se pueden expresar como números de notación decimal: se dividen los 32 bits de la dirección en cuatro octetos. El valor decimal de cada octeto está comprendido en el intervalo de 0 a 255, por ejemplo, la más común en una red dentro de una casa que pertenece al router es 192.168.0.1. 3.2.3. DNS (Domain Name System) Es un sistema de nomenclatura jerárquica para computadoras, servicios o cualquier recurso conectado a Internet o a una red privada. Éste asocia información variada con nombres de dominios asignados a cada uno de los participantes. Su función más importante es traducir 28 nombres inteligibles para las personas en identificadores binarios asociados con los equipos conectados a la red, con el propósito de poder localizar y direccionar estos equipos mundialmente. La asignación de nombres a direcciones IP es la función más conocida de los protocolos DNS. Por ejemplo, si la dirección IP del sitio www.prueba.net es 200.64.128.4, la mayoría de la gente llega a este equipo especificando su nombre DNS y no la dirección IP. Además de ser más fácil de recordar el nombre es más fiable ya que la dirección numérica podría cambiar por muchas razones, sin que tenga que cambiar el nombre. 3.2.4. Port Forwarding La redirección de puertos es la acción de redirigir la información entrante a una red privada por un puerto determinado a un equipo específico. Esta técnica puede permitir que un usuario externo tenga acceso a un puerto en una dirección IP privada (dentro de una LAN) desde el exterior vía un router. La redirección de puertos permite que computadores remotos (por ejemplo, máquinas públicas en Internet) se conecten a un computador en concreto dentro de una LAN privada. 3.2.5. Protocolo TCP TCP (Protocolo de Control de Transmisión) es uno de los principales protocolos de la capa de transporte del modelo TCP/IP. En el nivel de aplicación, posibilita la administración de datos que vienen del nivel más bajo del modelo, o van hacia él, (es decir, el protocolo IP). Cuando se proporcionan los datos al protocolo IP, los agrupa en datagramas IP. TCP es un protocolo orientado a conexión, es decir, que permite que dos máquinas que están comunicadas controlen el estado de la transmisión. Con el uso del protocolo TCP, las aplicaciones pueden comunicarse en forma segura (gracias al sistema de acuse de recibo del protocolo TCP) independientemente de las capas inferiores. Esto significa que los router sólo tienen que enviar los datos en forma de datagramas, sin preocuparse con el monitoreo de datos porque esta función la cumple la capa de transporte (o más específicamente el protocolo TCP). Durante una comunicación usando el protocolo TCP, las dos máquinas deben establecer una conexión. La máquina emisora (la que solicita la conexión) se llama cliente, y la receptora se llama servidor. 29 Para posibilitar la comunicación y que funcionen bien todos los controles que la acompañan, los datos se agrupan, es decir, se agrega un encabezado a los paquetes de datos que permitirán sincronizar las transmisiones y garantizar su recepción. Otra función de TCP es la capacidad de controlar la velocidad de los datos, ya que puede emitir mensajes de tamaño variable. Estos mensajes se llaman segmentos. Considerando que este proceso de comunicación que se produce con la transmisión y el acuse de recibo de datos se basan en un número de secuencia, las máquinas, transmisora y receptora (cliente y servidor) deben conocer el número de secuencia inicial de la otra máquina. La conexión establecida entre las dos aplicaciones a menudo se realiza siguiendo el siguiente esquema: Los puertos TCP deben estar abiertos. La aplicación en el servidor es pasiva, es decir, que la aplicación escucha y espera una conexión. La aplicación del cliente realiza un pedido de conexión al servidor en el lugar donde la aplicación es abierta pasiva. La aplicación del cliente se considera "abierta activa". Las dos máquinas deben sincronizar sus secuencias usando un mecanismo comúnmente llamado negociación en tres pasos que también se encuentra durante el cierre de la sesión. En la primera etapa, la máquina originadora (el cliente) transmite un segmento donde el indicador SYN está fijado en 1 (para indicar que es un segmento de sincronización), con número de secuencia N llamado número de secuencia inicial del cliente. En la segunda etapa, la máquina receptora (el servidor) recibe el segmento inicial que viene del cliente y luego le envía un acuse de recibo, que es un segmento en el que el indicador ACK está fijado en 1 y el indicador SYN está fijado en 1 (porque es nuevamente una sincronización). Este segmento incluye el número de secuencia de esta máquina (el servidor), que es el número de secuencia inicial para el cliente. El campo más importante en este segmento es el de acuse de recibo que contiene el número de secuencia inicial del cliente incrementado en 1. Por último, el cliente transmite un acuse de recibo, que es un segmento en el que el indicador ACK está fijado en 1 y el indicador SYN está fijado en 0 (ya no es un segmento de sincronización). Su número de secuencia está incrementado y el acuse de recibo representa el número de secuencia inicial del servidor incrementado en 1. 30 CAPÍTULO IV: Diseño Hardware 4.1. Requerimientos del proyecto De acuerdo a los aspectos analizados sobre consumo energético en una vivienda, se plantean requerimientos que debe cumplir el sistema en base a lo presentado como solución a la problemática, logrando eficazmente el ahorro de energía. Los requerimientos se representan en una serie de funciones que realizará el sistema domótico. Éstos se pueden dividir en los siguientes subsistemas: 4.1.1. Sistema domótico completo. Fácil implementación en casas y departamentos. Bajo costo de inversión inicial. Escalable, es decir, que el sistema se pueda ampliar sin modificar la estructura del mismo. 4.1.2. Control de Iluminación indoor y outdoor. Se deben encender y apagar todas las luminarias del hogar automáticamente en función de detección de presencia en las distintas zonas, considerando el nivel de iluminación natural, es decir, cuando se encuentre sobre cierto umbral no se encenderán las ampolletas. El usuario a través del control remoto puede encender y apagar todas las luminarias, teniendo prioridad sobre estados de sensores, ya sean zonas individuales o grupo de zonas, por ejemplo, todos los dormitorios instantáneamente. El control remoto debe permitir al usuario variar el nivel límite de iluminación natural que activará el control por sensores. 31 4.1.3. Control de calefacción eléctrica. El sistema de control de calefacción debe ser compatible con cualquier tipo de calefactor/climatizador que se active por medio de un termostato, para que se pueda reemplazar por el sistema domótico. La activación del calefactor/climatizador debe estar controlado por niveles de temperatura mínimo y máximo. El control remoto debe permitir al usuario variar los niveles de histéresis y controlar la activación teniendo prioridad sobre sensores de temperatura. 4.1.4. Monitoreo de temperatura y humedad relativa ambiental. Se debe monitorear niveles de temperatura y humedad relativa ambiental para proporcionar información para el control de climatización. El monitoreo ambiental debe realizarse tanto en interior como en el exterior de la casa. El control remoto debe mostrar al usuario los niveles actuales de temperatura y humedad relativa. 4.1.5. Control de consumo en equipos en standby. El sistema debe permitir al usuario activar y desactivar todos los enchufes por medio del control remoto. El control remoto debe proporcionar la opción de activar y desactivar enchufes (derivación completa) individualmente y por habitaciones. 4.1.6. Control de grifos de agua potable e inundación. Se debe controlar el flujo de agua en lavamanos y lavaplatos de manera automática, mediante sensores de presencia. Se debe monitorear posible inundación en zona donde se ubica lavadora de ropa, pudiendo en caso de inundación suprimir suministro de agua y electricidad en dicho lugar. El control remoto debe permitir al usuario desactivar sistema automático y poder accionar manualmente los grifos. 32 4.1.7. Monitoreo de fugas de calor y gas. El sistema debe informar al usuario la existencia de fugas en ventanas y puertas abiertas, cuando esté calefaccionando. La información respecto de fugas de calor debe ser detallada, es decir, mencionar qué ventana o puerta está abierta. El sistema debe informar cuando detecte niveles anormales de gas en el ambiente, además deberá suprimir suministro de electricidad. 4.1.8. Control remoto, interfaz usuario. El control remoto deberá estar disponible en múltiples dispositivos como teléfonos móviles, Tablet, computadores y notebooks. Se debe poder acceder al control total del sistema domótico estando en la casa y también desde internet, es decir, de cualquier lugar con conexión, mediante protocolo TCP/IP (servidor – cliente). Para acceder a la plataforma de control debe ser necesario ingresar usuario y contraseña. El control debe ser capaz de recibir instrucciones desde múltiples usuarios (clientes). El sistema de control remoto debe presentar una interfaz gráfica que permita conocer los estados de los subsistemas en tiempo real, por ejemplo, mostrar los estados de las luminarias, enchufes, ventanas y puertas, etc. 4.2. Diseño general de solución Considerando el esquema presentado previamente (Fig. 6), y teniendo en cuenta los requerimientos que se plantean sobre la funcionalidad que debe poseer el sistema domótico, se define la estructura óptima de éste (ver Fig. 12). 33 Figura 12: Estructura general de sistema domótico para cualquier tipo de casa o departamento. En esta estructura se definen una serie de sensores y actuadores conectados a un nodo conformado por una unidad de procesamiento (microprocesador) o bien una tarjeta electrónica, esto se puede replicar múltiples veces, lo que está determinado por el tamaño de la casa, es decir, la cantidad de elementos y zonas a controlar dentro de una vivienda determina el número de sensores y actuadores. Por lo tanto, la cantidad de éstos determinan el número de unidades de procesamiento, las cuales funcionan como esclavo de una sola unidad maestro, conteniendo el servidor TCP/IP para informar y recibir órdenes de los clientes. El tipo de comunicación, sensores y actuadores a utilizar se definen a continuación para cada subsistema. 4.3. Comunicación entre nodos de procesamiento y maestro La comunicación entre nodos de procesamiento y nodo maestro se realiza por medio de UART (Universal Asynchronous Receiver-Transmitter), ya que la cantidad de datos a transmitir será baja. Se determinan que las tasas de velocidad que existen para UART son suficientes. Esta comunicación será cableada. Dependiendo de la cantidad de nodos de procesamiento, puede que el nodo maestro no posea un puerto para cada uno, todo esto depende de las prestaciones del dispositivo que se escoja para este fin. Asumiendo que el nodo maestro posea sólo un puerto UART, es decir, un 34 par de transmisor y receptor (Tx y Rx) se deberá crear un algoritmo que solicite a cada nodo de procesamiento su información y a su vez envíe lo comandos respectivos cíclicamente, de esta manera se asigna a cada nodo de procesamiento un orden y tiempo determinado, logrando gestionar con un solo puerto UART. Respecto de la comunicación entre nodo maestro y router, se realizará por cable, mediante comunicación Ethernet. Por lo tanto, la comunicación inalámbrica sólo será para los usuarios, donde el control remoto situado en sus dispositivos será inalámbrico enviando información a través de una red WLAN hacia el router respectivo, y luego la información viajará por cable hasta los actuadores pasando por el nodo maestro y de procesamiento. 35 4.4. Sistema de control de iluminación El sistema domótico planteado se enfoca en ahorro energético, por lo tanto está pensado para que las luminarias consuman lo menos posible, considerando la diversidad de tipos de focos que se ofrecen en el mercado, los que menos consumo generan son las ampolletas LED. Actualmente la mayoría de éstas son incompatibles con circuitos reguladores de intensidad luminosa (Dimmer), habiendo sólo unos pocos fabricantes dedicados a desarrollar ampolletas compatibles, los cuales definen con qué tipo de Dimmer funcionan. Este tipo de ampolletas no se encuentran masificadas en nuestro país. Dependiendo del fabricante y modelo, la comparación entre LED y foco incandescente respecto de consumo de potencia varía; habitualmente un foco incandescente de 60W puede ser reemplazado por una ampolleta LED de 8W, resultando en un consumo 7,5 veces menor. Bajo estas circunstancias en el control de iluminación se descarta la regulación luminosa, y se opta por controlar el encendido y apagado de las luminarias, así el sistema es compatible en un 100% con ampolletas de ahorro energético. El control de la iluminación posee tres etapas; la primera consiste en la etapa de sensores, los cuales detectan luz solar y presencia de personas en zona específica donde apunta la luminaria; la segunda etapa consiste en la inteligencia, ésta decide si se debe encender o no la ampolleta, lo que lleva a cabo mediante el nodo de procesamiento y finalmente la etapa de activación. Para la etapa de sensores, la detección de intensidad luminosa natural utiliza un circuito divisor de tensión, donde una de las resistencias es un LDR, al variar la luz se alterará el voltaje (ver Fig. 13a), obteniendo un dato analógico que se envía al microcontrolador. Para la detección de presencia de personas se utiliza un módulo sensor PIR de 3 pines, de los cuales uno es dato, entrega información digital, es decir 1 o 0, cuando detecta presencia envía un 1 lógico (5V), cuando no detecta se mantiene en 0 (0V). 36 Figura 13: (a) esquema de sensores de luz solar, (b) sensor de presencia. En la Fig. 14 se presenta el diagrama del circuito para el encendido y apagado de una ampolleta. Consta de dos componentes principales, un optocoplador y un relé, el primero se conecta a voltaje positivo de 5Vdc a través del ánodo, mientras que el cátodo va a una salida de un microcontrolador, cuando la salida está en nivel bajo (0V), circula corriente por el diodo del optocoplador activando posteriormente el relé y conecta la ampolleta, cuando la salida está a nivel alto (5V), no circula corriente y por ende ésta se mantiene desconectada. Figura 14: Diagrama de circuito de activación de ampolleta. 4.5. Sistema de control de calefacción El sistema de control de calefacción está orientado a calefactores o climatizadores eléctricos, que se activan por medio de un termostato o tienen contactos para dicho propósito. De esta manera se remueve el sistema de control básico original, es decir, un contacto que varía su estado con respecto a niveles de temperatura los que se pueden variar con un tablero habitualmente ubicado en la pared. Luego se conecta el sistema de activación (ver Fig. 15). Para el caso de calefactores eléctricos que funcionen simplemente conectándolo a la red se puede implementar el mismo circuito de activación que para las ampolletas (ver Fig. 14). 37 Figura 15: Esquema de activación de calefactor con contacto termostato. Para tomar la decisión de activación, se mide el nivel de temperatura, en la Fig. 16 se muestra cómo debe ser la conexión al sistema del módulo sensor. Posteriormente el microcontrolador a través de niveles de histéresis toma la acción pertinente, siendo estos niveles modificables por el usuario. Figura 16: Esquema conexión modulo sensor de temperatura. 4.6. Sistema de control de dispositivos standby La regulación de consumo por dispositivos en standby se realiza desconectándolos totalmente del circuito eléctrico de la casa, para ello se intervienen las cajas de enchufes, es decir, si una caja posee más de una conexión, se desconectará o conectará el conjunto de espacios para dispositivos eléctricos. El diagrama de circuito para lograr esto se muestra en la Fig. 17, donde nuevamente se utiliza un relé y optocoplador, en este caso la señal de activación enviada por el usuario la recibe el nodo maestro, éste envía dicha información al nodo de procesamiento respectivo y finalmente se activa el pin asociado, produciendo una interrupción en la fase de la instalación eléctrica dejando sin corriente la caja de enchufes. Este diagrama, por lo tanto, se repite para cada caja de enchufes que exista en una casa. 38 Figura 17: Diagrama de circuito de activación de enchufe. 4.7. Sistema de control de grifos e inundación El control de flujo de agua potable en los grifos para lavaplatos y lavamanos se realiza por medio de una electroválvula, que permite bloquear o permitir el paso de agua por la cañería. Esta electroválvula se debe instalar, antes de llegar a la conexión con lavaplatos o lavamanos, de ese modo se puede controlar el flujo sin cambiar dicha instalación, puesto que simplemente el grifo instalado se deja abierto constantemente y la electroválvula se encarga de realizar el trabajo automáticamente. Para que esto funcione de manera automática se debe instalar un módulo sensor de presencia, al igual que para las luminarias (ver Fig. 13b), la diferencia radica en que debe centrar su área de detección sólo en el lavamanos o lavaplatos, la información recolectada por el sensor es enviada al nodo de procesamiento y éste activa su salida respectiva. En la Fig. 18 se muestra cómo debe ser el circuito de activación, siempre y cuando la electroválvula funcione a 220V AC, en caso de que se aplique con otros estándares, es necesario modificar la conexión entre relé y válvula. La válvula se activa cuando la salida del microcontrolador está en nivel 0 lógico. 39 Figura 18: Diagrama de circuito de activación de válvula. Para la detección de inundación en zona de cocina o dónde se instala la lavadora, se implementa un módulo sensor, el cual monitorea el estado del suelo detectando si hay agua o no. Esta información es enviada al nodo de procesamiento, que desactiva el flujo de agua y energía eléctrica para evitar daños en caso de inundación. 4.8. Sistema de monitoreo de fugas de calor y gas El monitoreo de fuga de calor se realiza a través de interruptores magnéticos instalados en las puertas y ventanas de una casa, el circuito eléctrico para ello se muestra en la Fig. 19. Se utiliza el interruptor magnético conectado a una resistencia pull-down, y la salida hacia el microcontrolador varía entre estado lógico 0 y 1, cuando las puertas están cerradas el interruptor igual lo está, por lo tanto el nivel es 1 lógico (5V), a diferencia de cuando se abren, el nivel es 0 lógico (0V), el circuito se alimenta de una fuente dc 5V. Esta configuración se debe implementar para cada puerta y ventana en una casa. Figura 19: Diagrama de circuito de detección fugas de calor, para puertas y ventanas. Para el monitoreo de fugas de gas, la conexión depende del tipo de sensor utilizado, manteniendo la metodología utilizada en casos anteriores, en donde la información es enviada al nodo de procesamiento avisando al usuario y suprimiendo el consumo de energía eléctrica. 4.9. Sistema de interfaz de usuario, control remoto Para desarrollar un control remoto que permita visualizar en tiempo real todos los parámetros controlados, y a su vez poder interactuar con el sistema desde cualquier parte como se especificó, es necesario que sea a través de internet. 40 Como requerimiento se planteó el acceso desde múltiples dispositivos móviles, por lo tanto el control remoto debe constar de dos partes para la comunicación por protocolo TCP/IP. La primera consiste en un servidor ubicado en el nodo maestro que se encarga de recibir instrucciones, parámetros y direccionarlos a los nodos de procesamiento. Para ello el nodo maestro debe tener acceso a una puerta de enlace, en este caso un router, el cual gestiona una red de área local inalámbrica (WLAN) y acceso a internet. De esta manera se plantean dos escenarios; en el primero, los dispositivos se conectan a la red WLAN, donde no es necesario acceso a internet; en el segundo, los dispositivos móviles que se encuentran en otras redes se comunican mediante internet. La segunda parte consiste en los clientes ubicados en los dispositivos móviles, por lo cual es necesario programar una aplicación que tendrá compatibilidad con sistemas operativos Android y Windows. Toda programación realizada tanto en nodo maestro y dispositivos móviles será a través de Software “Qt Creator”, ya que éste permite programar en lenguaje C++, que luego será compilado sin grandes modificaciones para los sistemas operativos mencionados, incluido Linux. 4.10. Comunicación mediante servidor TCP/IP Al servidor en nodo maestro, se le asignará una dirección IP fija, es decir, el router no la podrá cambiar. Se puede realizar en un ambiente residencial, ya que no existen múltiples dispositivos para abarcar el rango desde 1 a 255, por lo tanto, al asignar una dirección relativamente alta no interferirá con los demás equipos. Como la dirección IP del router hacia internet puede cambiar, puesto que algunos proveedores de internet establecen el servicio de esta manera, o si se reinician estos dispositivos también en algunos casos su IP cambia, se utilizará un servicio (www.noip.com) para asignar a esta dirección una DNS (Domain Name System) gratuitamente, es decir, asignarle un nombre para que los usuarios no tengan que saber cuál es la IP. 41 Para no modificar este aspecto directamente en la configuración del router, ya que algunos no lo permiten, el mismo servicio “noip” posee un software para activar DNS, que se instalará en el nodo maestro. Con respecto al puerto, éste será un número fuera de los utilizados para servicios como telnet, ftp, etc. Desde el punto de vista del cliente, en la interfaz usuario el puerto estará definido por programación por lo que no será necesario que se tenga conocimiento de esto. Para que los usuarios puedan acceder a través de internet, no basta sólo con ingresar la dirección IP o el DNS asociado del router y el puerto referido al servicio, además se debe realizar un redireccionamiento del puerto en la configuración del router hacia el nodo maestro, a este procedimiento se le conoce como “Port Forwarding”. En resumen, para establecer la comunicación entre los dispositivos usuarios y el nodo maestro con el servidor TCP/IP se realizan los siguientes pasos: Establecer una IP fija al nodo maestro dentro de la red generada por el router conectado a internet. Instalar software de www.noip.com en nodo maestro para activar DNS con IP de router. Direccionar el puerto específico desde la configuración del router hacia la IP del nodo maestro. Si en algún momento falla la conexión a internet desde la casa en cuestión, los usuarios no podrán controlarla desde fuera de ésta, no obstante, por medio de la IP fija que posee el nodo maestro, el usuario podrá establecer la conexión estando dentro de la red WLAN. 4.11. Suministro energético de sistema domótico De acuerdo al diseño planteado, se requieren dos tipos de fuentes distintas para suplir de energía al sistema completo, estos corresponden a voltaje continuo (DC) para toda la electrónica, y voltaje alterno (AC) para las electroválvulas. Teniendo en consideración que todos los elementos electrónicos se alimentan con voltaje continuo, a la hora de elegir componentes se considerará que funcionen con los mismos 42 niveles, el cual por simplicidad será de 5 Volts, ya que de esta manera se podrá alimentar con cargadores universales USB 5V, tal como los utilizados en teléfonos móviles o Tablet. Cabe destacar que la toma de corriente a la cual se conecte este transformador para alimentar a los nodos de procesamiento y maestro, en conjunto con los múltiples sensores y módulos relés, no debe estar sometido al sistema domótico por seguridad. De lo contrario se podría cortar suministro de energía accidentalmente y dejar sin operación al sistema, y por tanto las múltiples funciones que controla. En caso de utilizar más de un cargador, se debe considerar que las tierras deben estar interconectadas. En cuanto al tipo de electroválvula, está deberá funcionar con 220V AC, con lo cual se pueden conectar al toma corriente más cercano, siempre tomando en consideración la seguridad, es decir, aislar dicha conexión con posible fuga de agua. 43 CAPITULO V: Elección de componentes 5.1. Nodo maestro Se utilizará la placa Raspberry Pi b+ (ver Fig. 20), debido a que cumple con los requisitos asociados al desarrollo y diseño del sistema, ya que es de bajo costo, permite instalar sistema operativo Raspbian, con el cual se puede programar utilizando el software Qt Creator. Además posee comunicación serie asíncrona (UART) a través de sus pines, con lo cual se podrán conectar los nodos de procesamiento. Esta placa se puede conectar a una red de área local, con lo cual se puede acceder a una conexión a través de internet. Permite definir un servidor TCP/IP, debido a sus prestaciones. El sistema operativo se almacena en una memoria MicroSD, y desde ahí se cargan las aplicaciones y diversos software, para este diseño se utilizará una tarjeta de 8Gb de capacidad. Figura 20: Placa Raspberry Pi b+. Esta placa se puede considerar como un mini computador, por lo que si en algún momento el sistema se pretende modificar y complejizar aún más, no será necesario cambiar el dispositivo. Un ejemplo sería conectar una pantalla a la placa, y en esta misma ejecutar la aplicación de control remoto (interfaz), como estación central dentro de la casa. 44 Sus características técnicas son: Procesador Broadcom BCM2835 700MHz ARM1176JZFS con FPU y GPU VideoCore IV dual-core. 512MB SDRAM. HD 1080p video output. video (PAL/NTSC) output. 10/100 slot RJ45 Ethernet. HDMI 1.3 & 1.4 video/audio socket. 3.5mm 4-pole audio/composite video out jack socket. 4 x USB 2.0 sockets. Conector DSI (Display Serial Interface) 15. Slot para tarjeta MicroSD. 40-pin header para GPIO y buses serie (compatible con Raspberry Pi A/B 26-pin header) Alimentación: +5V hasta 2A vía microUSB. Dimensión: 85 x 56 x 17mm 5.2. Nodo de procesamiento Se utilizará como unidad de procesamiento la tarjeta de desarrollo Arduino Mega 2560 rev3 (ver Fig. 21), ya que ésta soporta comunicación UART para intercambiar información con el nodo maestro, posee una gran cantidad de entradas y salidas, dentro de las cuales tiene entradas analógicas, lo que es un requerimiento ya que el sistema domótico posee señales analógicas, como es el caso de sensor LDR. Figura 21: Arduino Mega 2056 rev3. 45 El ambiente de desarrollo que posee Arduino es sencillo, y existen múltiples proyectos y trabajos en internet por lo que es de fácil aprendizaje. Debido a esto, se han construido varios módulos de placas, ya sea de sensores o actuadores que se pueden acoplar directamente facilitando la implementación de proyectos. Esta placa igual que la escogida para desenvolverse como nodo maestro, puede seguir funcionando sin necesidad de un cambio al complejizar y agregar nuevas funciones al sistema domótico, por lo que no es necesario una reinversión. Sus especificaciones técnicas son: Microcontrolador ATmega2560. Voltaje de operación 5V. Voltaje de entrada de alimentación recomendado 7-12V. Voltajes limite 6-20V. Pines digitales de entrada y salida (I/O) 54. Pines PWM I/O 14. Pines de entrada analógica 16. Conversor análogo digital de 10 bits. Corriente dc por I/O Pin 40 mA. Corriente dc para Pin de 3.3V 50 mA. Memoria Flash 256 KB. Memoria Flash para Bootloader 8 KB. SRAM 8 KB. EEPROM 4 KB. Velocidad de reloj 16 MHz. 5.3. Actuadores 5.3.1. Módulo Relé Para la etapa de iluminación, activación de calefactor, desconexión de enchufes y activación de electroválvula, se utilizan relés conectados a los nodos de procesamiento por medio de un optocoplador y un transistor. Por lo tanto, se utilizará el mismo módulo relé, el cual posee dicha configuración. Éste se muestra en la Fig. 22. 46 Figura 22: Modulo Relé de 4 canales. Estos módulos tienen la particularidad de que funcionan a 5V, igual al voltaje que trabajan los pines de la placa Arduino. La corriente necesaria para activar el optocoplador no proviene de los pines de entrada, sino que de la fuente de tensión, por lo tanto se pueden conectar múltiples módulos sin afectar el desempeño ni poner en riesgo la placa. El consumo de corriente por relé es de máximo 70mA. Cada módulo posee 4 canales, es decir, pueden controlar 4 dispositivos. Como entrada se tienen los pines digitales de la placa Arduino, mientras que por cada relé se tiene 3 salidas, el contacto común, normal cerrado y normal abierto. Cada relé soporta hasta 10A. 5.3.2. Electroválvula La válvula eléctrica que se utilizará se muestra en la Fig. 23, funciona a 220V AC. Es normalmente cerrada (NC), por lo que al aplicar el voltaje se abre el paso para el agua. Este tipo de válvula funciona de mejor manera para el diseño, ya que no requiere una etapa adicional entre relé y válvula, además al ser NC, sólo se consume energía eléctrica cuando se utiliza el grifo. Especificaciones técnicas: Voltaje de funcionamiento 220V AC. Soporta presión de 0.02 a 0.8 Mpa. Diámetro 1/2". 47 Temperatura máxima de fluido de 95°C. Figura 23: Electroválvula. 5.4. Sensores 5.4.1. Sensor de presencia Se utilizará un módulo sensor PIR (Passive Infrared Sensor) (ver Fig. 24), el cual posee capacidad de adaptar la sensibilidad y el tiempo de duración de pulso desde que detecta presencia. Se adecúa a las necesidades de diseño, pudiéndose utilizar directamente para presencia de personas en el caso de iluminación, para presencia en lavaplatos y lavamanos será necesario diseñar un encapsulado resistente al agua. Figura 24: Sensor PIR. Especificaciones técnicas: Rango Voltaje de operación: DC 4.5V- 20V Corriente:<60uA Voltaje de salida 3.3V TTL. 48 Detección de distancia hasta 7M. Rango de detección: <140°. Tiempo de duración de pulso de salida: 5 a 200 segundos. Temperatura de trabajo:-20-+80°C. 5.4.2. Sensor de temperatura y humedad relativa Se utilizará el módulo sensor DHT22 (Fig. 25), el que monitorea el nivel de temperatura y humedad relativa del ambiente, la información se entrega digitalmente soportando una distancia máxima de 20 metros en condiciones normales. Éste es escogido ya que sólo utiliza un pin de I/O de Arduino, y además es de fácil implementación, debido a que existe una librería para la programación de la tarjeta Arduino. Es un sensor con amplio rango de medición y precisión correcta para los requerimientos de diseño. El primer pin corresponde a la alimentación, el segundo corresponde a dato y por último los pines tres y cuatro son tierra, las mediciones se obtienen cada 2 segundos, ya que tanto la humedad como la temperatura no tienen una variación rápida con respecto al tiempo. Figura 25: Sensor de temperatura y humedad relativa DHT22. Especificaciones técnicas: Voltaje de alimentación: 3,3 a 6V dc. Consumo corriente máxima: 2,5mA. Rango de operación de humedad: 0 a 100% RH, precisión de ±2%RH. Rango de operación de temperatura: -40 a 80°C, precisión de ±0,5°C. 49 Resolución de humedad: 0,1%RH. Resolución de temperatura: 0,1°C. 5.4.3. Sensor de inundación Para la etapa de monitoreo de inundación se utiliza un módulo sensor de detección de lluvia, como se puede observar en la Fig. 26, posee una placa con una serie de pistas conductoras de pequeña separación. La función de esta placa es crear un corto circuito cada vez que las pistas se mojan (agua es conductora), por lo que se crea un camino de baja resistencia, es decir, dependiendo de la cantidad de agua varía la resistencia de la placa, para evitar corto circuito existe una resistencia de 10 kΩ en serie para limitar corriente. La señal que se genera varia en voltaje respecto de la resistencia de la placa, esta señal pasa por un amplificador operacional LM392, y posteriormente se genera la señal de salida. Este módulo posee dos tipos de salidas, una digital (0 ó 1) y una analógica. Para el sistema domótico solamente se utilizará la salida digital, ya que lo que importa es solamente si hay o no inundación. El voltaje de operación del módulo es de 3,3 a 5 V dc. Figura 26: Módulo sensor de inundación. 50 5.4.4. Sensor de detección de fuga de calor Para esta etapa del sistema se utilizan interruptores magnéticos (Fig. 27). Poseen dos partes, una móvil y otra fija, con los que se debe montar el circuito mostrado en la Fig. 19. Estos sensores son NC, es decir, cuando las puertas y/o ventanas están cerradas, el interruptor magnético también lo está, y cuando se abren las puertas y/o ventanas el interruptor se abre, por lo que el circuito entrega valores lógico 1 y 0. Figura 27: Interruptor magnético. Especificaciones técnicas: Corriente nominal: 100mA. Voltaje nominal: 200V dc. Distancia de operación: entre 15 a 25mm. 5.4.5. Sensor de detección de fugas de gas Se utiliza un módulo sensor MQ-6 (ver Fig. 28), que permite medir los niveles de gases propano, butano y gas licuado (GLP). Posee dos salidas, analógica y digital. La primera demuestra la concentración del gas en el aire, mientras que la segunda se activa sobre cierto umbral. 51 Figura 28: Módulo sensor de gas MG-6. Especificaciones técnicas: Voltaje de operación: 5V dc. Rango de concentración: 200 a 10.000ppm. Temperatura de funcionamiento: -10 a 50°C. Consumo máximo de corriente: 150mA. Voltaje de salida: 5V, TTL. 5.5. Dispositivo de suministro de energía Para energizar el sistema se utilizan dos cargadores USB, siendo el primero para la placa Arduino (procesamiento), en conjunto con los sensores y módulos relés, debido a ésto es que se selecciona un cargador con capacidad de 2000mA (2A), mientras que para el nodo maestro se utiliza un cargador de 700mA (0,7A), ya que la placa Raspberry no posee elementos asociados que la hagan consumir más. 52 CAPÍTULO VI: Descripción de prototipo a construir 6.1. Descripción de casa para diseñar e implementar prototipo Para definir la estructura real del sistema que se construirá, primero se debe considerar el tamaño y distribución de la casa en dónde se implementará el sistema domótico de ahorro energético. Analizando ésto se obtiene la cantidad de dispositivos a monitorear y controlar con sensores y actuadores respectivamente, es decir, la cantidad de salidas y entradas hacia los nodos de procesamiento y definir la cantidad de Arduinos Mega a utilizar. En la Fig. 29 se observa el plano de la casa en la cual se propone implementar el sistema domótico, no obstante, será en una representación a escala de ésta, siendo totalmente funcional. Figura 29: Plano de casa para implementar sistema domótico. La estructura de la casa y su instalación eléctrica se define a continuación: Dormitorio 1: Posee una luminaria, dos cajas enchufes, una puerta y dos ventanas. Dormitorio 2: Posee una luminaria, dos cajas enchufes, puerta y ventana. Baño: Este posee una luminaria, una caja enchufe, grifo (lavamanos), puerta y ventana. 53 Cocina: Posee una luminaria, dos cajas enchufes, puerta, dos ventanas, grifo (lavaplatos), consumo de gas licuado, instalación para lavadora. Living – Comedor: Éstos se encuentran sin separación de pared, poseen dos luminarias, tres cajas enchufes, puerta y una ventana. Pasillo: Cuenta con una luminaria. Patio: Posee dos luminarias. 6.2. Planificación de sistema Considerando la cantidad de habitaciones y sus características, se establece una tabla donde se menciona lo que debe ser controlado y monitoreado (Tabla I) obteniendo la dimensión del sistema domótico. Tabla I: Cantidad de funciones por habitación. Control iluminación Dormitorio Monitoreo intensidad luminosa Control Monitoreo Monitoreo Monitoreo Control Control Monitoreo climatización T/H fuga Calor fuga Gas enchufes Grifo inundación 1 2 2 1 1 2 Baño 1 1 1 1 Cocina 1 2 2 1 1 Dormitorio 2 Living Comedor Pasillo Patio (Exterior) 2 1 1 2 1 1 3 1 2 1 1 Considerando estos elementos, se obtiene la cantidad de entradas (por sensores) y salidas (para actuadores) que representan las funciones de la Tabla I, por habitaciones y el total del sistema. Esto se observa en la Tabla II. 54 Tabla II: Entradas y salidas del sistema. Entrada Salida Dormitorio 1 3 3 Dormitorio 2 2 3 Baño 3 3 Cocina 6 5 Living Comedor 5 6 Pasillo 1 1 Patio (Exterior) 4 2 TOTAL 24 23 De la Tabla I también se obtiene la cantidad de sensores específicos para cada función, así como también los actuadores necesarios, todo esto referente al diseño planteado anteriormente. Estos datos se muestran en la Tabla III. Tabla III: Cantidad de sensores y actuadores para el desarrollo del sistema domótico. Sensores PIR 11 LDR 1 DHT22 2 MQ6 1 Interruptor Magnético 8 Inundación 1 TOTAL 24 Actuadores Relé + Electroválvula 3 Relé 20 TOTAL 23 55 De acuerdo a la cantidad de sensores y actuadores a utilizar, se determina que sólo es necesario un nodo de procesamiento, ya que se requiere 47 I/O, de las cuales dos entradas son analógicas, y la placa Arduino Mega posee 54 I/O digitales y 14 entradas analógicas, por lo tanto cumple con los requerimientos. En caso de haber seleccionado una tarjeta electrónica o un microcontrolador con menor cantidad de I/O hubiese sido necesario implementar más de un nodo. De igual manera si la casa o departamento fuese más grande, los requerimientos aumentan y por lo tanto más nodos de procesamiento serían necesarios. 56 CAPÍTULO VII: Diseño de software y programación de tarjetas Para el sistema diseñado se programa una interfaz gráfica para que los usuarios puedan interactuar y controlar los diversos elementos, utilizando el Software Qt Creator, el cual es un entorno de desarrollo integrado (IDE) donde se pueden crear programas informáticos con interfaz gráfica, y permite utilizar todas las librerías de Qt, más aún, permite compilar y ejecutar programas hechos en lenguaje C++ para múltiples plataformas, como es el caso de Windows, Linux, Android y Mac. Lo anterior es la principal causa de su elección, ya que cumple con los requerimientos de establecer en múltiples dispositivos con capacidad de conexión a internet el mismo programa desarrollado sin realizar modificaciones al código fuente. Qt también se utiliza para la programación de la tarjeta de desarrollo Raspberry pi, la cual se encarga de hacer de puerta de enlace entre el nodo de procesamiento y los usuarios, acoplándose a la red creada por un Router. Ésta utiliza un sistema operativo llamado Raspbian, basado en Debian, por lo que si en algún momento se piensa migrar de esta placa la programación de la aplicación que está ejecuta no debiese cambiar, considerando que sea reemplazada por otra tarjeta de desarrollo basada en Linux o bien un computador con Android o Windows. Finalmente para la programación del nodo de procesamiento se utiliza la IDE propia que posee Arduino, pudiendo programar mediante lenguaje C y las librerías específicas de esta placa de desarrollo. Las tres partes de software o aplicación que componen el sistema domótico se comunican conforme muestra la Fig. 30, donde se envía desde la aplicación de procesamiento la información por UART hacia la unidad que opera un servidor TCP/IP (Nodo maestro) y reenvía la información a los usuarios, donde finalmente es mostrada por medio de la interfaz gráfica. 57 Figura 30: Comunicación entre aplicaciones pertenecientes a distintos componentes de Sistema Domótico. 7.1. Descripción de aplicación desarrollada para interfaz usuario La interfaz está programada en Qt, utilizando lenguaje C++ y haciendo uso de forma de implementación de métodos o funciones propia de Qt. Esto se realiza a través de SIGNAL (señales) emitidas por objetos, las cuales se unen a SLOT (métodos), para ejecutar acciones pertinentes. Un ejemplo de lo anterior es al presionar un botón de la interfaz gráfica y ejecutar una determinada acción. En esta misma aplicación se implementa un cliente TCP IP, para lograr establecer una comunicación a través de una red LAN, WLAN o internet. Gráficamente la interfaz está compuesta por cuatro pestañas que contienen distintos elementos a controlar o monitorear, tal como se observa en la Fig. 31; la primera corresponde a “Enlace”, en la cual se establece la comunicación; la segunda corresponde a “Control” donde se gestiona los elementos del hogar, tales como enchufes, iluminación, calefacción, entre otros; en la tercera se muestran las “Fugas”, de calor, inundación y gas, las cuales cambian de color gris a rojo. Por último la pestaña “Ambiente” muestra los parámetros de temperatura, intensidad luminosa natural y humedad relativa en tiempo real desde la casa. 58 Figura 31: Interfaz gráfica de usuario, pestaña principal de conexión, de Fuga y de monitoreo Ambiente. En las Fig. 32 y 33 se puede observar la etapa de control la cual se subdivide en cuatro pestañas nuevamente. La primera pestaña corresponde al control de iluminación en el cual se puede seleccionar entre control por sensor, dejar encendido o apagado, cambia de color de acuerdo al estado en que se encuentra la ampolleta asociada, tal como se muestra en la leyenda inferior, también incluye un parámetro modificable que representa el nivel de intensidad límite de luminosidad. En la segunda pestaña se observa el control de enchufes, donde se pueden activar o desactivar a voluntad mostrándose el estado actual en tiempo real. En la tercera pestaña se controla el calefactor de la casa, donde se puede establecer parámetros dinámicos de temperaturas limite máxima y mínima, también se muestra si existe al menos una fuga de calor cuando se está calefaccionando y la temperatura real interior. Por último en la cuarta pestaña se controlan los grifos de lavamanos y lavaplatos, seleccionando funcionamiento por sensor o por usuario. También se controla la activación de agua hacia la lavadora. 59 Figura 32: Interfaz gráfica de control de iluminación y enchufes. 60 Figura 33: Interfaz gráfica de control de calefactor y grifos. La manera de funcionar de esta aplicación se explica en los siguientes puntos. En la interfaz aparece un espacio para ingresar la dirección IP y puerto para establecer la conexión con el servidor, en el espacio de dirección se puede escribir tanto en formato numérico o el DNS asociado. Posteriormente, cada vez que se conecta el usuario se le envía la información de todos los estados de los elementos en el hogar. Para modificar algún estado de elementos en el hogar, deben ser seleccionados y luego presionar donde dice “Enviar modificaciones”. De esta manera se pueden realizar múltiples cambios en todas las pestañas y enviar todo en conjunto. Al enviar modificaciones, el servidor retorna los estados reales posterior a la modificación y actualiza la interfaz, esto sucede independiente de que cliente realice el cambio. El programa con sus respectivos ficheros creados se encuentra en el Anexo I “Programa de Interfaz Gráfica”. 61 7.2. Descripción de aplicación desarrollada para nodo maestro La aplicación desarrollada para el nodo maestro utiliza el mismo lenguaje e IDE (Qt Creator) que la interfaz gráfica. Actúa en base a los clientes que se conectan y nodo de procesamiento que gestiona. El programa desarrollado posee una conexión puerto serie (UART), a 115200 bps, ya que los datos a transmitir son mínimos, y un servidor TCP, por el cual se comunica con los múltiples Clientes, que son los Usuarios. Para lograr lo anterior se establece a la tarjeta de desarrollo donde reside el programa, una IP fija dentro de la red, y al router se le habilita un redireccionamiento de puerto hacia dicha IP, de esta manera se logra la conexión a través de internet. La tarea que desarrolla esta aplicación se describe en los siguientes puntos: Recibe información desde el nodo de procesamiento. Transforma dicha información y la envía a todos los clientes conectados. Al conectarse un cliente lo agrega a una lista para luego transmitir información. Cuando un cliente envía comandos de control el servidor lee la información y la reenvía hacia el nodo de procesamiento. Si un cliente se conecta el servidor actualiza a todos los usuarios conectados el estado del sistema. La programación respectiva a esta aplicación se encuentra en el Anexo II “Programa de Nodo Maestro”. 7.3. Descripción de aplicación desarrollada para nodo de procesamiento La programación de la tarjeta de desarrollo se realiza con Arduino IDE, siguiendo la misma estructura de Arduino, es decir, primero se incorporan las librerías, variables globales, posteriormente existe una función “setup”, donde se ejecutan acciones sólo una vez, para preestablecer la configuración de la placa. Posterior existe la función principal llamada “loop”, la cual se ejecuta constantemente y es aquí donde se establecen las tareas a realizar. 62 Siguiendo la estructura mencionada al inicio del programa se agregan las librerías correspondientes, se establecen las variables asociadas a los sensores, actuadores y parámetros límites de control. En la etapa de “setup”, se establecen los pines de la tarjeta como entradas y salidas respectivo a su función, se configura el puerto serie a utilizar para conectar con el nodo maestro. En la etapa de “loop” se ejecuta el monitoreo de los sensores y lectura de comandos de control recibidos, también se analiza el estado de los actuadores de acuerdo a los parámetros de los sensores y comandos enviados por los usuarios, para decidir si se activan o no. Para ello se implementan múltiples funciones anexas las cuales se llaman desde la rutina “loop”. El mensaje que envía el nodo de procesamiento hacia el maestro, se subdivide en tres, siendo el primero relacionado al estado de sensores, el segundo a los actuadores y el último a sensores ambiente. En cada ciclo de la función principal se evalúan estos parámetros y si son distintos, se envían hacia el nodo maestro el cual actualizará a los usuarios conectados. En Anexo III “Programa Arduino”, se encuentra el código fuente completo de la placa de nodo de procesamiento. 63 CAPÍTULO VIII: Implementación del sistema 8.1. Descripción de método de implementación Para evaluar que el sistema domótico diseñado tenga el desempeño planificado, es decir, realice las funciones y se verifique el cumplimiento de todos los requerimientos planteados, se monta el proyecto completo sobre una maqueta a escala de la casa que se describe en el capítulo VI. La implementación de la maqueta en términos electrónicos y eléctricos, es 100% real, ya que se trabajará con todos los elementos mencionados y con conexiones a la red eléctrica doméstica (220V AC), por lo cual se podrá analizar el funcionamiento del proyecto completamente. En el caso del sistema de control de agua, se instalará hasta la etapa de las válvulas eléctricas, ya que con esto se comprueba si el sistema es capaz o no de realizar el control pertinente. La implementación se realiza sobre una maqueta, ya que no se dispone de una casa a la cual se le pueda acoplar el sistema diseñado, lo que implicaría realizar cambios mayores dentro del hogar en la instalación eléctrica. Se considera que para evaluar el funcionamiento y ahorro energético no es necesario la implementación en una casa, ya que una vez comprobado el sistema, se puede estimar el ahorro energético que generaría, puesto que es posible determinar el consumo del sistema propio considerando el comportamiento de consumo de las personas, el cual ya fue analizado. De esta manera se obtiene una estimación sobre si el sistema realmente genera un ahorro en términos de energía eléctrica y consumo de agua potable. 8.2. Especificación de maqueta La maqueta construida para montar el sistema electrónico y eléctrico del proyecto domótico está hecha de madera, para dar rigidez y firmeza a la estructura en general. La base sobre la cual se construye posee dimensiones de 120cm de largo y 80cm de ancho, la casa posee dimensiones de 100cm de largo y 50cm de ancho, por lo que queda un espacio en la base el cual corresponde al patio que esta casa posee, pudiendo montar el sistema tanto interior como exterior. 64 En la Fig. 34, se observa la maqueta previo al montaje del sistema domótico, del material y dimensiones ya descritas. Figura 34: Estructura de maqueta basado en plano de casa presentado en capítulo VI. 8.3. Montaje de sistema eléctrico Esta etapa corresponde al montaje de los elementos que comúnmente están instalados en las casas, sin considerar la inteligencia desarrollada en este trabajo. Estos dispositivos principalmente son los enchufes en todas las zonas y los soquetes para ampolletas de tipo E27. También se realiza la conexión para energizar la maqueta con 220V AC domiciliario dejando las conexiones listas hacia los dispositivos a través de las placas de relés. En la Fig. 35, se muestra una vista superior de la maqueta con los componentes ya instalados, todo esto de acuerdo a la planificación realizada en el capítulo VI. En la Fig. 36 se observa una vista inferior de la maqueta en la cual están las conexiones eléctricas realizadas. Todos los dispositivos se conectan a su respectivo relé mediante el cable correspondiente a la fase y el neutro directamente a la red domiciliaria. Para energizar la maqueta se instala un enchufe totalmente fuera de la planificación (ver Fig. 37), ya que en la realidad esto representa la acometida al hogar. 65 Figura 35: Instalación de dispositivos eléctricos. Figura 36: Conexión de enchufes y soquetes de ampolletas. 66 Figura 37: Enchufe por el cual se alimenta con 220V AC al resto de la maqueta. 8.4. Montaje electrónico En esta etapa se agregan todos los elementos que faltan para la composición total del sistema, es decir, los sensores en conjunto con las válvulas eléctricas para controlar el flujo de agua del lavamanos y lavaplatos. En primera instancia se realiza todo el montaje de elementos sobre la maqueta, es decir, sensores de movimiento, LDR, de temperatura y humedad tanto interior como exterior, interruptores magnéticos para fuga de calor e inundación. Dejando los cables para realizar las conexiones pertinentes hacia la placa Arduino Mega. En las Fig. 38 y 39 se observa dicho montaje con los respectivos elementos. Figura 38: Vista superior de maqueta, con sensores y actuadores instalados. 67 Figura 39: Vista inferior de maqueta, con conexiones realizadas. El nodo de procesamiento se ubica en un extremo de la maqueta hacia donde llegan todos los cables para su conexión como se ve en la Fig. 40. Cabe destacar que en una implementación dentro de una casa es necesario evaluar de acuerdo a su estructura respectiva dónde se debería ubicar, teniendo en cuenta la cercanía con el nodo Maestro. Figura 40: Nodo de procesamiento conectado al sistema. 68 8.5. Conexión de nodo maestro y red LAN En esta última etapa se instala el nodo maestro y se realiza la conexión al router mediante cable de red Ethernet RJ45. Para acoplar todo el sistema dentro de la red LAN, se debe tener en cuenta que si el router no tiene conexión hacia internet el sistema estará limitado a un control dentro de la red WLAN. La relación entre nodo maestro y de procesamiento se observa en la Fig. 41. Figura 41: Maqueta con nodo de procesamiento y nodo maestro instalado. 8.6. Control remoto en distintos dispositivos En esta etapa se instala el control remoto en dispositivos con sistema operativo Android y Windows. En la Fig. 42 se observa el control ejecutándose en un computador con Windows 7. En la Fig. 43 se ejecuta el control en un celular Avvio 790 con Android 4.0 y finalmente en la Fig. 44 se implementa el control en un Tablet Samsung Galaxy Tab. 69 Figura 42: Control remoto en notebook con Windows 7. Figura 43: Control remoto en celular Avvio 790. 70 Figura 44: Control remoto en Samsung Galaxy Tab 3, con Android 4.2.2. 71 CAPÍTULO IX: Resultados de prototipo y Cálculo de ahorro 9.1. Resultado prototipo Una vez montado el sistema e instalado el software de control en los dispositivos se probó el funcionamiento de éste, no obstante, se produjeron errores en distintas etapas que impidieron el funcionamiento. 9.1.1. Etapa nodo de procesamiento Se produjo un mal funcionamiento en la activación de las etapas controladas por los sensores de movimiento PIR, debido a que al detectar movimiento el sensor pasa a estado alto (3,3V) durante un tiempo determinado y luego se mantiene en nivel bajo por aproximadamente 2 segundos, siendo este tiempo fijo, por lo tanto los actuadores se activaban y se desactivaban en cada ciclo del sensor a pesar de seguir detectando movimiento. La solución a este problema fue modificar el programa de la tarjeta Arduino, de tal manera que una vez activado el sensor, se mantuviese el actuador respectivo accionado durante 6 segundos, siendo este tiempo levemente mayor que el período en alto y bajo del sensor, manteniendo así el accionamiento sin interrupciones. Por otra parte, se tuvo que limitar el envío de estados de sensores específicamente del sensor LDR, ya que éste cambia constantemente en pequeñas proporciones, teniendo un rango de 0 a 1024, del cual tenía variación de 1 a 3 ralentizando la comunicación con el resto de las etapas posteriores y con la actualización de la interfaz gráfica. La solución que se implementó fue modificar nuevamente el programa y enviar el conjunto de datos de sensor por cambio de sensor LDR cada 10 segundos, siempre y cuando tuviese una variación de más de 17 con respecto a la medición anterior. No obstante, si se presenta algún cambio en fugas de calor el dato se envía en el tiempo de ocurrencia. El resto de los sensores funcionó sin problema, de acuerdo a lo planificado. 9.1.2. Etapa comunicación entre nodo maestro y procesamiento Durante la realización de las pruebas no se produjeron problemas en esta etapa, aun cuando se probó con comunicación por cable de 10 metros, para ver si existía algún problema por distancia. Se utilizaron velocidades entre 9.600 a 115.200 baudios funcionando 72 perfectamente en todo el rango, por lo que se estableció 115.200 permitiendo una mayor velocidad hacia el nodo maestro y por consiguiente hacia la actualización de la interfaz gráfica. 9.1.3. Etapa de control remoto Esta etapa produjo gran cantidad de errores, los cuales se describen a continuación: Error de relación entre aspectos gráficos con definición de sensores y actuadores en placa Arduino, es decir, la información llegaba, pero no se encendían los elementos respectivos en pantalla, por ejemplo, al accionar la iluminación de una habitación encendía otra. Esto se debía a que habían fallas de orden en el envío del conjunto de datos. La solución fue verificar a qué correspondía cada pin de nodo procesamiento y relacionarlo con las variables tanto del programa de Arduino y control de usuario una a una. Error de visualización de temperatura y humedad en pantalla, esto se debió a que estaba mal programada la función en el software, puesto que se estaba utilizando un tipo de dato equivocado. Error de actualización de interfaz, es decir, al enviar mucha información no llegaba a la etapa de control siendo la comunicación extremadamente lenta; ésto se observó tanto dentro de la red de área local como a través de internet, así como también con un y cinco clientes. Se produjo, ya que se enviaba tres estructuras de datos distintas, una para sensores, otra para datos de ambiente y otra para estados de actuadores, por lo que al enviar la información a los clientes, existían tiempos en que habían interferencias, ralentizando la comunicación. La solución fue modificar tanto el programa del nodo maestro como del control remoto, para que a cualquier cambio dentro del sistema se enviase toda la información como una sola. También se tuvo que corregir el control remoto puesto que no se consideró previamente que al modificar múltiples parámetros por un cliente X, otro cliente Y ve las modificaciones, pero si el cliente Y realiza cualquier modificación tiene que configurar sus parámetros para no cambiar todo lo que realizó X. La solución fue cambiar el programa de nodo maestro y control remoto, por parte del nodo maestro cada vez que alguien se conecta o envía alguna modificación, envía los parámetros de vuelta a todos los clientes, así se actualizan los parámetros de control y visualización en conjunto. 73 9.1.4. Resultados Finales Luego de todas las modificaciones descritas anteriormente se realizaron pruebas utilizando de 1 a 4 clientes distintos simultáneamente, a través de internet y dentro de WLAN. Se observó que los cambios se producían sin problemas pudiendo controlar la iluminación, calefacción y electroválvulas desde los distintos dispositivos y, estos cambios se observaban instantáneamente en el resto de usuarios. Así como también el sistema funcionaba de acuerdo a los requerimientos planteados. En la prueba donde los 4 usuarios estaban conectados simultáneamente, se podían controlar desde cualquier dispositivo todos los aspectos mencionados en el diseño, así como también se observaban los cambios de estados de fugas de calor, gas, y datos ambientales como iluminación natural, temperatura interior, exterior y humedad relativa. 9.2. Estimación de ahorro energético Para comprobar que el sistema diseñado realmente ahorra energía, se realiza un estudio basado en estadísticas de consumo mencionadas en el capítulo I, en conjunto con mediciones realizadas al sistema. Se determina de esta manera ya que el sistema está implementado en una maqueta y no en una situación real dentro de un hogar. Así se mostrarán distintos escenarios en los cuales el sistema diseñado influye y genera un cambio en el consumo, como es el caso de la iluminación, consumo standby, calefacción y agua. 9.2.1. Consumo real de sistema domótico En este punto se establece la energía consumida por el sistema, puesto que para funcionar requiere de energía eléctrica, y es necesario contrastar dicho valor con el ahorro generado. Se midió la corriente consumida con un multímetro para cada elemento que compone el sistema domótico, a su vez se conoce el voltaje de funcionamiento y la cantidad de dispositivos, por lo tanto se determina la potencia respectiva en Watt. Estos resultados se muestran en la tabla IV. 74 Tabla IV: Potencia consumida total de cada componente de sistema domótico. Componente SENSORES LDR PIR DHT22 MQ6 Interruptor M Inundación Total Sensores ACTUADORES Salida Arduino-Relé Relé Válvula Total Actuadores TARJETA DE DESARROLLO Arduino Mega Raspberry Pi Total Tarjetas Corriente Cantidad Voltaje (V) unitaria (mA) Potencia unitaria (W) Potencia Total (W) 1 11 2 1 8 1 0,5 0,4 1,7 135 0,5 4 5 5 5 5 5 5 0,0025 0,002 0,0085 0,675 0,0025 0,02 0,0025 0,022 0,017 0,675 0,02 0,02 0,7565 23 23 3 1,9 65 22,7 5 5 220 0,0095 0,325 4,994 0,2185 7,475 14,982 22,6755 1 1 45 240 5 5 0,225 1,2 0,225 1,2 1,425 Cabe destacar que la potencia consumida por las tarjetas de desarrollo en conjunto con todos los sensores, es constante durante todo el tiempo, es decir, en funcionamiento dicho valor se mantiene 24 horas al día, 7 días a la semana, por lo tanto es un consumo fijo al mes equivalente a: 𝐶𝑜𝑛𝑠𝑢𝑚𝑜𝑚𝑒𝑠 = (𝑃𝑜𝑡𝑒𝑛𝑐𝑖𝑎𝑠𝑒𝑛𝑠𝑜𝑟𝑒𝑠 + 𝑃𝑜𝑡𝑒𝑛𝑐𝑖𝑎𝑡𝑎𝑟𝑗𝑒𝑡𝑎𝑠 ) ∗ 24ℎ ∗ 30𝑑𝑖𝑎𝑠 (Ec. 9.1) 𝐶𝑜𝑛𝑠𝑢𝑚𝑜𝑚𝑒𝑠 = (0,7565 + 1,425) ∗ 24 ∗ 30 = 1570,68 𝑊ℎ = 1,57068𝑘𝑊ℎ Este valor calculado se deberá restar al ahorro generado, ya que es un consumo inherente al sistema domótico. Respecto a la potencia consumida por los actuadores, el valor total no es relevante, puesto que solamente depende de si está activo la salida correspondiente al actuador, por ejemplo, al tener iluminada alguna zona un relé estará consumiendo durante el tiempo de iluminación. De igual manera ocurre con el control de los múltiples enchufes y las válvulas eléctricas. Considerando esto, se pueden plantear distintos escenarios y simular el consumo que se tendría. 75 9.2.2. Ahorro estimado por iluminación Para este análisis se consideran dos situaciones puntuales, el primer caso es utilizando ampolletas incandescentes, las cuales consumen en exceso, considerando la tecnología desarrollada hoy en día. En el segundo caso se utilizan ampolletas LED, las cuales consumen menos energía eléctrica. En ambos casos el sistema domótico consumirá lo mismo, ya que es independiente del tipo de ampolleta utilizado, esto se calcula a partir de la medición hecha anteriormente, mediante la siguiente expresión. 𝐶𝑜𝑛𝑠𝑢𝑚𝑜𝑆/𝑓𝑜𝑐𝑜 = (𝑃𝑜𝑡𝑒𝑛𝑐𝑖𝑎𝑅𝑒𝑙𝑒 + 𝑃𝑜𝑡𝑒𝑛𝑐𝑖𝑎𝑠𝑎𝑙𝑖𝑑𝑎 𝑎𝑟𝑑𝑢𝑖𝑛𝑜 ) ∗ ℎ𝑜𝑟𝑎𝑠 ∗ 30𝑑𝑖𝑎𝑠 (Ec. 9.2) Asumiendo 1 hora al día, se tendría un consumo por foco de iluminación durante un mes de: 𝐶𝑜𝑛𝑠𝑢𝑚𝑜𝑆/𝑓𝑜𝑐𝑜 = (0,0095 + 0,325) ∗ 1ℎ ∗ 30𝑑𝑖𝑎𝑠 = 10,035𝑊ℎ = 0,01𝑘𝑊ℎ Caso 1 El consumo de 4 ampolletas incandescentes de 100 W funcionando 3 horas diarias, cada una sin sistema implementado es de 36 kWh, considerando este valor se realiza una estimación de ahorro respecto del tiempo reducido por uso de sensores de presencia (ver Tabla V). Dentro del cálculo realizado se consideró como factor negativo al ahorro de potencia consumida por el relé que mantiene encendido la ampolleta. 76 Tabla V: Ahorro generado vs tiempo de iluminación innecesario omitido por sensores, con ampolletas incandescente. Tiempo reducido (h) Ahorro (kWh) 1 11,96 1,2 14,35 1,4 16,74 1,6 19,14 1,8 21,53 2 23,92 2,2 26,31 2,4 28,70 Dependiendo del comportamiento de las personas en el hogar es el ahorro reflejado, es decir, si una familia acostumbra a dejar las ampolletas encendidas sin estar en dichas habitaciones, el ahorro será mayor que en otra en la cual no lo hagan tan a menudo. En la Fig. 45 se puede observar gráficamente esta estimación, la cual muestra un ahorro que aumenta linealmente de acuerdo al tiempo reducido. Ahorro generado por iluminación 3,00 Ahorro (kWh) 2,50 2,00 1,50 1,00 0,50 0 0,5 1 1,5 2 2,5 3 Tiempo reducido (horas) Figura 45: Estimación de ahorro por iluminación con foco incandescente vs tiempo reducido por sensores. 77 Caso 2 En esta estimación se mantienen las mismas condiciones, con la diferencia que varía la potencia de la ampolleta, ya que equivale a una de tipo LED de 9 W. De esta manera se tiene un consumo sin sistema de 3,24 kWh. En la tabla VI se observa el ahorro generado considerando las ampolletas LED. Tabla VI: Ahorro generado vs tiempo de iluminación inútil omitido por sensores, con ampolletas LED. Tiempo reducido (h) Ahorro (kWh) 1 1,04 1,2 1,25 1,4 1,46 1,6 1,66 1,8 1,87 2 2,08 2,2 2,29 2,4 2,50 Se observa que existe un ahorro energético, pero es menor, ya que la potencia consumida por las ampolletas es notablemente inferior a las incandescentes. 9.2.3. Ahorro estimado por consumo Standby Para este cálculo se hace referencia a los estudios presentados en los cuales se plantean dos porcentajes de consumo standby de un hogar, siendo estos valores 10,3% y 13%. Basado en ambos casos se estima el ahorro de energía eléctrica respecto del consumo mensual de un hogar, considerando que se utiliza el sistema domótico de manera óptima desconectando los dispositivos de la red de energética, para que no se produzca el consumo standby. Los resultados obtenidos se observan en la tabla VII. 78 Tabla VII: Ahorro estimado de energía eléctrica por consumo standby. Consumo mensual (kWh) 150 160 170 180 190 200 210 Ahorro 10,3% (kWh) 15,45 16,48 17,51 18,54 19,57 20,6 21,63 Ahorro 13% (kWh) 19,5 20,8 22,1 23,4 24,7 26 27,3 9.2.4. Ahorro estimado por consumo agua potable Respecto de la energía utilizada por las electroválvulas que controlan el flujo del lavamanos y lavaplatos, en conjunto con la conexión hacia una lavadora, se puede estimar de acuerdo a la cantidad de horas de uso al día. Si se considera un uso de las tres electroválvulas con sus respectivos relés durante 30 días (un mes), con 30 minutos al día, el consumo sería: 𝐶𝑜𝑛𝑠𝑢𝑚𝑜𝑐𝑜𝑛𝑡𝑟𝑜𝑙 𝑎𝑔𝑢𝑎 = ( 𝑃𝑜𝑡𝑒𝑛𝑐𝑖𝑎𝑅𝑒𝑙𝑒 + 𝑃𝑜𝑡𝑒𝑛𝑐𝑖𝑎𝑠 𝑎𝑟𝑑𝑢𝑖𝑛𝑜 + 𝑃𝑜𝑡𝑒𝑛𝑐𝑖𝑎𝑣𝑎𝑙𝑣𝑢𝑙𝑎 ) ∗ 30 𝑑𝑖𝑎𝑠 ∗ 0,5 ℎ𝑜𝑟𝑎𝑠 (Ec. 9.3) 𝐶𝑜𝑛𝑠𝑢𝑚𝑜𝑠𝑖𝑠𝑡𝑒𝑚𝑎 𝑐𝑜𝑛𝑡𝑟𝑜𝑙 𝑎𝑔𝑢𝑎 = ( 15,9855 𝑊) ∗ 30 𝑑𝑖𝑎𝑠 ∗ 0,5 ℎ𝑜𝑟𝑎𝑠 = 0,239 𝑘𝑊ℎ Esta medida es mínima en comparación al control que conlleva este sistema y al ahorro que se pueda generar en términos de agua potable, que finalmente no se observa en un ahorro económico de la cuenta eléctrica, sino en la cuenta de agua potable. En la Región de Los Ríos, la empresa Aguas Décima, cobra $495 / m3 de agua potable y $644 / m3 por alcantarillado. Basado en estos valores se estima el ahorro generado en función del tiempo que se reduce la apertura de los grifos del lavamanos y lavaplatos, teniendo estos un flujo de 4 litros por minuto. Los resultados se muestran en la Tabla VIII. 79 Tabla VIII: Ahorro por control de lavamanos y lavaplatos durante un mes. Tiempo reducido (min) 5 9 13 17 21 Ahorro de agua (m3) 1,2 2,16 3,12 4,08 5,04 Ahorro Monetario $ 1.367 $ 2.460 $ 3.554 $ 4.647 $ 5.741 Se observa que el ahorro varía dependiendo del tiempo de reducción que se genere, por lo tanto, del comportamiento que se tenga al utilizar el lavamanos y lavaplatos. 9.2.5. Ahorro general del sistema Para obtener un ahorro general, es necesario establecer también los ahorros por calefacción, dependiendo del tipo de calefactor se utilizarán distintos tipos de energía, por ejemplo, puede utilizar sólo electricidad, parafina, gas, entre otros. Por lo tanto el ahorro que generaría el sistema domótico al controlar la calefacción mediante los sensores de temperatura no se puede estimar a grandes rasgos, como se realizó con la iluminación y consumo standby. A pesar de que no se pueda cuantificar dicho ahorro, el que no sólo puede ser eléctrico, se establece que sería un valor positivo a favor del sistema domótico. Finalmente, considerando todos los ahorros generados por separado se concluye que el sistema sí genera una disminución de consumo energético y, por lo tanto cumple con su función. Además permite a las personas dentro de un hogar tener control absoluto de su casa en los parámetros que gestiona el sistema presentado. No obstante, basado en los cálculos de ahorro en iluminación y standby, en las Tablas IX y X, se muestra lo que se reduciría en la cuenta de electricidad al mes, sin considerar el control de calefacción. Se asume que 1kWh tiene un valor de $ 127, ya que es el precio cobrado por la Empresa SAESA para la ciudad de Valdivia a la fecha de realización de este trabajo. 80 Tabla IX: Rango de ahorro eléctrico durante un mes, considerando iluminación incandescente. Iluminación Incandescente (kWh) Standby (kWh) Consumo sistema (kWh) Ahorro Total (kWh) Ahorro Total ($) Mínimo 11,96 15,45 -1,57 25,84 $ Máximo 28,7 27,3 -1,57 54,43 3.282 $ 6.913 Tabla X: Rango de ahorro eléctrico durante un mes, considerando iluminación LED. Iluminación LED (kWh) Standby (kWh) Consumo sistema (kWh) Ahorro Total (kWh) Ahorro Total ($) Mínimo 1,04 15,45 -1,57 14,92 $ Máximo 2,5 27,3 -1,57 28,23 1.895 $ 3.585 De las Tablas VIII, IX y X, se puede estimar un rango de ahorro que generaría el sistema, dada las condiciones planteadas. El mínimo se obtiene considerando iluminación LED y menor ahorro de agua potable, siendo $ 3.262 al mes y $ 39.144 al año. El máximo se obtiene considerando iluminación incandescente y mayor consumo de agua potable, siendo $ 12.654 al mes y $ 151.848 al año. Finalmente, las condiciones planteadas son tentativas y varían en cada hogar. Para obtener un valor real de cuánto equivale el ahorro, sería necesario llevar el registro de una casa regular en cuanto a consumo eléctrico, combustible para calefacción (siempre que sea compatible con el sistema) y consumo de agua, por un par de meses. Luego se debe implementar el sistema domótico y elaborar nuevamente un registro cierta cantidad de meses, hecho esto se puede contrastar los meses medidos y verificar el ahorro real que se generaría. 81 9.3. Costos de componentes utilizados La inversión necesaria para comprar los dispositivos sensores, actuadores, placas de desarrollo, cargadores para suministrar la energía necesaria y tarjeta MicroSD, que componen el sistema domótico se observa en tabla XI. Tabla XI: Listado de precios de materiales que conforman el sistema domótico. Dispositivo Cantidad Valor Unitario (USD) Valor Total (USD) CLP Sensores PIR 11 $ 1,0 $ 11 $ 6.512 LDR 1 $ 2,0 $ 2 $ 1.184 DHT22 2 $ 4,2 $ 8 $ 4.973 MQ6 1 $ 4,4 $ 4 $ 2.605 Interruptor Magnético 8 $ 0,6 $ 5 $ 2.936 Inundación 1 $ 2,8 $ 3 $ 1.658 Electroválvula 3 $ 8,2 $ 25 $ 14.563 Modulo Relés 4 canales 6 $ 4,0 $ 24 $ 14.208 Raspberry pi 1 $ 40,0 $ 40 $ 23.680 Arduino Mega 1 $ 10,0 $ 10 $ 5.920 Tarjeta SD 1 $ 5,0 $ 5 $ 2.960 Cargador 2A/5V 2 $ 4,0 $ 8 $ 4.736 $ 145 $ 85.935 Actuadores Placas electrónicas Varios TOTAL Los precios de los componentes se detallan en dólares, ya que se importaron desde China. La columna CLP corresponde a pesos chilenos, se obtuvo considerando el valor del dólar a la fecha de compra, siendo 1 dólar equivalente a $ 592. El monto $ 85.935 corresponde solamente a los componentes, no obstante para considerar todo el costo que conlleva la inversión inicial se debiese incorporar el valor de instalar el sistema en una residencia. Cabe destacar que un sistema que cumpla las mismas funciones o similares al presentado en este trabajo tienen un costo muy superior. 82 CAPÍTULO X: CONCLUSIONES En el presente trabajo se diseñó un sistema domótico enfocado al ahorro energético, puesto que cada vez se hace más necesario administrar eficientemente los recursos. De acuerdo a los requerimientos planteados que consisten en que sea de bajo costo inicial, fácil y rápida implementación, escalable, permitiendo ampliar el sistema en caso de ser necesario, se opta por tecnología basada en tarjetas de desarrollo como lo son Arduino y Raspberry Pi en conjunto con dispositivos que son comunes hoy en día, como teléfonos móviles inteligentes, Tablet y computadores con acceso a internet para el control de los múltiples aspectos del hogar, puesto que permiten una fácil interconexión entre ellos dentro de una red WLAN o por medio de internet, facilitando la gestión de proyectos desde cualquier lugar siempre y cuando se esté conectado a internet o dentro del mismo hogar utilizando la red generada por un Router. Los parámetros que se controlan están relacionados con la iluminación en todas las zonas; gestión de enchufes para evitar consumo standby; calefacción eléctrica en conjunto con monitoreo de temperatura y fugas de calor; control de grifos en lavamanos, lavaplatos y conexión de lavadora para disminuir consumo de agua potable; finalmente se agregó el monitoreo de inundación y fuga de gas para dar mayor seguridad al hogar. Estos factores se seleccionaron debido a los resultados obtenidos del estudio presentado en el capítulo I, donde destacan como principales pérdidas de energía, el consumo por iluminación 15% y standby 13%. A esto se le asocia las perdidas en consumo de agua potable y fugas de gas. De las pruebas realizadas, se puede concluir que el sistema funciona como se diseñó, es decir, permite tener múltiples usuarios conectados de manera simultánea, cada uno puede controlar todos los aspectos mencionados y el resto ve las modificaciones en tiempo real. Además los usuarios pueden seleccionar entre dejar encendido, apagado o controlado por sensores funciones como el accionar de la iluminación en zonas independientes entre ellas, grifos de agua potable y calefactor. Se observó que la variación de tiempo que demora en actualizar la interfaz respecto de la cantidad de usuarios conectados al nodo maestro es imperceptible para ellos. No obstante, por software se limitó el número de usuarios conectados simultáneamente a 10 ya que al estar pensado en el sector residencial, se espera que no se supere la cantidad de personas queriendo controlar el hogar. 83 Respecto del ahorro que puede generar este sistema se deduce que en términos económicos el rango es muy amplio, todo esto depende de factores tales como, el tamaño de la vivienda, tipo de iluminación y electrodomésticos que existan, cantidad de personas en la vivienda y el comportamiento que estas posean. Por otro parte, se puede concluir que este sistema presentado se puede mejorar en múltiples aspectos, como por ejemplo, tener un control regulable compatible con ampolletas LEDs, programar funciones de acuerdo a horas del día, complementar el sistema domótico al enfocarlo en confort, seguridad y entretenimiento. Se estima que todo esto puede ser realizado con la misma estructura del sistema diseñado, ya que tanto la tarjeta Arduino como Raspberry Pi permiten acoplar más tareas al software respectivo, puesto que el espacio de memoria y recursos de procesamiento utilizados fueron mínimos. No obstante, para establecer una casa aún más eficiente, de manera complementaria al sistema domótico, se deben utilizar electrodomésticos de eficiencia energética, es decir, etiqueta A, reemplazar ampolletas incandescentes o fluorescente compacta por focos LEDs que son aún más eficientes, y autogenerar energía eléctrica a partir de paneles solares o mini aerogeneradores. 84 BIBLIOGRAFIA [1] Ministerio de energía, Antecedentes sobre la matriz energética en Chile y sus desafíos para el futuro. Documento disponible en: http://www.cchen.cl/mediateca/PDF/antecedentes_matriz_energetica.pdf [2] Sergio Del Campo F. Subsecretario de Energía. Estrategia Nacional de Energía. Mayo 2012. Documento disponible en: http://cifes.gob.cl/archivos/sextoencuentro/m2/Sergio%20Del%20Campo%20Presentacion_ EncuentroERNC%202012.pdf [3] Corporación del desarrollo tecnológico, Estudio de usos finales y curva de oferta de la conservación de la energía en el sector residencial, 2010, Documento disponible en: http://antiguo.minenergia.cl/minwww/opencms/05_Public_Estudios/introduccion.html [4] N. Romero, 2011, Consumo de energía a nivel residencial en chile y análisis de eficiencia energética en calefacción, Tesis Ing. Civil. Univ. de Chile, Documento disponible en: http://www.tesis.uchile.cl/handle/2250/104235 [5] K. Baraka, M. Ghobril, S. Malek, R. Kanj, and A. Kayssi, Low cost Arduino/Android-based Energy-Efficient Home Automation System with Smart Task Scheduling, IEEE Trans, CICSyN, pp. 296-301, June, 2013. [6] R. Piyare, M. Tizil, Bluetooth based home automotion system using cell phone, IEEE Trans, ISCE, pp. 192-195, June 2011. [7] L. Zhi-Gang, and H. Wei, The design of smart home system based on Wi-Fi, IEEE Trans, ICCP, pp. 453-456, October, 2012. 85 ANEXO Anexo I: Programa de Interfaz Gráfica 1.1. Cabecera clase “Grifos” #ifndef AGUAV4_H #define AGUAV4_H #define tipo_grifo 1 #define tipo_lavadora 2 #include <QObject> #include <QWidget> #include <QGridLayout> #include <QPushButton> #include <QCheckBox> #include <QLabel> #include <QComboBox> #include <QDebug> class AguaV4 : public QWidget { Q_OBJECT public: explicit AguaV4(QString nombre, int tipo, QWidget *parent = 0); ~AguaV4(); QWidget *obtener(); void setParametro(QString a); void EstadoReal(QString a); int modificacion(); private: QPushButton *boton; QWidget *objeto; QGridLayout *orden; QLabel *lbl_nombre; int tipo_objeto; QComboBox *selector; QCheckBox *checkbox; }; #endif // AGUAV4_H 1.2. Cabecera clase “Calefactor” #ifndef CALEFACTORV4_H #define CALEFACTORV4_H #include <QObject> #include <QWidget> #include <QGridLayout> #include <QPushButton> #include <QCheckBox> #include <QLabel> #include <QComboBox> #include <QLCDNumber> 86 #include <QSlider> #include <QDebug> class CalefactorV4 : public QWidget { Q_OBJECT public: explicit CalefactorV4(QWidget *parent = 0); ~CalefactorV4(); QWidget * obtener(); void setParametrosTemperatura(int maximo, int minimo); void setParametroActivacion(QString a); void confirmacionFuga(int confir); void EstadoReal(QString a); int modificacion(); int * rangoTemp(); void setLCD(double valor); public slots: private slots: void parametroMinimo(); void parametroMaximo(); private: QLCDNumber *lcd; QPushButton *boton_alarma; QPushButton *boton_climatizador; QSlider *slider_max; QSlider *slider_min; QLabel *etiquetas[5]; QComboBox *selector; QGridLayout *orden; QWidget *objeto; bool var_aux; int valor_alarma; }; #endif // CALEFACTORV4_H 1.3. Cabecera clase “Conexión” #ifndef CONEXIONV4_H #define CONEXIONV4_H #include <QObject> #include <QWidget> #include <QLabel> #include <QLineEdit> #include <QPushButton> #include <QGridLayout> #include <QTcpSocket> class ConexionV4 : public QWidget { Q_OBJECT 87 public: explicit ConexionV4(QWidget *parent = 0); ~ConexionV4(); QGridLayout * obtener(); void enviarInformacion(QString mensaje); void desconectarCliente(); signals: void void void void void void datos_sensores(QString b); datos_estados(QString c); datos_ambiente(QString d); datos_parametros(QString x); ConexionEstablecida(); DesconexionDelSistema(); public slots: void conectar(); void desconectar(); void desconectado(); void leer_datos(); private: QLabel *titulo; QLabel *lbl_direc; QLabel *lbl_puerto; QLabel *lbl_estado; QPushButton *boton[2]; QLabel *leyenda; QGridLayout *orden; QLineEdit *line_Puerto; QLineEdit *line_IP; QTcpSocket *cliente; }; #endif // CONEXIONV4_H 1.4. Cabecera clase “Enchufe” #ifndef ENCHUFEV4_H #define ENCHUFEV4_H #include <QObject> #include <QWidget> #include <QGridLayout> #include <QPushButton> #include <QCheckBox> #include <QLabel> #include <QString> class EnchufeV4 : public QWidget { Q_OBJECT public: explicit EnchufeV4(QString nombre, int cantidad, QWidget *parent = 0); ~EnchufeV4(); QWidget *obtener(); 88 void setParametro(QStringList a); void EstadoReal(QStringList a); int * modificacion(); private: QGridLayout *orden; QLabel *etiqueta_nombre; QWidget *objeto; QPushButton *botones[20]; QCheckBox *checkboxes[20]; int contador; }; #endif // ENCHUFEV4_H 1.5. Cabecera clase “Fugas” #ifndef FUGASV4_H #define FUGASV4_H #include <QObject> #include <QWidget> #include <QLabel> #include <QPushButton> #include <QStringList> #include <QGridLayout> #include <QString> class FugasV4 : public QWidget { Q_OBJECT public: explicit FugasV4(QString nombre, int cantidad, QWidget *parent = 0); ~FugasV4(); QWidget * obtener(); void setNombreFuga(QStringList lista); void setFugas(QStringList a); bool existenciaFuga(); private: QWidget *objeto; QGridLayout *orden; QLabel *lbl_nombre; QPushButton *btn_s[20]; int canti; bool exFuga; }; #endif // FUGASV4_H 1.6. Cabecera clase “Iluminación” #ifndef ILUMINACIONV4_H #define ILUMINACIONV4_H #include <QObject> 89 #include #include #include #include #include <QWidget> <QPushButton> <QComboBox> <QGridLayout> <QLabel> class IluminacionV4 : public QWidget { Q_OBJECT public: explicit IluminacionV4(QString nombre, QWidget *parent = 0); ~IluminacionV4(); QWidget * obtener(); void setEstado(QString a); int modificacion(); void setParametro(QString a); private: QPushButton *boton; QComboBox *selector; QGridLayout *orden; QLabel *etiqueta_nombre; QWidget *objeto; }; #endif // ILUMINACIONV4_H 1.7. Cabecera clase “Login” #ifndef LOGINV4_H #define LOGINV4_H #include <QDialog> namespace Ui {class LoginV4;} class LoginV4 : public QDialog { Q_OBJECT public: explicit LoginV4(QWidget *parent = 0); ~LoginV4(); signals: void resultado(bool a); private slots: void on_pushButton_clicked(); void on_pushButton_2_clicked(); private: Ui::LoginV4 *ui; bool result; }; #endif // LOGINV4_H 90 1.8. Cabecera clase “Sensores” #ifndef SENSORESV4_H #define SENSORESV4_H #include <QObject> #include <QWidget> #include <QLabel> #include <QLCDNumber> #include <QGridLayout> #include <QLine> class SensoresV4 : public QWidget { Q_OBJECT public: explicit SensoresV4(QWidget *parent = 0); ~SensoresV4(); QWidget *obtener(); void setParametro(double valor, int objeto); signals: public slots: private: QLabel *etiquetas[8]; QLCDNumber *display[5]; QGridLayout *orden; QWidget *objeto; }; #endif // SENSORESV4_H 1.9. Cabecera clase “Ventana Principal” #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <loginv4.h> #include <conexionv4.h> #include <iluminacionv4.h> #include <enchufev4.h> #include <calefactorv4.h> #include <aguav4.h> #include <fugasv4.h> #include <sensoresv4.h> #include <QStringList> #include <QLine> #include <QPalette> #include <QPixmap> namespace Ui { class MainWindow; } 91 class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); void pes_ilu(); void pes_ench(); void pes_cal(); void pes_agua(); void pes_fugas(); void pes_sen(); public slots: void resultado_ingreso(bool a); private slots: void on_actionIngresar_triggered(); void on_actionSalir_triggered(); void obtencion_dato_sensores(QString z); void obtencion_dato_estados(QString x); void obtencion_dato_ambiente(QString y); void obtencion_dato_parametro(QString v); void etiqueta_nivel_solar(int a); void EnviarModificaciones(); void CerrarInterfaz(); void ConectadoSistema(); void DesconectadoSistema(); private: Ui::MainWindow *ui; LoginV4 *ingreso; ConexionV4 *enlace; QGridLayout *orden_iluminacion; QGridLayout *orden_enchufe; QGridLayout *orden_calefactor; QGridLayout *orden_agua; QGridLayout *orden_sensores; QGridLayout *orden_fugas; IluminacionV4 *elemento_iluminacion[9]; EnchufeV4 *elemento_enchufe[6]; CalefactorV4 *calefactor; AguaV4 *grifo[3]; FugasV4 *fugas[7]; SensoresV4 *sensores; QSlider *slider_sol; QLabel *posicion_s_sol; int datos[30]; }; #endif // MAINWINDOW_H 92 1.10. Código fuente clase “Grifos” #include "aguav4.h" AguaV4::AguaV4(QString nombre, int tipo, QWidget *parent) : QWidget(parent) { tipo_objeto = tipo; objeto = new QWidget(this); orden = new QGridLayout(this); lbl_nombre = new QLabel(this); lbl_nombre->setText(nombre); boton = new QPushButton(this); if(tipo==tipo_grifo) { selector = new QComboBox(this); orden->addWidget(lbl_nombre,0,0,1,2,Qt::AlignCenter); orden->addWidget(boton,1,0); orden->addWidget(selector,1,1); QStringList items; items << "Sensor" << "Encender" << "Apagar"; selector->addItems(items); } if(tipo==tipo_lavadora) { checkbox = new QCheckBox(this); orden->addWidget(lbl_nombre,0,0); orden->addWidget(boton,1,0); orden->addWidget(checkbox,2,0,Qt::AlignCenter); } objeto->setLayout(orden); boton->setStyleSheet("* { background-color: gray }"); boton->setDisabled(true); } AguaV4::~AguaV4() { } QWidget *AguaV4::obtener() { return objeto; } void AguaV4::setParametro(QString a) { if(tipo_objeto==tipo_grifo) { if(a == "0") { selector->setCurrentText("Sensor"); } if(a == "1") { selector->setCurrentText("Encender"); 93 } if(a == "2") { selector->setCurrentText("Apagar"); } } if(tipo_objeto==tipo_lavadora) { if(a == "1") { checkbox->setChecked(true); } if(a == "2") { checkbox->setChecked(false); } } } void AguaV4::EstadoReal(QString a) { if(a == "1") { boton->setStyleSheet("* { background-color: blue }"); } else { boton->setStyleSheet("* { background-color: gray }"); } } int AguaV4::modificacion() { int resultado; if(tipo_objeto==tipo_grifo) { if(selector->currentText()=="Sensor") { resultado = 0; } if(selector->currentText()=="Encender") { resultado = 1; } if(selector->currentText()=="Apagar") { resultado = 2; } } if(tipo_objeto==tipo_lavadora) { if(checkbox->isChecked()) { resultado = 1; } else 94 { resultado = 2; } } return resultado; } 1.11. Código fuente clase “Calefactor” #include "calefactorv4.h" CalefactorV4::CalefactorV4(QWidget *parent) : QWidget(parent) { lcd = new QLCDNumber(this); boton_alarma = new QPushButton(this); boton_climatizador = new QPushButton(this); slider_max = new QSlider(this); slider_max->setOrientation(Qt::Horizontal); slider_min = new QSlider(this); slider_min->setOrientation(Qt::Horizontal); selector = new QComboBox(this); QStringList items; items << "Sensor" << "Encender" << "Apagar"; selector->addItems(items); for(int i=0; i<5;i++) { etiquetas[i] = new QLabel(this); } etiquetas[0]->setText("Estado"); etiquetas[1]->setText("T° Máxima"); etiquetas[2]->setText("T° Mínima"); etiquetas[3]->setText("Temperatura actual (°C)"); etiquetas[4]->setText("Fuga de Calor"); orden = new QGridLayout(this); orden->addWidget(etiquetas[1],0,0,1,2); orden->addWidget(slider_max,1,0,1,2); orden->addWidget(etiquetas[2],2,0,1,2); orden->addWidget(slider_min,3,0,1,2); orden->addWidget(etiquetas[3],4,0); orden->addWidget(lcd,4,1); orden->addWidget(etiquetas[0],5,0,1,2); orden->addWidget(boton_climatizador,6,0); orden->addWidget(selector,6,1); orden->addWidget(etiquetas[4],7,0,1,2); orden->addWidget(boton_alarma,8,0,3,2); objeto = new QWidget(this); objeto->setLayout(orden); connect(slider_max,SIGNAL(actionTriggered(int)),this,SLOT(parametroMaximo())); connect(slider_min,SIGNAL(actionTriggered(int)),this,SLOT(parametroMinimo())); slider_max->setMaximum(40); slider_max->setMinimum(1); slider_min->setMaximum(39); slider_min->setMinimum(1); slider_max->setSliderPosition(22); slider_min->setSliderPosition(17); 95 boton_climatizador->setStyleSheet("* { background-color: gray }"); boton_alarma->setStyleSheet("* { background-color: red }"); boton_alarma->setDisabled(true); boton_alarma->setVisible(false); boton_climatizador->setDisabled(true); boton_alarma->setText("Fuga"); var_aux = false; valor_alarma = 0; } CalefactorV4::~CalefactorV4() { } QWidget *CalefactorV4::obtener() { return objeto; } void CalefactorV4::setParametrosTemperatura(int maximo, int minimo) { slider_max->setSliderPosition(maximo); slider_min->setSliderPosition(minimo); } void CalefactorV4::setParametroActivacion(QString a) { if(a == "0") { selector->setCurrentText("Sensor"); } if(a == "1") { selector->setCurrentText("Encender"); } if(a == "2") { selector->setCurrentText("Apagar"); } } void CalefactorV4::confirmacionFuga(int confir) { qDebug() << QString::number(confir); valor_alarma = confir; if(var_aux) { if(confir < 8) { boton_alarma->setVisible(true); } if(confir == 8) { boton_alarma->setVisible(false); } 96 } } void CalefactorV4::EstadoReal(QString a) { if(a=="1") { boton_climatizador->setStyleSheet("* { background-color: yellow }"); var_aux = true; confirmacionFuga(valor_alarma); } else { boton_climatizador->setStyleSheet("* { background-color: gray }"); boton_alarma->setVisible(false); var_aux = false; } } int CalefactorV4::modificacion() { int resultado; if(selector->currentText()=="Sensor") { resultado = 0; } if(selector->currentText()=="Encender") { resultado = 1; } if(selector->currentText()=="Apagar") { resultado = 2; } return resultado; } int *CalefactorV4::rangoTemp() { int rango[4]; int b = slider_min->sliderPosition(); int c = slider_max->sliderPosition(); int ww = c % 10; int hh = (c - ww)/10; int www = b % 10; int hhh = (b - www)/10; //int rango[4] = {hh, ww, hhh, www}; rango[0] = hh; rango[1] = ww; rango[2] = hhh; rango[3] = www; return rango; } void CalefactorV4::setLCD(double valor) { 97 lcd->display(valor); } void CalefactorV4::parametroMinimo() { int b = slider_min->sliderPosition(); int c = slider_max->sliderPosition(); if(b >= c) { b = c - 1; slider_min->setSliderPosition(b); } etiquetas[2]->setText("T° Mínima: " + QString::number(b)); } void CalefactorV4::parametroMaximo() { int b = slider_max->sliderPosition(); int c = slider_min->sliderPosition(); if(b <= c) { b = c + 1; slider_max->setSliderPosition(b); } etiquetas[1]->setText("T° Máxima: " + QString::number(b)); } 1.12. Código fuente clase “Conexión” #include "conexionv4.h" ConexionV4::ConexionV4(QWidget *parent) : QWidget(parent) { titulo = new QLabel(this); titulo->setText("Interfaz de Control Domotico"); lbl_direc = new QLabel(this); lbl_direc->setText("Direccion :"); lbl_puerto = new QLabel(this); lbl_puerto->setText("Puerto :"); lbl_estado = new QLabel(this); lbl_estado->setText("Estado : "); leyenda = new QLabel(this); leyenda->setText("Autor: Christopher Del Canto Garcia"); boton[0] = new QPushButton("Conectar",this); boton[1] = new QPushButton("Desconectar",this); line_IP = new QLineEdit(this); line_Puerto = new QLineEdit(this); orden = new QGridLayout(this); orden->addWidget(titulo,0,0); orden->addWidget(lbl_direc,1,0); orden->addWidget(line_IP,2,0); orden->addWidget(lbl_puerto,3,0); orden->addWidget(line_Puerto,4,0); orden->addWidget(lbl_estado,5,0); orden->addWidget(boton[0],6,0); orden->addWidget(boton[1],7,0); 98 orden->addWidget(leyenda,8,0); cliente = new QTcpSocket(this); connect(cliente,SIGNAL(readyRead()),this,SLOT(leer_datos())); connect(cliente,SIGNAL(disconnected()),this,SLOT(desconectado())); connect(cliente,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(desconec tado())); connect(boton[0],SIGNAL(clicked()),this,SLOT(conectar())); connect(boton[1],SIGNAL(clicked()),this,SLOT(desconectar())); } ConexionV4::~ConexionV4() { } QGridLayout *ConexionV4::obtener() { return orden; } void ConexionV4::enviarInformacion(QString mensaje) { if(cliente->isOpen()) { cliente->write(mensaje.toLatin1()); QString fin = "\n"; cliente->write(fin.toLatin1()); } } void ConexionV4::desconectarCliente() { if(cliente->isOpen()) { cliente->disconnectFromHost(); if(cliente->state() == QAbstractSocket::UnconnectedState || cliente->waitForDisconnected(3000)) { lbl_estado->setText("Estado: Desconectado"); emit DesconexionDelSistema(); } else { lbl_estado->setText("Estado: Error de Desconexión"); } } } void ConexionV4::conectar() { QString dir_ip = line_IP->text(); bool conv; int puerto = line_Puerto->text().toInt(&conv); if(conv) { cliente->connectToHost(dir_ip,puerto); 99 if (cliente->waitForConnected(3000)) //ms { lbl_estado->setText("Estado: Conectado"); emit ConexionEstablecida(); } else { lbl_estado->setText("Estado: Error de Conexión"); } } } void ConexionV4::desconectar() { cliente->disconnectFromHost(); if(cliente->state() == QAbstractSocket::UnconnectedState || cliente->waitForDisconnected(3000)) { lbl_estado->setText("Estado: Desconectado"); emit DesconexionDelSistema(); } else { lbl_estado->setText("Estado: Error de Desconexión"); } } void ConexionV4::desconectado() { lbl_estado->setText("Estado: Desconectado"); emit DesconexionDelSistema(); } void ConexionV4::leer_datos() { QString informacion; QStringList mensajes; informacion = cliente->readLine(); informacion = informacion.trimmed(); if(informacion.contains("Parametros")) { emit datos_parametros(informacion); } else { mensajes = informacion.split("-"); if(mensajes.size()==3) { emit datos_ambiente(mensajes.at(0)); emit datos_sensores(mensajes.at(2)); emit datos_estados(mensajes.at(1)); } } } 100 1.13. Código fuente clase “Enchufe” #include "enchufev4.h" EnchufeV4::EnchufeV4(QString nombre, int cantidad, QWidget *parent) QWidget(parent) { contador = cantidad; etiqueta_nombre = new QLabel(this); etiqueta_nombre->setText(nombre); orden = new QGridLayout(this); objeto = new QWidget(this); int a = 1; int b = 2; for(int i=0; i<cantidad; i++) { botones[i] = new QPushButton(this); checkboxes[i] = new QCheckBox(this); orden->addWidget(botones[i],a,0); orden->addWidget(checkboxes[i],b,0); a = a+2; b = b+2; botones[i]->setStyleSheet("* { background-color: gray }"); botones[i]->setDisabled(true); } orden->addWidget(etiqueta_nombre,0,0); objeto->setLayout(orden); } EnchufeV4::~EnchufeV4() { } QWidget *EnchufeV4::obtener() { return objeto; } void EnchufeV4::setParametro(QStringList a) { if(a.size()==contador) { for(int i=0; i<contador; i++) { if(a.at(i).contains("1")) { checkboxes[i]->setChecked(true); } if(a.at(i).contains("0")) { checkboxes[i]->setChecked(false); } } } } : 101 void EnchufeV4::EstadoReal(QStringList a) { if(a.size()==contador) { for(int i=0; i<contador; i++) { if(a.at(i).contains("1")) { botones[i]->setStyleSheet("* { background-color: yellow }"); } if(a.at(i).contains("0")) { botones[i]->setStyleSheet("* { background-color: gray }"); } } } } int *EnchufeV4::modificacion() { int resultado[contador]; for(int i=0; i<contador; i++) { if(checkboxes[i]->isChecked()) { resultado[i] = 1; } else { resultado[i] = 0; } } return resultado; } 1.14. Codigo fuente clase “Fugas” #include "fugasv4.h" FugasV4::FugasV4(QString nombre, int cantidad, QWidget *parent) : QWidget(parent) { objeto = new QWidget(this); orden = new QGridLayout(this); lbl_nombre = new QLabel(this); lbl_nombre->setText(nombre); orden->setColumnMinimumWidth(0,60); orden->addWidget(lbl_nombre,0,0); for(int i=0; i<cantidad; i++) { btn_s[i] = new QPushButton(this); orden->addWidget(btn_s[i],i+1,0); btn_s[i]->setStyleSheet("* { background-color: gray }"); btn_s[i]->setDisabled(true); //btn_s[i]->setStyleSheet("QPushButton {background-color: gray; color: white;}"); 102 exFuga = false; } objeto->setLayout(orden); canti = cantidad; } FugasV4::~FugasV4() { } QWidget *FugasV4::obtener() { return objeto; } void FugasV4::setNombreFuga(QStringList lista) { for(int i=0; i<canti; i++) { btn_s[i]->setText(lista.at(i)); } } void FugasV4::setFugas(QStringList a) { if(a.size()==canti) { for(int i=0; i<canti; i++) { if(a.at(i).contains("1")) { btn_s[i]->setStyleSheet("* { background-color: gray }"); exFuga = false; } if(a.at(i).contains("0")) { btn_s[i]->setStyleSheet("* { background-color: red }"); exFuga = true; } } } } bool FugasV4::existenciaFuga() { return exFuga; } 1.15. Código fuente clase “Iluminación” #include "iluminacionv4.h" IluminacionV4::IluminacionV4(QString QWidget(parent) { nombre, QWidget *parent) : 103 objeto = new QWidget(this); etiqueta_nombre = new QLabel(this); etiqueta_nombre->setText(nombre); boton = new QPushButton(this); selector = new QComboBox(this); QStringList items; items << "Sensor" << "Encender" << "Apagar"; selector->addItems(items); orden = new QGridLayout(this); orden->setColumnMinimumWidth(0,60); orden->setColumnMinimumWidth(1,60); orden->addWidget(etiqueta_nombre,0,0,Qt::AlignLeft); orden->addWidget(boton,1,0); orden->addWidget(selector,1,1); objeto->setLayout(orden); boton->setStyleSheet("* { background-color: gray }"); boton->setDisabled(true); } IluminacionV4::~IluminacionV4() { } QWidget *IluminacionV4::obtener() { return objeto; } void IluminacionV4::setEstado(QString a) { if(a=="1") { boton->setStyleSheet("* { background-color: yellow }"); } else { boton->setStyleSheet("* { background-color: gray }"); } } int IluminacionV4::modificacion() { int resultado; if(selector->currentText()=="Sensor") { resultado = 0; } if(selector->currentText()=="Encender") { resultado = 1; } if(selector->currentText()=="Apagar") { resultado = 2; } 104 return resultado; } void IluminacionV4::setParametro(QString a) { if(a == "0") { selector->setCurrentText("Sensor"); } if(a == "1") { selector->setCurrentText("Encender"); } if(a == "2") { selector->setCurrentText("Apagar"); } } 1.16. Código fuente clase “Login” #include "loginv4.h" #include "ui_loginv4.h" LoginV4::LoginV4(QWidget *parent) : QDialog(parent), ui(new Ui::LoginV4) { ui->setupUi(this); result = false; ui->line_p->setEchoMode(QLineEdit::Password); } LoginV4::~LoginV4() { delete ui; } void LoginV4::on_pushButton_clicked() { if(ui->line_p->text()=="controlcasa" && ui->line_u->text()=="Christopher") { result = true; emit resultado(result); } else { result = false; } this->close(); } void LoginV4::on_pushButton_2_clicked() { this->close(); 105 } 1.17. Código fuente clase “Sensores” #include "sensoresv4.h" SensoresV4::SensoresV4(QWidget *parent) : QWidget(parent) { objeto = new QWidget(this); orden = new QGridLayout(this); for(int i=0; i<8; i++) { etiquetas[i] = new QLabel(this); } for(int i=0; i<5; i++) { display[i] = new QLCDNumber(this); } etiquetas[0]->setText("Sensores Ambientales"); etiquetas[1]->setText("Dentro del hogar"); etiquetas[2]->setText("Temperatura"); etiquetas[3]->setText("% Humedad"); etiquetas[4]->setText("Fuera del hogar"); etiquetas[5]->setText("Temperatura"); etiquetas[6]->setText("% Humedad"); etiquetas[7]->setText("Luz Solar"); orden->addWidget(etiquetas[0],0,0,1,2,Qt::AlignCenter); orden->addWidget(etiquetas[1],1,0); orden->addWidget(etiquetas[2],2,0); orden->addWidget(display[0],2,1); orden->addWidget(etiquetas[3],3,0); orden->addWidget(display[1],3,1); orden->addWidget(etiquetas[4],4,0); orden->addWidget(etiquetas[5],5,0); orden->addWidget(display[2],5,1); orden->addWidget(etiquetas[6],6,0); orden->addWidget(display[3],6,1); orden->addWidget(etiquetas[7],7,0); orden->addWidget(display[4],7,1); objeto->setLayout(orden); } SensoresV4::~SensoresV4() { } QWidget *SensoresV4::obtener() { return objeto; } void SensoresV4::setParametro(double valor, int objeto) { display[objeto]->display(valor); } 106 1.18. Código fuente clase “Ventana Principal” #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); QPixmap bkgnd(":/foto3.png"); bkgnd = bkgnd.scaled(this->size(), Qt::IgnoreAspectRatio); QPalette palette; palette.setBrush(QPalette::Background, bkgnd); this->setPalette(palette); ui->tabWidget->setVisible(false); enlace = new ConexionV4(this); ui->Contenido1->setLayout(enlace->obtener()); connect(enlace,SIGNAL(datos_ambiente(QString)),this,SLOT(obtencion_dato_ambien te(QString))); connect(enlace,SIGNAL(datos_estados(QString)),this,SLOT(obtencion_dato_estados (QString))); connect(enlace,SIGNAL(datos_parametros(QString)),this,SLOT(obtencion_dato_para metro(QString))); connect(enlace,SIGNAL(datos_sensores(QString)),this,SLOT(obtencion_dato_sensor es(QString))); connect(enlace,SIGNAL(ConexionEstablecida()),this,SLOT(ConectadoSistema())); connect(enlace,SIGNAL(DesconexionDelSistema()),this,SLOT(DesconectadoSistema() )); connect(ui>actionEnviar_Modificaicones,SIGNAL(triggered()),this,SLOT(EnviarModificacione s())); connect(ui>actionSalir_de_Interfaz,SIGNAL(triggered()),this,SLOT(CerrarInterfaz())); ui->tabWidget->setTabText(0, "Conexión"); ui->tabWidget->setTabText(1, "Control"); ui->tabWidget->setTabText(2, "Fugas"); ui->tabWidget->setTabText(3, "Ambiente"); ui->tabWidget_2->setTabText(0, "Iluminacion"); ui->tabWidget_2->setTabText(1, "Enchufes"); ui->tabWidget_2->setTabText(2, "Calefactor"); ui->tabWidget_2->setTabText(3, "Grifos"); ui->actionEnviar_Modificaicones->setDisabled(true); ui->actionSalir->setDisabled(true); pes_ilu(); pes_ench(); pes_cal(); pes_agua(); pes_fugas(); 107 pes_sen(); for (int i=0; i<30; i++) { datos[i] = 0; } } MainWindow::~MainWindow() { delete ui; } void MainWindow::pes_ilu() { orden_iluminacion = new QGridLayout(this); QStringList nombres_ilu; nombres_ilu << "Dormitorio 1" << "Dormitorio 2" << "Baño" << "Cocina" << "Living" << "Comedor" << "Pasillo" << "Patio 1" << "Patio 2"; for(int i=0; i<9; i++) { elemento_iluminacion[i] = new IluminacionV4(nombres_ilu.at(i),this); } orden_iluminacion->addWidget(elemento_iluminacion[0]->obtener(),0,0); orden_iluminacion->addWidget(elemento_iluminacion[1]->obtener(),0,1); orden_iluminacion->addWidget(elemento_iluminacion[2]->obtener(),1,0); orden_iluminacion->addWidget(elemento_iluminacion[3]->obtener(),1,1); orden_iluminacion->addWidget(elemento_iluminacion[4]->obtener(),2,0); orden_iluminacion->addWidget(elemento_iluminacion[5]->obtener(),2,1); orden_iluminacion->addWidget(elemento_iluminacion[6]->obtener(),3,0); orden_iluminacion->addWidget(elemento_iluminacion[7]->obtener(),3,1); orden_iluminacion->addWidget(elemento_iluminacion[8]->obtener(),4,0); slider_sol = new QSlider(Qt::Horizontal,this); posicion_s_sol = new QLabel("Límite nivel solar: 300",this); orden_iluminacion->addWidget(posicion_s_sol,5,0); orden_iluminacion->addWidget(slider_sol,6,0,1,2); ui->Contenido21->setLayout(orden_iluminacion); slider_sol->setMinimum(0); slider_sol->setMaximum(999); slider_sol->setSliderPosition(300); connect(slider_sol,SIGNAL(actionTriggered(int)),this,SLOT(etiqueta_nivel_solar (int))); } void MainWindow::pes_ench() { QStringList nombres_ench; nombres_ench << "Dormitorio 1" << "Dormitorio 2" << "Living" << "Cocina" << "Baño" << "Comedor"; int cantidad[6] = {2,2,2,2,1,1}; orden_enchufe = new QGridLayout(this); for(int i=0; i<6; i++) { elemento_enchufe[i] = new EnchufeV4(nombres_ench.at(i),cantidad[i],this); 108 } orden_enchufe->addWidget(elemento_enchufe[0]->obtener(),0,0,Qt::AlignTop); orden_enchufe->addWidget(elemento_enchufe[1]->obtener(),0,1,Qt::AlignTop); orden_enchufe->addWidget(elemento_enchufe[2]->obtener(),1,0,Qt::AlignTop); orden_enchufe->addWidget(elemento_enchufe[3]->obtener(),1,1,Qt::AlignTop); orden_enchufe->addWidget(elemento_enchufe[4]->obtener(),2,0,Qt::AlignTop); orden_enchufe->addWidget(elemento_enchufe[5]->obtener(),2,1,Qt::AlignTop); ui->Contenido22->setLayout(orden_enchufe); } void MainWindow::pes_cal() { calefactor = new CalefactorV4(this); orden_calefactor = new QGridLayout(this); orden_calefactor->addWidget(calefactor->obtener()); ui->Contenido23->setLayout(orden_calefactor); } void MainWindow::pes_agua() { orden_agua = new QGridLayout(this); grifo[0] = new AguaV4("Grifo baño",1,this); grifo[1] = new AguaV4("Grifo cocina",1,this); grifo[2] = new AguaV4("Lavadora",2,this); orden_agua->addWidget(grifo[0]->obtener(),0,0); orden_agua->addWidget(grifo[1]->obtener(),1,0); orden_agua->addWidget(grifo[2]->obtener(),2,0); ui->Contenido24->setLayout(orden_agua); } void MainWindow::pes_fugas() { orden_fugas = new QGridLayout(this); QStringList lista_nombres; lista_nombres << "Dormitorio 1" << "Dormitorio 2" << "Living - Comedor" << "Baño" << "Cocina" << "Fuga de Gas" << "Inundación"; int cantidad2[7] = {2,1,2,1,2,1,1}; QList<QStringList> ubicacion_fugas; QStringList dorm1; dorm1 <<"Ventana 1" << "Ventana 2"; QStringList dorm2; dorm2 <<"Ventana"; QStringList lc; lc <<"Ventana" << "Puerta"; QStringList ba; ba <<"Ventana"; QStringList co; co <<"Ventana 1" << "Ventana 2"; QStringList ga; ga <<"Cocina"; QStringList in; in <<"Logia"; ubicacion_fugas << dorm1 << dorm2 << lc << ba << co << ga << in; for(int i=0; i<7;i++) { fugas[i] = new FugasV4(lista_nombres.at(i),cantidad2[i],this); fugas[i]->setNombreFuga(ubicacion_fugas.at(i)); } QLabel *etiqueta = new QLabel("Fuga de calor", this); orden_fugas->addWidget(etiqueta,0,0,1,2,Qt::AlignCenter); orden_fugas->addWidget(fugas[0]->obtener(),1,0,Qt::AlignTop); orden_fugas->addWidget(fugas[1]->obtener(),1,1,Qt::AlignTop); 109 orden_fugas->addWidget(fugas[2]->obtener(),2,0,Qt::AlignTop); orden_fugas->addWidget(fugas[3]->obtener(),2,1,Qt::AlignTop); orden_fugas->addWidget(fugas[4]->obtener(),3,0,Qt::AlignTop); orden_fugas->addWidget(fugas[5]->obtener(),4,0,Qt::AlignTop); orden_fugas->addWidget(fugas[6]->obtener(),4,1,Qt::AlignTop); ui->Contenido3->setLayout(orden_fugas); } void MainWindow::pes_sen() { sensores = new SensoresV4(this); orden_sensores = new QGridLayout(this); orden_sensores->addWidget(sensores->obtener()); ui->Contenido4->setLayout(orden_sensores); } void MainWindow::resultado_ingreso(bool a) { if(a) { ui->tabWidget->setVisible(true); ui->actionSalir->setDisabled(false); ui->actionIngresar->setDisabled(true); QPalette palette; palette.setColor(QPalette::Window, Qt::white); this->setPalette(palette); } else { ui->tabWidget->setVisible(false); } } void MainWindow::on_actionIngresar_triggered() { ingreso = new LoginV4(this); connect(ingreso,SIGNAL(resultado(bool)),this,SLOT(resultado_ingreso(bool))); ingreso->show(); } void MainWindow::on_actionSalir_triggered() { ui->tabWidget->setVisible(false); ui->actionSalir->setDisabled(true); ui->actionIngresar->setDisabled(false); enlace->desconectarCliente(); QPixmap bkgnd("C:/Users/Christopher/Desktop/foto3.png"); bkgnd = bkgnd.scaled(this->size(), Qt::IgnoreAspectRatio); QPalette palette; palette.setBrush(QPalette::Background, bkgnd); this->setPalette(palette); } void MainWindow::obtencion_dato_sensores(QString z) 110 { QStringList lista_sensores; lista_sensores = z.split(",", QString::SkipEmptyParts); if(lista_sensores.size()==13) { sensores->setParametro(lista_sensores.at(1).toDouble(),4); QStringList d1; d1 << lista_sensores.at(4) << lista_sensores.at(5); QStringList d2; d2 << lista_sensores.at(6); QStringList lv; lv << lista_sensores.at(11) << lista_sensores.at(12); QStringList ba; ba << lista_sensores.at(7); QStringList coc; coc << lista_sensores.at(8) << lista_sensores.at(9); QStringList gas; gas << lista_sensores.at(2); QStringList inu; inu << lista_sensores.at(3); QList<QStringList> lista; lista << d1 << d2 << lv << ba << coc << gas << inu; for(int i=0; i<7; i++) { fugas[i]->setFugas(lista.at(i)); } int alarma = 0; for(int i=4; i<13; i++) { if(lista_sensores.at(i).contains("1")) { alarma += 1; } } calefactor->confirmacionFuga(alarma); } } void MainWindow::obtencion_dato_estados(QString x) { QStringList lista_estados; lista_estados = x.split(","); if(lista_estados.size()==30) { for(int i=7; i<10; i++) { int aux = i - 7; grifo[aux]->EstadoReal(lista_estados.at(i)); } calefactor->EstadoReal(lista_estados.at(10)); for(int i=11; i<20; i++) { int aux = i - 11; elemento_iluminacion[aux]->setEstado(lista_estados.at(i)); } QStringList listd1; listd1 << QString(lista_estados.at(20)) QString(lista_estados.at(21)); QStringList listd2; listd2 << QString(lista_estados.at(22)) QString(lista_estados.at(23)); QStringList listba; listba << QString(lista_estados.at(24)); QStringList listcoci; listcoci << QString(lista_estados.at(25)) QString(lista_estados.at(26)); QStringList listcom; listcom << QString(lista_estados.at(29)); << << << 111 QStringList listliv; listliv << QString(lista_estados.at(27)) << QString(lista_estados.at(28)); QList<QStringList> lista_para_enchu; lista_para_enchu << listd1 << listd2 << listliv << listcoci << listba << listcom; for(int i=0; i<6; i++) { elemento_enchufe[i]->EstadoReal(lista_para_enchu.at(i)); } } } void MainWindow::obtencion_dato_ambiente(QString y) { QStringList lista_ambiente; lista_ambiente = y.split(";", QString::SkipEmptyParts); if(lista_ambiente.size()==5) { sensores->setParametro(lista_ambiente.at(1).toDouble(),1); sensores->setParametro(lista_ambiente.at(2).toDouble(),3); sensores->setParametro(lista_ambiente.at(3).toDouble(),0); sensores->setParametro(lista_ambiente.at(4).toDouble(),2); calefactor->setLCD(lista_ambiente.at(3).toDouble()); } } void MainWindow::obtencion_dato_parametro(QString v) { v.replace("Parametros,",""); QByteArray ba(v.toLatin1()); if(ba.size()==30) { QString valor_ldr = QString(ba.at(0)) + QString(ba.at(1)) QString(ba.at(2)); slider_sol->setSliderPosition(valor_ldr.toInt()); QString valor_tM = QString(ba.at(3)) + QString(ba.at(4)); QString valor_tm = QString(ba.at(5)) + QString(ba.at(6)); calefactor>setParametrosTemperatura(valor_tM.toInt(),valor_tm.toInt()); for(int i=7; i<10; i++) { grifo[i-7]->setParametro(QString(ba.at(i))); } calefactor->setParametroActivacion(QString(ba.at(10))); for(int i=11; i<20; i++) { elemento_iluminacion[i-11]->setParametro(QString(ba.at(i))); } QStringList listd1; listd1 << QString(ba.at(20)) QString(ba.at(21)); QStringList listd2; listd2 << QString(ba.at(22)) QString(ba.at(23)); QStringList listliv; listliv << QString(ba.at(27)) QString(ba.at(28)); QStringList listcoci; listcoci << QString(ba.at(25)) QString(ba.at(26)); + << << << << 112 QStringList listba; listba << QString(ba.at(24)); QStringList listcom; listcom << QString(ba.at(29)); QList<QStringList> lista_para_enchu; lista_para_enchu << listd1 << listd2 << listliv << listcoci << listba << listcom; for(int i=0; i<6; i++) { elemento_enchufe[i]->setParametro(lista_para_enchu.at(i)); } } } void MainWindow::etiqueta_nivel_solar(int a) { int b = slider_sol->sliderPosition(); posicion_s_sol->setText("Límite nivel solar: " + QString::number(b)); } void MainWindow::EnviarModificaciones() { int b = slider_sol->sliderPosition(); int f = b % 100; int g = b - f; int u = g/100; int w = f % 10; int h = (f - w)/10; datos[0] = (u); datos[1] = (h); datos[2] = (w); for(int i=11; i<20; i++) { int aux = i - 11; datos[i] = elemento_iluminacion[aux]->modificacion(); } datos[20] datos[21] datos[22] datos[23] datos[24] datos[25] datos[26] datos[27] datos[28] datos[29] = = = = = = = = = = elemento_enchufe[0]->modificacion()[0]; elemento_enchufe[0]->modificacion()[1]; elemento_enchufe[1]->modificacion()[0]; elemento_enchufe[1]->modificacion()[1]; elemento_enchufe[4]->modificacion()[0]; elemento_enchufe[3]->modificacion()[0]; elemento_enchufe[3]->modificacion()[1]; elemento_enchufe[2]->modificacion()[0]; elemento_enchufe[2]->modificacion()[1]; elemento_enchufe[5]->modificacion()[0]; for(int i=7; i<10; i++) { int aux = i - 7; datos[i] = grifo[aux]->modificacion(); } datos[3] = calefactor->rangoTemp()[0]; datos[4] = calefactor->rangoTemp()[1]; datos[5] = calefactor->rangoTemp()[2]; datos[6] = calefactor->rangoTemp()[3]; datos[10] = calefactor->modificacion(); 113 QString informacion; for(int i=0; i<30; i++) { informacion = informacion + QString::number(datos[i]); } enlace->enviarInformacion(informacion); } void MainWindow::CerrarInterfaz() { this->close(); } void MainWindow::ConectadoSistema() { ui->actionEnviar_Modificaicones->setDisabled(false); } void MainWindow::DesconectadoSistema() { ui->actionEnviar_Modificaicones->setDisabled(true); } 1.19. Código fuente programa #include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } 114 Anexo II: Programa de Nodo Maestro 2.1. Cabecera #ifndef PRINCIPAL_H #define PRINCIPAL_H #define MaximosUsuarios 10 #include <QObject> #include <QTcpServer> #include <QTcpSocket> #include <QtCore/QCoreApplication> #include <qextserialport.h> #include <QStringList> #include <QTimer> #include <QList> class Principal : public QObject { Q_OBJECT public: explicit Principal(QObject *parent = 0); void enviar_arduino(); void actualizar_clientes(QString a); public slots: void nueva_conexion_tcp(); void listo_leer_tcp(); void listo_leer_serie(); void temp_fin(); void temp_fin2(); void temp_fin3(); void desconectar_clientes(); private: QTcpServer *servidor; QList <QTcpSocket *> lista_clientes; QString inf_reci; int id; QextSerialPort *arduino_serie; QString info_arduino, dato_sen, dato_amb, dato_est, mensaje, parametro; QTimer *temp, *temp_2, *temp_3; }; #endif // PRINCIPAL_H 2.2. Código fuente de programa #include "principal.h" Principal::Principal(QObject *parent) : QObject(parent) { servidor = new QTcpServer(this); 115 connect(servidor, SIGNAL(newConnection()),this,SLOT(nueva_conexion_tcp())); if(!servidor->listen(QHostAddress::Any, 5432)) { qDebug() << "No se pudo iniciar servidor"; this->deleteLater(); } //CONFIGURA PUERTO SERIE arduino_serie = new QextSerialPort(); arduino_serie->setPortName("ttyAMA0"); arduino_serie->setBaudRate(BAUD115200); arduino_serie->setDataBits(DATA_8); arduino_serie->setParity(PAR_NONE); arduino_serie->setStopBits(STOP_1); arduino_serie->setFlowControl(FLOW_OFF); connect(arduino_serie,SIGNAL(readyRead()),this,SLOT(listo_leer_serie())); //ABRE PUERTO SERIE arduino_serie->open(QIODevice::ReadWrite); temp = new QTimer(this); temp_2 = new QTimer(this); temp_3 = new QTimer(this); connect(temp,SIGNAL(timeout()),this,SLOT(temp_fin())); connect(temp_2,SIGNAL(timeout()),this,SLOT(temp_fin2())); connect(temp_3,SIGNAL(timeout()),this,SLOT(temp_fin3())); } void Principal::actualizar_clientes(QString a) { foreach(QTcpSocket *cliente, lista_clientes) { if(cliente->isOpen()) { cliente->write(a.toLatin1()); } } } void Principal::nueva_conexion_tcp() { while(servidor->hasPendingConnections()) { if(lista_clientes.size()<MaximosUsuarios) { QTcpSocket *cliente = servidor->nextPendingConnection(); connect(cliente,SIGNAL(readyRead()),this,SLOT(listo_leer_tcp())); connect(cliente,SIGNAL(disconnected()),this,SLOT(desconectar_clientes())); lista_clientes.append(cliente); } } temp_2->start(10); temp_3->start(40); } void Principal::listo_leer_tcp() 116 { foreach(QTcpSocket *cliente, lista_clientes) { if(cliente->canReadLine()) { inf_reci += cliente->readLine(); } } parametro = inf_reci; arduino_serie->write(inf_reci.toLatin1()); inf_reci = ""; temp_3->start(40); } void Principal::listo_leer_serie() { info_arduino += arduino_serie->readLine(); if(info_arduino.contains("fin")) { if(info_arduino.contains(",,,,,,,,")) { info_arduino.replace(",,,,,,,,", ",,,,,,,"); } info_arduino.remove("fin"); info_arduino = info_arduino.trimmed(); if(info_arduino.contains("Ambiente")) { dato_amb = info_arduino; } if(info_arduino.contains("Sensores")) { dato_sen = info_arduino; } if(info_arduino.contains("Estados")) { dato_est = info_arduino; } mensaje = dato_amb + "-" + dato_est + "-" + dato_sen + "/n"; temp->start(10); info_arduino = ""; } } void Principal::temp_fin() { actualizar_clientes(mensaje); temp->stop(); } void Principal::temp_fin2() { actualizar_clientes(mensaje); temp_2->stop(); } void Principal::temp_fin3() 117 { QString msg_param; msg_param = "Parametros," + parametro + "/n"; actualizar_clientes(msg_param); temp_3->stop(); } void Principal::desconectar_clientes() { QTcpSocket *cliente = qobject_cast<QTcpSocket *>(sender()); if(!cliente) return; lista_clientes.removeAll(cliente); cliente->deleteLater(); } 2.3. Código fuente programa principal #include <QCoreApplication> #include <principal.h> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); Principal servidor_; return a.exec(); } 118 Anexo III: Programa Arduino #include "DHT.h" #define DHT_int 24 //Exterior #define DHT_ext 27 //Interior #define DHT1TYPE DHT22 DHT dht_int(DHT_int, DHT1TYPE); DHT dht_ext(DHT_ext, DHT1TYPE); //variable lectura char lectura[30] = {1,5,0,2,3,1,7}; byte posicion = 0; //variable envio de resultados char resultados[30]; String resul, resul_ant; String sens, sens_ant; long tiempo_ant = 0, intervalo = 10000; //variables de control enviadas por usuario int Limit_ldr = 150; int Limit_sup_T = 23; //temperatura superior int Limit_inf_T = 17; //temperatura inferior char u_RVba = 0, u_RVco = 0, u_RVinun = 0; //rele valvulas char u_RCal = 0; //rele calefactor char u_RLd1 = 0, u_RLd2 = 0, u_RLba = 0, u_RLco = 0, u_RLLC1 = 0; //rele iluminacion char u_RLLC2 = 0, u_RLpas = 0, u_RLpat1 = 0, u_RLpat2 = 0; //rele iluminacion char u_RId11 = 0, u_RId12 = 0, u_RId21 = 0, u_RId22 = 0, u_RIba = 0; //rele enchufe char u_RIco1 = 0, u_RIco2 = 0, u_RILC1 = 0, u_RILC2 = 0, u_RILC3 = 0; //rele enchufe //Pines de sensores int p_ldr = A0; //sensor iluminacion solar char p_pird1 = 38, p_pird2 = 48, p_pirba = 44, p_pirco = 40, p_pirlc1 = 42; //sensor movimiento iluminacion char p_pirlc2 = 34, p_pirpas = 50, p_pirpat1 = 36, p_pirpat2 = 46; //sensor movimiento iluminacion char p_pirVB = 29, p_pirVC = 28; //sensor movimiento grifos agua char p_gas = 26, p_inun = 26; //sensor fuga gas e inundacion char p_fcald1 = 49, p_fcald11 = 39, p_fcald2 = 41, p_fcalb = 51, p_fcalco1 = 37; //sensor fuga calor char p_fcalco2 = 45, p_fcalLv1 = 33, p_fcalLv2 = 43, p_fcalLv3 = 47; //sensor fuga calor //Pines de actuadores char p_RVba = A8, p_RVco = A9, p_RVinun = A10; //rele valvulas char p_RCal = 3; //rele calefactor char p_RLd1 = 2, p_RLd2 = 16, p_RLba = 14, p_RLco = A11, p_RLLC1 = A13; //rele iluminacion char p_RLLC2 = A12, p_RLpas = 15, p_RLpat1 = A14, p_RLpat2 = A15; //rele iluminacion 119 char p_RId11 = 13, p_RId12 = 12, p_RId21 = 9, p_RId22 = 10, p_RIba = 11; //rele enchufe char p_RIco1 = 5, p_RIco2 = 4, p_RILC1 = 7, p_RILC2 = 6, p_RILC3 = 8; //rele enchufe //Variables de sensores int ldr = 0; //sensor iluminacion solar int pird1 = 0, pird2 = 0, pirba = 0, pirco = 0, pirlc1 = 0; //sensor movimiento iluminacion int pirlc2 = 0, pirpas = 0, pirpat1 = 0, pirpat2 = 0; //sensor movimiento iluminacion int pirVB = 0, pirVC = 0; //sensor movimiento grifos agua int gas = 0, inun = 0; //sensor fuga gas e inundacion int fcald1 = 0, fcald11 = 0, fcald2 = 0, fcalb = 0, fcalco1 = 0; //sensor fuga calor int fcalco2 = 0, fcalLv1 = 0, fcalLv2 = 0, fcalLv3 = 0; //sensor fuga calor float hum_int = 0, hum_ext = 0, temp_int = 0, temp_ext = 0; //sensor temperatura y humedad //Variables auxiliares int ldr_ant = 0, margen, va_ldr, bool_ldr, t_timer; long t_acti_pir[20], t_actual_pir[20]; void setup(){ pinMode(p_ldr, INPUT); pinMode(p_pird1, INPUT); pinMode(p_pird2, INPUT); pinMode(p_pirba, INPUT); pinMode(p_pirco, INPUT); pinMode(p_pirlc1, INPUT); pinMode(p_pirlc2, INPUT); pinMode(p_pirpas, INPUT); pinMode(p_pirpat1, INPUT); pinMode(p_pirpat2, INPUT); pinMode(p_pirVB, INPUT); pinMode(p_pirVC, INPUT); pinMode(p_gas, INPUT); pinMode(p_inun, INPUT); pinMode(p_fcald1, INPUT); pinMode(p_fcald11, INPUT); pinMode(p_fcald2, INPUT); pinMode(p_fcalb, INPUT); pinMode(p_fcalco1, INPUT); pinMode(p_fcalco2, INPUT); pinMode(p_fcalLv1, INPUT); pinMode(p_fcalLv2, INPUT); pinMode(p_fcalLv3, INPUT); pinMode(p_RVba, OUTPUT); pinMode(p_RVco, OUTPUT); pinMode(p_RVinun, OUTPUT); pinMode(p_RCal, OUTPUT); pinMode(p_RLd1, OUTPUT); pinMode(p_RLd2, OUTPUT); pinMode(p_RLba, OUTPUT); pinMode(p_RLco, OUTPUT); 120 pinMode(p_RLLC1, OUTPUT); pinMode(p_RLLC2, OUTPUT); pinMode(p_RLpas, OUTPUT); pinMode(p_RLpat1, OUTPUT); pinMode(p_RLpat2, OUTPUT); pinMode(p_RId11, OUTPUT); pinMode(p_RId12, OUTPUT); pinMode(p_RId21, OUTPUT); pinMode(p_RId22, OUTPUT); pinMode(p_RIba, OUTPUT); pinMode(p_RIco1, OUTPUT); pinMode(p_RIco2, OUTPUT); pinMode(p_RILC1, OUTPUT); pinMode(p_RILC2, OUTPUT); pinMode(p_RILC3, OUTPUT); dht_int.begin(); dht_ext.begin(); Serial.begin(115200); for(int i=7; i<30; i++) { lectura[i] = '0'; } for(int i=0; i<20; i++) { t_acti_pir[i] = '0'; } for(int i=0; i<20; i++) { t_actual_pir[i] = '0'; } } void loop(){ lectura_sensores(); if(Serial.available()) { while(Serial.available()>0) { delay(5); lectura[posicion] = Serial.read(); posicion++; } posicion = 0; obtencion_parametros(); } //ACTIVACION DE CALEFACTOR Y VALVULAS acc_calefactor(lectura[10], temp_int, p_RCal, 10); //calefactor acc_valvulas(lectura[7], pirVB, p_RVba, 7); //grifo de baño acc_valvulas(lectura[8], pirVC, p_RVco, 8); //grifo de cocina if(inun==0) { digitalWrite(p_RVinun, 1); //grifo de lavadora off resultados[9] = '0'; } else 121 { if(lectura[9]=='1'){digitalWrite(p_RVinun, 0); resultados[9] = '1';} //grifo de lavadora on if(lectura[9]=='2'){digitalWrite(p_RVinun, 1); resultados[9] = '0';} if(lectura[9]=='0'){digitalWrite(p_RVinun, 1); resultados[9] = '0';} } comparacion_ldr(); //ACTIVACION DE ILUMINACION acc_ReleIluminacion(lectura[11], bool_ldr, pird1, p_RLd1, 11); //iluminacion dormitorio 1 acc_ReleIluminacion(lectura[12], bool_ldr, pird2, p_RLd2, 12); //iluminacion dormitorio 2 acc_ReleIluminacion(lectura[13], bool_ldr, pirba, p_RLba, 13); //iluminacion baño acc_ReleIluminacion(lectura[15], bool_ldr, pirlc1, p_RLLC1, 15); //iluminacion comedor acc_ReleIluminacion(lectura[16], bool_ldr, pirlc2, p_RLLC2, 16); //iluminacion living acc_ReleIluminacion(lectura[17], bool_ldr, pirpas, p_RLpas, 17); //iluminacion pasillo acc_ReleIluminacion(lectura[18], bool_ldr, pirpat1, p_RLpat1, 18); //iluminacion patio 1 acc_ReleIluminacion(lectura[19], bool_ldr, pirpat2, p_RLpat2, 19); //iluminacion patio 2 if(gas==1) { acc_ReleIluminacion(lectura[14], bool_ldr, pirco, p_RLco, 14); //iluminacion cocina } else { digitalWrite(p_RLco, 1); resultados[14] = '0'; } //ACTIVACION DE ENCHUFES acc_enchufes(lectura[20], p_RId11, 20); //enchufe 1 dormitorio 1 acc_enchufes(lectura[21], p_RId12, 21); //enchufe 2 dormitorio 1 acc_enchufes(lectura[22], p_RId21, 22); //enchufe 1 dormitorio 2 acc_enchufes(lectura[23], p_RId22, 23); //enchufe 2 dormitorio 2 acc_enchufes(lectura[24], p_RIba, 24); //enchufe baño acc_enchufes(lectura[27], p_RILC1, 27); //enchufe 1 living comedor acc_enchufes(lectura[28], p_RILC2, 28); //enchufe 2 living comedor acc_enchufes(lectura[29], p_RILC3, 29); //enchufe 3 living comedor comedor if (gas==1 and inun==1) { acc_enchufes(lectura[25], p_RIco1, 25); //enchufe 1 cocina acc_enchufes(lectura[26], p_RIco2, 26); //enchufe 2 cocina } else { digitalWrite(p_RIco1, 1); digitalWrite(p_RIco2, 1); resultados[25] = '0'; resultados[26] = '0'; } 122 transformacion_datos(); envio_datos(); envio_ambiente(); } //FUNCIONES COMPLEMENTARIAS void obtencion_parametros() { String ldr_0 = String(lectura[0]); String ldr_1 = String(lectura[1]); String ldr_2 = String(lectura[2]); String ldr_ = ldr_0 + ldr_1 + ldr_2; Limit_ldr = ldr_.toInt(); String L_sup_T0 = String(lectura[3]); String L_sup_T1 = String(lectura[4]); String L_sup_T = L_sup_T0 + L_sup_T1; Limit_sup_T = L_sup_T.toInt(); String L_inf_T0 = String(lectura[5]); String L_inf_T1 = String(lectura[6]); String L_inf_T = L_inf_T0 + L_inf_T1; Limit_inf_T = L_inf_T.toInt(); } void lectura_sensores() { ldr = analogRead(p_ldr); //sensor iluminacion solar margen = (ldr_ant - ldr)*(ldr_ant - ldr); if(margen < 300){ldr = ldr_ant;} ldr_ant = ldr; pird1 = digitalRead(p_pird1); pird2 = digitalRead(p_pird2); pirba = digitalRead(p_pirba); pirco = digitalRead(p_pirco); pirlc1 = digitalRead(p_pirlc1); pirlc2 = digitalRead(p_pirlc2); pirpas = digitalRead(p_pirpas); pirpat1 = digitalRead(p_pirpat1); pirpat2 = digitalRead(p_pirpat2); pirVB = digitalRead(p_pirVB); pirVC = digitalRead(p_pirVC); gas = digitalRead(p_gas); inun = digitalRead(p_inun); fcald1 = digitalRead(p_fcald1); fcald11 = digitalRead(p_fcald11); fcald2 = digitalRead(p_fcald2); fcalb = digitalRead(p_fcalb); fcalco1 = digitalRead(p_fcalco1); fcalco2 = digitalRead(p_fcalco2); fcalLv1 = digitalRead(p_fcalLv1); fcalLv2 = digitalRead(p_fcalLv2); fcalLv3 = digitalRead(p_fcalLv3); hum_int = dht_int.readHumidity(); hum_ext = dht_ext.readHumidity(); temp_int = dht_int.readTemperature(); 123 temp_ext = dht_ext.readTemperature(); } void acc_calefactor(char y, float f, char g, int pos) //e variable usuario, f variable temperatura, g rele salida { String bb = String(y); int e = bb.toInt(); switch(e){ case 0: //usuario define control por sensor if(f >= Limit_sup_T){ digitalWrite(g, 1); resultados[pos] = '0';} if(f <= Limit_inf_T){ digitalWrite(g, 0); resultados[pos] = '1';} break; case 1: //usuario define siempre encendido digitalWrite(g, 0); resultados[pos] = '1'; break; case 2: //usuario define siempre apagado digitalWrite(g, 1); resultados[pos] = '0'; break; } } void acc_ReleIluminacion(char x, int b, int c, char d, int pos) //a variable de usuario, b variable ldr, c variable pir { String aa = String(x); //Pasar a string int a = aa.toInt(); // y luego a int switch(a){ case 0: //usuario define control por sensor if(b==1) //ldr permite encender { if(c==1) //sensor detecto movimiento y enciende { digitalWrite(d, 0); // d equivale al rele (salida) resultados[pos] = '1'; t_acti_pir[pos] = millis(); } else //sensor no detecta y apaga { t_actual_pir[pos] = millis(); t_timer = t_actual_pir[pos] - t_acti_pir[pos]; if(t_timer > 6000) //tiempo 6 segundos para decidir si apaga o no la ampolleta { digitalWrite(d, 1); resultados[pos] = '0'; } } } else //ldr no permite encender { digitalWrite(d, 1); resultados[pos] = '0'; } 124 break; case 1: //usuario define siempre encendido digitalWrite(d, 0); resultados[pos] = '1'; break; case 2: //usuario define siempre apagado digitalWrite(d, 1); resultados[pos] = '0'; break; } } void acc_enchufes(char h, char i, int pos) //h variable usuario, i salida correspondiente { if(h=='1'){ digitalWrite(i, 0); //usuario mantiene encendido el enchufe resultados[pos] = '1'; } else{ digitalWrite(i, 1); //usuario mantiene desconectado el enchufe resultados[pos] = '0'; } } void acc_valvulas(char p, int k, char l, int pos) //j variable usuario, k variable sensor, l salida rele valvula { String cc = String(p); int j = cc.toInt(); switch(j){ case 0: //usuario define control por sensor if(k==1){ digitalWrite(l, 0); resultados[pos] = '1'; t_acti_pir[pos] = millis(); } else{ t_actual_pir[pos] = millis(); t_timer = t_actual_pir[pos] - t_acti_pir[pos]; if(t_timer > 6000) { digitalWrite(l, 1); resultados[pos] = '0'; } } break; case 1: //usuario define siempre encendido digitalWrite(l, 0); resultados[pos] = '1'; break; case 2: //usuario define siempre apagado digitalWrite(l, 1); resultados[pos] = '0'; break; } } void envio_datos() 125 { if (!(sens == sens_ant)) { Serial.print("Sensores,"); Serial.print(sens);Serial.println("fin"); sens_ant = sens; } if (!(resul == resul_ant)) { Serial.print("Estados,"); Serial.print(resul);Serial.println("fin"); resul_ant = resul; } } void transformacion_datos() { va_ldr = 1024 - ldr; sens = ""; sens += String(va_ldr) + ","; sens += String(gas) + ","; sens += String(inun) + ","; sens += String(fcald1) + ","; sens += String(fcald11) + ","; sens += String(fcald2) + ","; sens += String(fcalb) + ","; sens += String(fcalco1) + ","; sens += String(fcalco2) + ","; sens += String(fcalLv1) + ","; sens += String(fcalLv2) + ","; sens += String(fcalLv3); resul = ""; for(int i=0; i<30;i++) { if(i==29){resul += String(resultados[i]);} else {resul += String(resultados[i]) + ",";} } } void envio_ambiente() { long tiempo_act = millis(); long tiempo = tiempo_act - tiempo_ant; if(tiempo > intervalo) { Serial.print("Ambiente;");Serial.print(hum_int);Serial.print(";");Serial.print (hum_ext);Serial.print(";"); Serial.print(temp_int);Serial.print(";");Serial.print(temp_ext);Serial.println ("fin"); tiempo_ant = tiempo_act; } } void comparacion_ldr() { if(va_ldr < Limit_ldr) { bool_ldr = 1; } else { 126 bool_ldr = 0; } }
© Copyright 2024