Arduino Uno

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 63

ESCUELA TCNICA SUPERIOR DE INGENIERA DE

TELECOMUNICACIN
UNIVERSIDAD POLITCNICA DE CARTAGENA

Proyecto Fin de Carrera

Red de sensores auto-configurable mediante tecnologas ZigBee y Arduino


con monitorizacin por aplicacin Android

AUTOR: Jos Salvador Montesinos Navarro


DIRECTORES: Juan Carlos Snchez Aarnoutse

Felipe Garca Snchez


Septiembre / 2013

Autor

Jos Salvador Montesinos Navarro

E-mail del autor

[email protected]

Directores

Juan Carlos Snchez Aarnoutse


Felipe Garca Snchez

E-mail de
directores

[email protected]
[email protected]

Ttulo del PFC

Red de sensores auto-configurable mediante


tecnologas ZigBee y Arduino con monitorizacin
por aplicacin Android.

Descriptores

ZigBee, Arduino, Android, Bluetooth, Sensores,


Inalmbrico, Monitorizacin, Ad-hoc, Redes Mesh

Resumen
Diseo e implementacin de una red inalmbrica de sensores de temperatura
y luz capaz de reconfigurarse automticamente al variar la disposicin y/o
disponibilidad de los nodos que la componen. Estos nodos estn formados por
placas Arduino que se comunican entre s mediante la tecnologa ZigBee.
Los datos de los sensores, junto con la ruta que siguen los paquetes dentro de
la red, son recopilados por un nodo coordinador capaz de transmitir dicha
informacin va Bluetooth a un dispositivo Android, donde una aplicacin se
encarga de monitorizar la red, mostrando dicha informacin tanto de forma
grfica como en modo texto.

Titulacin

Ingeniero Tcnico de Telecomunicaciones, Esp.


Telemtica

Departamento

Tecnologas de la Informacin y las


Comunicaciones

Fecha de
presentacin

09/2013

ndice
1.- Introduccin .......................................................................................................................... 3
1.1.- Planteamiento inicial ..................................................................................................... 3
1.2.- Objetivos ........................................................................................................................ 3
1.3.- Organizacin de la memoria .......................................................................................... 4
2.- Tecnologas ........................................................................................................................... 5
2.1.- Arduino .......................................................................................................................... 5
2.2.- ZigBee ........................................................................................................................... 9
2.3.- Bluetooth ..................................................................................................................... 17
2.4.- Android ........................................................................................................................ 18
3.- Red de Sensores .................................................................................................................. 22
3.1.- Topologa ..................................................................................................................... 22
3.2.- Hardware ..................................................................................................................... 23
3.3.- Configuracin .............................................................................................................. 24
3.4.- Protocolo de comunicacin ......................................................................................... 27
4.- Aplicacin de monitorizacin ............................................................................................. 29
4.1.- Comunicacin Bluetooth ............................................................................................. 30
4.2.- Representacin de la informacin ............................................................................... 31
5.- Conclusiones ....................................................................................................................... 32
5.1.- Problemas encontrados ................................................................................................ 32
5.2.- Lneas futuras .............................................................................................................. 34
Anexo A. Cdigo y flujogramas .............................................................................................. 35
A1.- Coordinador ................................................................................................................. 35
A2.- Router .......................................................................................................................... 40
A3.- Terminal ....................................................................................................................... 43
A4.- MainActivity ................................................................................................................ 47
A5.- AndroidManifest .......................................................................................................... 59
Anexo B. Bibliografa y referencias ........................................................................................ 60

1.- Introduccin
Esta memoria recoge informacin detallada acerca del proceso de diseo, desarrollo e
implementacin del presente Proyecto Fin de Carrera. En este primer punto se expone cul
fue la idea original del proyecto, los objetivos que se pretenden alcanzar y cmo se
estructuran los siguientes captulos de que consta este documento.

1.1.- Planteamiento inicial


En un principio este proyecto surgi de la necesidad de implementar una red inalmbrica con
fines esencialmente didcticos donde se pudiera observar de forma grfica e intuitiva cmo se
forman los enlaces entre los distintos componentes del sistema. Si estos enlaces caan, la red
deba poder reconfigurarse automticamente, buscando rutas alternativas y mostrando la
nueva configuracin.
Para que todos los nodos de la red dispusieran de datos independientes entre s, se opt por
implementar una red de sensores donde cada nodo recogiera informacin ambiental de su
entorno, como luminosidad y temperatura, y la transmitiera hasta un nodo coordinador
encargado de recopilar todos los datos de la red. Desde este nodo coordinador los datos seran
volcados a un dispositivo, como un smartphone o una tablet, donde una aplicacin se
encargara de monitorizar la red y representar grficamente su estado en cada momento.
A lo largo del proceso de diseo y desarrollo del proyecto el planteamiento didctico inicial
ha ido evolucionando, primando el potencial de las tecnologas empleadas y la utilidad
prctica que una red de estas caractersticas puede ofrecer, pero sin abandonar el objetivo
original.
1.2.- Objetivos
Adems del fin didctico sealado en el apartado anterior, los principales objetivos del
presente proyecto son:
- Estudiar el uso, rendimiento, versatilidad y posibles aplicaciones de componentes hardware
libres de bajo coste como Arduino.
- Profundizar en las posibilidades que ofrece la tecnologa inalmbrica ZigBee y su uso
aplicado a la implementacin de una red mallada de sensores que permita una
reconfiguracin automtica y eficiente de la misma frente a cualquier tipo de evento (entorno
hostil, cadas de nodos, ingreso de nuevos nodos a la red, etc.).
- Destacar las prestaciones y versatilidad que ofrece el entorno Android para desarrollar
aplicaciones que interacten con tecnologas completamente independientes y la posibilidad
de convertir cualquier smartphone o tablet en una potente herramienta de monitorizacin o
control remoto de sistemas.

1.3.- Organizacin de la memoria


Los siguientes apartados de esta memoria se estructuran de la manera descrita a continuacin:
Captulo 2: Tecnologas. Se plantea una introduccin a las principales tecnologas
que han sido empleadas durante la realizacin del proyecto, exponiendo sus
principales caractersticas y los motivos por los que fueron elegidas frente a otras
posibles alternativas.
Captulo 3: Red de sensores. Estudio del proceso de diseo e implementacin de la
red inalmbrica de sensores, as como informacin detallada sobre su topologa,
configuracin, funcionamiento y caractersticas.
Captulo 4: Aplicacin de monitorizacin. Se pormenoriza en el desarrollo y
funcionamiento de la aplicacin Android encargada de monitorizar la red y en el
proceso de interactuacin entre sta y el nodo coordinador.
Captulo 5: Conclusiones. Principales ideas que se extraen del proyecto, adems de
las diversas problemticas encontradas durante su realizacin y algunas propuestas de
posibles aplicaciones futuras que se le pueden dar al mismo.
Anexo A: Cdigo y flujogramas. Anexo que incluye los cdigos ntegros de los
distintos programas cargados en las placas Arduino y de la aplicacin Android, as
como sus correspondientes diagramas de flujo.
Anexo B: Bibliografa y referencias.

2.- Tecnologas
En este apartado se estudian las distintas tecnologas que forman parte del proyecto, tales
como componentes hardware, protocolos de comunicacin, estndares tcnicos o entornos de
programacin.
2.1.- Arduino
Arduino1 es una plataforma de electrnica abierta para la creacin de prototipos basada en
software y hardware flexibles y fciles de usar. Se cre para artistas, diseadores, aficionados
y cualquiera interesado en crear entornos u objetos interactivos.
Arduino puede tomar informacin del entorno de toda una gama de sensores a travs de sus
pines de entrada y puede afectar aquello que le rodea controlando luces, motores y otros
actuadores. El microcontrolador en la placa Arduino se programa mediante el lenguaje de
programacin Arduino2 (basado en Wiring3) y el entorno de desarrollo Arduino (basado en
Processing4). Los proyectos hechos con Arduino pueden ejecutarse sin necesidad de conectar
a un ordenador, si bien tienen la posibilidad de hacerlo y comunicar con diferentes tipos de
software.
Las placas pueden ser hechas a mano5 o compradas6 montadas de fbrica; el software puede
ser descargado7 de forma gratuita. Los ficheros de diseo de referencia (CAD) estn
disponibles8 bajo una licencia abierta, as pues permite ser adaptado segn las necesidades9.
Existe una amplia gama de placas prefabricadas que se ajustan a las distintas necesidades de
cada proyecto, ofreciendo distintos tamaos, potencias, costes, modelos de microcontrolador,
necesidades de alimentacin, nmero de entradas/salidas analgicas o digitales y otras
prestaciones especficas. Algunos de los modelos oficiales ms utilizados son Uno10,
Leonardo11, Mega ADK12, Pro13, Mini14, Nano15, Fio16, y un largo etc. Adems existe gran
variedad de clones no oficiales.

Figura 1 - Diversos modelos de placas oficiales Arduino disponibles.

El principal componente hardware de los nodos de la red es la placa Arduino Uno.

Figura 2 Arduino Uno

Uno es el modelo de referencia de la plataforma Arduino, alcanzando un compromiso entre la


sencillez de los modelos ms bsicos y la potencia de los ms complejos. Est basado en el
microcontrolador ATmega32817. Dispone de 14 pines de entrada/salida digital (de los cuales
6 pueden ser utilizados como salida PWM y 2 como puerto serie), 6 entradas analgicas, reloj
cermico de 16 MHz, puerto USB, conector de alimentacin, cabezal para programacin en
circuito serie y un botn de reinicio, entre otros componentes.

Figura 3 Principales elementos que componen la placa Arduino Uno

Para ponerlo en funcionamiento basta con conectarlo a un PC mediante el puerto USB o


alimentarlo con una batera o un adaptador AC/DC. Su voltaje de funcionamiento es de 5
voltios, admitiendo un rango de voltaje de alimentacin recomendado entre 7 y 12 voltios.
Proporciona dos pines de salida de alimentacin de 5 y 3,3 voltios.
Posee tres unidades de almacenamiento: una memoria FLASH de 32 KB, una SRAM de 2KB
y una EEPROM de 1 KB. En el siguiente esquemtico18 se puede observar la disposicin del
circuito interno de la placa y cmo se interconectan los distintos elementos.
El modelo Uno ha experimentado varias modificaciones desde su origen, siendo la versin
utilizada en este proyecto la ms reciente, llamada Revisin 3 o R3, que cambia la disposicin
en la placa de algunos pines y del botn de reset, adems de proporcionar un circuito ms
estable de reinicio del microcontrolador.
Arduino IDE.
Para programar el microcontrolador se proporciona un sencillo pero eficiente entorno de
desarrollo integrado o IDE que se puede descargar de forma libre desde la web de la
plataforma Arduino. Este software se puede utilizar en sistemas operativos Windows, Mac o
Linux y proporciona herramientas como editor de cdigo, compilador, cargador y monitor
serial, adems de libreras y ejemplos.
El lenguaje de programacin Arduino est basado en C/C++. Los programas, denominados
comnmente sketches, se dividen en tres partes principales: estructura, variables y funciones.
Adems todo programa debe comprender dos funciones esenciales denominadas setup() y
loop().
setup(): esta funcin se carga cuando se inicia un programa o sketch. Se emplea para
iniciar variables, establecer el estado de los pines, inicializar libreras, etc. Se
ejecutar una nica vez despus de que se conecte la placa Arduino a la fuente de
alimentacin, o cuando se pulse el botn de reinicio de la placa.
loop(): esta funcin se ejecuta inmediatamente despus de setup(). Se trata de un
bucle infinito que se repite indefinidamente mientras la placa est en funcionamiento
y no sea reiniciada. En ella se desarrolla el cdigo principal del programa y es la que
controla el comportamiento de la placa.
En la figura 4 se puede observar a modo de ejemplo un sketch bsico realizado en el IDE de
Arduino. Este programa hace uso del LED integrado en placa conectado al pin digital nmero
13 para hacerlo parpadear cada segundo. En la funcin setup() se inicializa el pin 13 como
pin de salida y en loop() se alterna el nivel de voltaje de dicho pin entre nivel alto o bajo para
encender o apagar el LED, respectivamente, con un retardo de un segundo entre cada
operacin.
Adicionalmente, en el Anexo A se pueden encontrar los cdigos de los sketches cargados en
los microcontroladores de las placas Arduino Uno que componen los distintos nodos de la red
y que determinan su comportamiento.

Figura 4 Programa bsico realizado en el IDE de Arduino

2.2.- ZigBee
ZigBee19 es un estndar abierto para radiocomunicaciones de baja potencia basado en la
especificacin 802.15.420 de redes inalmbricas de rea personal o WPAN21. Incluye un
robusto y confiable protocolo de red, de bajo consumo y coste, con servicios de seguridad y
capa de aplicacin que garantiza la interoperabilidad entre dispositivos. ZigBee trabaja a una
velocidad de datos de 250 Kbps sobre la banda libre de 2,4 Ghz, aunque tambin soporta las
bandas de 868 y 900 MHz.
El estndar ZigBee es publicado y administrado por un grupo de empresas y fabricantes
denominado ZigBee Alliance22. Por tanto, el trmino ZigBee es en realidad una marca
registrada de este grupo y no un estndar tcnico. Sin embargo, para fines no comerciales, la
especificacin ZigBee se encuentra disponible de forma abierta y libre al pblico. De esta
forma la relacin entre IEEE 802.15.4 y ZigBee Alliance es similar a aquella entre IEEE
802.1123 y Wi-Fi Alliance24.
Una de las caractersticas ms destacables de ZigBee es su soporte a redes malladas o mesh
networking25. En una red mallada los nodos se interconectan entre s de forma que existen
mltiples rutas posibles entre ellos. Las conexiones entre nodos se actualizan dinmicamente
y se optimizan mediante sofisticadas tablas de encaminamiento integradas. Las redes
malladas son descentralizadas; cada nodo es capaz de descubrir la red por s mismo. Adems,
cuando un nodo abandona la red, la topologa en malla permite a los dems nodos
reconfigurar las rutas en funcin de la nueva estructura de la red. Las posibilidades de una
topologa mallada y del enrutamiento ad-hoc proporcionan una mayor estabilidad y
adaptacin a condiciones impredecibles o cada de enlaces y nodos.
Principales caractersticas de ZigBee:
Bajo coste: estndar abierto que hace innecesario el pago de patentes.
Bajo consumo energtico: permite prolongar ampliamente la vida de las bateras.
Sencillez: cuenta con una pila de protocolos de reducido tamao.
Alta confiabilidad: redes malladas con redundancia de enlaces y canales y
posibilidad de enrutamiento alternativo automtico.
Despliegue de red sencillo: fcil de montar y administrar gracias a las redes ad-hoc y
al enrutamiento automtico.
Alta seguridad: proporciona integridad de datos y autenticacin, haciendo uso del
algoritmo de cifrado AES-128.
Compatibilidad: al tratarse de un estndar abierto se garantiza la interoperabilidad
entre dispositivos de diferentes fabricantes.
Baja latencia: los retardos producidos en las distintas tareas de red son muy
reducidos, del orden de milisegundos frente a varios segundos en otras tecnologas.
Gran capacidad: una misma red puede soportar ms de 65000 nodos independientes.
9

Estas caractersticas convierten a ZigBee en la tecnologa ideal para implementar una red de
sensores como la que es objeto de este proyecto. En fases iniciales del diseo se baraj la
posibilidad de emplear otras tecnologas como Wi-Fi o Bluetooth pero, como se puede
apreciar en la figura 5, el elevado consumo de la primera y el escaso alcance y poca
escalabilidad de la segunda provocaron que fuesen descartadas en favor de ZigBee.

Figura 5 Comparativa entre tecnologas inalmbricas

10

Tipos de dispositivos ZigBee.


Los nodos que forman parte de una red ZigBee se clasifican en 3 tipos:
Coordinador: el coordinador es el nodo ms importante de la red. puesto que es el
encargado de crearla. Por este motivo, slo puede existir un nico coordinador por
red. Adems, el coordinador se encarga de asignar direcciones a los nodos que se van
uniendo a la red, mantiene la seguridad, administra el sistema y acta de enlace con
otras redes u otros dispositivos.
Router: un router es un nodo ZigBee plenamente operativo. Puede unirse a redes
existentes, transmitir, recibir y enrutar informacin. Acta como intermediario entre
nodos que no pueden comunicarse directamente entre s, ampliando el alcance
efectivo de la red. Adems puede permitir a otros nodos el ingreso en la red. Su
consumo es mayor que el de los terminales puesto que, al tener responsabilidades de
enrutamiento, no puede desconectarse en ningn momento.
Terminal: un terminal es un nodo provisto con la funcionalidad bsica para unirse a
la red y enviar y recibir informacin. No puede actuar como intermediario entre otros
nodos. Necesita que un router o el coordinador sea su nodo padre y le permita el
acceso a la red. Puede entrar de forma cclica en un modo de bajo consumo para
ahorrar energa.

Figura 6 Ejemplo de topologa tpica de una red ZigBee

11

Direccionamiento.
Cada dispositivo ZigBee posee una direccin nica, exclusiva e inmutable de 64 bits
denominada direccin MAC que le distingue de cualquier otro dispositivo a nivel mundial.
Adicionalmente tambin dispone de una direccin de red de 16 bits que le es asignada
dinmicamente por el coordinador al asociarse a la red. Dentro de una PAN cualquier
dispositivo puede ser identificado unvocamente por cualquiera de estas dos direcciones. Por
ltimo, tambin se le puede asignar arbitrariamente un nombre identificativo formado por una
cadena de caracteres, pero este nombre no garantiza su identificacin inequvoca dentro de
una red.
De igual modo, cada red ZigBee posee dos identificadores que permiten distinguirla de
cualquier otra red de su entorno, incluso de las que operan en su mismo canal, permitiendo su
coexistencia en un mismo espacio. El primero de estos identificadores se denomina PAN ID
y es un valor de 16 bits que se establece al crearse la red. El segundo es el llamado Extended
PAN ID, un valor de 64 bits asignado arbitrariamente por el administrador de la red y que es
aadido, junto al PAN ID, en los paquetes beacon de sealizacin para permitir que los nodos
que deseen asociarse puedan identificar de forma unvoca la red.
Adems, dos redes ZigBee que compartan un mismo espacio se pueden diferenciar segn la
frecuencia del canal sobre el que trabajan. Cuando el nodo coordinador crea la red sondea los
canales disponibles en la banda utilizada (2,4 GHz) y elige el ms adecuado. Todos los nodos
que se asocien a la red deben usar este mismo canal. Por defecto, los dispositivos ZigBee se
encargan automticamente de seleccionar el canal adecuado.

Figura 7 Diagrama de Venn que muestra tres redes ZigBee coexistiendo en un mismo espacio gracias a
que pueden ser diferenciadas unvocamente por su PAN ID y el canal de transmisin. De igual modo, los
nodos que las constituyen pueden tener la misma direccin de red que los nodos de las otras redes, puesto
que es un valor local a la PAN.

12

Seguridad.
La tecnologa ZigBee garantiza la seguridad de las comunicaciones mediante el mecanismo
Advanced Encryption Standard26 o AES. Se trata de un fiable, rpido y eficiente algoritmo de
cifrado en bloque que utiliza claves de 128 bits y que proporciona confidencialidad de datos,
integridad en las conexiones, autenticacin de los elementos del sistema y proteccin a la red
frente a ataques malintencionados.
ZigBee soporta dos modos de manejo de claves:
Claves de red: proporcionan seguridad a las comunicaciones entre nodos. Cada
paquete es cifrado y enviado al siguiente nodo de la red donde es descifrado, cifrado
de nuevo y retransmitido al siguiente nodo en ruta hasta su destino.

Claves de enlace: proporcionan seguridad extremo a extremo. El origen del paquete


lo cifra, y ste permanece cifrado mientras se transmite por la red hasta que llega a su
destino donde es descifrado. Es conveniente usar este tipo de claves en situaciones
donde alguno de los nodos o enlaces intermedios de la red no es completamente
confiable.

XBee.
XBee27 es el hardware ZigBee utilizado en el proyecto. Se trata de una gama de mdulos de
radio fabricados por Digi International28 con una amplia variedad de modelos, componentes,
firmware, potencias de transmisin y antenas. Trabajan con un voltaje de operacin de 3,3
voltios y, aunque incorporan hasta 20 pines para distintas operaciones como reinicio o modo
de bajo consumo, pueden funcionar haciendo uso tan slo de sus 4 pines principales:
alimentacin, tierra, y entrada y salida de datos.
Cuentan con un microchip que, adems de ocuparse de las tareas propias de la comunicacin
radio, les permite realizar operaciones con un nivel de lgica muy bsico, como por ejemplo
leer directamente datos de sensores y retransmitirlos sin tener que contar con procesado
externo. Para lgica ms avanzada deben conectarse a otro dispositivo que se encargue de
ello, como un microcontrolador ms complejo.

Figura 8 Mdulo de radio XBee Serie 2 de Digi International

13

Los mdulos XBee se clasifican principalmente en dos tipos:


Serie 1: esta serie de mdulos XBee proporciona soporte para comunicaciones punto
a punto de forma simple y basndose en el estndar 802.15.4. Su principal ventaja es
la sencillez.
Serie 2: estos mdulos permiten implementar redes malladas siguiendo el protocolo
ZigBee. Adems poseen un mayor alcance y un menor consumo que la serie 1. Estas
caractersticas convierten a los mdulos de la serie 2 en los idneos para implementar
una red de sensores como la que ocupa este proyecto.
Cabe destacar que los mdulos XBee de la serie 1 y la serie 2 son incompatibles entre s, y
no pueden interactuar entre ellos de ninguna forma. Los mdulos pertenecientes a una serie
slo se pueden comunicar con otros mdulos de la misma serie.

Figura 9 Comparativa entre la serie 1 y la serie 2 de mdulos de radio XBee

14

Las radios XBee presentan dos modos de funcionamiento, denominados modos AT y API.
Modo AT: se trata de un modo transparente donde la informacin recibida por el pin
de entrada de datos es retransmitida por radio sin ninguna modificacin. Los datos
pueden ser enviados a un nico destinatario (punto a punto) o bien pueden ser
transmitidos a mltiples destinos (broadcast).
Modo API: en este modo, los datos son encapsulados dentro de una trama que
proporciona varias funcionalidades adicionales, tales como direccionamiento,
confirmacin de paquetes y checksum, entre otras. Existen varios tipos de tramas API
y cada una ofrece distintas prestaciones: comandos de configuracin, transmisin de
datos, reconocimiento de mensajes, etc.
Todas las radios XBee empleadas en el proyecto funcionan bajo el modo API, que les ofrece
las funcionalidades necesarias para realizar algunas de las operaciones ms complejas, como
la reconfiguracin automtica de la red, que no seran posibles en el modo AT.

Figura 10 Estructura de una trama API bsica

Para programar los mdulos XBee se debe cargar el firmware deseado y modificar el valor de
los distintos parmetros que determinan su comportamiento. Para ello se utiliza un software
distribuido por Digi, denominado X-CTU29 y que se puede descargar de forma gratuita desde
su pgina web30. Este programa, disponible slo para entornos Windows, permite actualizar
el firmware del mdulo, determinar su comportamiento como coordinador, router o terminal,
leer la configuracin actual, realizar pruebas de alcance o facilitar el acceso a las
funcionalidades del modo API, entre otras posibilidades. Basta con conectar el mdulo a un
ordenador haciendo uso de un adaptador USBi y usar el software para programarlo con la
configuracin deseada.
A pesar de que la nica forma de actualizar el firmware de un mdulo XBee es mediante el
software X-CTU, para modificar otras configuraciones se puede hacer uso de cualquier otro
programa terminal serie, entrar en modo comando y reconfigurar el mdulo mediante el envo
de comandos AT31.
i

En caso de no disponer de un adaptador USB especfico, se puede conectar el mdulo XBee a una placa
Arduino a la que previamente se ha borrado su programacin o retirado el microcontrolador, y conectar dicha
placa al ordenador mediante su puerto USB. De esta forma, la placa Arduino acta como adaptador entre PC y
XBee, permitiendo la configuracin de ste ltimo mediante el programa X-CTU.

15

Figura 11 Software X-CTU mostrando la configuracin leda de un nodo coordinador en modo AT

16

2.3.- Bluetooth
Bluetooth32 es una tecnologa de comunicaciones inalmbricas de corto alcance, segura,
simple y ampliamente extendida que soporta canales de voz y datos. Su principal objetivo es
remplazar las conexiones cableadas entre dispositivos conservando un alto grado de
seguridad. Est especficamente diseado para que sus transceptores sean pequeos, baratos y
de bajo consumo, pudiendo ser integrados en cualquier dispositivo.
Bluetooth fue especificado en el estndar 802.15.133 que a da de hoy no se sigue
manteniendo. En su lugar, un grupo de empresas llamado Bluetooth Special Interest Group34,
conocido tambin como Bluetooth SIG, se encarga de administrar el estndar y del desarrollo
de la especificacin.
La tecnologa Bluetooth opera sobre la banda de frecuencias libre de 2,4 GHz utilizando 79
canales de 1 MHz. Emplea la tcnica de espectro ensanchado por salto en frecuencia
(Frequency Hopping Spread Spectrum o FHSS35) que produce un cambio en la frecuencia de
transmisin cada 625 microsegundos, es decir, 1600 saltos por segundo. De esta forma se
minimizan las interferencias con otras comunicaciones inalmbricas que operan en la misma
banda de frecuencias.
Una comunicacin Bluetooth ocurre siempre entre un dispositivo maestro y uno esclavo, que
previamente han negociado las caractersticas de la conexin en un proceso denominado
vinculacin o pairing. Los esclavos pueden comunicarse nicamente con el maestro y slo
cuando ste se lo indique. Sin embargo, los dispositivos Bluetooth son simtricos y pueden
actuar como maestro o esclavo indistintamente. Esto permite formar redes ad-hoc que se
adaptan a las necesidades de la comunicacin.
Los dispositivos Bluetooth forman redes denominadas piconets. Cada piconet consta de un
dispositivo maestro y hasta 7 esclavos. Todos los dispositivos de una piconet comparten la
misma secuencia de salto en frecuencia, que suele denominarse canal FH o Frequency
Hopping. Los maestros se encargan de establecer la red y de controlar el canal FH,
determinando los instantes de salto en funcin de su reloj local. Los esclavos siguen la
secuencia que les marca el maestro, de forma que todos comparten la misma. Cada piconet
utiliza una secuencia de ensanchado distinta, permitiendo as la coexistencia de mltiples
redes en un mismo espacio.
Existen tres clases de mdulos Bluetooth en funcin de su alcance:
Clase 1: hasta 100 metros. Usados principalmente en entornos industriales
Clase 2: hasta 10 metros. Los ms comnmente extendidos en dispositivos mviles.
Clase 3: hasta 1 metro. Su reducido alcance limita sus posibles aplicaciones.
El uso de Bluetooth est muy extendido, lo que se convierte en su principal ventaja. Su
presencia en la inmensa mayora de dispositivos mviles como smartphones, tablets e
infinidad de otros dispositivos, convierte a Bluetooth en una de las tecnologas inalmbricas
de mayor compatibilidad.

17

2.4.- Android
Android36 es un sistema operativo de cdigo abierto basado en Linux37 y distribuido por
Google38 bajo licencia Apache39. Est diseado principalmente para dispositivos mviles de
pantalla tctil, como smartphones o tablets. Su naturaleza de cdigo abierto y lo permisivo de
su licencia hace posible que el software basado en Android sea libremente creado, modificado
y distribuido por cualquier desarrollador. Se facilita completo acceso al kit de desarrollo de
software o SDK40 que proporciona todas las herramientas necesarias para implementar,
probar y depurar aplicaciones, junto con prestaciones adicionales como libreras API,
documentacin, emulador, cdigos de ejemplo y tutoriales. Adems, se permite a los
desarrolladores la libre publicacin de sus creaciones, facilitando su distribucin a travs de
la plataforma Google Play41.
Los programas en entorno Android, denominados comnmente aplicaciones o apps, se
implementan en una versin personalizada del lenguaje de programacin Java42. Para ello se
puede hacer uso de la plataforma libre Eclipse43 que proporciona entornos de desarrollo
integrado tanto para Java como para Android. Adems, recientemente ha sido publicado por
Google un entorno de desarrollo especfico de Android, denominado Android Studio44,
disponible de forma gratuita desde su web. Debido a que Android Studio se encuentra todava
en fases muy iniciales de su desarrollo, todo el software Android implementado en este
proyecto se ha desarrollado mediante la plataforma Eclipse.

Arquitectura por capas.


El sistema operativo Android est conformado por una estructura software dividida en
diversos niveles. Cada capa de esta arquitectura proporciona servicios a su capa
inmediatamente superior.
Ncleo Linux: todo el sistema Android se construye sobre un ncleo Linux
personalizado por Google. Este nivel se encarga de interactuar con el hardware,
proporcionando los controladores necesarios. Adems acta como capa de abstraccin
entre el hardware y el resto de capas software de la arquitectura.
Libreras y Android Runtime: la siguiente capa corresponde a las libreras nativas
de Android, en lenguaje C/C++. Al mismo nivel se encuentra la capa de ejecucin
denominada Android Runtime, que consta de la mquina virtual Dalvik, encargada de
ejecutar las aplicaciones, y un conjunto de libreras Java.
Marco de Aplicacin: por encima de los niveles de libreras y ejecucin se encuentra
la capa marco de aplicacin o framework. Esta capa gestiona funciones bsicas del
dispositivo y proporciona las herramientas sobre las que se construyen las
aplicaciones.
Aplicaciones: esta es la capa superior de la arquitectura Android. Incluye todas las
aplicaciones, desde las incorporadas por defecto en Android como las desarrolladas
por terceros e instaladas por el usuario.

18

Figura 12 Arquitectura en capas del sistema Android.

Actividades.
Una actividad es un componente de una aplicacin Android que proporciona una interfaz con
la que el usuario puede interactuar. Cada actividad dispone de un espacio en el que
representar su interfaz. Normalmente este espacio ocupa toda la pantalla del dispositivo,
aunque puede ser ms pequeo o situarse por encima de otras actividades.
Una aplicacin puede constar de varias actividades vinculadas entre s. Una de estas
actividades es la principal, que es presentada al usuario en el momento de lanzar la
aplicacin. Cada actividad puede iniciar otras actividades para realizar distintas acciones.
Cuando se inicia una nueva actividad la anterior es detenida, pero preservada en una pila de
actividades. Se trata de una pila LIFO (Last In, First Out) que permite volver a la actividad
inmediatamente anterior pulsando el botn Atrs del dispositivo.
Durante la navegacin del usuario por la aplicacin, las actividades transitan entre distintos
estados en lo que se denomina el ciclo de vida de actividad45. Cuando una actividad cambia
de un estado a otro, el sistema llama a determinados mtodos que determinan su
comportamiento al transitar a ese nuevo estado, realizando las acciones correspondientes
como por ejemplo iniciar variables en caso de crearse una nueva actividad o liberar recursos
en caso de detenerse. Estos mtodos pueden ser modificados por los desarrolladores,
personalizando su comportamiento o incluyendo acciones adicionales.

19

Figura 13 Representacin del ciclo de vida de una actividad Android. Se muestran los posibles estados
de la actividad y los mtodos que el sistema utiliza para transitar entre ellos.

Como se puede observar en la figura 13, una actividad puede encontrarse en uno de cinco
estados posibles. Sin embargo slo tres de estos estados son estticos, es decir, la actividad
puede permanecer en ellos por un periodo de tiempo prolongado. Estos estados son:
Ejecutndose (Resumed): en este estado la actividad se encuentra corriendo en
primer plano y el usuario puede interactuar con ella. Si la actividad pasa a segundo
plano, el sistema llama al mtodo onPause().
Pausada (Paused): la actividad se encuentra en segundo plano, oculta parcialmente
por otra actividad que no ocupa toda la pantalla. La actividad pausada no ejecuta
ningn cdigo y no puede interactuar con el usuario. Si vuelve a primer plano se
llama al mtodo onResume() y se vuelve al estado de ejecucin. Si por el contrario la
actividad pasa por completo a segundo plano, el sistema llama a onStop() y transita al
siguiente estado.
Detenida (Stopped): la actividad est completamente oculta en segundo plano y no es
visible por el usuario. Se conserva su instancia y toda la informacin correspondiente,
pero no puede ejecutar cdigo. El sistema llama al mtodo onRestart() si la actividad
vuelve a primer plano, recuperando la informacin guardada. Si la actividad es
cerrada por completo, se ejecuta el mtodo onDestroy().
Los otros dos estados, Creada (Created) e Iniciada (Started), son transitorios y el sistema
avanza rpidamente por ellos para pasar al estado de ejecucin.

20

AndroidManifest
Cada aplicacin debe tener un archivo llamado AndroidManifest.xml46, con ese exacto
nombre, en su directorio raz. Se trata de un archivo XML que, mediante el uso de un sistema
de etiquetas y atributos, describe las caractersticas fundamentales de la aplicacin y define
cada uno de sus componentes. El sistema Android debe disponer de esta informacin antes de
poder ejecutar cualquier cdigo de la aplicacin. Algunas de las funciones que lleva a cabo
este archivo son:
Dar nombre al paquete Java. Este nombre identifica unvocamente la aplicacin.
Describe los distintos componentes de la aplicacin: actividades, servicios, clases, etc.
Determina los permisos que autorizan a la aplicacin para acceder a los distintos
recursos del dispositivo.
Establece la versin mnima del sistema Android que requiere la aplicacin.
En el Anexo A5 del presente documento se puede observar el archivo AndroidManifest de la
aplicacin de monitorizacin desarrollada en este proyecto.

Layouts
Un layout47 define la estructura visual de la interfaz de usuario de la aplicacin. Puede ser
creada de dos formas: mediante la declaracin de los elementos de la interfaz en un archivo
XML o mediante la instanciacin de los componentes del layout durante la ejecucin de la
aplicacin. Tambin se pueden emplear libremente estos dos mtodos en combinacin para
conseguir los resultados deseados.
En el proyecto se usan principalmente dos layouts: uno para la representacin grfica de la
red y otro para presentar los datos en modo texto. Ambos layouts se integran dentro de una
interfaz principal mediante una estructura de vistas denominada ViewFlipper48 que permite
cambiar de una a otra con slo pulsar un botn.
Los principales elementos de que constan los layouts desarrollados son:
TextView49: son campos de texto que presentan la informacin recibida de la red.
ImageView50: estos elementos permiten mostrar una imagen por pantalla.
Drawable51: se trata de un recurso que referencia una imagen para poder ser mostrada
dentro de un ImageView
Button52: botones que, al ser pulsados, permiten que el programa ejecute un cdigo
determinado.

21

3.- Red de Sensores


En este captulo se estudia el proceso llevado a cabo durante las fases de diseo e
implementacin de la red de sensores, as como sus principales caractersticas.
3.1.- Topologa
El sistema implementado en el proyecto consiste en una red mallada de nodos que se
comunican entre s mediante la tecnologa ZigBee. Consta de doce nodos: un coordinador,
cuatro routers y siete terminales, aunque est diseada para ser escalable hasta sesenta nodos.
Cada uno de estos nodos tiene funciones distintas:
Coordinador: crea la red y acepta las uniones de los dems nodos. Es el destino final
de todas las transmisiones dentro de la red, puesto que se encarga de recopilar los
datos de todos los nodos. Cuenta con sus propios sensores que le permiten medir sus
correspondientes datos ambientales. Adems puede conectarse mediante Bluetooth a
un dispositivo Android y enviarle los datos de la red para su monitorizacin.
Routers: leen los datos de sus sensores y los envan al coordinador. Adems pueden
actuar como intermediarios para los terminales que se encuentran fuera del alcance
del coordinador, retransmitiendo la informacin que stos les envan.
Terminales: adems de recoger informacin de sus sensores, son capaces de
identificar a su nodo padre, es decir, el router que acta de intermediario entre el
coordinador y ellos, e incluir dicha informacin en el mensaje transmitido para que
pueda ser identificada la ruta que dicho mensaje ha seguido dentro de la red.
Si bien la naturaleza ad-hoc de la tecnologa de radiocomunicacin empleada permite un
amplio grado de libertad en cuanto al despliegue de la red, para facilitar su posterior
monitorizacin se establece una disposicin fija de los nodos que hace posible la
identificacin inequvoca de la ruta que ha seguido cada uno de los mensajes que atraviesa la
red. Esta disposicin es la siguiente:

Figura 14 Topologa de la red de sensores mostrando todos los posibles enlaces entre los distintos nodos.

22

3.2.- Hardware
Cada nodo de la red, independientemente de su rol dentro de la misma, consta de los
siguientes componentes hardware:
Placa Arduino Uno: es el principal elemento del nodo, al que se conectan todos los
dems componentes. Es su microcontrolador quien determina el comportamiento del
nodo. Las salidas de los sensores se conectan a las entradas analgicas de la placa,
permitindole leer sus datos. Adems, mediante sus dos salidas de alimentacin de
3,3 y 5 voltios, se encarga de suministrar el voltaje de operacin adecuado a cada
componente hardware.
Mdulo XBee serie 2: es el encargado de la comunicacin inalmbrica con los dems
nodos e implementa el protocolo ZigBee, que permite la conexin y reconfiguracin
automtica de la red. Dependiendo de su configuracin actuar como coordinador,
router o terminal.
XBee Shield53: se trata de un adaptador especialmente diseado para conectar una
placa Arduino y un mdulo XBee. Realiza todas las conexiones necesarias entre los
pines de ambos elementos y dota de estabilidad al conjunto. Proporciona fcil acceso
a los conectores libres de la placa, junto con un botn adicional de reinicio del
microcontrolador. Dispone adems de un interruptor que permite seleccionar la salida
serie del mdulo XBee entre radio o USB, lo que facilita su configuracin.
Sensor de temperatura TMP3654: se trata de un pequeo dispositivo con tres patillas:
alimentacin, tierra y una salida de voltaje que vara en funcin de la temperatura. La
placa Arduino lee este valor de voltaje por la entrada analgica A0 y lo convierte en
grados Celsius mediante la frmula:
Temperatura (C) = ([(Vout * Alimentacin * 1000) / 1023] 500) / 10
Fotorresistencia LDR55: una fotorresistencia es un elemento cuya resistividad elctrica
vara en funcin de la luminosidad que detecta. Conectada al divisor de tensin de la
figura 15 acta como un sensor de luz. Mediante el pin analgico A1 la placa lee la
salida Vout, que vara en funcin de la luz presente, y traduce este valor de voltaje a la
magnitud de luminosidad Lux mediante la frmula:
Luminosidad (Lux) = Vout * 10000 / 1023

Figura 15 Divisor de tensin que permite a la fotorresistencia LDR actuar como un sensor de luz.

23

Pila de 9 voltios: alimenta a la placa Arduino, proporcionndole una tensin de 9


voltios que entra dentro de su rango recomendado (7-12 voltios). A su vez, la placa
alimenta al resto de elementos del nodo a travs de sus dos salidas de alimentacin
reguladas a 3,3 y 5 voltios. La pila convierte al nodo en un elemento completamente
inalmbrico.
Mdulo Bluetooth JY-MCU56: presente nicamente en el nodo coordinador, permite
mantener una comunicacin Bluetooth entre ste y el dispositivo Android encargado
de la monitorizacin. El pin TX del mdulo se conecta al pin digital nmero 10 de la
placa, y el RX al 11. Se estudiar en detalle esta comunicacin en el captulo 4.

Figura 16 Nodo coordinador de la red. De izquierda a derecha: mdulo Bluetooth,


sensores, mdulo XBee montado sobre placa Arduino Uno, y pila de 9V.

3.3.- Configuracin
Una vez interconectados correctamente los distintos componentes hardware, para que el nodo
presente el comportamiento deseado es necesario configurar mediante software dos de estos
elementos:
En primer lugar es necesario programar el microcontrolador de la placa mediante el IDE
Arduino, conectando el puerto USB de la placa a un PC y cargando el sketch
correspondiente. En la realizacin del proyecto se han desarrollado tres sketches distintos
para los tres tipos de nodo presentes en la red, que dotan a la placa del comportamiento
adecuado en cada caso. En el Anexo A de esta memoria se proporciona los cdigos en
lenguaje Arduino de estos sketches, junto con sus correspondientes diagramas de flujo.

24

Por otro lado, tambin es necesario configurar el mdulo XBee mediante la utilizacin del
software X-CTU. Para conectar el mdulo al ordenador se puede hacer uso de la placa
Arduino a modo de adaptador, borrando previamente el programa cargado en el
microcontrolador y cambiando el interruptor del shield a la posicin USB. De este modo el
mdulo se comunica directamente con el PC y se puede cargar en l el firmware adecuado y
configurar una serie de parmetros, tambin denominados comandos AT, que determinan su
comportamiento y las caractersticas de la comunicacin.
Si bien estos parmetros pueden modificarse mediante la ejecucin de comandos AT desde
cualquier programa terminal serie, para cargar un nuevo firmware en un mdulo XBee es
necesario el uso del programa X-CTU.

Figura 17 - Captura del software X-CTU mostrando la configuracin cargada en el nodo


coordinador. Los mens desplegables permiten elegir el modelo de radio XBee, su funcin como
coordinador, router o terminal tanto en modo AT como API, y la versin del firmware. En la ventana
inferior se pueden configurar los parmetros que determinan el comportamiento del mdulo en lo
referente a la creacin de la red, el direccionamiento, la seguridad, la potencia de transmisin, etc.

25

Algunos de los parmetros ms importantes, y que deben ser configurados en todos los
mdulos XBee que formen parte de la red, son:
ID (Identity): valor de 64 bits que determina el identificador de la red (Extended PAN
ID) a la que pertenece el nodo. La red del proyecto tiene como identificador el valor
1234.
NI (Node Identity): cadena de caracteres usada como identificador del nodo. El
microcontrolador determina dinmicamente la identidad del nodo y el origen de los
mensajes a partir de este valor. Cada nodo de la red est identificado por un carcter
alfanumrico: 0 para el coordinador, del 1 al 9 para los routers y una letra ASCII para
los terminales.
DH (Destination High): valor que representa los 32 bits ms significativos de la
direccin de 64 bits del nodo destino de los mensajes transmitidos. Siempre debe ser
0x00000000.
DL (Destination Low): este valor son los 32 bits menos significativos de la direccin
de 64 bits del nodo destino de los mensajes transmitidos. Para el coordinador este
valor debe ser la direccin broadcast (0x0000FFFF), y para todos los dems nodos
debe ser la direccin por defecto del coordinador (0x00000000).
EE (Encryption Enable): activa (1) o desactiva (0) el algoritmo de cifrado AES para
dotar de seguridad las transmisiones del nodo. Los nodos de la red implementada
tienen activado el cifrado AES.
NK (Netwrok Key): clave de red de hasta 128 bits utilizada para cifrar y descifrar los
mensajes protegidos mediante AES. La clave de red utilizada es ABCD.
PL (Power Level): Establece la potencia de transmisin del nodo. Este valor es un
nmero entero entre 0 (potencia de -8 dBm) y 4 (potencia de +2dBm). Los mdulos
del proyecto estn configurados para usar la mnima potencia para ahorrar energa y
limitar en lo posible el alcance de las transmisiones.

Tambin existen parmetros de slo lectura que ofrecen informacin de diagnstico de la red,
y a los que se puede acceder mediante el software X-CTU o tambin ejecutando los
comandos AT adecuados. Algunos de estos parmetros pueden ser:
MY: direccin de red de 16 bits del nodo, asignada dinmicamente al unirse a la red.
MP: direccin de red de 16 bits del nodo padre. Este valor es esencial para conocer la
ruta que siguen los mensajes dentro de la red.
NC: nmero restante de nodos hijos que pueden tomar a este nodo como padre. Si su
valor es 0 ya no puede aceptar ms nodos hijos.
DB: potencia del ltimo mensaje recibido por el mdulo.

26

3.4.- Protocolo de comunicacin


Para controlar la comunicacin ZigBee desde el programa cargado en la placa, se hace uso de
una librera abierta XBee57 para Arduino diseada a tal efecto por Andrew Rapp58, que
soporta las principales tramas API de los mdulos XBee. En este proyecto se usan
principalmente dos tramas API: la que permite ejecutar comandos AT para obtener
informacin del mdulo XBee y, sobre todo, la trama de transmisin de datos que encapsula
la informacin que el nodo quiere transmitir.

Figura 18 Estructura de una trama API de transmisin de datos.

27

Al iniciar su funcionamiento, cada nodo obtiene su identidad y la identidad de su nodo padre


mediante comandos AT. Adems, en cada iteracin del bucle, se leen los datos de los sensores
de temperatura y luz. Con toda esta informacin, el nodo crea un paquete de datos y llama a
la librera XBee para que encapsule dicho paquete dentro de una trama API de transmisin de
datos, que es enviada hasta su destino: el nodo coordinador. Al recibir esta trama, el
coordinador llama de nuevo a la librera XBee, que extrae el paquete de datos. El nodo
obtiene entonces de este paquete la informacin y la almacena en su base de datos local. De
esta forma puede saber el origen del mensaje, la ruta que ha seguido y los datos de los
sensores.

Figura 19 Estructura del paquete de datos creado por el nodo.


Este paquete constituye el payload de la trama API

Identificador de nodo: valor de 1 byte que identifica el nodo origen del mensaje y
que coincide con el parmetro NI. Este valor se establece al configurar el mdulo
XBee y el microcontrolador puede acceder a l mediante el comando AT NI. El
identificador del nodo coordinador es 0, los routers estn numerados por un carcter
numrico del 1 al 9 y los terminales por un carcter alfabtico ASCII. De esta forma
la red puede soportar hasta 60 nodos.
Identificador del nodo padre: valor de 1 byte que determina la identidad del nodo
padre. Mediante la ejecucin del comando AT MP, el microcontrolador obtiene del
mdulo XBee la direccin de red del nodo padre. Una vez obtenida, se sondea a todos
los posibles routers de la red con el comando AT ND, que solicita informacin como
la direccin de red y el identificador NI. Este sondeo es necesario puesto que las
direcciones de red son asignadas dinmicamente por el coordinador y no tienen un
valor fijo. Entonces se compara la direccin recibida de cada nodo con la direccin
del nodo padre obtenida anteriormente y, si alguna coincide, se establece su
identificador NI como el del nodo padre.
Dato de temperatura: float de 4 bytes que contiene el ltimo dato ledo del sensor de
temperatura.
Dato de luz: float de 4 bytes que contiene el ltimo dato ledo del sensor de luz.

Cabe destacar que, en caso de que un nodo caiga, abandone la red o una comunicacin entre
nodos se interrumpa por cualquier motivo, la naturaleza ad-hoc del protocolo ZigBee permite
la reconfiguracin automtica de los enlaces entre los distintos nodos de la red. Esta
restructuracin de la red se produce automticamente cada vez que la ruta entre el
coordinador y cualquier terminal se ve interrumpida y garantiza que la comunicacin se lleve
a cabo siempre que exista un camino posible entre nodo y coordinador,

28

4.- Aplicacin de monitorizacin


Adems del diseo e implementacin de la red de sensores, en el proyecto se ha desarrollado
una aplicacin para dispositivos Android capaz de interactuar mediante Bluetooth con el nodo
coordinador. La aplicacin solicita al coordinador el envo de los datos de la red que ste
tiene almacenados. Una vez recibidos, se procesa e interpreta la informacin, representando
grficamente el estado de los nodos de la red y de los enlaces existentes entre ellos.
La aplicacin tiene dos vistas principales: una representacin grfica de la topologa de la red
y un modo texto con la informacin recibida del coordinador. Se puede cambiar
indistintamente entre ambas interfaces en cualquier momento.

Figura 20 Captura de pantalla de la aplicacin de monitorizacin, mostrando un ejemplo de


representacin grfica del estado de la red y su correspondiente modo texto.

29

4.1.- Comunicacin Bluetooth


Debido a que la prctica totalidad de dispositivos Android cuenta con la posibilidad de
establecer una comunicacin Bluetooth, esta aplicacin permite que cualquier smartphone o
tablet se convierta en herramienta de monitorizacin de la red de sensores.
Para que la aplicacin tenga acceso al mdulo Bluetooth del dispositivo, es necesario
otorgarle los permisos adecuados. Esta autorizacin se concede modificando el archivo
AndroidManifest. Mediante su edicin, se puede conceder a la aplicacin autorizacin para
acceder a los distintos recursos del dispositivo, entre otras caractersticas. En concreto, se le
permite hacer uso del mdulo Bluetooth al aadir la siguiente lnea:
<uses-permission android:name="android.permission.BLUETOOTH"/>

Adems es necesario que, previamente a la ejecucin de la aplicacin, el dispositivo Android


y el mdulo Bluetooth del nodo coordinador hayan sido vinculados mediante la interfaz
estndar Bluetooth de Android. De esta forma al iniciar la aplicacin sta podr encontrar
fcilmente el nodo coordinador dentro de la lista de dispositivos Bluetooth vinculados. Slo
es necesario realizar esta vinculacin una vez, puesto que queda registrada en el sistema.
Una vez vinculados ambos dispositivos y concedidos los permisos correspondientes, la
aplicacin ya est preparada para conectar al mdulo Bluetooth del nodo coordinador y
comenzar el trfico de datos. Se presentan tres posibles interactuaciones entre ambos
dispositivos:
Conectar: es la primera accin que es necesario llevar a cabo al arrancar la
aplicacin. Para ello debe pulsarse el botn correspondiente que provoca que el
sistema busque el mdulo del nodo coordinador dentro de la lista de dispositivos
Bluetooth vinculados. Una vez encontrado, se establece la conexin mediante la
creacin de un socket y se abren sendos flujos de entrada y salida de datos. De esta
forma, la comunicacin se encuentra lista para ser empleada.
Actualizar: al pulsar este botn la aplicacin enva al nodo coordinador una solicitud
de informacin, consistente en el carcter ASCII A. Cuando el nodo recibe esta
peticin enva secuencialmente al dispositivo Android los datos ms recientes de
todos los nodos de la red. Estos datos son transmitidos con el formato adecuado para
ser directamente mostrados por pantalla en el modo texto de la aplicacin. La
informacin de cada nodo es recibida y procesada de forma independiente.
Desconectar: esta accin se lleva a cabo cuando se pulsa el botn de desconexin o
tambin cada vez que la aplicacin es cerrada o pasa a segundo plano, puesto que se
incluye dentro del mtodo onPause(). Cuando alguno de estos eventos ocurre, la
comunicacin Bluetooth es cerrada, liberando los recursos empleados y cerrando los
flujos de entrada y salida de datos. Para volver a establecer la conexin basta con
pulsar de nuevo el botn Conectar.

30

4.2.- Representacin de la informacin


Cuando la aplicacin recibe informacin referente a un nodo, sta es procesada, guardada y
representada adecuadamente en la interfaz de monitorizacin. Esta representacin depender
de la vista que est activa en el momento de enviar una solicitud de actualizacin al nodo
coordinador. Se puede cambiar entre ambas vistas, que forman parte de una estructura
ViewFlipper, pulsando el botn correspondiente.
Si la aplicacin se encuentra en modo texto tan slo necesita extraer el primer byte del
mensaje recibido, que indica la identidad del nodo cuyos datos vienen a continuacin, y
mostrar por pantalla dichos datos en el campo de texto, o TextView, correspondiente, pues
son ya transmitidos por el nodo coordinador con el formato adecuado.
Si por el contrario la aplicacin est en el modo de representacin grfica de la topologa,
el procesado de los datos es ms complejo. En primer lugar debe extraerse el byte que
identifica al nodo origen de los restantes datos del mensaje. Si dichos datos indican que el
nodo est activo, se muestra por pantalla, en el elemento ImageView adecuado, una imagen
de dicho nodo iluminado en un color identificativo: verde para el coordinador, azul para los
routers y naranja para los terminales. Sin embargo, si los datos recibidos indican que el nodo
est desactivado, se mostrar una imagen griscea para representar su inactividad.
Una vez identificado el nodo y mostrado su estado, es necesario identificar a su nodo padre.
Para ello se extrae y se procesa el byte correspondiente dentro de los datos recibidos, y se
representa el camino seguido dentro de la red por el paquete en su ruta hasta el coordinador.
La aplicacin cuenta con imgenes, denominadas Drawables en el contexto Android, que
contemplan todas las posibles combinaciones de rutas entre los distintos nodos. Una vez se
conocen el nodo origen y su nodo padre, basta con comparar dichos valores con unas tablas
de estados implementadas en la aplicacin y mostrar por pantalla la imagen correspondiente
que representa el estado actual de los enlaces involucrados. Si por cualquier motivo un nodo
terminal no tiene como padre uno de los nodos esperados, la ruta del mensaje quedar en
blanco, indicando de esta forma que el despliegue de la red no es el deseado y que conviene
reiniciar dicho nodo.
Por ltimo, una vez encendido o apagado el nodo y actualizada la representacin de la
ruta seguida por el mensaje, tan slo resta mostrar en el campo de texto correspondiente los
datos de los sensores de temperatura y luz. De esta forma con un simple vistazo se puede
tener una idea detallada del estado de la red de una forma ms intuitiva y directa que en el
modo texto, tal y como se puede apreciar en la figura 20.
Cabe destacar que la aplicacin mantiene una base de datos local con la informacin ms
reciente obtenida de cada nodo, por lo que cada nuevo dato recibido puede ser procesado de
forma independiente. Cuando se recibe un nuevo dato de un nodo, se representar por
pantalla el estado de la red en funcin tanto del nuevo dato de ese nodo, como de los ltimos
datos recibidos de los dems. De esta forma cada vez que se solicita una actualizacin la
monitorizacin de la red siempre se muestra en su estado ms reciente.
Para ms informacin acerca del funcionamiento de la aplicacin, se puede observar el
cdigo de la actividad que la conforma y sus correspondientes diagramas de flujo en el
Anexo A4.
31

5.- Conclusiones
El proyecto ha conseguido cumplir el objetivo de disear e implementar una red mallada
inalmbrica de sensores capaz de reconfigurarse automticamente para adaptarse a
condiciones cambiantes tales como desconexin de nodos, modificaciones en su disposicin,
cadas de enlaces o ingreso de nuevos nodos a la red.
Asimismo, mediante la aplicacin Android desarrollada se cuenta con la capacidad de
monitorizar el estado de la red en cada momento, pudiendo observarse de forma inmediata e
intuitiva la situacin de los nodos y de los distintos enlaces entre ellos, as como los valores
ledos por los sensores de luz y temperatura presentes en cada nodo. De esta forma, se cumple
el objetivo didctico que supuso el punto de partida del proyecto.
Otras de las principales conclusiones que se pueden extraer de la realizacin de este proyecto
son las sealadas a continuacin:
Se ha podido evidenciar el potencial de las placas Arduino como elemento hardware
libre de bajo coste. Su versatilidad, la potencia de su lenguaje de programacin y la
gran gama de modelos disponibles, junto con la posibilidad de montar placas
personalizadas bajo licencia abierta, permite a las placas Arduino adaptarse a las
necesidades de cualquier proyecto o prototipo que requiera del uso de un
microcontrolador.
Se han estudiado las principales caractersticas de la tecnologa de comunicacin
inalmbrica ZigBee, entre las que se han destacado su sencillez y eficacia para el
despliegue, configuracin y administracin de redes ad-hoc auto-configurables de
bajo consumo, gran alcance, adaptabilidad frente a condiciones impredecibles y
elevado nmero de nodos. Estas prestaciones convierten a ZigBee en una tecnologa
inalmbrica superior a otras alternativas como Wi-Fi para la realizacin de un
proyecto de esta ndole.
Se ha destacado la gran extensin de la tecnologa inalmbrica Bluetooth y su
presencia en la prctica totalidad de dispositivos mviles de ltima generacin, lo que
la convierte en una de las tecnologas de comunicacin de mayor compatibilidad. Que
el nodo coordinador utilice Bluetooth para comunicarse con el dispositivo encargado
de la monitorizacin del sistema, en lugar de mediante la tecnologa ZigBee ya
presente en la red, garantiza que la gama de dispositivos con los que puede interactuar
sea la mayor posible.
Se ha podido observar cmo la aplicacin de monitorizacin desarrollada en entorno
Android permite convertir cualquier dispositivo mvil que cuente con este sistema
operativo, como puede ser un smartphone o una tablet, en una potente plataforma para
monitorizar o controlar sistemas de forma remota, independientemente de las distintas
tecnologas en que stos se basen. Android ofrece de forma abierta un potente entorno
de programacin y todas las herramientas indispensables para programar aplicaciones
que se adapten a las necesidades de cada proyecto.

32

5.1.- Problemas encontrados y soluciones propuestas


A lo largo del proceso de diseo y desarrollo del proyecto aparecieron diversos problemas y
obstculos que requirieron de una mayor atencin y esfuerzo para poder ser solventados.
Principalmente fueron consecuencia de la dificultad de llevar a la prctica algunas de las
ideas planteadas en el diseo, debido a las limitaciones de las tecnologas empleadas.
Tambin hubo que descartar algunas tecnologas presentes en un diseo inicial por otras ms
adecuadas al proyecto.
Los principales problemas a los que hubo que enfrentarse durante la realizacin del proyecto
fueron:
La dificultad para determinar la ruta seguida por los mensajes dentro de la red. Debido
a las limitaciones de los mdulos XBee no es posible conocer la identidad del nodo
padre de una radio configurada como router. Esto hace imposible determinar la ruta
seguida por los mensajes enviados por un router en el caso de existir ms de dos
posibles caminos hasta el nodo coordinador. Este problema se solvent estableciendo
una disposicin fija de los nodos de la red de forma que todos los routers pudieran
comunicarse directamente con el coordinador y desplegando los terminales en la
periferia de la red. Los terminales s disponen de mecanismos para conocer cul de los
routers es su nodo padre, por lo que de esta forma se puede conocer la ruta seguida
por todos los mensajes que se transmiten por la red.
En un principio se pens en utilizar el modelo de placas Arduino Fio, que ofrece la
posibilidad de ser reprogramado inalmbricamente mediante una comunicacin
ZigBee, lo cual supona una gran ventaja a la hora de aadir prestaciones adicionales
a la red. Sin embargo dicha reprogramacin inalmbrica requera necesariamente del
uso de mdulos XBee de la serie 1, que nicamente soportan comunicaciones punto a
punto. Puesto que el objetivo del proyecto era implementar una red mallada para la
que es necesario el uso de mdulos XBee de la serie 2 y siendo del todo imposible
cualquier tipo de interactuacin entre ambas series, se opt por renunciar a la
reprogramacin inalmbrica y descartar las placas Arduino Fio en favor de las Uno.
La naturaleza didctica del proyecto haca pensar en un principio que era necesario
limitar el alcance de los nodos de la red de forma que no todos ellos se pudieran
comunicar directamente con el coordinador para que, de esta manera, se establecieran
entre ellos los enlaces adecuados. No obstante, incluso configurando al mnimo la
potencia de transmisin de los nodos, su alcance, de aproximadamente 10 metros, era
demasiado grande como para que toda la red pudiera ser, en principio, desplegada en
una misma habitacin. Sin embargo, se descubri que los mdulos XBee funcionan de
tal forma que, al conectarse a la red, eligen como nodo padre al router o coordinador
que les ofrece una mejor calidad de seal. As, todos los nodos pueden ser colocados
en una misma mesa con la nica precaucin de que cada nodo terminal debe estar ms
cerca del router que debe actuar como su padre que de los dems. En caso de
desconectarse dicho router, el terminal tomar como nodo padre al segundo router (o
coordinador) que tenga ms cerca, facilitndose as en gran medida el despliegue
adecuado de la red y su administracin.

33

5.2.- Lneas futuras


Son mltiples las posibles aplicaciones que se le pueden dar a una red de estas caractersticas.
Est diseada para ser fcilmente escalable hasta 60 nodos, o muchos ms introduciendo las
modificaciones adecuadas en su diseo, y basta con cambiar los tipos de sensores y
actuadores de que dispone para adaptarla segn las necesidades. Se puede tambin desarrollar
una aplicacin Android cuya funcin sea el control telemtico de los elementos de la red,
adems de su monitorizacin. Por otra parte, cambiando el mdulo Bluetooth del nodo
coordinador por cualquier otro tipo de mdulo se puede otorgar a la red la posibilidad de
interactuar con otros sistemas mediante distintas tecnologas de comunicacin: Wi-Fi,
Ethernet, etc.
A modo de referencia se presentan a continuacin algunos mbitos en los que se emplean
actualmente redes ZigBee similares a la implementada en el proyecto:
Gestin energtica inteligente.
Domtica y automatizacin de edificios.
Monitorizacin de sistemas.
Servicios de vigilancia y seguridad.
Control de procesos en plantas industriales.
Tele-asistencia mdica y control telemtico de constantes vitales.
Sistemas de calefaccin y aire acondicionado.
Y, como en este proyecto, prototipos con fines acadmicos.
En concreto, se est estudiando la posibilidad de aplicar una red como la diseada en este
proyecto para controlar el encendido y apagado automtico de la iluminacin de las aulas y
salas de la universidad con el fin de optimizar el ahorro energtico. Mediante el despliegue
por el campus de nodos dotados de sensores de movimiento se podra determinar las estancias
que estn vacas en un sistema de monitorizacin central y proceder al apagado automtico de
la iluminacin correspondiente. Este planteamiento puede dar origen a un futuro proyecto.

34

Anexo A. Cdigo y flujogramas


A1.- Coordinador

Inicio

Obtener datos de
sensores

Declaracin e
inicializacin de
variables

Recibir mensaje
XBee

Leer voltaje de
salida del sensor

setup()
NO
Es un mensaje
de datos vlido?

Configuracin de
pines y puertos
serie

Convertir voltaje en
temperatura o luz

SI
loop()
Identificar origen y
reiniciar su timeout
Se ha recibido
peticin de
actualizacin por
Bluetooth?

SI

Guardar en la
variable
correspondiente

NO
return
Extraer y almacenar
datos del mensaje

Obtener datos
de sensores

Decrementar
timeout de los
nodos activos

Enviar datos de toda


la red por Bluetooth

35

#include <XBee.h>
#include <SoftwareSerial.h>
#define
#define
#define
#define
const
const
const
const
const

NUM_NODOS 12
NUM_ROUTERS 4
BT_TX 10
BT_RX 11

//Declaracin de constantes

unsigned int PIN_TEMP = 0;


unsigned int PIN_LUZ = 1;
unsigned int LED = 13;
unsigned int BAUD_RATE = 9600;
float ALIMENTACION = 5.0;

XBee xbee = XBee();


//Declaracin de variables
SoftwareSerial BluetoothSerial(BT_TX, BT_RX);
XBeeResponse response = XBeeResponse();
ZBRxResponse rx = ZBRxResponse();
ModemStatusResponse msr = ModemStatusResponse();
union u_tag1 {
byte t[4];
float ftemp;
} temp;
union u_tag2 {
byte l[4];
float fluz;
} luz;
typedef struct{
byte padre;
byte timeout;
float temperatura;
float luminosidad;
} Nodo;
Nodo nodo[NUM_NODOS];
int i = 0;
byte origen = 0;
byte padre = 0;
byte buffer[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
void setup() {
pinMode(LED, OUTPUT);
Serial.begin(BAUD_RATE);
xbee.begin(BAUD_RATE);
BluetoothSerial.begin(BAUD_RATE);
parpadeo(LED, 3, 50);
}
void loop() {
//si se recibe por Bluetooth una peticin de actualizacin por parte de la
aplicacin de monitorizacin, se leen los datos de los sensores locales y
se enva por Bluetooth los datos ms recientes de toda la red.

36

if (BluetoothSerial.available()){
if (BluetoothSerial.read() == 'A'){
temp.ftemp = get_temp();
luz.fluz = get_luz();
nodo[0].timeout = NUM_NODOS;
nodo[0].padre = 0;
nodo[0].temperatura = temp.ftemp;
nodo[0].luminosidad = luz.fluz;
enviar_datos();
}
}
xbee.readPacket(1000);

//se espera 1 seg a recibir un mensaje XBee

//si se recibe un mensaje vlido, sus datos se extraen al buffer de


entrada, se identifica el origen, y los datos se almacenan en la
posicin correspondiente del array de nodos.
if (xbee.getResponse().isAvailable()) {
if (xbee.getResponse().getApiId() == ZB_RX_RESPONSE) {
xbee.getResponse().getZBRxResponse(rx);
if (rx.getOption() == ZB_PACKET_ACKNOWLEDGED) {
parpadeo(LED, 10, 10);
}
else {
parpadeo(LED, 2, 20);
}
for (i=0; i<10; i++){
buffer[i] = rx.getData(i);
}
origen = buffer[0];
if (origen >= 'A') origen = origen - 'A' + NUM_ROUTERS + 1;
nodo[origen].timeout = NUM_NODOS;
nodo[origen].padre = buffer[1];
for(i=0;i<4;i++){
temp.t[i] = buffer[i+2];
}
nodo[origen].temperatura = temp.ftemp;
for(i=0;i<4;i++){
luz.l[i] = buffer[i+6];
}
nodo[origen].luminosidad = luz.fluz;
}
//si es otro tipo de mensaje (control, error, desconocido, etc) el
LED parpadea para indicarlo.
else if (xbee.getResponse().getApiId() == MODEM_STATUS_RESPONSE){
xbee.getResponse().getModemStatusResponse(msr);
if (msr.getStatus() == ASSOCIATED){
parpadeo(LED, 10, 10);
}

37

else if (msr.getStatus() == DISASSOCIATED){


parpadeo(LED, 10, 10);
}
else{
parpadeo(LED, 5, 10);
}
}
else {
parpadeo(LED, 1, 25);
}
}
actualizar_nodos();

//se decrementa el timeout de los nodos

}
void parpadeo(int pin, int times, int wait) {
//funcin que controla el parpadeo del led
for (int i = 0; i < times; i++) {
digitalWrite(pin, HIGH);
delay(wait);
digitalWrite(pin, LOW);
if (i + 1 < times) {
delay(wait);
}
}
}
void actualizar_nodos(){
//funcin que reduce el timeout de los nodos
for(i=0; i<NUM_NODOS; i++){
if (nodo[i].timeout > 0){
nodo[i].timeout -= 1;
}
}
}
void enviar_datos(){
//funcion que enva por Bluetooth todos los datos almacenados en el array
de nodos
for(i=0; i<NUM_NODOS; i++){
BluetoothSerial.write(i);
if(nodo[i].timeout > 0){
BluetoothSerial.print("Padre: ");
if(i==0) BluetoothSerial.println("-");
else BluetoothSerial.println(nodo[i].padre);
BluetoothSerial.print("Temp: ");
BluetoothSerial.println(nodo[i].temperatura);
BluetoothSerial.print("Luz: ");
BluetoothSerial.println(nodo[i].luminosidad);
}
else BluetoothSerial.println("Desactivado");
BluetoothSerial.write(0x7f);

38

void mostrar_datos(){
//funcin auxiliar que enva los datos por el monitor serial. No es llamada
durante la ejecucin, pero se conserva para posible depuracin futura.
boolean actividad = false;
Serial.println("Datos de los nodos activos:");
for(i=0; i<NUM_NODOS; i++){
if(nodo[i].timeout > 0){
if(!actividad) actividad = true;
Serial.println("---------------------------------------");
Serial.print("Datos recibidos del sensor numero ");
Serial.println(i);
Serial.print("Cuyo padre es el nodo numero ");
Serial.println(nodo[i].padre);
Serial.print("Temperatura: ");
Serial.print(nodo[i].temperatura);
Serial.println(" C");
Serial.print("Luminosidad: ");
Serial.print(nodo[i].luminosidad);
Serial.println(" lux");
delay(100);
}
}
if(!actividad) Serial.println("No se ha registrado ningn nodo activo");
}
const float get_temp(){
//funcin que lee el sensor de temperatura
const int temp_voltaje = analogRead(PIN_TEMP);
const float t = temp_voltaje * ALIMENTACION / 1023;
return ((t * 1000 - 500) / 10);
}
const float get_luz(){
//funcin que lee el sensor de luz
const int luz_voltaje = analogRead(PIN_LUZ);
const float l = luz_voltaje * ALIMENTACION / 1023;
return (l * (10000 / ALIMENTACION));
}

39

A2.- Router

Inicio

Obtener ID
del nodo

Declaracin e
inicializacin de
variables

Ejecutar comando
AT NI

setup()
Guardar respuesta
como ID

Configuracin de
pines y puertos
serie

return
Obtener ID del
nodo

loop()
Obtener datos de
sensores
Obtener datos
de sensores
Leer voltaje de
salida del sensor
Rellenar el paquete
de datos con la info
obtenida
Convertir voltaje en
temperatura o luz
Envar datos al
coordinador
Guardar en la
variable
correspondiente
Recibir ACK y
retardo de 1
segundo
return

40

#include <XBee.h>
#define COORDINADOR 0x4079c2a9
const
const
const
const
const

unsigned int PIN_TEMP = 0;


unsigned int PIN_LUZ = 1;
unsigned int LED = 13;
unsigned int BAUD_RATE = 9600;
float ALIMENTACION = 5.0;

//declaracin de constantes

union u_tag1 {
byte t[4];
float ftemp;
} temp;

//declaracin de variables

union u_tag2 {
byte l[4];
float fluz;
} luz;
int i = 0;
byte id = 0xFF;
byte datos[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
XBee xbee = XBee();
XBeeAddress64 direccion = XBeeAddress64(0x0013a200, COORDINADOR);
ZBTxRequest tx = ZBTxRequest(direccion, datos, sizeof(datos));
ZBTxStatusResponse txStatus = ZBTxStatusResponse();
void setup(){
pinMode(LED, OUTPUT);
Serial.begin(BAUD_RATE);
xbee.setSerial(Serial);
obtener_ID();
}

//se inicializan puertos y pines


//se obtiene la ID del nodo

void loop(){
temp.ftemp = get_temp();
luz.fluz = get_luz();
datos[0] = id;
datos[1] = 0;

//se lee el dato de temperatura


//se lee el dato de luz
//se rellena el paquete de datos

for(i=0;i<4;i++){
datos[i+2] = temp.t[i];
}
for(i=0;i<4;i++){
datos[i+6] = luz.l[i];
}
xbee.send(tx);

//se enva la trama de datos

parpadeo(LED, 1, 100);
if (xbee.readPacket(500)) {

//se espera a recibir respuesta

//si la respuesta es correcta el LED parpadea rpido; si no, lento.


if (xbee.getResponse().getApiId() == ZB_TX_STATUS_RESPONSE) {
xbee.getResponse().getZBTxStatusResponse(txStatus);

41

if (txStatus.getDeliveryStatus() == SUCCESS) {
parpadeo(LED, 5, 50);
} else {
parpadeo(LED, 3, 500);
}
}
delay(1000);
}
}
const float get_temp(){
//funcin que lee el sensor de temperatura y devuelve el dato en grados.
const int temp_voltaje = analogRead(PIN_TEMP);
const float t = temp_voltaje * ALIMENTACION / 1023;
return ((t * 1000 - 500) / 10);
}
const float get_luz(){
//funcin que lee el sensor de luz y devuelve el dato en lux.
const int luz_voltaje = analogRead(PIN_LUZ);
const float l = luz_voltaje * ALIMENTACION / 1023;
return (l * (10000 / ALIMENTACION));
}
void parpadeo(int pin, int times, int wait) {
//funcin que controla el parpadeo del led
for (int i = 0; i < times; i++) {
digitalWrite(pin, HIGH);
delay(wait);
digitalWrite(pin, LOW);
if (i + 1 < times) {
delay(wait);
}
}
}
void obtener_ID(){
//funcin que obtiene el ID del nodo mediante el comando AT NI
byte comando_NI[] = {'N','I'};
AtCommandRequest atRequest = AtCommandRequest(comando_NI);
AtCommandResponse atResponse = AtCommandResponse();
xbee.send(atRequest);
if (xbee.readPacket(5000)) {
if (xbee.getResponse().getApiId() == AT_COMMAND_RESPONSE) {
xbee.getResponse().getAtCommandResponse(atResponse);
if (atResponse.isOk()) {
if (atResponse.getValueLength() > 0) {
id = atResponse.getValue()[0] - '0';
}
}
}
}
}

42

A3.- Terminal

Inicio

Obtener ID
del nodo

Declaracin e
inicializacin de
variables

Ejecutar comando
AT NI

Obtener ID del
nodo padre

Obtener direccin
de red del nodo
padre
(AT MP)

setup()

Configuracin de
pines y puertos
serie

Guardar respuesta
como ID

Sondear a los
posibles routers
solicitando
informacin
(AT ND)

return
Obtener ID del
nodo
NO

Obtener ID del
nodo padre

loop()

Obtener datos de
sensores

Coincide
alguna
direccin?

SI
Establecer el NI de
esa direccin como
ID del padre

Leer voltaje de
salida del sensor
Obtener datos
de sensores
Convertir voltaje en
temperatura o luz
Rellenar el paquete
de datos con la info
obtenida

Guardar en la
variable
correspondiente

Envar datos al
coordinador
return

Recibir ACK y
retardo de 1
segundo

43

SI

return

Es una ID
correcta (0-9)?

NO

Inicio

#include <XBee.h>
#define COORDINADOR 0x4079c2a9
const
const
const
const
const

unsigned int PIN_TEMP = 0;


unsigned int PIN_LUZ = 1;
unsigned int LED = 13;
unsigned int BAUD_RATE = 9600;
float ALIMENTACION = 5.0;

//declaracin de constantes

union u_tag1 {
byte t[4];
float ftemp;
} temp;
union u_tag2 {
byte l[4];
float fluz;
} luz;
int i = 0;
//declaracin de variables
byte id = 0xFF;
byte id_padre = 0xFF;
byte id_padre_aux = 0xFF;
byte dir_padre[] = { 0xFF, 0xFE };
byte dir_aux[] = { 0xFF, 0xFE };
byte datos[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
XBee xbee = XBee();
XBeeAddress64 direccion = XBeeAddress64(0x0013a200, COORDINADOR);
ZBTxRequest tx = ZBTxRequest(direccion, datos, sizeof(datos));
ZBTxStatusResponse txStatus = ZBTxStatusResponse();
void setup(){
pinMode(LED, OUTPUT);
Serial.begin(BAUD_RATE);
xbee.setSerial(Serial);

//se inicializan puertos y pines

delay(1000);
obtener_ID();
buscar_padre();

//se obtiene la ID del nodo


//se obtiene la ID del nodo padre

}
void(* resetFunc) (void) = 0;

//funcin que resetea el Arduino

void loop(){
temp.ftemp = get_temp();
luz.fluz = get_luz();
datos[0] = id;
datos[1] = id_padre;

//se lee el dato de temperatura


//se lee el dato de luz
//se rellena el paquete de datos

for(i=0;i<4;i++){
datos[i+2] = temp.t[i];
}
for(i=0;i<4;i++){
datos[i+6] = luz.l[i];
}
xbee.send(tx);
parpadeo(LED, 1, 100);

//se enva la trama de datos

44

if (xbee.readPacket(500)) {

//se espera a recibir respuesta.

//si la respuesta es correcta el LED parpadea rpido; si no, lento.


if (xbee.getResponse().getApiId() == ZB_TX_STATUS_RESPONSE) {
xbee.getResponse().getZBTxStatusResponse(txStatus);
if (txStatus.getDeliveryStatus() == SUCCESS) {
parpadeo(LED, 5, 50);
} else {
parpadeo(LED, 3, 500);
resetFunc();
}
}
delay(1000);
}
}
const float get_temp(){
//funcin que lee el sensor de temperatura y devuelve el dato en grados
const int temp_voltaje = analogRead(PIN_TEMP);
const float t = temp_voltaje * ALIMENTACION / 1023;
return ((t * 1000 - 500) / 10);
}
const float get_luz(){
//funcin que lee el sensor de luz y devuelve el dato en lux
const int luz_voltaje = analogRead(PIN_LUZ);
const float l = luz_voltaje * ALIMENTACION / 1023;
return (l * (10000 / ALIMENTACION));
}
void parpadeo(int pin, int times, int wait) {
//funcin que controla el parpadeo del led
for (int i = 0; i < times; i++) {
digitalWrite(pin, HIGH);
delay(wait);
digitalWrite(pin, LOW);
if (i + 1 < times) {
delay(wait);
}
}
}
void obtener_ID(){
//funcin que obtiene el identificador del nodo
byte comando_NI[] = {'N','I'};
AtCommandRequest atRequest = AtCommandRequest(comando_NI);
AtCommandResponse atResponse = AtCommandResponse();
while(1){
xbee.send(atRequest);
if (xbee.readPacket(500)) {
if (xbee.getResponse().getApiId() == AT_COMMAND_RESPONSE) {
xbee.getResponse().getAtCommandResponse(atResponse);
if (atResponse.isOk()) {
if (atResponse.getValueLength() > 0) {
if(atResponse.getValue()[0]>='A' &&
atResponse.getValue()[0]<='Z'){
id = atResponse.getValue()[0];
break;

45

}
}
}
}
}
delay(100);
}
}
void buscar_padre(){
byte id_aux = '0';
id_padre = 0xFF;
dir_padre[0] = 0xFF;
dir_padre[1] = 0xFE;

//funcin que obtiene la identidad del nodo padre

while(dir_padre[0]==0xFF && dir_padre[1]==0xFE){


sendAtCommand_MP();
delay(100);
}
for (i=0; i<10; i++){
//se sondea a los posibles nodos padre mediante AT ND
dir_aux[0] = 0xFF;
dir_aux[1] = 0xFE;
delay(100);
sendAtCommand_ND(&id_aux);
if(word(dir_aux[0], dir_aux[1]) == word(dir_padre[0],dir_padre[1])){
id_padre = id_padre_aux;
break;
}
id_aux++;
}
delay(100);
if (id_padre < 0 || id_padre > 9) resetFunc();
}
void sendAtCommand_MP() {
//funcin que obtiene la direccin red del nodo padre
byte comando_MP[] = {'M','P'};
AtCommandRequest atRequest = AtCommandRequest(comando_MP);
AtCommandResponse atResponse = AtCommandResponse();
xbee.send(atRequest);
if (xbee.readPacket(500)) {
if (xbee.getResponse().getApiId() == AT_COMMAND_RESPONSE) {
xbee.getResponse().getAtCommandResponse(atResponse);
if (atResponse.isOk()) {
if (atResponse.getValueLength() > 0) {
dir_padre[0] = atResponse.getValue()[0];
dir_padre[1] = atResponse.getValue()[1];
}
}
}
}
}

46

void sendAtCommand_ND(byte *id) {


//funcin que solicita informacin al nodo cuya id. se pasa como argumento
byte comando_ND[] = {'N','D'};
AtCommandRequest atRequest = AtCommandRequest(comando_ND, id, 1);
AtCommandResponse atResponse = AtCommandResponse();
xbee.send(atRequest);
if (xbee.readPacket(500)) {
if (xbee.getResponse().getApiId() == AT_COMMAND_RESPONSE) {
xbee.getResponse().getAtCommandResponse(atResponse);
if (atResponse.isOk()) {
if (atResponse.getValueLength() > 0) {
dir_aux[0] = atResponse.getValue()[0];
dir_aux[1] = atResponse.getValue()[1];
id_padre_aux = atResponse.getValue()[10];
if(id_padre_aux<='9') id_padre_aux = id_padre_aux - '0';
}
}
}
}
}

A4.- MainActivity
Inicio

Declaracin e
inicializacin de
variables

Mostrar interfaz y
referenciar
elementos

Preparar dispositivo
Bluetooth

No

(Des)Conectar
Est conectado
Bluetooth?
SI

Encontrar
coordinador y
conectar

Botn pulsado?
Cambiar
vista
Actualizar

Desconectar
Bluetooth

Envar peticin
de datos

47

Cambiar vista

Encontrar
coordinador

Enviar peticin
de datos

Recorrer lista de
dispositivos
aprendidos

Enviar carcter A
al coordinador

Alguno es el
coordinador?

Mostrar mensaje en
campo de texto

SI

NO

Declarar variables
locales

Almacenar en buffer
datos recibidos

return

Extraer el mensaje e
identificar el nodo
correspondiente

Desconectar
Bluetooth

Cambiar vista

Mostrar el mensaje
en el campo de
texto adecuado

Cerrar streams de
entrada y salida

Cambiar referencias
a elementos de
pantalla

Dibujar el nodo
correspondiente
como encendido o
apagado

Cambiar al otro
layout

Redibujar los
enlaces en funcin
de la ruta seguida
por el mensaje

return coordinador

Informar de error

Conectar
Bluetooth

Crear UUID y socket

Conectar a
coordinador

Recibir datos

Desconectar del
coordinador

return
Abrir streams de
entrada y salida

Recibir datos

Resetear elementos
de pantalla

return

return

return

48

package es.upct.monitorredsensores;
import
import
import
import
import

java.io.IOException;
java.io.InputStream;
java.io.OutputStream;
java.util.Set;
java.util.UUID;

import
import
import
import
import
import
import
import
import
import
import
import
import

android.app.Activity;
android.bluetooth.BluetoothAdapter;
android.bluetooth.BluetoothDevice;
android.bluetooth.BluetoothSocket;
android.content.Intent;
android.content.pm.ActivityInfo;
android.os.Bundle;
android.os.Handler;
android.view.View;
android.widget.Button;
android.widget.ImageView;
android.widget.TextView;
android.widget.ViewFlipper;

public class MainActivity extends Activity


{
TextView[] myLabel = new TextView[12];
BluetoothAdapter mBluetoothAdapter;
BluetoothSocket mmSocket;
BluetoothDevice mmDevice;
OutputStream mmOutputStream;
InputStream mmInputStream;
Thread workerThread;
byte[] readBuffer;
int readBufferPosition;
int counter;
volatile boolean stopWorker;
Button openButton;
Button sendButton;
Button changeButton;
ImageView nodo_img[] = new ImageView[12];
ImageView ruta_img[] = new ImageView[5];
int nodo_draw[] = new int[24];
int i;
boolean[] activado = new boolean[12];
int[] padre = {0,0,0,0,0,0,0,0,0,0,0,0};
ViewFlipper vf;
boolean texto = false;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setContentView(R.layout.activity_main);
vf = (ViewFlipper) findViewById(R.id.vf);
//Botones
openButton = (Button)findViewById(R.id.open);
sendButton = (Button)findViewById(R.id.send);
changeButton = (Button)findViewById(R.id.change);

49

//Espacio reservado para las imgenes de los nodos


nodo_img[0] = (ImageView)findViewById(R.id.coordinador_img);
nodo_img[1] = (ImageView)findViewById(R.id.router1_img);
nodo_img[2] = (ImageView)findViewById(R.id.router2_img);
nodo_img[3] = (ImageView)findViewById(R.id.router3_img);
nodo_img[4] = (ImageView)findViewById(R.id.router4_img);
nodo_img[5] = (ImageView)findViewById(R.id.terminal5_img);
nodo_img[6] = (ImageView)findViewById(R.id.terminal6_img);
nodo_img[7] = (ImageView)findViewById(R.id.terminal7_img);
nodo_img[8] = (ImageView)findViewById(R.id.terminal8_img);
nodo_img[9] = (ImageView)findViewById(R.id.terminal9_img);
nodo_img[10] = (ImageView)findViewById(R.id.terminal10_img);
nodo_img[11] = (ImageView)findViewById(R.id.terminal11_img);
//Imgenes de los nodos
nodo_draw[0] = R.drawable.coordinador_off;
nodo_draw[1] = R.drawable.coordinador_on;
nodo_draw[2] = R.drawable.router1_off;
nodo_draw[3] = R.drawable.router1_on;
nodo_draw[4] = R.drawable.router2_off;
nodo_draw[5] = R.drawable.router2_on;
nodo_draw[6] = R.drawable.router3_off;
nodo_draw[7] = R.drawable.router3_on;
nodo_draw[8] = R.drawable.router4_off;
nodo_draw[9] = R.drawable.router4_on;
nodo_draw[10] = R.drawable.terminal5_off;
nodo_draw[11] = R.drawable.terminal5_on;
nodo_draw[12] = R.drawable.terminal6_off;
nodo_draw[13] = R.drawable.terminal6_on;
nodo_draw[14] = R.drawable.terminal7_off;
nodo_draw[15] = R.drawable.terminal7_on;
nodo_draw[16] = R.drawable.terminal8_off;
nodo_draw[17] = R.drawable.terminal8_on;
nodo_draw[18] = R.drawable.terminal9_off;
nodo_draw[19] = R.drawable.terminal9_on;
nodo_draw[20] = R.drawable.terminal10_off;
nodo_draw[21] = R.drawable.terminal10_on;
nodo_draw[22] = R.drawable.terminal11_off;
nodo_draw[23] = R.drawable.terminal11_on;
//Espacio reservado para representar los enlaces entre nodos
ruta_img[0] = (ImageView)findViewById(R.id.tr_img);
ruta_img[1] = (ImageView)findViewById(R.id.rc_img);
ruta_img[2] = (ImageView)findViewById(R.id.t8c_img);
ruta_img[3] = (ImageView)findViewById(R.id.cr_img);
ruta_img[4] = (ImageView)findViewById(R.id.rt_img);
//Campos de texto para mostrar los datos de los nodos
myLabel[0] = (TextView)findViewById(R.id.label0);
myLabel[1] = (TextView)findViewById(R.id.label1);
myLabel[2] = (TextView)findViewById(R.id.label2);
myLabel[3] = (TextView)findViewById(R.id.label3);
myLabel[4] = (TextView)findViewById(R.id.label4);
myLabel[5] = (TextView)findViewById(R.id.label5);
myLabel[6] = (TextView)findViewById(R.id.label6);
myLabel[7] = (TextView)findViewById(R.id.label7);
myLabel[8] = (TextView)findViewById(R.id.label8);
myLabel[9] = (TextView)findViewById(R.id.label9);
myLabel[10] = (TextView)findViewById(R.id.label10);
myLabel[11] = (TextView)findViewById(R.id.label11);

50

//Se activa el Bluetooth del dispositivo


mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if(mBluetoothAdapter == null)
{
myLabel[0].setText("Ningn dispositivo Bluetooth disponible");
}
if(!mBluetoothAdapter.isEnabled())
{
Intent enableBluetooth = new
Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBluetooth, 0);
}
//Botn Conectar
openButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
if(mmOutputStream==null){
try
{
findBT();
openBT();
}
catch (IOException ex) { }
if(mmOutputStream!=null){
myLabel[0].setText("Bluetooth conectado");
openButton.setText("Desconectar");
nodo_img[0].setImageResource(nodo_draw[1]);
}
else myLabel[0].setText("Bluetooth no conectado");
}
else{
try
{
closeBT();
}
catch (IOException ex) { }
}
}
});
//Botn Actualizar
sendButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
try
{
if(mmOutputStream!=null)
sendData();

51

else
myLabel[0].setText("No encontrado");
}
catch (IOException ex) { }
}
});
//Botn Desconectar
changeButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
cambiarVista();
}
});
}
public void onPause(){
//Mtodo que cierra la comunicacin Bluetooth al cerrar la aplicacin
super.onPause();
if(mmOutputStream!=null){
try
{
closeBT();
}
catch (IOException ex) { }
}
}
void findBT()
{

//Mtodo que busca el mdulo Bluetooth del nodo coordinador

Set<BluetoothDevice> pairedDevices =
mBluetoothAdapter.getBondedDevices();
if(pairedDevices.size() > 0)
{
for(BluetoothDevice device : pairedDevices)
{
if(device.getName().equals("COORDINADOR"))
{
mmDevice = device;
break;
}
}
}
}
void openBT() throws IOException
{
//Mtodo que conecta al Bluetooth del coordinador
UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);
mmSocket.connect();
mmOutputStream = mmSocket.getOutputStream();
mmInputStream = mmSocket.getInputStream();
beginListenForData();}

52

void beginListenForData()
{
//Mtodo que recibe los datos de la red y los representa grficamente
final Handler handler = new Handler();
final byte delimiter = 0x7f; //Caracter que marca el fin de la
transmisin
stopWorker = false;
readBufferPosition = 0;
readBuffer = new byte[1024];
workerThread = new Thread(new Runnable()
{
public void run()
{
while(!Thread.currentThread().isInterrupted() && !stopWorker)
{
try
{
int bytesAvailable = mmInputStream.available();
if(bytesAvailable > 0)
{
byte[] packetBytes = new byte[bytesAvailable];
mmInputStream.read(packetBytes);
for(int i=0;i<bytesAvailable;i++)
{
byte b = packetBytes[i];
if(b == delimiter)
{
byte[] encodedBytes = new byte[readBufferPosition];
System.arraycopy(readBuffer, 0, encodedBytes, 0, encodedBytes.length);
final int id = (int)encodedBytes[0];
final String data;
if(encodedBytes[1]=='P' && !texto){
//si son datos de un nodo y estamos en modo grfico, se extrae lo
importante
data = new String(encodedBytes, 11, encodedBytes.length-11, "USASCII");
padre[id] = (int)(encodedBytes[8] - '0');
}
else{
//si el nodo est desactivado, se guarda el mensaje "Desactivado".
data = new String(encodedBytes, 1, encodedBytes.length-1, "USASCII");
if(encodedBytes[1]!='P') padre[id] = 0;
}
readBufferPosition = 0;
handler.post(new Runnable()
{
public void run()
{
//Se actualiza el campo de texto con los datos recibidos
myLabel[id].setText(data);
//Se muestra el nodo encendido o apagado segn corresponda
if(id>0 && id<12){
if(data.charAt(0) == 'T'){
nodo_img[id].setImageResource(nodo_draw[(2*id)+1]);
activado[id]=true;

53

}
else{
nodo_img[id].setImageResource(nodo_draw[2*id]);
activado[id]=false;
}
//Se dibujan las rutas entre routers y coordinador
if(id==1 || id==2){
if(!activado[1] && !activado[2]){
ruta_img[1].setImageResource(R.drawable.rcr00);}
else if(activado[1] && !activado[2]){
ruta_img[1].setImageResource(R.drawable.rc10);}
else if(!activado[1] && activado[2]){
ruta_img[1].setImageResource(R.drawable.rc01);}
else if(activado[1] && activado[2]){
ruta_img[1].setImageResource(R.drawable.rc11);}
}
else if(id==3 || id==4){
if(!activado[3] && !activado[4]){
ruta_img[3].setImageResource(R.drawable.rcr00);}
else if(activado[3] && !activado[4]){
ruta_img[3].setImageResource(R.drawable.cr10);}
else if(!activado[3] && activado[4]){
ruta_img[3].setImageResource(R.drawable.cr01);}
else if(activado[3] && activado[4]){
ruta_img[3].setImageResource(R.drawable.cr11);}
}
//Se dibujan las rutas entre terminales y routers
else if(id==5 || id==6 || id==7){
if(padre[5]<1 || padre[5]>2){
if(padre[6]<1 || padre[6]>2){
if(padre[7]<1 || padre[7]>2)
ruta_img[0].setImageResource(R.drawable.trt000);
else if(padre[7]==1)
ruta_img[0].setImageResource(R.drawable.tr001);
else if(padre[7]==2)
ruta_img[0].setImageResource(R.drawable.tr002);
}
else if(padre[6]==1){
if (padre[7]<1 || padre[7]>2)
ruta_img[0].setImageResource(R.drawable.tr010);
else if(padre[7]==1)
ruta_img[0].setImageResource(R.drawable.tr011);
else if(padre[7]==2)
ruta_img[0].setImageResource(R.drawable.tr012);
}

54

else if(padre[6]==2){
if (padre[7]<1 || padre[7]>2)
ruta_img[0].setImageResource(R.drawable.tr020);
else if(padre[7]==1)
ruta_img[0].setImageResource(R.drawable.tr021);
else if(padre[7]==2)
ruta_img[0].setImageResource(R.drawable.tr022);
}
}
else if(padre[5]==1){
if(padre[6]<1 || padre[6]>2){
if(padre[7]<1 || padre[7]>2)
ruta_img[0].setImageResource(R.drawable.tr100);
else if(padre[7]==1)
ruta_img[0].setImageResource(R.drawable.tr101);
else if(padre[7]==2)
ruta_img[0].setImageResource(R.drawable.tr102);
}
else if(padre[6]==1){
if (padre[7]<1 || padre[7]>2)
ruta_img[0].setImageResource(R.drawable.tr110);
else if(padre[7]==1)
ruta_img[0].setImageResource(R.drawable.tr111);
else if(padre[7]==2)
ruta_img[0].setImageResource(R.drawable.tr112);
}
else if(padre[6]==2){
if (padre[7]<1 || padre[7]>2)
ruta_img[0].setImageResource(R.drawable.tr120);
else if(padre[7]==1)
ruta_img[0].setImageResource(R.drawable.tr121);
else if(padre[7]==2)
ruta_img[0].setImageResource(R.drawable.tr122);
}
}
else if(padre[5]==2){
if(padre[6]<1 || padre[6]>2){
if(padre[7]<1 || padre[7]>2)
ruta_img[0].setImageResource(R.drawable.tr200);
else if(padre[7]==1)
ruta_img[0].setImageResource(R.drawable.tr201);
else if(padre[7]==2)
ruta_img[0].setImageResource(R.drawable.tr202);
}
else if(padre[6]==1){
if (padre[7]<1 || padre[7]>2)
ruta_img[0].setImageResource(R.drawable.tr210);
else if(padre[7]==1)
ruta_img[0].setImageResource(R.drawable.tr211);
else if(padre[7]==2)
ruta_img[0].setImageResource(R.drawable.tr212);
}
else if(padre[6]==2){
if (padre[7]<1 || padre[7]>2)
ruta_img[0].setImageResource(R.drawable.tr220);
else if(padre[7]==1)
ruta_img[0].setImageResource(R.drawable.tr221);
else if(padre[7]==2)
ruta_img[0].setImageResource(R.drawable.tr222);

55

}
}
}
else if(id==8){
if(activado[8])
ruta_img[2].setImageResource(R.drawable.t8c1);
else
ruta_img[2].setImageResource(R.drawable.t8c0);
}
else if(id==9 || id==10 || id==11){
if(padre[9]<3 || padre[9]>4){
if(padre[10]<3 || padre[10]>4){
if(padre[11]<3 || padre[11]>4)
ruta_img[4].setImageResource(R.drawable.trt000);
else if(padre[11]==1)
ruta_img[4].setImageResource(R.drawable.rt001);
else if(padre[11]==2)
ruta_img[4].setImageResource(R.drawable.rt002);
}
else if(padre[10]==3){
if(padre[11]<3 || padre[11]>4)
ruta_img[4].setImageResource(R.drawable.rt010);
else if(padre[11]==1)
ruta_img[4].setImageResource(R.drawable.rt011);
else if(padre[11]==2)
ruta_img[4].setImageResource(R.drawable.rt012);
}
else if(padre[10]==4){
if(padre[11]<3 || padre[11]>4)
ruta_img[4].setImageResource(R.drawable.rt020);
else if(padre[11]==1)
ruta_img[4].setImageResource(R.drawable.rt021);
else if(padre[11]==2)
ruta_img[4].setImageResource(R.drawable.rt022);
}
}
else if(padre[9]==3){
if(padre[10]<3 || padre[10]>4){
if(padre[11]<3 || padre[11]>4)
ruta_img[4].setImageResource(R.drawable.rt100);
else if(padre[11]==1)
ruta_img[4].setImageResource(R.drawable.rt101);
else if(padre[11]==2)
ruta_img[4].setImageResource(R.drawable.rt102);
}
else if(padre[10]==3){
if(padre[11]<3 || padre[11]>4)
ruta_img[4].setImageResource(R.drawable.rt110);
else if(padre[11]==1)
ruta_img[4].setImageResource(R.drawable.rt111);
else if(padre[11]==2)
ruta_img[4].setImageResource(R.drawable.rt112);
}
else if(padre[10]==4){

56

if(padre[11]<3 || padre[11]>4)
ruta_img[4].setImageResource(R.drawable.rt120);
else if(padre[11]==1)
ruta_img[4].setImageResource(R.drawable.rt121);
else if(padre[11]==2)
ruta_img[4].setImageResource(R.drawable.rt122);
}
}
else if(padre[9]==4){
if(padre[10]<3 || padre[10]>4){
if(padre[11]<3 || padre[11]>4)
ruta_img[4].setImageResource(R.drawable.rt200);
else if(padre[11]==1)
ruta_img[4].setImageResource(R.drawable.rt201);
else if(padre[11]==2)
ruta_img[4].setImageResource(R.drawable.rt202);
}
else if(padre[10]==3){
if(padre[11]<3 || padre[11]>4)
ruta_img[4].setImageResource(R.drawable.rt210);
else if(padre[11]==1)
ruta_img[4].setImageResource(R.drawable.rt211);
else if(padre[11]==2)
ruta_img[4].setImageResource(R.drawable.rt212);
}
else if(padre[10]==4){
if(padre[11]<3 || padre[11]>4)
ruta_img[4].setImageResource(R.drawable.rt220);
else if(padre[11]==1)
ruta_img[4].setImageResource(R.drawable.rt221);
else if(padre[11]==2)
ruta_img[4].setImageResource(R.drawable.rt222);
}
}
}
}
}
});
}
else
{
readBuffer[readBufferPosition++] = b;
}}}}
catch (IOException ex)
{
stopWorker = true;
}}}
});
workerThread.start();
}

57

void sendData() throws IOException{


//Mtodo que enva por Bluetooth una peticin de actualizacin de datos
String msg = "A";
msg += "\n";
mmOutputStream.write(msg.getBytes());
myLabel[0].setText("Peticin enviada");
}
void closeBT() throws IOException{
//Mtodo que desconecta la comunicacin Bluetooth y limpia la pantalla
stopWorker = true;
mmOutputStream.close();
mmInputStream.close();
mmSocket.close();
mmOutputStream=null;
openButton.setText("Conectar");
ruta_img[0].setImageResource(R.drawable.trt000);
ruta_img[1].setImageResource(R.drawable.rcr00);
ruta_img[2].setImageResource(R.drawable.t8c0);
ruta_img[3].setImageResource(R.drawable.rcr00);
ruta_img[4].setImageResource(R.drawable.trt000);
for(i=0; i<12; i++){
myLabel[i].setText("");
nodo_img[i].setImageResource(nodo_draw[2*i]);
}
}
public void cambiarVista(){
//Mtodo que alterna entre las vistas Topologa y Texto
if(!texto){
changeButton.setText("Topologa");
texto=true;
myLabel[0] = (TextView)findViewById(R.id.txt0);
myLabel[1] = (TextView)findViewById(R.id.txt1);
myLabel[2] = (TextView)findViewById(R.id.txt2);
myLabel[3] = (TextView)findViewById(R.id.txt3);
myLabel[4] = (TextView)findViewById(R.id.txt4);
myLabel[5] = (TextView)findViewById(R.id.txt5);
myLabel[6] = (TextView)findViewById(R.id.txt6);
myLabel[7] = (TextView)findViewById(R.id.txt7);
myLabel[8] = (TextView)findViewById(R.id.txt8);
myLabel[9] = (TextView)findViewById(R.id.txt9);
myLabel[10] = (TextView)findViewById(R.id.txt10);
myLabel[11] = (TextView)findViewById(R.id.txt11);
for(i=0; i<12; i++){
myLabel[i].setText("");
}
}
else{
changeButton.setText("Texto");
texto=false;
ruta_img[0].setImageResource(R.drawable.trt000);
ruta_img[1].setImageResource(R.drawable.rcr00);

58

ruta_img[2].setImageResource(R.drawable.t8c0);
ruta_img[3].setImageResource(R.drawable.rcr00);
ruta_img[4].setImageResource(R.drawable.trt000);
myLabel[0] = (TextView)findViewById(R.id.label0);
myLabel[1] = (TextView)findViewById(R.id.label1);
myLabel[2] = (TextView)findViewById(R.id.label2);
myLabel[3] = (TextView)findViewById(R.id.label3);
myLabel[4] = (TextView)findViewById(R.id.label4);
myLabel[5] = (TextView)findViewById(R.id.label5);
myLabel[6] = (TextView)findViewById(R.id.label6);
myLabel[7] = (TextView)findViewById(R.id.label7);
myLabel[8] = (TextView)findViewById(R.id.label8);
myLabel[9] = (TextView)findViewById(R.id.label9);
myLabel[10] = (TextView)findViewById(R.id.label10);
myLabel[11] = (TextView)findViewById(R.id.label11);
for(i=0; i<12; i++){
myLabel[i].setText("");
if(i>0) nodo_img[i].setImageResource(nodo_draw[2*i]);
}
}
vf.showNext();
}}

A5.- AndroidManifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="es.upct.monitorredsensores"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="Monitor Red Sensores"
android:theme="@style/AppTheme" >
<activity
android:name="es.upct.monitorredsensores.MainActivity"
android:label="Monitor Red Sensores" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
</application>
</manifest>

59

Anexo B. Bibliografa y referencias


Bibliografa

Michael Margolis, Arduino Cookbook, OReilly, 2011


Maik Schmidt, Arduino: A Quick-Start Guide, Pragmatic Programmers, 2011
Massimo Banzi, Getting Started With Arduino, OReilly, 2011
Emily Gertz & Patrick Di Justo, Enviromental Monitoring With Arduino, OReilly,
2011
Robert Faludi, Building Wireless Sensor Networks, OReilly, 2011
http://www.arduino.cc
http://developer.android.com/index.html
http://stackoverflow.com

Referencias y Enlaces.

http://www.arduino.cc/es/

http://arduino.cc/es/Reference/HomePage

http://wiring.org.co/

http://www.processing.org/

http://arduino.cc/es/Main/ArduinoBoardSerialSingleSided3

http://arduino.cc/en/Main/Buy

http://arduino.cc/es/Main/Software

http://arduino.cc/es/Main/Hardware

http://arduino.cc/es/Main/Policy

10

http://arduino.cc/en/Main/ArduinoBoardUno

11

http://arduino.cc/en/Main/ArduinoBoardLeonardo

12

http://arduino.cc/en/Main/ArduinoBoardADK

13

http://arduino.cc/en/Main/ArduinoBoardPro

14

http://arduino.cc/en/Main/ArduinoBoardMini

15

http://arduino.cc/en/Main/ArduinoBoardNano

16

http://arduino.cc/en/Main/ArduinoBoardFio

17

http://www.atmel.com/Images/doc8161.pdf

18

http://arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf

19

http://www.digi.com/technology/rf-articles/wireless-zigbee

20

http://standards.ieee.org/getieee802/download/802.15.4-2011.pdf

21

http://standards.ieee.org/about/get/802/802.15.html

22

http://www.zigbee.org/

23

http://standards.ieee.org/about/get/802/802.11.html

60

24

http://www.wi-fi.org/

25

http://www.meshnetworks.com/

26

http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf

27

http://www.digi.com/xbee/

28

http://www.digi.com/es/

29

http://www.digi.com/support/kbase/kbaseresultdetl?id=2125

30

http://www.digi.com/support/productdetail?pid=3352&osvid=57&type=utilities

31

http://examples.digi.com/wp-content/uploads/2012/07/XBee_ZB_ZigBee_AT_Commands.pdf

32

http://www.bluetooth.com/Pages/Bluetooth-Home.aspx

33

http://www.ieee802.org/15/pub/TG1.html

34

https://www.bluetooth.org/en-us

35

http://sorin-schwartz.com/white_papers/fhvsds.pdf

36

http://www.android.com/

37

http://www.linux.org/

38

https://www.google.com/intl/es/about/

39

http://www.apache.org/licenses/LICENSE-2.0

40

http://developer.android.com/sdk/index.html

41

https://play.google.com/store

42

http://www.java.com/es/

43

http://www.eclipse.org/

44

http://developer.android.com/sdk/installing/studio.html

45

http://developer.android.com/training/basics/activity-lifecycle/index.html

46

http://developer.android.com/guide/topics/manifest/manifest-intro.html

47

http://developer.android.com/guide/topics/ui/declaring-layout.html

48

http://developer.android.com/reference/android/widget/ViewFlipper.html

49

http://developer.android.com/reference/android/widget/TextView.html

50

http://developer.android.com/reference/android/widget/ImageView.html

51

http://developer.android.com/reference/android/graphics/drawable/Drawable.html

52

http://developer.android.com/reference/android/widget/Button.html

53

http://arduino.cc/es/Main/ArduinoXbeeShield

54

http://www.analog.com/static/imported-files/data_sheets/TMP35_36_37.pdf

55

http://www.farnell.com/datasheets/1699948.pdf

56

http://academic.cleardefinition.com/wp-content/uploads/2012/08/AnnotatedDiagram.pdf

57

http://code.google.com/p/xbee-arduino/

58

http://code.google.com/u/[email protected]/

61

Figuras
Figura 1 - http://www.robotshop.com/blog/en/files/arduino-microcontrollers.jpg
Figura 2 - http://www.arduinodev.com/wp-content/uploads/2012/01/09950-01.jpg
Figura 3 - http://4.bp.blogspot.com/-nfoEZFX6OME/T3-u05afydI/AAAAAAAABXw/gYxNyeGM3Q/s1600/arduino2.png
Figura 4 - Captura de pantalla del entorno de desarrollo integrado (IDE) de Arduino
Figura 5 http://www.sena.com/products/industrial_zigbee/ZigBee_Technology_Overview_for_SENA_
Web_Page.V1.pdf#page=10
Figura 6 http://www.sena.com/products/industrial_zigbee/ZigBee_Technology_Overview_for_SENA_
Web_Page.V1.pdf#page=4
Figura 7 Robert Faludi, Building Wireless Sensor Networks, OReilly, 2011
Figura 8 - http://www.matlog.com/58-816-thickbox/modules-xbee-zb-serie-2.jpg
Figura 9 - Robert Faludi, Building Wireless Sensor Networks, OReilly, 2011
Figura 10 http://www.socialledge.com/sjsu/images/9/9e/CmpE146_F12_T2_XBeeAPIFrame.png
Figura 11 - Robert Faludi, Building Wireless Sensor Networks, OReilly, 2011
Figura 12 - http://ows.edb.utexas.edu/sites/default/files/users/nqamar/system-architecture.jpg
Figura 13 - http://developer.android.com/training/basics/activity-lifecycle/starting.html
Figura 14 Topologa representada mediante el programa Microsoft Visio
Figura 15 Esquema de divisor de tensin realizado con el programa ISIS
Figura 16 Fotografa del nodo coordinador de la red
Figura 17 Captura del software X-CTU
Figura 18 - ftp://ftp1.digi.com/support/documentation/90000991_B.pdf#page=48
Figura 19 - Paquete de datos representado mediante el programa Microsoft Visio
Figura 20 Captura de pantalla de la aplicacin de monitorizacin desarrollada

62

También podría gustarte