Untitled - Tesis Electrónicas UACh

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;
}
}