Está en la página 1de 34

Ingeniería Biomédica

Laboratorio de Programación 2

Proyecto Final
Casa domótica

Nombre: Maximiliano Muñozcano Domínguez

Expediente: 297970

Grupo: 45

Fecha: 23/08/2022

1
1. Objetivo

El proyecto consiste en la construcción de un sistema demótico en una vivienda, utilizando un


microcontrolador PIC18F4550 y una aplicación móvil.
El sistema controlará el acceso, la iluminación, la alarma, la ventilación y las persianas de una
vivienda de 3 habitaciones, la cual tendrá una puerta delantera, una puerta de garaje y 3
ventanas.
Se utilizará un reloj de tiempo real DS1307 conectado al microcontrolador para gestionar el
encendido y apagado automático de la iluminación de la vivienda (habitaciones y patios). Los
valores de la hora de encendido y apagado se enviarán desde la aplicación móvil y se
guardarán en la memoria EEPROM del microcontrolador. De la misma manera, el sistema
controlará el encendido y apagado de una alarma, la cual sonará de manera intermitente si se
abre una puerta o ventana y la alarma esta activada. La alarma solo puede ser desactivada
desde el teléfono y está representada por un buzzer conectado al microcontrolador.
El sistema encenderá y apagará el sistema de ventilación si la temperatura de la vivienda
supera valores establecidos de temperatura, los cuales serán enviados desde el teléfono y se
guardarán en la memoria EEPROM del microcontrolador.
Se utilizará una resistencia variable conectada como potenciómetro al canal cero del ADC
para emular un sensor de temperatura, además se utilizará un ventilador para simular la
unidad de aire acondicionado.
La apertura y cierre de las persianas se controlará desde la aplicación móvil, cuyo valor de
apertura se guardará en la memoria EEPROM del microcontrolador. Además de que la puerta
del garaje se abrirá automáticamente cuando se detecte un vehículo y se cerrará con un botón
ubicado en el interior del garaje, donde el garaje no podrá abrirse si la alarma esta activada.
Por último, el microcontrolador debe enviar el estado de la iluminación, persianas, de puertas
y ventanas para que se muestren en la pantalla del dispositivo móvil. También se enviará el
valor de la temperatura, la cual se mostrará en una gráfica dinámica en la pantalla del
dispositivo.

2. MATERIALES Y EQUIPAMIENTO

• Software: ISIS Professional, C CCS Compiler.


• Protoboards, cable para proto.
• Resistencias 330, 1k, variables de 1k.
• Reloj de tiempo Real DS1307.
• Sensor de presencia.
• 4 servomotores.
• 4 limit switch.
• Un motor de corriente directa.
• Transistors 2N2222 .
• Un buzzer.

2
• Leds para la iluminación
• Push button

• Smartphone o Tablet con sistema operativo Android.

3. METODOLOGÍA

1. ENVÍO Y RECEPCIÓN DE DATOS


En el envío y recepción de datos se tomó como base lo utilizado en la práctica 6 checkpoint 3,
se define como comunicación serial al proceso de envío de datos un bit a la vez, de forma
secuencial, sobre un canal de comunicación o bus. Se trabajó con el transmisor-receptor
asíncrono universal (UART).
Para la parte de recepción de datos se utilizó la interrupción RDA donde básicamente la trama
enviada desde el celular al microcontrolador se iba guardando.
Una trama completa de datos consta de el símbolo # al inicio de la trama, el valor o valores
que se envían y el símbolo & marcando el final de la trama.
Para guardar los datos básicamente lo que se hace es leer la trama de datos recibida, una vez
recibido el símbolo # se empiezan a guardar los demás. Es importante mencionar que si no se
manda el símbolo & no se manda una trama completa, por lo que no se podrá separar el dato
recibido como lo veremos más adelante.
Cuando se recibe el símbolo # el vector donde se guardarán todos los datos recibidos se
establece en cero con la finalidad de ir llenando el vector en orden, también se pone una
bandera en alto la cual indica que ha llegado un dato nuevo. Al haber llegado un dato nuevo
se irán guardando los caracteres de este en el vector hasta que se recibe el carácter & que se
define en este programa como carácter de fin de cadena. Una vez recibido el carácter & al
finalizar la cadena de datos se pone en alto la bandera que indica que se recibió una trama
completa.
Para realizar esto se tuvo que modificar el orden del programa de manera que primero se
evaluara la bandera y después se evaluara si había llegado el carácter #, esto con la finalidad
de que no guardara al carácter # dentro de nuestro vector.

3
Fig. 1.1 Recepción de datos.

Una vez tenida nuestra trama completa lo que se hace es separar cada uno de los datos que
esta contenga para poder guardarlos y utilizarlos después. Al primer valor guardado de
nuestra cadena de caracteres lo conoceremos como identificador. Este identificador lo que
hace es clasificar el tipo de datos dependiendo del valor de este como se ve en la siguiente
tabla.
Para ir avanzando a lo largo de la trama de datos completa es necesario crear una variable
que se utiliza para saber en que dato de la trama estamos para poder guardarlo. Los
caracteres de las tramas se separan por comas al cambiar de dato, esto sirve para diferenciar
que ya se ha cambiado de dato dentro de la misma trama completa.

Identificador Apartado
0 Cambio de hora de reloj
1 Horas encendido/apagado luces
2 Estado de la alarma
3 Temperatura máxima
4 Persianas

Cambio de hora de reloj.


Al recibir una trama de dato de la siguiente manera #0 , 21 , 3 , 45& lo que se busca es
cambiar nuestra hora del reloj de tiempo real, eso nos lo indica el identificador de esta trama
de datos (0), el segundo dato indica la hora, el tercero, el minuto y el último nos indica los
segundos siendo 21:03:45 la hora a la que se cambiaría el reloj. Cada uno de los datos
recibidos se guarda en su variable correspondiente dependiendo de la posición en la que se
encuentre como se muestra en la Fig. 1.2.
4
Fig. 1.2 Guardar datos de la trama en sus variables correspondientes.

Como se ve en la imagen y regresando al ejemplo anterior la posición de la hora es la


segunda, quiere decir que es la posición 1 de cont_dato ya que empieza desde 0 por lo que el
21 se guarda en la variable hora_rtc. Para guardar min_rtc lo que se realiza es aumentar el
cont_dato para que se mueva de posición para que cuando cont_dato sea igual a 2 y id sea
igual a cero ese valor se guarde como min_rtc.

Cambio de horas de encendido y apagado de luces.


Al recibir una trama de dato de la siguiente manera #1 , 21 , 3 , 5 , 20& sabemos por el
identificador de la trama que se busca mandar las horas de encendido y apagado de las luces.
Es la misma lógica que para la hora de cambio de reloj, cuando se está en la segunda
posición o la posición 1 de cont_dato y el identificador vale 1 el dato almacenado se guarda en
la variable hora_on (Fig. 1.2), lo mismo pasa con los demás datos, se guardan en sus
respectivas variables conforme cont_dato va avanzando de posición.
Estado de la alarma
La trama de la alarma es igual a las demás #2, 1& sólo que en esta únicamente se manda un
dato después del identificador el cual nos indica si está o no apagada la alarma. Este dato se
guarda en la variable alarma.

5
Temperatura máxima
La trama de temperatura máxima es muy parecida a la de la alarma ya que únicamente se
manda un dato que es el valor de la temperatura enviada desde el celular viéndose de esta
manera: #3,35&. El tres indica que es el identificador de la temperatura y al moverse a la
segunda posición se guarda el dato en la variable T_max.
Persianas
Para la trama de las persianas se requieren 3 datos además del identificador los cuales
establecen si la persiana correspondiente está abierta o cerrada de la siguiente manera #4, 0,
1,0& indicando que se quiere que la segunda persiana se abra y las demás se cierren. Se
guardan en sus respectivas variables mientras cont_dato avanza en la trama de datos.

ENVÍO DE DATOS AL CELULAR


Para enviar datos al celular se utilizó una base de tiempo generada por el timer 1 utilizando la
misma lógica que se utilizó para crear la base de tiempo en el apartado de iluminación sólo
que en vez de 1 segundo en esta ocasión se hizo de 200 ms evaluando otra variable de
contador hasta 2 de manera que al repetirse la interrupción del timer 1 dos veces se forme
una base de tiempo de 200 ms. Una vez formada esta base de tiempo pueden enviarse los
datos sin que colapse la aplicación, para enviar los datos se utilizó la función printf() donde
antes de poner el dato que se va a enviar se utilizó una letra identificadora para que al llegar
al celular se pueda clasificar ese dato y utilizarse como se requiera(Fig. 1.3). Esto se realizó
con cada una de las variables que se tenían que enviar a la aplicación como el valor de la
temperatura leída por el adc, el estado de puertas y ventanas, estado de persianas, estado de
iluminación, etc. Todos estos eran mandados en una sola línea de código separados uno de
otro por una letra del abecedario

Fig. 1.3 Envío de datos.

2. CONTROL DE ILUMINACIÓN

Para el control de la rutina de iluminación debemos tener en cuenta que esta depende del
tiempo que indique el reloj de tiempo real DS1307, para ello se debo generar una base de
tiempo de 1 segundo para ser capaces de leer la hora en tiempo real.

6
Para realizar esto se utilizó la interrupción del Timer 1, recordemos que ésta va de 0 a 65535
cuentas y no es capaz de generar un periodo de 1 segundo sin usar lógica de programación,
por lo que se cálculo para un periodo de 100 ms con la siguiente fórmula:
4
𝑇= ∗ 𝑝𝑟𝑒𝑒𝑠𝑐𝑎𝑙𝑒𝑟 ∗ (65535 − 𝑐𝑎𝑟𝑔𝑎)
𝑓 𝑜𝑠𝑐
Utilizando un preescaler de 2, un cristal oscilador de 4MHz y una carga de 15535 se obtiene
un periodo de 100 ms.
Una vez obtenido el periodo de 100 ms se utilizó lógica de programación para generar la base
de tiempo de 1 segundo utilizando un contador y una bandera, estableciendo que cuando el
valor del contador sea 10 la bandera se ponga en alto, esto indicaría que la interrupción del
timer se repitió diez veces por lo que ahora tendríamos una base de 1 segundo.
Se debe recordar que la interrupción de los timers debe configurarse dentro de la función
principal antes del ciclo infinito utilizando la función setup_timer_1 () y deben habilitarse con
la función enable_interrupts (), esto se realiza antes del ciclo infinito debido a que solo es
necesario configurarse y habilitarse una vez.

Fig. 2.1 Base de tiempo de un segundo.

Recordemos que para utilizar el reloj de tiempo real debe incluirse su respectiva librería, para
hacerlo basta con escribir #include "DS1307.c" en el apartado de las librerías, recordemos
que la librería es independiente del conjunto de librerías ya preestablecidas para el
microcontrolador por lo que debe ponerse en la misma carpeta donde está nuestro código y
ponerse entre comillas para mandarla a llamar.
El reloj de tiempo real también se configura en la función principal antes del ciclo infinito con la
función DS1307_OSC_ENABLE (1), teniendo al 1 como significado de que se quiere
encendido y el 0 como apagado.
Una vez configurado nuestro timer y el reloj de tiempo real ya podemos empezar con el
apartado de la iluminación.

7
Dentro del ciclo infinito evaluamos el estado de la bandera del reloj de tiempo real para
verificar que haya pasado un segundo, si la bandera está en alto significa que ha pasado un
segundo, al haber pasado un segundo debe establecerse que el valor la bandera sea cero
para que empiece a contar nuevamente para generar la base de tiempo de un segundo.
Dentro de esta base de tiempo se debe leer la hora del reloj, esto se realiza con la función
DS1307_GET_DATE_TIME (), donde deben establecerse las variables para guardar la hora,
minuto, segundo, día de la semana, día, mes y año.
Para determinar el encendido de las luces necesita compararse la hora y minuto actual con los
valores de la hora y minuto de encendido enviados desde la aplicación. Para esto se declaró
una variable llamada segundos cuyo valor era igual al de la hora actual del reloj del tiempo
real multiplicado por el número de segundos que hay en una hora más el valor de minutos
actual del reloj del tiempo real multiplicado por el número de segundos que hay en un minuto
más el valor de segundos actual del reloj del tiempo real. Una vez obtenido este dato se
compara con el valor en segundos de la hora y minuto de encendido enviados desde la
aplicación, si el valor de la variable segundos es igual al valor en segundos de la hora de
encendido enviada por la aplicación se ponen en alto los pines de la iluminación.
Se utiliza la misma lógica para la hora de apagado; el valor de la variable segundos se
compara con el valor en segundos de la hora y minuto de apagado enviada desde el celular, si
el valor de la variable segundos es igual al valor en segundos de la hora de apagado enviada
por la aplicación se ponen en bajo los pines de la iluminación.
Para mandar los datos de la hora de encendido y apagado desde el celular se mandó una
trama de datos en la cuál el primer dato mejor conocido como el identificador (1 para el caso
de las horas y minutos de encendido y apagado) determinaba que los datos siguientes serían
la hora y minuto de encendido y seguido la hora y minuto de apagado todos separados de la
siguiente manera: #1, hora_encendido, minuto_encendido, hora_apagado,
minuto_apagado& .

8
Fig. 2.2 Encendido y apagado de luces con reloj de tiempo real.

Los valores de horas/minutos de encendido y apagado de las luces se guardan en la memoria


EEPROM del microcontrolador con la función write_eeprom(x,y) donde x es el espacio en la
memoria donde se va a guardar la variable y “y” es el valor de que se guarda.
Una vez guardado debe establecerse el valor guardado a la variable correspondiente antes
del ciclo infinito para que al volver a alimentar al sistema el valor guardado sea el correcto. Se
ocuparon en total 4 espacios para guardar los valores de hora_encendido,
minuto_encendido, hora_apagado y minuto_apagado.
Para establecer el valor guardado a su respectiva variable lo que se hizo es leer la posición de
la memoria EEPROM donde se guardó el dato y después de leerlo se guarda en la variable
como se muestra en la siguiente imagen:

Fig. 2.3 Lectura de memoria EEPROM para establecer valores.

9
Para el encendido y apagado de luces de manera independiente del reloj se implementó una
lógica diferente, para empezar como este no depende del reloj de tiempo real podemos
sacarlo de la base de tiempo que se generó, esto con la finalidad de que al mandar la
instrucción de encender o apagar una luz no se tenga que esperar un segundo para que se
encienda o apague y sea casi inmediato.
Se asignó una combinación diferente para cada instrucción de encendido y apagado de cada
una de las luces, teniendo 2 combinaciones por luz, 8 combinaciones en total. Esto con la
finalidad de que al mandar una combinación se apague o encienda la luz correspondiente.
Para esto se utilizó un switch donde el valor a evaluar es el primer dato recibido de la trama
de datos completa que en el apartado de envío y recepción de datos se habla más a detalle.

Fig. 2.4 Encendido y apagado de luces independiente.


Los estados de iluminación sean dependiente o independiente de cada uno de los cuartos se
guardan en las variables cocina, garage, cuarto y sala (0 para apagado y 1 para encendido).
Estos valores determinan si está encendido o no el respectivo cuarto, estos valores son
enviados desde el microcontrolador al celular y se muestran en el apartado de estados de la
aplicación.

10
3. SISTEMA DE VENTILACIÓN
Para el sistema de ventilación se utilizó el módulo ADC del microcontrolador para leer la
resistencia variable que se utilizó como potenciómetro para simular a un sensor de
temperatura. El ADC se configuró para usarse con 10 bits por lo que su valor varía entre 0 y
1023. Se debe configurar el ADC con la función SETUP_ADC (ADC_CLOCK_INTERNAL)
para que trabaje con el reloj interno del microcontrolador y la función SETUP_ADC_PORTS
(AN0, VSS_VDD) cuyos parámetros son el número de canales que se utilizarán y los voltajes
de referencia.
Una vez configurado el ADC se lee el canal del ADC que desea utilizarse para después
realizar conversiones (Fig. 3.1) para que el valor leído por el canal únicamente fuera de 0 a
40, esto con la finalidad de guardar el dato recibido como la temperatura actual que va de 0° a
40°.

Fig. 3.1 Conversión valor leído a valor en grados.


Para enviar el valor de la temperatura máxima desde el celular se mandó una trama de datos
siendo el primer valor de la trama el identificador el cuál le indica al programa que el siguiente
dato es la temperatura máxima y se guarde en su respectiva variable de la siguiente manera:
#3, temperatura_maxima&.

Una vez obtenido el valor de la temperatura máxima permitida se compara con el valor actual
de la temperatura leída por el canal del ADC, si el valor actual de la temperatura es mayor o
igual a la temperatura máxima establecida, se pone en alto el pin del ventilador, de lo contrario
el pin del ventilador permanece en bajo como se ve en la Fig. 3.2.

Fig. 3.2 Control de temperatura.

11
Una vez obtenido el valor de la temperatura máxima, se guarda en la memoria EEPROM del
microcontrolador con la función write_eeprom (2, T_max) siendo el 2 el lugar que ocupa en la
memoria, y T_max el valor de la temperatura máxima, para que se guarde apropiadamente,
se debe leer la posición de la memoria donde se guardó la temperatura máxima antes del ciclo
infinito y debe guardarse nuevamente en la variable T_max como se hizo en el caso de la
hora de encendido y apagado de las luces.
4. CONTROL DE PERSIANAS
Para el control de las persianas y de los servomotores en general se utilizó la interrupción del
timer 3. Es necesario explicar el funcionamiento de un servomotor ya que es diferente de los
motores de corriente directa, para hacer funcionar un servomotor se tiene que programar una
base de tiempo generalmente de 25 ms. Para mover el servomotor a 180° se debe generar un
pulso positivo de 2.5 ms, si se quisiese mover el servomotor a 0° el pulso generado debe ser
de 0.5 ms, todo esto cuando únicamente se utiliza un servomotor, si se llegaran a utilizar más
se debe dividir la base de tiempo de 25 ms entre el número de servomotores que se tienen,
para fines del proyecto se necesitaron 4 servomotores por lo que se generó la base de tiempo
de 6 ms para una f. de oscilación de 4 MHz un preescaler de 1, la carga calculada es de
59535. Esto quiere decir que tenemos 6000 cuentas, con estas cuentas se hace una regla de
3; Si a 6000 corresponde un periodo de 6 ms, a .5 le corresponde de 500 y a 2.5 le
corresponde de 2500, pero debe tomarse en cuenta que al dividir el periodo de 25 ms entre 4
se redondeó el resultado a 6 por lo que se le resta 100 y se le suman 100 a los valores
correspondientes de .5 y 2.5 respectivamente con la finalidad de hacer más preciso el
movimiento del servomotor.

Fig. 4.1 Utilizando timer 3 para mover servomotores

12
Para modificar el ancho de pulso dentro de la interrupción del timer se necesita establecer dos
cargas diferentes las cuales modifican el ancho de pulso de .5 a 2.5 ms que es el rango que
utiliza el servomotor como se muestra en la Fig. 4.1. Como únicamente se necesita que el
servomotor se mueva de 0° a 90° la cantidad de cuentas que se necesitan para moverlo 90°
es aproximadamente de 1100. Entonces cada que se quiera abrir alguna persiana o
servomotor debe restarse al total de cuentas del timer el valor de cuentas que se necesita
para poner el servo motor en 0° menos la cantidad de cuentas que se necesiten para poner el
servomotor en el grado deseado (Fig. 4.2) siendo este último 0 si se quiere que el servomotor
se quede en 0° o 1100 si se quiere que se mueva a 90° aproximadamente.

Fig. 4.2 Interrupción del timer 3 para

5. ESTADO DE PUERTAS Y VENTANAS


Para determinar el estado de puertas y ventanas se utilizaron botones de fin de carrera,
conectados a pines del microcontrolador. Al estar el botón presionado se manda un estado
alto (1) lo que significaría que la ventana o puerta está cerrada. Al soltar el botón se manda un
estado bajo (0) significando que la ventana o puerta está abierta.
Esto con la finalidad de leer los pines del microcontrolador a los que están conectados los
botones, determinar si las puertas o ventanas están abiertas o cerradas para después mandar
el estado de los pines a la aplicación con la función printf ().
Para leer el estado de los pines se utiliza la función input (), debe utilizarse una variable
diferente para el total de puertas y ventanas que se tengan para guardar el estado de las

13
mismas y después enviarse, en este caso se utilizaron 4 variables para guardar los estados (3
ventanas, 1 puerta).
Este valor guardado se envía al celular y acorde al valor se muestra en el apartado de los
estados si la ventana está abierta o cerrada.

Fig. 5.1 Leectura de entradas digitales


6. ALARMA
El valor de encendido o apagado de la alarma se envía desde el celular, este se guarda en la
variable alarma y se evalúa dentro del ciclo infinito. Si alarma es igual a cero quiere decir que
la alarma está apagada, si es igual a uno quiere decir que la alarma está encendida.
Debemos recordar que el funcionamiento del garaje depende de si la alarma está encendida o
no. Si la alarma está activada el garaje debe permanecer cerrado incluso si estaba abierto
antes de activar la alarma.
Para esto se evalúa la variable alarma, al valer 1 (activada) se establece el valor calculado de
la carga para que el servomotor se mueva a 0 grados para que se cierre el garaje, al hacer
esto se guarda en la variable pgarage un 0 el cual significa que el garaje está cerrado, el valor
de esta variable se envía al celular y se muestra en el apartado de estado de la aplicación.
Otra de las acciones que se realizan cuando la variable alarma es 1 es evaluar el estado de
puertas y ventanas.

Fig. 6.1 Evaluando variable alarma = 1.

Recordemos que cuando las puertas o ventanas están abiertas el microcontrolador lo


interpreta con un 0. Al estar activada la alarma y que alguna de las puertas o ventanas esté
abierta se pone en alto una bandera. Esta bandera se evalúa, de manera que cuando está en
alto hace sonar un buzzer de manera intermitente. Para esto se utilizó un delay para que cada
500ms estuviera sonando el buzzer poniendo en alto y bajo el pin donde estaba conectado.
14
Fig. 6.2 Sonido intermitente de alarma con buzzer.
En caso de que el valor de alarma fuese 0, el uso del garaje debe estar habilitado por lo que
se leen los valores de los pines del sensor de presencia y el botón para abrir y cerrar la puerta
del garaje. Se debe tener en cuenta que el sensor de presencia manda al microcontrolador un
1 cuando no detecta presencia alguna por lo que cuando el pin donde envíe la señal el sensor
reciba un cero quiere decir que hay algo frente al sensor. Se utilizó una variable llamada
pgarage para determinar el estado del garaje siendo 1 abierto y 0 cerrado, el valor de esta
variable se envía al celular y se muestra en el apartado de estado de la aplicación.
Para abrir o cerrar la puerta del garaje con el botón desde adentro de la casa lo que se hizo
fue evaluar la variable pgarage, esto con la finalidad de primero saber si está abierto o
cerrado. Si está abierto (pgarage =1), lo que se hace es establecer la carga 0 para que el
servomotor se mueva a 0° y se cierre después de presionar el botón, también el valor de
pgarage se actualiza a 0 indicando que la puerta está cerrada.

Si el garaje está cerrado (pgarage = 0), la carga se establece nuevamente en 1100 para que
el servomotor se mueva a 90° y se abra el garaje. Se actualiza nuevamente el valor de
pgarage a 1.
Otra manera de abrir el garaje es con el sensor de presencia, cuando hay algo frente al sensor
y la alarma está desactivada se establece nuevamente la carga calculada para que el
servomotor del garaje se mueva y abra el garaje y en la variable pgarage se guarda un 1 ya
que está abierto el garaje.
Para abrir o cerrar la puerta con el botón se implementó un delay de 300ms, esto debido a
que al presionarlo sin el delay el servomotor oscilaba ya que realizaba la lectura del pin más
de una vez por lo que abría y cerraba la puerta muy rápidamente.

15
Fig. 6.3 Evaluando variable alarma = 0.
Otra de las cosas que se realiza cuando está apagada la alarma es establecer en cero la
bandera que activa al buzzer y poner en bajo los pines de este.

Fig. 6.4 Apagar Buzzer.

7. CIRCUITO FÍSICO Y DESARROLLO DE APLICACIÓN


Para el circuito físico del programa primeramente se armó el circuito mínimo para el
microcontrolador con un cristal oscilador de 4 MHz y 2 capacitores de 33pF conectados en
paralelo al cristal oscilador, además de conectar la alimentación en los pines
correspondientes.
Para el apartado de la iluminación, a cada led se le colocó su respectiva resistencia de 330
Ohm conectando el ánodo al pin correspondiente del microcontrolador con una resistencia de
330 Ohms mientras que el cátodo a tierra.

16
Fig. 7.1 Conexión de leds con resistencia para iluminación.
Para el reloj de tiempo real se conectaron dos de sus pines a alimentación y tierra, los otros
dos pines se conectaron a los pines 15 y 16 del microcontrolador.
Para conectar el módulo bluetooth se conectó la salida TX del módulo al pin RX del
microcontrolador de manera directa, se conectó también del pin RX del módulo al pin TX del
microcontrolador con una resistencia de por medio y otra resistencia conectada hacia tierra
como se ven en la siguiente imagen.

Fig. 7.2 Conexión de módulo bluetooth.


Para la lectura de los estados de puertas y ventanas se implementaron limit switch, soldados
de los pines común y normalmente abierto, el común se conectó a 5V y el pin de normalmente
abierto se conectó al pin del microcontrolador con una resistencia a tierra, esto con la finalidad
de que al estar presionado se mande una señal en alto al microcontrolador y al soltarse
mande un cero lógico, si no se conectase la resistencia al estar soltado el pin del
microcontrolador recibiría ruido y no un cero lógico (pull down).
Para la ventilación se utilizó una resistencia variable la cual se conecta a alimentación y tierra
y en su pin de en medio es la señal que va variando, esta se conecta al pin 2 del
microcontrolador. Para conectar el motor de corriente directa se utilizó un transistor 2N2222
conectado como se muestra en la siguiente imagen.

17
Fig. 7.3 Conexión de motor de directa.
NOTA: la fuente de voltaje depende del motor, el pin de base va conectado con una
resistencia de un kilo al pin del microcontrolador.
El sensor de presencia tiene 3 pines, dos de ellos son para alimentación y tierra, el tercero se
conecta al pin 27 del microcontrolador.
El push button por uno de sus pines se conecta a +5V mientras que la otra va al
microcontrolador con una resistencia a tierra (pull down).

18
Para cada uno de los servomotores se utilizó un transistor 2N2222 conectados de la siguiente
manera:

Fig. 7.4 Conexión de servomotores.


NOTA: el transistor puede cambiar, para el transistor 2N2222 se utiliza el mismo circuito, si se
utiliza otro transistor es recomendable revisar el datasheet del mismo para identificar como
conectan sus pines.
Finalmente para la alarma se utilizó un buzzer que trabaja con 5V por lo que no se necesitó
utilizar un transistor, solo se conectó su pin de alimentación en el pin 4 del microcontrolador y
el otro pin se conectó a tierra.
DESARROLLO DE APLICACIÓN EN MIT APP INVENTOR
La aplicación se divide en 8 partes diferentes (Fig. 7.5), las cuales se detallaran a
continuación.

• Iluminación
Para el apartado de la iluminación se implementaron switches, primero se evalúa que el switch
haya cambiado, después se evalúa si el switch está prendido o apagado, acorde a esto se
manda una trama de datos con solo un valor el cual ya se tiene registrado en el programa
realizado, este dato puede ser 11,21,31 y 41 para encender los focos o 10,20,30 y 40 para
apagarlos esto dependiendo claro de que switch sea el que se active o desactive (véase el
apartado de iluminación independiente del reloj de tiempo real) como se muestra en la figura
7.6. Esto se realizó con cada uno de los 4 switches diferentes.

19
Fig. 7.6 Encendido y apagado de luces desde aplicación

• Control de persianas
Para el control de persianas de igual manera se implementó el uso de los switches solo que
para estos se utilizó una diferente lógica. Recordemos que la trama de datos mandada para la
posición de las persianas es la siguiente #4,0,0,0& siendo 4 el identificador y los ceros
representan que todas las persianas están cerradas. Se guardó en una variable el valor que
tenía la persiana después de haber un cambio en el switch, esto con la finalidad de usar esa
variable con los otros switch a la hora de presionarlos y que el valor de la persiana que se
había cambiado previamente permaneciera sin modificarse como se muestra en la siguiente
imagen.

Fig. 7.7 Control de persianas.


20
• Apartado de estados
Recordemos que para el apartado de estados deben enviarse datos desde el microcontrolador
al celular con una letra identificadora, lo que realiza la aplicación es una vez que está
conectado el bluetooth leer esta trama de datos y evaluar el contenido de la misma, si el valor
evaluado coincide con uno de los registrados por la aplicación guarda el dato que le sucede
con su respectivo tamaño sea de 2 o más bits, una vez recibido y guardado se evalúa este
nuevo dato de manera que si es un uno el estado de una etiqueta en la aplicación cambia de
color a verde e indica que la luz, puerta o persiana está prendida o abierta, de lo contrario se
cambial el color de la etiqueta a rojo e indica que se está apagada o cerrada dependiendo del
valor recibido como se ve en la siguiente imagen.

Fig. 7.8 Recepción de valores para estados de puertas, luces, y persianas.

• Gráfica temperatura
Para la gráfica del valor de la temperatura se envió en una trama diferente los valores leídos
por el ADC cada 200 ms, esto debido a que si se enviaban cada un segundo la gráfica
tardaba bastante en dibujarse, y si se enviaban más rápido la aplicación se trababa.
Este dato al igual que los demás se enviaba con una Letra identificadora la cual indicaba la
llegada del valor del ADC en la aplicación.
Para la gráfica primero se creó un proceso en la aplicación para pintar los ejes:

Fig. 7.9 Dibujar ejes x , y .

21
Después, una vez recibido la letra identificadora del valor del ADC se guarda el dato de 4 bits
que viene después de esta letra, este dato se multiplica por un factor de conversión para que
su valor varíe de 0 a 40 y se guarda en una variable que luego es utilizada para modificar el
texto de una etiqueta la cual cambia al valor de la variable.
Para graficar se dibujan los ejes primero, y después se dibuja la línea utilizando una función
para ir dibujando una línea cada que se actualice el valor de y2, al actualizarse y2, se
actualizan también las variables x1 y y2 con los nuevos valores que acaban de obtenerse en
x2 y y2 esto para que la siguiente línea empiece dónde termino la última línea dibujada como
se muestra en la siguiente imagen

Fig. 7.10 Graficar en la aplicación.

• Envío temperatura máxima


Para el envío de la temperatura máxima se utilizó una caja de texto donde solo se habilitó que
fuera disponible mandar números, el número establecido por el usuario se guarda y al
presionar el botón a lado de la caja de texto se manda la trama de datos correspondiente a la
temperatura máxima con el dato de la caja de texto dentro de ella como se muestra en la Fig.
7.11.

22
Fig. 7.11 Envío de temperatura máxima al microcontrolador.

• Rutina de luces
Para la rutina de luces se implementó un switch con el cuál al presionarlo aparecen en
pantalla 3 botones el primero recopila la hora y minuto encendido de las luces, el segundo
recopila hora y minuto de apagado de las luces, el tercer botón manda la trama de datos al
microcontrolador con los datos recién recopilados, como se puede apreciar en la siguiente
imagen.

Fig. 7.12 Envío de hora y minuto encendido/apagado de luces.

• Alarma
Para el activado de la alarma se implementó un switch donde se evalúa que este cambie,
después se evalúa si está encendido de ser así manda la trama de datos para encenderá la
alarma, de lo contrario manda la trama de datos para apagar la alarma.

23
Fig. 7.13 Envío de estado de alarma.

• Cambio de hora del reloj de tiempo real


Para el cambio de hora del reloj de tiempo real se recolectó la hora a la cuál quería cambiarse
el reloj y se envío una trama con los datos recopilados, se añadió también un adelanto en
segundos a 55, suponiendo que se establece que la hora y minuto recopilado es de 9:25 pm
la trama enviada por el celular es #0,21,25,55&.

Fig. 7.14 Cambio de hora del reloj de tiempo real.

24
• Aplicación final

25
8. RESULTADOS SIMULACIÓN
• Iluminación

Resultados iluminación independiente del reloj de tiempo real.

Resultados iluminación dependiente del reloj de tiempo real.

26
• Ventilación

Resultados ventilación.

27
• Estados puertas y ventanas

Resultados estados de puertas y ventanas.

28
• Persianas/garage

Resultados persianas.

29
Resultados garaje.

30
• Alarma

Encendido de alarma.

Buzzer activado por ventanas abiertas.

31
• Base de tiempo de un segundo y de 200 ms

Resultados base de tiempo de 200 ms y un segundo.


Imágenes de la maqueta:

32
Resultado final.

4. CONCLUSIONES

33
Interpretación de resultados
No hubo problema con la iluminación, la trama que se mandaba ya fuera la de iluminación
dependiente o independiente funcionaron correctamente.
La ventilación funcionaba correctamente, el motor encendía después de sobrepasar el 52% de
la resistencia variable utilizando 21 como la temperatura máxima, se apaga el motor
reduciendo el porcentaje de la resistencia variable o cambiando la temperatura por una más
alta.
El estado de las ventanas y puertas era correctamente enviado por la trama de datos después
de apretar o soltar los botones que representan los limit switch.
Las persianas se mueven correctamente de acuerdo con la trama de datos enviados con un
rango de movimiento de 0 a 97.92° al igual que el garaje al mandar un cero con un botón en
configuración pull down para simular el sensor de presencia, el funcionamiento del botón ya
fuese para abrir o cerrar la puerta dependiendo de si la alarma está o no encendida es el
correcto.
El sonido intermitente del buzzer una vez abierta una puerta o ventana al estar activada la
alarma se simuló con un buzzer y un foco que prendían de manera intermitente 2 veces por
segundo.
Las bases de tiempo calculadas para los distintos procesos que se llevan a cabo en el
programa fueron las esperadas, se utilizó un osciloscopio digital para medir dichas señales y
al código se le agregó un par de funciones dentro de estas para que estuviera cambiando el
valor de un pin con el fin de medir cada cuanto tiempo cambiaba.

Se logró cumplir el objetivo del proyecto final satisfactoriamente, se aprendió las diferentes
maneras en las que puede ser utilizado el envío y recepción de datos a través de un módulo
bluetooth, las aplicaciones de este tipo de proyectos incluyen viviendas, supermercados,
estacionamientos, alumbrados de calle a ciertas horas del día, etc. Una de las dificultades que
se tuvo a la hora de programar fue que los datos para la gráfica se enviaban de manera muy
rápida ya que no se tenía una base de tiempo establecida para el envío de estos por lo que se
enviaban cada iteración del ciclo infinito lo que hacía que la aplicación colapsara y dejara de
funcionar, esto se resolvió generando una base de tiempo para mandar los datos de la gráfica
cada 200 ms.

34

También podría gustarte