Siguenos en ...

Google+facebooktwitter

youtubepinterest RSS aquihayapuntes

Últimos Tutoriales

Licencia

Creative Commons

 

Todo el contenido de este sitio está bajo una licencia de Creative Commons

 

Controlador doméstico

 

Descripción del Software


En los siguientes apartados se describen resumidamente los programas realizados en Visual Basic y en Ensamblador.

Programa en Visual Basic

Este programa permite las siguientes funciones:

  • Control del encendido y apagado de 16 dispositivos X-10, ampliable hasta 256.
  • La programación de la hora de encendido y apagado de 4 dispositivos simultáneamente.
  • La recepción y visualización de alarmas en el monitor del ordenador de cualquier transmisor conectado a la red.
  • El control de los dispositivos y la recepción de alarmas a través de mensajes SMS.


Para realizar estas funciones el programa utiliza los puertos de comunicación serie COM1 y COM2 del ordenador, pudiéndose seleccionar cualquiera de ellos o utilizar los dos a la vez.
El control a través del ordenador y del teléfono móvil puede funcionar simultáneamente, aunque se puede dejar libre uno de los puertos deshabilitando el control GSM por medio  del botón "Desconectar teléfono".

Para establecer la comunicación con los puertos serie del ordenador el programa utiliza dos controles MsComm configurados de la siguiente manera:

  • Velocidad en Baudios: 9600
  • Cantidad de Bits de envío: 8
  • Bit de parada:1
  • Pariedad: Ninguna.


La comunicación entre el ordenador y el controlador doméstico es transparente para el usuario y se ha realizado por medio de caracteres ASCII.
Para el envío de un comando a un dispositivo es necesario como mínimo dos caracteres, el primero puede ser o bien el carácter "+" si queremos poner a "ON" el dispositivo o el carácter "-" si queremos ponerlo  a "OFF" y el segundo nos sirve para identificar el dispositivo elegido entre las 256 combinaciones posibles.
Para la recepción de alarmas se ha utilizado el evento OnComm del control MsComm.
El control MsComm proporciona comunicaciones serie para que la aplicación pueda transmitir y recibir datos a través del puerto serie.  
El evento OnComm se genera siempre que cambia el valor de la propiedad CommEvent e indica que se ha producido un evento o un error en la comunicación.  
Los caracteres de alarma recibidos por el puerto serie conectado al controlador doméstico son almacenados en la variable valor, estos caracteres se van concatenando uno detrás de otro hasta que se encuentra el carácter de salto de línea que índica el fin de la transmisión, una vez recibido el mensaje se  
llama a la función alarma que se encarga de visualizar el mensaje de alarma en el monitor.

La comunicación entre el teléfono móvil y el ordenador se realiza por medio de comandos AT, estos comandos son compatibles con todos los modelos de teléfonos móviles.  
Nosotros utilizaremos tres de estos comandos:

  • AT+CMGS=? <cr> Comando para el envío de un SMS al nº de teléfono (?)
  • AT+CMGR=? <cr> Comando para la lectura del SMS guardado en la posición nº (?) de la memoria de la tarjeta SIM del teléfono.
  • AT+CMGD=? <cr> Comando para el borrado del SMS guardado en la posición nº (?) de la memoria de la tarjeta SIM del teléfono.


La clave utilizada desde un teléfono remoto para controlar los diferentes dispositivos es la siguiente:

Cada módulo se identifica por medio de una letra mayúscula A,B,C,D, etc. Si queremos encender el dispositivo, la letra irá precedida de la cadena "ON" y si queremos apagarlo irá seguida de la cadena "OFF".

Cada segundo se comprueba si hay algún mensaje guardado en la posición de  memoria nº 1  del teléfono, para ello se envía por medio del control MsComm2 el comando  "AT+CMGR=1" más el carácter retorno de carro que en visual Basic se representa por "Vbcr".  

Si hay algún mensaje guardado se identifica si corresponde con alguna de las claves asignadas a los dispositivos, si la clave es aceptada se guarda en la variable "resultado" para su posterior envío al controlador doméstico y se borra la posición nº1 de memoria del teléfono por medio del comando AT+CMGD=1<Cr>. Si la clave no es aceptada, el mensaje se borra igualmente de esta manera solo se utiliza la posición nº1 de memoria del teléfono.

Para enviar la señal de alarma a un teléfono remoto se envía a través del control MsComm2 el comando siguiente:

AT+CMGS+Ctrl(z)+Texto de alarma + <Cr>

Un esquema básico de flujo de datos del programa en visual Basic se muestra en la figura de abajo.

Diagrama de flujo

Interfaz de usuario

Al iniciar el programa aparece una ventana con una barra de menús desplegables, al pulsar sobre la opción Herramientas tenemos acceso a las ventanas:  Configuración Puerto Serie y Controles X-10. Según se muestra en la figura de abajo.

 

Ventana de inicio

 

Pulsando sobre la opción Configuración Puerto Serie tendremos acceso a la ventana de la figura siguiente. En la que podremos seleccionar el puerto serie utilizado para realizar la conexión con el controlador doméstico.

 

Selección del puerto serie

 

Una vez abierto el puerto de comunicación serie podemos acceder a la ventana principal de la aplicación, desde ella tendremos acceso al control de los dispositivos X-10 así como a la visualización de las alarmas recibidas. En la figura siguiente se muestran los diferentes apartados en los que se divide esta ventana.

 

Ventana principal del programa

 

En el apartado Control de dispositivos podemos encender o apagar el dispositivo seleccionado en la lista desplegable, esta versión de la aplicación solo tiene implementado el código para los primeros 16 dispositivos (letra de casa la A  y unidades de la 1-16).
En el Control de Alarmas podemos visualizar el mensaje de alarma enviado por cualquier dispositivo transmisor. Cuando el mensaje es recibido, el cuadro de texto empieza a parpadear y muestra en su interior el texto de la alarma recibida. Por medio del botón Desactivar eliminamos la alarma del panel.
En el apartado Programación de Unidades tenemos la posibilidad de controlar la hora de encendido y apagado de cuatro unidades simultáneamente.  
Para ello basta con seleccionar el dispositivo a controlar en la lista desplegable y escribir en los cuadros de texto la hora en la que queremos encender o apagar la unidad, utilizando para ello el formato indicado en los cuadros de texto. El panel dispone de un apartado en el que se visualiza la hora del sistema en formato hh:mm:ss junto con un botón que permite el acceso rápido a la ventana Propiedades de Fecha y hora de Windows.

El control GSM se realiza por medio del puerto de comunicación serie que queda libre, para ello solo tenemos que hacer clic con el ratón sobre el botón Conectar teléfono ó utilizar la combinación de teclas ALT+C, la aplicación seleccionará  automáticamente el puerto que quede disponible y mostrará el estado de la conexión debajo de la etiqueta Estado.  
Previamente se habrá escrito el mensaje de alarma que queremos transmitir y el número de teléfono donde queremos que se reciba el mensaje.
Si no queremos utilizar el teléfono pulsaremos sobre el botón Desconectar teléfono, el cual cerrará el puerto COMX seleccionado y mostrará la palabra Desconectado debajo de la etiqueta Estado,  
indicando de que el puerto se ha cerrado correctamente.

Programa en Ensamblador

El software se divide en varios archivos diferentes facilitando la adaptación del código a otras aplicaciones.  A continuación se muestra un resumen de los archivos asociados con esta aplicación.

  • X10 lib. asm Define funciones X-10
  • X10 lib. inc Define constantes y macros de X-10
  • X10 hc.asm Código principal del controlador doméstico.
  • Lcd. asm Define las rutinas necesarias para controlar el LCD.
  • P16F877.lkr Archivos linker estándar para PIC 16F877.
  • P16F877 Archivos include estándar para PIC16F877


A continuación se comentan las principales librerías de funciones y macros utilizadas en la transmisión y recepción de mensajes en X-10:

  • INIT X-10 Esta macro es usada para inicializar el periférico que provee la funcionalidad X-10. Debe ser llamada en el programa antes que las demás. Se utiliza escribiendo la instrucción siguiente: InitX10
  • SkipIfTX Ready Antes de enviar un mensaje en X-10, es necesario asegurarse que ningún otro mensaje está siendo ya enviado por la línea, lo cual se conoce porque el X10TxFlag está a uno. Esta macro verifica simplemente esa bandera y salta a la siguiente instrucción si  se puede empezar una nueva transmisión. De lo contrario, habría la posibilidad de que una nueva transmisión interrumpa una que ya está en curso. Se utiliza como se indica a continuación:

SKipIFTxDone
Goto $-1            ; Bucle hasta que se esté listo para transmitir el siguiente mensaje.

  • SendX10Address (House, Unit). Esta macro es usada para enviar una dirección a una unidad particular. Requiere dos argumentos, la dirección de casa y la dirección de la unidad. Las definiciones para todas las direcciones de casa y unidades están definidas en X10lib.inc. Por ejemplo, para enviar la dirección a la unidad 16 de la casa P se debe escribir la siguiente instrucción: SendX10Adress    House P, Unit 16
  • SendX10AddressVar. Es usada para enviar direcciones X-10 definidas por variables, en vez de por constantes como en la macro anterior. Por ejemplo para enviar una dirección contenida en las variables de usuario MyHouse y MyUnit, se escribirá la siguiente secuencia de instrucciones:


MOVF       MyHouse, W ;  contiene un valor de 0-16
MOVWF      TxHouse
MOVF       MyUnit, W ; contiene un valor de 0-16
MOFWF      TxUnit
SendXAddressVar

  • SendX10Command (House, Function). Esta macro es usada para enviar un comando en X-10. Requiere dos argumentos, la dirección de la casa y la función de código. Por ejemplo,  para enviar el comando "todas las luces encendidas" en todas las unidades de la casa A, se escribe la instrucción siguiente:


SendX10Command   House A, Alllights0n

  • SendX10CommandVar. Esta macro es usada para enviar un comando en X-10 definida por una variable en vez de por una constante. Por ejemplo, para mandar la orden almacenada en la variable de usuario MyCommand a todas las unidades de MyHouse, se escribe lo siguiente:


MOVF         MyHouse,W; contiene un valor de 0-16
MOVWF       TxHouse
MOVF          MyCommand,W; cualquier función X-10 definida en X10 lib.inc
MOVWF       TxFunction
SendX10 commandvar

  • SKipIfRxDone. Antes de leer un mensaje en X-10 hay que asegurarse de que el mensaje se ha recibido por completo, esto se conoce por medio del Flag X10RxFlag que se pone a uno. Esta macro verifica simplemente esa bandera y se salta la próxima instrucción si un nuevo mensaje X-10 se ha recibido. Se usa de la siguiente forma:

 

SkipIfRxDone

Goto $-1          ; bucle hasta que el mensaje sea recibido.

  • SKipIfCommandRcvd. Se utiliza para asegurarse de que un comando se ha recibido por completo. Para ello esta macro verifica si la bandera RxCommandFlag está a cero. Se utiliza de la siguiente forma:


SkipIfCommandRcvd
Goto $-1          ; bucle hasta que el comando sea recibido.

  • Read X10Message. Esta macro es llamada cada vez que se quiera leer un mensaje X-10 recibido, pudiendo ser este una dirección o un comando. Si el mensaje fuera una dirección, entonces los códigos recibidos de casa y unidad se almacenarán en las variables RxHouse y RxUnit, respectivamente. Si el mensaje fuera un comando u orden, entonces la dirección recibida de casa y código de función se almacenarán en las variables RxHouse y RxFunction. Esta macro es llamada de la siguiente manera:


ReadX10 Message

 

© 2007-2017 AquiHayapuntes.com