Sistema de control y gestión de invernadero automatizado con Arduino (Hortduino)
Abstract
Ingeniería Técnica en Informática de Gestión
Full text
UNIVERSIDAD DE VALLADOLID E.U. de Informática (Segovia) Ingeniería Técnica en Informática de Gestión SITEMA DE GESTIÓN Y CONTROL DE INVERNADERO AUTOMATIZADO CON ARDUINO (HORTDUINO) Alumno: Miguel Angel Hernanz Hernanz Tutor: Fernando Díaz Gómez
BLOQUE I MEMORIA DEL PFC
Miguel Angel Hernanz Hernanz Índice de contenido 1 INTRODUCCIÓN............................................................................................................................3 1.1 IDENTIFICACIÓN DEL PROYECTO FIN DE CARRERA.................................................3 1.2 ORGANIZACIÓN DE LA DOCUMENTACIÓN...................................................................3 2 DESCRIPCIÓN GENERAL DEL PROYECTO..............................................................................5 2.1 OBJETIVOS DEL PFC..........................................................................................................11 2.2 CUESTIONES METODOLÓGICAS....................................................................................11 2.3 TECNOLOGÍAS DE DESARROLLO..................................................................................13 3 DESCRIPCIÓN GENERAL DEL PRODUCTO............................................................................15 3.1 FRONT-END.........................................................................................................................16 3.1.1 Aplicación de Escritorio................................................................................................16 3.1.2 Aplicación para dispositivos Android............................................................................17 3.1.3 Página Web....................................................................................................................18 3.2 BACK-END...........................................................................................................................20 3.2.1 Arduino..........................................................................................................................20 3.2.2 Sensores.........................................................................................................................21 3.2.3 Servidor XAMPP...........................................................................................................22 4 ARQUITECTURA DEL PROYECTO...........................................................................................23 4.1 Arquitectura interna del subsistema Arduino.........................................................................24 4.1 Arquitectura interna del subsistema Arduino.........................................................................24 4.2 Arquitectura interna del subsistema Aplicación de Escritorio...............................................25 4.3 Arquitectura interna del subsistema Aplicación Android.......................................................27 4.4 Arquitectura interna del subsistema Servidor XAMPP..........................................................29 5 DESPLIEGUE DEL PRODUCTO.................................................................................................31 6 PLANIFICACIÓN Y PRESUPUESTO..........................................................................................32 6.1 ESTIMACIÓN DEL TAMAÑO............................................................................................34 6.1 ESTIMACIÓN DEL TAMAÑO............................................................................................34 6.2 ESTIMACIÓN DEL COSTE DE DESARROLLO...............................................................39 6.3 ESTIMACIÓN DE TAREAS.................................................................................................42 6.4 PRESUPUESTO DEL PROYECTO......................................................................................45 7 CUESTIONES DE DISEÑO E IMPLEMENTACIÓN RESEÑABLES.......................................47 8 CONCLUSIONES Y POSIBLES AMPLIACIONES....................................................................55 8.1 CONCLUSIONES.................................................................................................................55 8.2 POSIBLES AMPLIACIONES...............................................................................................56 9 BIBLIOGRAFÍA............................................................................................................................58 10 ANEXO.........................................................................................................................................59 1
Miguel Angel Hernanz Hernanz Índice de Ilustraciones Ilustración 1 - Vista general del sistema y sus componentes...............................................................5 Ilustración 2 – Modelo de negocio Arduino / Aplicación escritorio....................................................6 Ilustración 3 – Modelo de negocio Aplicación escritorio / Dispositivo Android................................7 Ilustración 4 – Modelo de negocio Aplicación escritorio / XAMPP Server........................................8 Ilustración 5 – Modelo de negocio XAMPP Server / Web..................................................................9 Ilustración 6 – Módulos y funciones del sistema...............................................................................14 Ilustración 7 – Arquitectura del Proyecto Hortduino.........................................................................22 Ilustración 8 – Arquitectura interna del subsistema Arduino.............................................................23 Ilustración 9 – Arquitectura interna de la Aplicación de Escritorio...................................................24 Ilustración 10 – Arquitectura interna de la Aplicación para Android................................................26 Ilustración 11 – Arquitectura interna del Servidor XAMPP..............................................................28 Ilustración 12 – Despliegue del sistema Hortduino...........................................................................30 Ilustración 13 – Planificación de las tareas según las iteraciones propuestas...................................42 Ilustración 14 – Diagrama de Gantt...................................................................................................43 Ilustración 15 – Vista esquemática del prototipo hardware inicial....................................................49 Índice de tablas Tabla 1 – Obtención de los Puntos de Función No Ajustados...........................................................32 Tabla 2 – Cálculo de los PFNA de la Aplicación de Escritorio.........................................................36 Tabla 3 – Cálculo de los PFNA de la Aplicación Android.................................................................36 Tabla 4 – Cálculo de los PFNA de la Página Web.............................................................................36 Tabla 5 – Asociación de factores de complejidad por aplicación......................................................37 Tabla 6 – Extracto de la tabla de Capers Jones..................................................................................38 Tabla 7 – Asignación de valor a los atributos relativos al esfuerzo...................................................39 Tabla 8 – Valor de las constantes según modo de desarrollo.............................................................40 Tabla 9 – Atributos asignados para cada subsistema y previsiones...................................................40 Tabla 10 – Costes de los recursos hardware......................................................................................44 Tabla 11 – Costes de los recursos software.......................................................................................45 Tabla 12 – Coste de los recursos humanos........................................................................................45 Tabla 13 – Estructura interna de la base de datos..............................................................................52 Índice de cuadros de código Cuadro 1 – Método de lectura del sensor ultrasónico........................................................................47 Cuadro 2 – Procedimiento de lectura de sensores en Arduino..........................................................48 Cuadro 3 – Método receive empleado en la aplicación de escritorio................................................51 2
Miguel Angel Hernanz Hernanz 1 INTRODUCCIÓN 1.1 IDENTIFICACIÓN DEL PROYECTO FIN DE CARRERA Título: Sistema de gestión y control de invernadero automatizado con Arduino (Hortduino). Autor: Miguel Angel Hernanz Hernanz Director: Fernando Díaz Gómez Departamento: Informática Área: Ciencias de la Computación e Inteligencia Artificial 1.2 ORGANIZACIÓN DE LA DOCUMENTACIÓN La documentación del proyecto Hortduino se estructura en tres secciones, siguiendo la recomendación de la guía de Proyectos Fin de Carrera. La primera sección se corresponde con la memoria del proyecto, la segunda se centra en la documentación técnica y la tercera contiene el manual de usuario. La primera sección de esta memoria incluye la introducción e identificación del Proyecto Fin de Carrera (PFC) y otros elementos como: La descripción general del PFC, incluyendo los objetivos propuestos y cuestiones metodológicas relativas al mismo, así como el marco tecnológico en el que se desarrolla. La descripción del software implementado en el PFC destacando las funcionalidades básicas del producto y la interacción con usuarios y otros sistemas. También se detalla la arquitectura y los métodos empleados en el desarrollo del proyecto. Planificación y presupuesto del proyecto mediante el uso del análisis por puntos de función y modelo constructivo de costes COCOMO (Constructive Cost Model) Cuestiones de implementación y diseño a destacar en el desarrollo del software y del prototipado del hardware. Conclusiones y posibles ampliaciones propuestas. Bibliografía, referencias web y recursos empleados en la realización de este proyecto. 3
Miguel Angel Hernanz Hernanz La segunda sección recoge la documentación técnica del proyecto y está enfocada desde el punto de vista del desarrollador. Contiene detalles relativos al análisis y diseño del sistema Hortduino divididos en varias secciones: Análisis de los requisitos del sistema, donde se estudian las funciones que ha de tener y los objetivos a cumplir por el sistema. Para ello se hace uso de una representación esquemática, empleando diagramas de casos de uso y listado de requisitos de forma tabulada. En la especificación funcional del sistema se agrupan los modelos de datos y procesos presentes en el sistema bajo diagramas de flujo de datos (DFDs) y diagramas de entidad-relación (E-R). El diseño del sistema agrupa los diseños de la base de datos y las diversas aplicaciones disponibles para el usuario, describiendo el flujo de trabajo y los procedimientos relativos a cada aplicación del sistema, así como el diseño de las diferentes interfaces de usuario disponibles La implementación del sistema ofrece ejemplos del código interno de algunos de los procedimientos implementados en las aplicaciones. Las pruebas del sistema recopila la fase de testeo de cada aplicación por separado y del sistema en su conjunto. Por último, la tercera sección contiene el manual de uso de las diferentes aplicaciones disponibles para el usuario, así como la guía de instalación y configuración del software necesario para su correcto funcionamiento. 4
Miguel Angel Hernanz Hernanz 2 DESCRIPCIÓN GENERAL DEL PROYECTO El proyecto Hortduino (derivado de las palabras Hortelano y Arduino) nace de la idea de aplicar las nuevas tecnologías y el concepto del Internet of Things (IoT) al mundo de la horticultura tradicional a pequeña escala. Los llamados huertos urbanos, como actividad ecológica y saludable, han experimentado un crecimiento notable en los últimos años dentro de los núcleos de población mas grandes. Los alimentos cultivados por este método son considerados generalmente de gran calidad y son numerosos los restaurantes de renombre que cultivan sus propias materias primas en huertos propios y especializados para ofrecer una experiencia única a sus clientes. El presente Proyecto Fin de Carrera está dedicado a desarrollar un sistema de monitorización y control de invernadero apoyado en la popular plataforma de hardware libre Arduino y en tecnologías web. Este sistema, compuesto por tres aplicaciones diferenciadas, recibirá datos acerca de las principales variables implicadas en el crecimiento de los cultivos, como pueden ser la humedad del suelo, humedad ambiental y temperatura, obtenidos mediante una red de sensores colocados en el invernadero. La información enviada desde los sensores será procesada por la aplicación de escritorio, la cual se encargará de su almacenamiento en una base de datos externa y de la automatización y control del riego y ventilación mediante sendos actuadores mecánicos. Esta aplicación de escritorio también será capaz de mostrar los datos recibidos por red desde los sensores en tiempo real y establecer las condiciones máximas y mínimas que se han de mantener para cada variable, alertando al usuario si se encuentran fuera de rango. El usuario podrá seleccionar el modo automático o manual para el control del riego y la ventilación, de modo que se active el sistema de riego si la humedad del suelo cae por debajo de un determinado valor mínimo aceptable o se accione el sistema de ventilación si la temperatura o humedad interior superan un límite máximo. Para apoyar a la aplicación de escritorio, la aplicación móvil será una réplica en versión reducida de las funcionalidades e interfaz de la aplicación de escritorio, contando con las ventajas de movilidad que ofrecen los dispositivos ANDROID. A diferencia de la aplicación de escritorio, la aplicación móvil no tendrá la funcionalidad de incorporar los datos recibidos a la base de datos externa, pero si podrá ajustar los rangos aceptables de las variables monitorizadas y activar/desactivar los controles de riego y ventilación. Por último, se dispondrá de una página web donde el usuario podrá visualizar gráficamente la información almacenada en la base de datos por la aplicación principal y tener acceso a estadísticas y gráficos históricos de la evolución de las condiciones ambientales del cultivo durante diferentes periodos temporales. En dicha página web se mostrará de forma dinámica la última lectura recibida en los 30 segundos anteriores, el estado de las alertas y sistemas de riego y ventilación, el consumo de agua para riego y el porcentaje restante disponible en el depósito. A continuación se muestra de forma gráfica el diseño del sistema en su conjunto y las relaciones entre las diferentes partes en una serie de ilustraciones, las cuales son resultantes de la fase inicial de diseño. 5
Miguel Angel Hernanz Hernanz 1 – Estudio previo En la primera fase se recaba información acerca de la plataforma hardware Arduino y sus herramientas de desarrollo, así como del entorno de programación propio. También se propone un posible inventario con los componentes requeridos para la base hardware del proyecto. 2 – Iteración I La primera iteración consiste básicamente en conectar y enviar información desde el hardware Arduino hacia el equipo donde se reciben los datos. Esta comunicación se produce mediante el uso de un puerto serial, ya que es la forma mas básica de envío de datos que posee la plataforma Arduino. 3 – Iteración II En esta iteración se trata fundamentalmente el diseño de la interfaz de usuario para la aplicación de escritorio y la visualización de datos en pantalla usando el lenguaje Processing. También incluye la implementación de la comunicación con Arduino mediante paquetes UDP vía Ethernet y el diseño del protocolo de órdenes entre la aplicación y el hardware. 4 – Iteración III En la tercera iteración se realiza el proceso de portar la aplicación de escritorio al entorno Android, aprovechando las facilidades que posee para ello el lenguaje Processing. Hay que tener en cuenta que la aplicación resultante no usa la API de Android salvo para métodos puntuales, por lo que la interfaz tiene que ser adaptada específicamente a la resolución del dispositivo. 5 – Iteración IV El diseño de la base de datos y la integración de la librería BezierSQLib para Processing ocupan la mayor parte de esta iteración. Además se despliega y configura el servidor XAMPP en el PC que hace las veces de servidor. 6 – Iteración V En la quinta iteración se realiza el diseño y maquetación de la página web del proyecto mediante el uso de los lenguajes HTML, PHP y CSS. Los applets o sketches mostrados en la web son implementados también dentro de esta iteración. 7 – Documentación Durante el desarrollo del proyecto, la mayor parte de los esquemas, notas y borradores obtenidos son incorporados a la documentación en las fases finales del proyecto. Los comentarios en el código son añadidos a la vez que se prueban las diferentes partes del software. 12
Miguel Angel Hernanz Hernanz 2.3 TECNOLOGÍAS DE DESARROLLO Para el desarrollo del proyecto Hortduino se han utilizado varias herramientas y tecnologías de uso público y gratuito, siguiendo la filosofía del software libre. El microcontrolador ATmega2560 instalado en el Arduino se ha programado usando el entorno de desarrollo propio de Arduino, el cual está escrito en Java y basado en otros lenguajes similares como Processing, el compilador avr-gcc y otros programas open-source. La aplicación de escritorio está programada en Processing, un lenguaje similar a Java y elegido por su buena capacidad de interacción con el hardware Arduino y por ofrecer la posibilidad de migrar las aplicaciones al entorno Android de manera sencilla pero con algunas limitaciones. La interfaz de usuario ha sido diseñada a partir de las herramientas que ofrece Processing para mostrar elementos gráficos en pantalla. En la construcción de la página web se ha utilizado HTML en su versión 5, PHP para la generación dinámica de contenido y Processing.js empleado en los applets o sketches encargados de representar gráficamente los datos. La maquetación y diseño visual de la web se separa del contenido de la misma a través del uso del archivo CSS (hoja de estilos en cascada) asociado a la página web. Los servicios correspondientes a estas herramientas y el motor SQL de la base de datos son ejecutados en el servidor, agrupados bajo el paquete de desarrollo web XAMPP. La comunicación entre el dispositivo Arduino, la aplicación de escritorio y la aplicación Android utiliza el protocolo UDP sobre Ethernet mediante la biblioteca UDP Hypermedia.net para Processing y EthernetUDP.h para Arduino. Se ha elegido este protocolo de red por su buen ajuste a las características técnicas de este proyecto, siendo las principales expuestas a continuación: ✔Intercambio rápido de información usando un solo paquete UDP, lo que evita el establecimiento de una conexión previa (handshaking) y la sobrecarga asociada al uso del protocolo TCP (20 bytes para el header en TCP, 8 bytes usados en el header UDP), con el correspondiente ahorro en el tráfico de datos enviados por la red. ✔La pérdida de un paquete en la red no supone una problema crítico, puesto que el envío de datos y órdenes se realiza de forma casi continua. En vez de solicitar el reenvío si se emplease el protocolo TCP, los datos recibidos en el servidor son reemplazados por la siguiente lectura con valores prácticamente idénticos a los del paquete perdido. En el caso del envío de órdenes se presenta una situación similar, ya que son enviadas al hardware de forma continuada. 13 Estructura interna de un paquete UDP
Miguel Angel Hernanz Hernanz En lo que respecta al soporte hardware del proyecto, se han empleado los siguientes elementos en la construcción del prototipo hardware: Placa Arduino MEGA 2560 R3 con microcontrolador ATMega integrado. Shield Ethernet compatible con Arduino. Sensor de temperatura y humedad DHT11. Sensor de temperatura National Semiconductor LM35. Sensor de humedad del suelo (de fabricación propia). Sensor de medición de distancia por ultrasonidos. Fotorresistencia mini. Relés, válvula de solenoide y ventilador 12V. Cableado, breadboard y resistencias eléctricas. Para el desarrollo y pruebas del software, han sido necesarios los recursos y herramientas enumerados a continuación: PC dedicado a tareas de programación y servidor. Smartphone Samsung Galaxy Mini II con Android 2.3 para el desarrollo de la aplicación Android y las correspondientes pruebas. Router TP-LINK TD-W8970 Wi-Fi para las comunicaciones por red. Editor de código Sublime Text 2 (versión de prueba). Entorno de desarrollo Arduino 1.0.5 Entorno de desarrollo Processing 2.1.1 Java JDK 1.7.0.45 y Android SDK Tools. Servicio de redireccionamiento DNS No-IP.org (gratuito). Fritzing 0.8.7 usado en el diseño del prototipo hardware. LibreOffice 4.2 para labores de documentación. Adobe Photoshop CS6 trial, para la creación de las ilustraciones que acompañan la documentación, diversas imágenes auxiliares en la página web y algunos elementos gráficos de las aplicaciones. 14
Miguel Angel Hernanz Hernanz 3 DESCRIPCIÓN GENERAL DEL PRODUCTO Desde el punto de vista relativo al usuario, el sistema resultante se divide en dos grandes partes diferenciadas: el back-end, que comprende todos los procesos no visibles por el usuario, y el front-end que es el encargado de la interacción con el usuario mediante las interfaces propias de cada herramienta. Ilustración 6 – Módulos y funciones del sistema En la anterior ilustración se puede apreciar la separación en los subsistemas back-end y front-end explicada anteriormente y los diferentes módulos que están relacionados entre sí mediante procesos de comunicación y/o intercambio de datos. Dado que el presente proyecto poseé varios subsistemas diferenciados, vamos a tratar cada una de ellos por separado a la hora de describir su funcionalidad y composición. 15
Miguel Angel Hernanz Hernanz 3.1 FRONT-END 3.1.1 Aplicación de Escritorio Descripción y funcionalidad Esta aplicación se podría considerar como el corazón del sistema, puesto que se encarga de las funciones principales, como son la comunicación directa con el hardware Arduino y la interacción con el usuario. Desde esta aplicación se controlan los rangos aceptables de las variables monitorizadas (humedad ambiental, humedad del suelo suelo, temperatura interior, temperatura exterior y nivel de agua para riego) así como el modo de funcionamiento de los sistemas de riego y ventilación (ON, OFF, AUTO). Estas condiciones y el estado actual de los sistemas de riego y ventilación son almacenados en sendos ficheros de texto dentro del servidor XAMPP cada vez que se modifican los parámetros en la aplicación para mantener la consistencia de configuraciones y estados entre los subsistemas front-end. La interfaz se ha tratado de simplificar todo lo posible para hacerla intuitiva y sencilla a la vez que funcional. En el manual de usuario se detalla mas en profundidad las distintas partes y controles disponibles en la interfaz de la aplicación. Interacción con otros sistemas La aplicación de escritorio se ocupa de enviar la información a almacenar en la base de datos del servidor XAMPP y, si existe una conexión activa desde el dispositivo Android, reenviar la información recibida en tiempo real hacia el dispositivo conectado y ejecutar las órdenes recibidas desde el mismo en el hardware Arduino. Limitaciones y dependencias Hay que destacar que es indispensable para el inicio de la aplicación de escritorio que los servicios del servidor web Apache y el motor MySQL del servidor XAMPP se encuentren en ejecución, ya que es necesario establecer la dirección IP donde se encuentra conectado el hardware Arduino para la interacción con el mismo. De otro modo, la aplicación fallará al arrancar. Al estar basada en Java, es necesario que se encuentre instalado el Entorno de Tiempo de Ejecución (Java Runtime Environment) de Java en el equipo donde se ejecute esta aplicación y que se disponga de conexión a la red Ethernet en la cual se encuentra conectado el hardware del sistema. Usuarios Esta aplicación está orientada a los administradores / encargados del invernadero, pues es la pieza básica del sistema Hortduino en lo referido al software. 16
Miguel Angel Hernanz Hernanz 3.1.2 Aplicación para dispositivos Android Descripción y funcionalidad La aplicación para dispositivos Android se concibió como un complemento a la aplicación de escritorio, dado el enorme número de dispositivos con dicho sistema operativo presentes en el mercado. En esta aplicación se replican las funcionalidades principales de la aplicación de escritorio en un formato compacto y adaptado a la entrada táctil. En la sección correspondiente a esta aplicación dentro del manual de usuario se aborda su uso y disposición de los elementos de la interfaz. La característica fundamental de esta aplicación se la otorga el uso del sistema operativo Android y los dispositivos en los que se puede ejecutar, y no es otra que la movilidad que confiere al usuario mientras hace uso de las funciones de la aplicación de forma remota. Interacción con otros sistemas En lo relativo a la comunicación con otros subsistemas, esta aplicación interactúa con la aplicación de escritorio, siendo esta última la encargada de ejecutar las órdenes enviadas desde la aplicación Android y de reenviar la información obtenida del hardware Arduino hacia el cliente Android. También interactúa con el servidor XAMPP para cargar la configuración que establece el usuario. Esta aplicación tiene la misma prioridad que la aplicación de escritorio en lo concerniente al cambio de parámetros de los rangos aceptables pertenecientes a las variables monitorizadas y al envío de órdenes a los sistemas de riego y ventilación. Limitaciones y dependencias A diferencia de la aplicación de escritorio, la aplicación para Android no poseé funcionalidad de comunicación con la base de datos usada para almacenar la información recibida y, al igual que la aplicación de escritorio, necesita que ésta última y los servicios del servidor XAMPP se encuentren en ejecución. Si no se cumplen estos requisitos, la aplicación para Android no se iniciará. Es necesario que el dispositivo Android disponga de la versión 2.3.6 o superior de dicho sistema operativo. Otra limitación a destacar está relacionada con el uso del lenguaje Processing para la conversión de la aplicación de escritorio hacia el entorno Android: al no usar el API de Android, la interfaz de la aplicación ha de adaptarse por medios propios a la resolución y densidad de la pantalla del dispositivo que la ejecute. Usuarios Al ser una aplicación prácticamente idéntica a la aplicación de escritorio en lo que respecta a funcionalidad y apariencia, este software está orientado al administrador / encargado del invernadero. 17
Miguel Angel Hernanz Hernanz 3.1.3 Página Web Descripción y funcionalidad El principal cometido de la página web es el de servir como herramienta de observación sobre la evolución en el tiempo de los parámetros relativos al invernadero controlados por el sistema Hortduino y actuar como plataforma para acceder a la información almacenada en la base de datos. De esta manera, el usuario puede visualizar la información de manera gráfica y valorar el desarrollo de los cultivos en función de las condiciones establecidas en el sistema. Al ser una página web creada de forma dinámica mediante el lenguaje PHP, se ofrece al usuario la posibilidad de comprobar desde cualquier lugar donde se disponga de un navegador web y conexión a Internet la información siguiente: ✔Estado actual de los sistemas de riego y ventilación. ✔Estado actual de las condiciones de los parámetros monitorizados, incluyendo posibles alertas. ✔Nivel de agua disponible en el depósito de riego, su duración aproximada con el consumo actual y el total consumido hasta ese momento. ✔Temperaturas máximas, medias y mínimas registradas. ✔El comportamiento de las variables y la actividad de los sistemas de riego y ventilación a lo largo de un intervalo de tiempo seleccionado por el usuario. Mediante el uso del lenguaje de hojas de estilo en cascada (CSS) y las reglas definidas con éste en el archivo estilo.css se separa el contenido de la página del aspecto visual, facilitando así la posible modificación de los elementos visuales que componen la página sin alterar la funcionalidad o el contenido de la misma. Interacción con otros sistemas Se puede considerar a la página web como la parte del subsistema Servidor-XAMPP que es visible por el usuario y se comunica dentro de ese subsistema con los servicios MySQL y servidor web. Dentro del directorio de la página web en el servidor se alojan tres ficheros de texto plano utilizados para almacenar configuraciones y estados. Estos ficheros son: Config.txt : Contiene los valores mínimos y máximos aceptables para cada variable monitorizada, separados por punto y coma. Usado por la aplicación de escritorio. Condiciones.txt : Almacena el estado de las condiciones del invernadero en formato numérico usando separación por comas mediante el código 0 si el valor actual de dicha condición se encuentra dentro del rango fijado por el usuario, -1 si el valor actual es inferior al mínimo establecido y 1 si se supera el máximo permitido para esa condición. Se usa para indicar el estado de las condiciones en la página web. IPServer.txt : Este archivo es utilizado para actualizar la dirección IP empleada en la inicialización de la aplicación Android. Se modifica su contenido mediante la invocación a un script que la recupera mediante funciones PHP. 18
Miguel Angel Hernanz Hernanz Limitaciones y dependencias Para que la página web pueda ser mostrada en el navegador del usuario, el servidor web Apache y su servicio asociado deben estar en ejecución en el host encargado de actuar como servidor. Igualmente, es crítico que se encuentre en ejecución el motor MySQL para poder realizar consultas a la base de datos y mostrar los datos obtenidos en los sketches dispuestos en la web. Se necesita un navegador que soporte HTML 5 para su correcta visualización. Usuarios La página web del proyecto Hortduino está dirigida a cualquier usuario que quiera consultar los datos disponibles contemplados en la sección Descripción y Funcionalidad descrita mas arriba. Para ello, el usuario ha de conocer la dirección de la página web, disponer de un navegador y conexión a Internet o bien a la red Ethernet donde se encuentre el servidor XAMPP. 19
Miguel Angel Hernanz Hernanz 3.2 BACK-END 3.2.1 Arduino Descripción y funcionalidad El dispositivo Arduino es una plataforma de hardware libre asequible y ampliamente utilizada para toda clase de proyectos que tengan que ver con la presencia de sensores y actuadores mecánicos, así como proyectos de robótica y domótica. En nuestro caso, es el encargado de recibir y transformar la información obtenida en la lectura de los sensores y trasladarla a la aplicación de escritorio por medio de un shield Ethernet, proporcionando la conectividad necesaria con el router. Otra función importante que desarrolla este hardware es la de activar y desactivar los actuadores correspondientes a los sistemas de riego y ventilación en base a las órdenes recibidas desde la aplicación de escritorio. El proyecto Hortduino usa un Arduino modelo Mega 2560, dotado de un microcontrolador ATmega 2560. Las características físicas de este hardware son explicadas en mayor detalle dentro del apéndice correspondiente, siendo las mas destacadas: Memoria flash : 256KB (8 KB usados por el bootloader) Memoria SRAM : 8 KB Pines de entrada analógicos : 16 Pines de entrada/salida digitales: 54 Velocidad de reloj : 16 Mhz Voltaje operativo : 5 V Interacción con otros sistemas Los sistemas que interaccionan con el dispositivo Arduino son el array de sensores, de donde se toman las lecturas ambientales, y la aplicación de escritorio, desde la que se reciben las órdenes a ejecutar en los sistemas de riego y ventilación, y hacia la que se envía la información de las lecturas mediante paquetes de datos usando el protocolo de red UDP. Limitaciones y dependencias La programación del microcontrolador se efectúa empleando el entorno de desarrollo propio de Arduino para almacenar en la memoria flash del dispositivo el programa a ejecutar, el cual es transferido al dispositivo por medio de un cable USB. Dado que la memoria SRAM disponible es limitada, se debe optimizar el código para que se nunca se exceda el tamaño máximo de la memoria usada en tiempo de ejecución. Si esto sucediese, el dispositivo mostraría un ciclo de reinicialización continuo por la falta de memoria disponible para ejecutar las siguientes instrucciones. 20
Miguel Angel Hernanz Hernanz El subsistema compuesto por el dispositivo Arduino, los sensores y actuadores mecánicos depende de la aplicación de escritorio para conocer cuándo se debe regular el comportamiento de los sistemas de riego y ventilación o hay indicios de un posible fallo en algún sensor. El uso de la librería Ethernet.udp.h impone un tamaño máximo de datos por paquete UDP de 24 bytes que hay tomar en consideración a la hora de construir el datagrama para no exceder este tamaño. Usuarios Puede ser de utilidad al administrador del invernadero conocer cómo está trabajando internamente el dispositivo Arduino en lo que respecta a los datos enviados y a las órdenes recibidas. Esto se consigue mediante el uso de un cliente que soporte el protocolo de comunicación de puerto serie local (como la aplicación PuTTY) mediante el cual se puede acceder a los datos que maneja Arduino en modo debug, conectando el dispositivo a un PC a través de un cable USB. 3.2.2 Sensores Descripción y funcionalidad El array de sensores es un conjunto de actuadores mecánicos y diversos sensores electrónicos capaces de medir diferentes variables. Cada sensor dispuesto tiene la capacidad de transmitir la medición efectuada de diferentes maneras en función del tipo de sensor. La información técnica referente a cada sensor se incluye en el apéndice correspondiente. A continuación aparecen los diferentes sensores usados en el proyecto: •National Semiconductor LM35 (temperatura exterior). •Grove Temperature and Humidity Sensor (temperatura y humedad interior). •Fotorresistencia CdS (intensidad lumínica). •Seeed Ultrasonic Sensor (nivel de agua en el depósito de riego). •Sensor de humedad del suelo (basado en la conductividad del yeso húmedo). Interacción con otros sistemas El subsistema de sensores y actuadores solamente se comunica con el dispositivo Arduino mediante los cables conectados a las diferentes entradas y salidas de las que dispone el hardware. Limitaciones y dependencias La principal limitación de este subsistema es la precisión que ofrece cada sensor en la medida de la variable de la que se ocupa. En general, los rangos de medida de los sensores son adecuados para el modelo de temperatura y humedad que cabría esperar en el entorno de un invernadero, salvo en el caso de la fotorresistencia empleada en la medición de la luminosidad, la cual posee una precisión baja en sus lecturas (debido a su reducido coste) que no la hace apta si se necesita una precisión aceptable en la medición de la intensidad lumínica. 21
Miguel Angel Hernanz Hernanz Mostrar Menú : Es el conjunto de procedimientos que generan un menú en pantalla con varias opciones para el usuario. Mostrar Nivel Depósito : Se encarga de dibujar una representación del depósito de agua para riego y su porcentaje de llenado actual en la pantalla del dispositivo. Mostrar Inicio : Se ocupa de mostrar la pantalla inicial de la aplicación con información relativa a los datos recibidos en tiempo real, el estado nominal de las condiciones del invernadero, las posibles alertas y el estado y funcionamiento de los sistemas de riego y ventilación, todo ello de forma gráfica y compacta en la pantalla del dispositivo. Se apoya en la clase Botón implementada en la aplicación para mostrar los diferentes botones accesibles por el usuario, los cuales son capaces de cambiar el modo de funcionamiento del riego y la ventilación del invernadero y acceder al menú de la aplicación. Mostrar selectores : Este conjunto de procedimientos dibuja los sliders sobre los cuales el usuario puede fijar el valor máximo y mínimo aceptable para cada variable monitorizada por el sistema Hortduino. Para ello hace uso de la clase propia Selector que se ha implementado específicamente con este fin. Comprobar Estados : Comprueba el estado del sistema de riego y ventilación del invernadero, actuando de acuerdo al modo de funcionamiento establecido por el usuario. También muestra la actividad de dichos sistemas de forma visual. Comprobar Condiciones : Son los procedimientos encargados de alertar al usuario si alguna de las condiciones establecidas sobre los parámetros supervisados por el sistema Hortduino se encuentra fuera de los valores permisibles fijados por el usuario. Conexión Red : Es el procedimiento que se ocupa de alertar si la conexión con el servidor XAMPP y la aplicación de escritorio no se ha podido iniciar o ha sufrido una interrupción. Enviar Ordenes : Se encarga de enviar las nuevas órdenes por red a la aplicación de escritorio si se detecta un cambio en las condiciones establecidas por parte del usuario. Hay que destacar que las órdenes enviadas desde esta aplicación tienen prioridad sobre las relativas a la aplicación de escritorio. Esto se hace para evitar órdenes contradictorias que afectarían al normal funcionamiento del sistema. 28
Miguel Angel Hernanz Hernanz 4.4 Arquitectura interna del subsistema Servidor XAMPP Ilustración 11 – Arquitectura interna del Servidor XAMPP El servidor XAMPP es un conjunto de servicios y herramientas formado por el sistema de gestión de bases de datos MySQL, el servidor web Apache y los intérpretes para lenguajes PHP y Perl, todo ello bajo un mismo paquete que se instala en el PC destinado al rol de servidor. En el caso del proyecto Hortduino, es el encargado de mantener la base de datos y los servicios que son necesarios para que otros subsistemas puedan inicializarse y operar correctamente, hospedar el contenido de la página web y almacenar los archivos de configuración que mantienen la coherencia interna entre los diferentes subsistemas. Servicio MySQL : Este módulo está compuesto por los servicios necesarios para operar con la base de datos y se encarga de tareas como la realización de consultas o el soporte de conexiones de usuarios a la base de datos. Servidor HTTP : Se trata del servicio encargado de responder a las peticiones HTTP efectuadas desde el navegador web del usuario solicitando el envío del contenido y estructura de la página web. Intérprete PHP : Su función es la de traducir y ejecutar en el servidor el código PHP de la página web a fin de generar dinámicamente un documento HTML, con el resultado del procesamiento del archivo PHP, que será enviado por el servidor HTTP al navegador web del usuario. Contenido Web : Aquí se agrupan todos los recursos requeridos para mostrar la página web y su estructura en el navegador del usuario, como pueden ser imágenes, archivos .php correspondientes a cada sección de la web, applets y el archivo .css de estilos visuales de la página. 29
Miguel Angel Hernanz Hernanz Acciones PHP : Es el conjunto de archivos usados por diferentes procedimientos para realizar acciones remotamente en el servidor mediante el empleo de los scripts contenidos en ellos. A continuación se listan dichos archivos y sus funciones: AccionesConfig.php : Es usado por la aplicación de escritorio para guardar y cargar la configuración de las variables supervisadas almacenadas en el archivo de texto plano config.txt. También actualiza el estado de las condiciones en el archivo de texto condiciones.txt. Consultar.php : Este script genera una consulta SQL a la base de datos del servidor y devuelve el resultado al procedimiento que la solicitó. Se emplea en varios sketches de la página web como medio de acceso al contenido de la base de datos. GetIP.php : Devuelve la actual dirección IP del servidor. Es necesario para la inicialización de las aplicaciones Escritorio y Android. Archivos de configuración : Comprende los archivos de texto plano vistos anteriormente en la sección 3.1.3 y su apartado Interacción con otros sistemas. El paquete XAMPP incluye en su instalación un panel de control desde el cual se administra y configura el funcionamiento de los diversos servicios que integra. Esta cuestión se aborda en la sección correspondiente del manual de usuario para mayor claridad. 30
Miguel Angel Hernanz Hernanz 5 DESPLIEGUE DEL PRODUCTO El sistema de control de invernaderos Hortduino está pensado para su instalación en un invernadero de reducidas dimensiones. Dadas las funciones de Hortduino, es necesaria una infraestructura de red que soporte la comunicación entre los diferentes subsistemas que componen este proyecto, ya sea mediante el uso de Internet o bien empleando una red Ethernet de área local, para el correcto funcionamiento del sistema. Ilustración 12 – Despliegue del sistema Hortduino Como se puede apreciar en la ilustración anterior, los subsistemas que componen Hortduino se pueden encontrar en la misma red o en diferentes redes, siempre que se puedan intercomunicar entre sí. Por cuestiones prácticas, en el desarrollo de este proyecto se ha optado por emplear un mismo equipo para albergar los subsistemas Aplicación de Escritorio y Servidor XAMPP. El dispositivo Arduino también se conecta en red local para realizar las pruebas pertinentes. Los sensores encargados de medir las condiciones ambientales son instalados en lugares estratégicos del invernadero y su entorno de acuerdo a su cometido específico, como se explica en el apartado 3.2.2. 31
Miguel Angel Hernanz Hernanz 6 PLANIFICACIÓN Y PRESUPUESTO En la fase de planificación del proyecto, resulta de gran utilidad conocer el tamaño aproximado en líneas de código que ocupará el sistema, ya que dicho tamaño es un factor es clave a la hora de estimar el tiempo y el coste total del proyecto. Para ello se empleará una metodología que estima este parámetro en función de los elementos lógicos que se utilizan en el sistema y de valoraciones subjetivas de su complejidad. Esta metodología se conoce por Estimación por Puntos de Función (Function Point Analysis) y fue definida por primera vez en el año 1979 por Allan J. Albrecht en el simposio de IBM sobre desarrollo de aplicaciones. La métrica del punto función asigna una cantidad de puntos al software según la complejidad de los datos que maneja y los procesos que son realizados sobre esos datos, todo ello desde el punto de vista de la funcionalidad ofrecida al usuario. Los parámetros sobre los cuales se trabaja son: •Número de entradas de usuario : Se cuenta cada entrada de usuario que proporciona diferentes datos empleados por la aplicación, como por ejemplo la alteración de los rangos aceptables de las variables controladas. •Número de salidas de usuario : Son las salidas que proporcionan al usuario información sobre la aplicación en forma de pantallas, mensajes, informes, etc. Los elementos de datos particulares dentro de un informe no se cuentan de forma separada. •Número de peticiones de usuario : Las peticiones del usuario son aquellas entradas que producen la generación de respuestas automáticas del software en forma de salida interactiva. •Número de archivos : Cada uno de los archivos lógicos que forman parte del sistema, englobando en este concepto a las bases de datos. •Número de interfaces externas : Se consideran todas las interfaces usables por el sistema que se utilizan para transmitir información a otro sistema. Una vez que se han recopilado todos los elementos referentes a los puntos anteriores, se asocia a cada uno un factor de complejidad (alta, media o baja) en función del criterio adoptado. Este criterio es un tanto subjetivo, ya que está abierto a interpretaciones personales sobre lo que se considera complejo o sencillo. A continuación, se obtienen los Puntos de Función No Ajustados como la suma resultante de rellenar la Tabla 1 que asocia cada parámetro con su factor de complejidad. Para obtener los Puntos de Función ajustados se emplea la siguiente relación: PF =PFNA∗(0,65+0,01∗∑FCi) siendo FCi los valores de ajuste de complejidad asignados a los Factores de Valor de Ajuste Técnico (FVAT) en una escala de significación de 0 a 5, representando 0 la ausencia de influencia y 5 una influencia muy fuerte. 32
Miguel Angel Hernanz Hernanz Cálculo de los Puntos de Función No Ajustados Factor de ponderación Parámetros de medición Simple Medio Complejo Suma Número de entradas de usuario x3 x4 x6 Número de salidas de usuario x4 x5 x7 Número de peticiones de usuario x3 x5 x6 Número de archivos x7 x10 x15 Número de interfaces externas x5 x7 x10 Cuenta Total PFNA Tabla 1 – Obtención de los Puntos de Función No Ajustados Factores de Valor de Ajuste Técnico (FVAT) 1. Comunicación de datos 2. Proceso distribuido de datos 3. Rendimiento 4. Configuración 5. Volumen de transacciones 6. Entrada de datos en línea 7. Diseño para la eficiencia del usuario final 8. Actualización de datos en línea 9. Complejidad del procesamiento 10. Reusabilidad del código 11. Facilidad de instalación 12. Facilidad de operación 13. Instalación múltiple 14. Facilidad de cambio 15. Requerimientos de otras aplicaciones 33
Miguel Angel Hernanz Hernanz 6.1 ESTIMACIÓN DEL TAMAÑO Una vez se ha explicado el método a seguir para estimar los Puntos de Función, se aplicará paso a paso lo visto anteriormente a este proyecto. Aunque el sistema Hortduino se compone de varios subsistemas diferenciados, se considera el conjunto total de todos ellos para hacer el cálculo final de los Puntos de Función. Aplicación de Escritorio ◦Entradas ▪Dirección IP y puerto para conexión con Arduino (en caso de error) (baja) ◦Salidas ▪Pantalla de información principal, la cual incluye información de los sensores en tiempo real, gráficos interactivos y tiempo de su última actualización, nivel de agua en depósito, estado de los sistemas de riego/ventilación, mensajes y alertas del estado de las variables (alta) ▪Pantalla de configuración de red para conexión con Arduino (baja) ◦Peticiones de usuario ▪Activar/desactivar sistemas de riego y ventilación (baja) ▪Modificar los rangos aceptables de las variables (baja) ▪Información sobre la posición del puntero del ratón en las gráficas (baja) ▪Cambiar el intervalo de actualización de las gráficas interactivas (baja) ◦Archivos ▪Base de datos de lecturas de los sensores (media) ▪Archivo de configuración de rangos de las variables y estados (baja) ▪Archivo de estado actual de las condiciones (baja) ◦Interfaces externas ▪Comunicación por red mediante protocolo UDP (baja) ▪Comunicación con servicio MySQL remoto (baja) 34
Miguel Angel Hernanz Hernanz Aplicación Android ◦Entradas ▪Selección de menú de navegación (baja) ◦Salidas ▪Pantalla de información principal, la cual incluye información de los sensores en tiempo real, estado de los sistemas de riego/ventilación, mensajes y alertas del estado de las variables (alta) ▪Nivel de agua en depósito (baja) ▪Información de conexión (baja) ▪Menú de navegación (baja) ◦Peticiones de usuario ▪Activar/desactivar sistemas de riego y ventilación (media) ▪Modificar los rangos aceptables de las variables (alta) ▪Mostrar menú de opciones (baja) ◦Archivos ▪Archivo de configuración IP (baja) ◦Interfaces externas ▪Comunicación por red mediante protocolo UDP (baja) 35
Miguel Angel Hernanz Hernanz Página Web ◦Entradas ▪Selección de intervalo en Últimas Lecturas (baja) ▪Selección de intervalo y variables en Estadísticas (baja) ▪Selección de intervalo en Temperaturas (baja) ◦Salidas ▪Sección Últimas Lecturas (media) ▪Sección Estadísticas (media) ▪Sección Estado Actual (media) ▪Sección Consumo de Agua (baja) ▪Sección Temperaturas (baja) ▪Sección Sobre Hortduino (baja) ◦Peticiones de usuario ▪Cambiar la página visualizada (baja) ▪Selección de las variables a mostrar en Estadísticas (media) ◦Archivos ▪Archivo de estado actual de condiciones (baja) ▪Archivo de hoja de estilos en cascada CSS (baja) ◦Interfaces externas ▪Comunicación con servicio MySQL remoto (baja) Una vez determinados los parámetros y su complejidad, se calculan los Puntos de Función No Ajustados empleando la Tabla 1 para cada subsistema: 36
Miguel Angel Hernanz Hernanz Aplicación de Escritorio Factor de ponderación Parámetros de medición Simple Medio Complejo Suma Número de entradas 1 x3 0 x4 0 x6 3 Número de salidas 1 x4 0 x5 1 x7 11 Número de peticiones 4 x3 0 x4 0 x6 12 Número de archivos 2 x7 1 x10 0 x15 24 Número de interfaces externas 2 x5 0 x7 0 x10 10 Cuenta Total PFNA 60 Tabla 2 – Cálculo de los PFNA de la Aplicación de Escritorio Aplicación Android Factor de ponderación Parámetros de medición Simple Medio Complejo Suma Número de entradas 1 x3 0 x4 0 x6 3 Número de salidas 3 x4 0 x5 1 x7 19 Número de peticiones 1 x3 1 x4 1 x6 13 Número de archivos 1 x7 0 x10 0 x15 7 Número de interfaces externas 1 x5 0 x7 0 x10 5 Cuenta Total PFNA 47 Tabla 3 – Cálculo de los PFNA de la Aplicación Android Página Web Factor de ponderación Parámetros de medición Simple Medio Complejo Suma Número de entradas 3 x3 0 x4 0 x6 9 Número de salidas 3 x4 3 x5 0 x7 27 Número de peticiones 1 x3 1 x4 0 x6 7 Número de archivos 2 x7 0 x10 0 x15 14 Número de interfaces externas 1 x5 0 x7 0 x10 5 Cuenta Total PFNA 62 Tabla 4 - Cálculo de los PFNA de la Página Web 37
Miguel Angel Hernanz Hernanz Ilustración 14 – Diagrama de Gantt En el diagrama de Gantt de la ilustración 14 se observa el desarrollo en el tiempo de las diferentes tareas, con la numeración correspondiente a las indicadas en la ilustración 13. Las flechas indican que la tarea a la que apuntan necesita como requisito previo a su inicio la finalización de la tarea de la cual procede la flecha. 44
Miguel Angel Hernanz Hernanz 6.4 PRESUPUESTO DEL PROYECTO Cada recurso disponible lleva asociado un coste y un grado de uso que refleja su utilización en la consecución de las tareas del proyecto en las que es empleado, por lo que el coste total del proyecto será la suma de los valores porcentuales de la utilización sobre el coste de cada recurso. En la siguientes tablas se recopilan todos los recursos utilizados en la realización de este proyecto junto a su coste de adquisición y porcentaje de utilización. También se indican los recursos humanos con el coste del personal por hora de trabajo. Recurso Coste (€) Utilización (%) Coste asociado al proyecto (€) Ordenador Personal 800,00 60 480 Smartphone Samsung Galaxy Mini II 110,00 25 27,5 Router TP-LINK TD-W8970 70,00 50 35 Placa Arduino Mega 2560 49,61 100 49,61 Shield Ethernet para Arduino 35,09 100 35,09 Sensor de temperatura y humedad DHT11 5,62 100 5,62 Sensor de temperatura National Semiconductor LM35 1,10 100 1,1 Sensor de distancia por ultrasonidos Seed U-S 18,15 100 18,15 Sensor de humedad del suelo 0,00 100 0 Fotorresistencia GL5528 LDR 1,45 100 1,45 Válvula de solenoide 12V 9,07 80 7,26 Ventilador 12V 3,00 80 2,4 Relés Grove-Twig 5V 7,26 80 5,81 Breadboard mini para prototipado 12,10 100 12,1 Set de jump cables breadboard 6,05 100 6,05 Resistencias eléctricas 0,40 100 0,4 Fuente de alimentación 9V 6,00 100 6 TOTAL 693,53 Tabla 10 – Costes de los recursos hardware 45
Miguel Angel Hernanz Hernanz Recurso Coste (€) Utilización (%) Coste asociado al proyecto (€) MS Windows 7 (incluido en el coste del PC) 0,00 100 0 Sublime Text 2 (trial version) 0,00 100 0 Processing 2.11 IDE 0,00 100 0 Arduino 1.0.5 IDE 0,00 100 0 Adobe Photoshop CS6 (trial version) 0,00 100 0 LibreOffice 4.2 0,00 100 0 GanttProject 2.7b 0,00 100 0 Fritzing 0.8.7b 0,00 40 0 XAMPP 1.8.3 0,00 100 0 Java JDK 1.7.0.45 0,00 80 0 yEd Graph Editor 3.12.2 0,00 100 0 Android SDK 0,00 80 0 TOTAL 0 € Tabla 11 – Costes de los recursos software Recurso Coste por hora de trabajo Desarrollador / Analista / Encargado de pruebas 12 € Documentador 5 € Tabla 12 – Coste de los recursos humanos Según lo indicado en la tabla 11, los costes totales asociados al software empleado en este proyecto se reducen a 0 €. Esto es debido a la utilización de programas y herramientas de acceso público gratuito o en su versión de prueba, lo cual reduce los costos empleados en licencias. Con toda la información expuesta anteriormente, el coste total del proyecto resulta de la suma del coste de desarrollo indicado en la ilustración 13 y el coste de los recursos físicos empleados durante su realización, recogido en la suma total de la tabla 10: 3359,05 € + 693,53 € = 4052,58 € 46
Miguel Angel Hernanz Hernanz 7 CUESTIONES DE DISEÑO E IMPLEMENTACIÓN RESEÑABLES COMPONENTES DEL PROTOTIPO HARDWARE El mercado de sensores electrónicos cuenta con un amplio abanico de opciones disponibles en lo que respecta a la medición de diferentes variables físicas. Para este proyecto se realizó un inventario preliminar de sensores basándose principalmente en la relación precisión/precio y en la documentación disponible sobre ellos. En el caso del sensor para medir la humedad del suelo, se optó por la fabricación propia. En la construcción de este sensor se emplearon materiales asequibles y de uso común, como son el yeso y clavos galvanizados. Este sensor de la humedad del suelo es de tipo resistivo, ya que se basa en la conductividad a través de él en función de la humedad presente en el suelo que es absorbida por capilaridad hacia el cilindro de yeso. Durante el periodo de pruebas se detectó corrosión en uno de los clavos debido a la reacción electrolítica que aparece al hacer circular corriente eléctrica entre los dos terminales. Para solucionar este problema, se optó por construir un nuevo sensor reemplazando los clavos galvanizados que actuaban como terminales en el sensor por dos barras de grafito, material mucho mas resistente a éste fenómeno pero que posee una resistividad propia superior a la del acero galvanizado, por lo que fue preciso efectuar la calibración de la medición a partir de los nuevos valores obtenidos reemplazando una de las resistencias del prototipo. Para simular el comportamiento del nivel de agua en el depósito de riego, se empleó un potenciómetro capaz de variar su resistencia y ofrecer distintos valores en el pin de entrada asignado en la placa Arduino. Al necesitar una solución mas realista al problema de calcular el nivel de agua para riego, se optó por utilizar un sensor de distancia por ultrasonidos. Este sensor funciona por pulsos ultrasónicos que son emitidos perpendicularmente a la superficie del agua contenida en el depósito con el objetivo de medir el tiempo transcurrido entre el envío del pulso y el retorno del eco al rebotar en el agua. La ventaja de este sensor frente a otras soluciones propuestas es la adaptación a depósitos de diferente profundidad (hasta 4 metros) modificando ligeramente el código de la aplicación de escritorio, mostrado a continuación: void lecturaPing () { unsigned long retorno = 0; // Distancia calculada en cm. pinMode (pinEco, OUTPUT); digitalWrite (pinEco, LOW); delayMicroseconds (2); digitalWrite (pinEco, HIGH); // Pulso -> ))) delayMicroseconds (15); digitalWrite (pinEco, LOW); // Fin del pulso delayMicroseconds(20); pinMode (pinEco, INPUT); // Retorno del eco <- ((( retorno = pulseIn(pinEco, HIGH); // Velocidad del sonido 29 cm/milisegundos (58 ida y vuelta) // La distancia real se ajusta entre el rango mínimo del sensor (3cm) y la profundidad de depósito marcada por profDeposito. El valor que se envía es el porcentaje de llenado del depósito de 0 a 100. nivelH2O = map(retorno/58,3,profDeposito,100,0); 47
Miguel Angel Hernanz Hernanz nivelH2O = nivelH2O * 10; // Multiplicación para ajustarse al formato usado en Processing if (nivelH2O < 0) { nivelH2O=0; } // Evitamos niveles negativos si el sensor lee fuera del rango } Cuadro 1 – Método de lectura del sensor ultrasónico El periodo de lectura de las variables se ajustó a 1.5 segundos excepto en el caso de la humedad del suelo, donde se ha espaciado la lectura hasta los 10 segundos con el fin de no provocar un desgaste prematuro en el sensor y ahorrar energía. Hay que destacar que en el caso del sensor de temperatura externa, se detectaron fuertes variaciones en el valor ofrecido en la primera lectura efectuada en cada intervalo, por lo que se aplicó una corrección consistente en realizar 10 lecturas consecutivas con un pequeño retraso entre cada una y devolver la media del conjunto de datos para estabilizar las lecturas. El procedimiento de lectura de sensores y composición de los datos a enviar se detalla en el código fuente mas abajo: void lecturaSensores (int pinLDR, int pinLM35, int pinYeso, byte pinDHT=DHTPIN, byte tipoDHT=DHTTYPE, String datos ="") { unsigned long tiempo = millis(); // Tiempo transcurrido desde el inicio del loop char bufferTemp[5]; //Buffer para la conversión float/string float tempLM35 = 0.0; // Temperatura exterior (en grados celsius) int humedadSuelo; int sumTemps = 0; int luminosidad = analogRead(pinLDR); int humedadDHT = dht.readHumidity(); int tempDHT = dht.readTemperature(); lecturaPing (); if (isnan (humedadDHT) || isnan (tempDHT)) { // Comprobación de que la lectura del sensor DHT11 es correcta Serial.println ("-- Error de lectura en DHT11 --"); humedadDHT = 0; tempDHT = 0; } if (tiempo - actHumSuelo > intervaloHumSuelo) { // Lectura espaciada de la humedad del suelo para evitar electrólisis en los materiales actHumSuelo = millis(); digitalWrite (pin5V, HIGH); delay(5); humedadSuelo = 1023 - analogRead(pinYeso); // Se resta la resistencia ofrecida por el sensor de yeso humedadSueloAnt = humedadSuelo; // Conservar la lectura digitalWrite (pin5V, LOW); } else { humedadSuelo = humedadSueloAnt; // Mantenemos el valor de la anterior lectura en la variable humedadSuelo } tempLM35 = analogRead(pinLM35); // Descartamos la primera lectura por alta fluctuación 48
Miguel Angel Hernanz Hernanz for (int i=0; i<=9; i++) { // Obtiene 10 muestras de temperatura para mayor precisión sumTemps += analogRead (pinLM35); // Las muestras son almacenadas en la variable sumTemps delay (100); // Retardo para estabilizar las lecturas } // Correción de muestreo de temperatura según datasheet LM35 (10mV / ºC) y voltaje de referencia de 5V --> ((5*100*lectura)/1024)/10 muestras = 0.048875855 tempLM35 = sumTemps * 0.048875855; datos += luminosidad; // Construye un string con todos los datos de los sensores separados por comas datos += ','; dtostrf (tempLM35,2,1,bufferTemp); // Convierte el valor float con un decimal a string datos += String(bufferTemp); datos +=','; datos += tempDHT; datos += ','; datos += humedadDHT; datos += ','; datos += humedadSuelo; datos += ','; datos += nivelH2O; datosSensores = datos; // Contiene los datos formateados para enviar a Processing Serial.println (datosSensores); // Debug serial } Cuadro 2 – Procedimiento de lectura de sensores en Arduino En la ilustración 15 se representa el modelado del prototipo hardware inicial, realizado en el programa de diseño de prototipos Fritzing. Este programa permite exportar los esquemas del diseño a un formato compatible con la producción física del PCB, incluyendo los componentes necesarios y el ruteado de las pistas sobre la placa. 49
Miguel Angel Hernanz Hernanz Ilustración 15 – Vista esquemática del prototipo hardware inicial ESTRUCTURA DE DATOS Y PROTOCOLO La transmisión de datos entre Arduino y el PC o dispositivo Android del usuario emplea un formato de datos muy sencillo basado en valores numéricos ordenados y separados por comas, todo ello es agrupado en una variable de tipo string que es enviada al dispositivo de destino. Luminosidad Temperatura Exterior Temperatura Interior Humedad Ambiental Humedad Suelo Nivel Agua Para el envío de órdenes, se ha adoptado un sistema basado en tres dígitos que codifican la orden a ejecutar en el dispositivo Arduino de la siguiente forma: Selector Sistema Orden riego Orden Ventilación 50
Miguel Angel Hernanz Hernanz El primer campo siempre contiene un 1 para señalizar una nueva orden a los sistemas de riego y ventilación. El valor 0 está reservado para otro tipo de órdenes a sistemas que se implementen en una posible ampliación. El segundo campo contiene un 1 si la activación del sistema de riego es necesaria y un 0 en caso contrario. De forma similar, la última posición de las órdenes indica con un 1 la activación del sistema de ventilación o la desactivación del mismo si toma el valor 0. La aplicación de escritorio tiene la capacidad de reenviar la información recibida si registra un mensaje procedente de una IP distinta a la especificada para el dispositivo Arduino. Esto permite a la aplicación Android mostrar los mismos datos que maneja la aplicación de escritorio. Para mantener la sincronización entre las dos aplicaciones en lo relativo a la configuración actual del sistema, se modifica el sistema de envío de órdenes de la siguiente manera: •Si la aplicación Android cambia la configuración, envía un mensaje a la aplicación de escritorio utilizando el campo [SelectorSistema] con el valor 1 para notificar a la aplicación de escritorio que debe guardar la nueva configuración indicada en los campos siguientes del mensaje en el archivo de configuración del servidor. •Si la aplicación de escritorio realiza un cambio en la configuración mientras la aplicación Android está conectada, se sustituye el mensaje conteniendo los datos recibidos desde Arduino por un mensaje que solo contiene el carácter 'c' para indicar que la aplicación de Android debe recargar la configuración desde el archivo almacenado en el servidor. Dada la naturaleza de trabajo casi en tiempo real del sistema, es necesario que el envío de los datos recabados por los sensores y la generación de las respuestas del sistema en forma de órdenes sean efectuadas de forma rápida para adaptarse a un cambio de condiciones. A esto se suma la necesidad de que, ante un fallo en la comunicación entre Arduino y el dispositivo del usuario, los datos recibidos mas recientemente tengan prioridad sobre aquellos que no llegaron a tiempo al destino, descartándose estos últimos. Por estos motivos fue elegido el protocolo de comunicación en red UDP frente al protocolo TCP, puesto que proporciona las características requeridas para el funcionamiento del sistema y supone un ahorro en el volumen de datos a transmitir al prescindir de las funcionalidades asociadas al protocolo TCP como son el establecimiento previo de la conexión y la confirmación de llegada de cada paquete enviado. El método perteneciente al handler de escucha UDP receive() de la librería hypermedia.net para Processing puede ampliar su funcionalidad incorporando mas instrucciones añadidas por el desarrollador que ejecuten tareas auxiliares cada vez que hay un evento de recepción de datagramas en el puerto de escucha. A continuación se muestra el código que emplea este handler en la aplicación de escritorio: void receive (byte[] mensaje, String ipAdress, int port) { // Handler por defecto de la libreria UDP que se activa en el evento de recepción de datagramas if ( ipAdress.equals(ip) ) // La dirección IP que manda el mensaje es la del Arduino if (mensaje.length > 11) { nuevosDatos = true; conexion = true; // Si recibe un paquete UDP marca la conexión como activa paquetesEsperados = 0; // y pone a cero el contador de paquetesEsperados datos = new String(mensaje); arrayDatos = splitTokens (datos,","); // Trocea la cadena de entrada a un array, usando una coma como separador de valores 51
Miguel Angel Hernanz Hernanz } else { println ("Array datos incompleto!"); for (int i=0; i<6; i++) { arrayDatos[i] = "0"; } nuevosDatos = false; } else { // La dirección IP que se conecta datos pertenece al dispositivo Android ipExterna = ipAdress; udp.send (datos, ipAdress, port); // Reenvia los datos al dispositivo Android conectado if (char(mensaje[0])=='1') { // Se han recibido ordenes desde Android switch (mensaje[1]) { case 48: estadoOrdenes[0] = 0; break; case 49: estadoOrdenes[0] = 1; break; case 50: estadoOrdenes[0] = 2; break; } switch (mensaje[2]) { case 48: estadoOrdenes[1] = 0; break; case 49: estadoOrdenes[1] = 1; break; case 50: estadoOrdenes[1] = 2; break; } salvarConfig(); // El mensaje recibido contiene ordenes nuevas y se necesita guardar la configuración y refrescar las condiciones recargarCondiciones = true; } } } Cuadro 3 – Método receive empleado en la aplicación de escritorio DISEÑO DE LA BASE DE DATOS La información recibida desde el dispositivo Arduino resulta de gran utilidad a largo plazo si se quiere analizar la evolución de los cultivos y calificar el resultado final de la cosecha en relación a las condiciones establecidas para su crecimiento. Para este fin, se dispuso de una única tabla que almacena los registros con la siguiente estructura: 52
Miguel Angel Hernanz Hernanz Columna Tipo Nulo Predeterminado Indice int(11) No Fecha timestamp No CURRENT_TIMESTAMP Luminosidad int(4) No TempExterior float No TempInterior int(3) No HumAmbiente int(3) No HumSuelo int(4) No NivelAgua int(4) No EstadoRiego int(1) No EstadoVent int(1) No Tabla 13 – Estructura interna de la base de datos La clave primaria es Indice y se utiliza para indexar cada nuevo registro de forma unívoca, siendo autoincrementada al añadir nuevas entradas. A parte de las columnas relativas a la fecha de la lectura y los valores registrados por los sensores, se incluyen también el nivel de agua y los estados del riego y la ventilación en el momento de la lectura. Esto permite efectuar el cálculo del volumen de agua utilizado en un determinado periodo temporal y comprobar en qué momentos y durante cuánto tiempo han estado en funcionamiento el riego y la ventilación del invernadero. INFORMACIÓN VISUAL EN LA PÁGINA WEB Con objeto de disponer de la información relativa a las condiciones actuales y anteriores del invernadero en cualquier lugar, la página web del proyecto Hortduino se diseñó para generar contenido útil para el usuario de forma dinámica a partir de la información disponible almacenada en la base de datos del servidor. Para este fin se idearon una serie de elementos que muestran los datos obtenidos por el sistema de forma gráfica e intuitiva para el usuario, el cual puede visualizar diversos parámetros relacionados entre sí, como por ejemplo la evolución temporal del valor de la humedad presente en el suelo frente al nivel restante de agua en el depósito y los periodos en los que el sistema de riego ha estado activo. Aprovechando las oportunidades ofrecidas por el lenguaje Processing y su integración en la web usando el lenguaje HTML 5, se optó por la combinación de ambos en el diseño de los sketches que muestran la información al usuario en detrimento de otros métodos de generación de gráficos basados en el empleo de librerías gráficas predefinidas de terceros. Ante el problema de representar comparativamente en un mismo gráfico variables que usan diferentes rangos y unidades de medida, se recurrió a la agrupación de los parámetros que utilizan las mismas unidades de medida en las partes derecha e izquierda de la gráfica, correspondientes al eje Y, en la sección Estadísticas de la página web. 53
Miguel Angel Hernanz Hernanz LICENCIA Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. 60
Miguel Angel Hernanz Hernanz TERMS AND CONDITIONS 0. Definitions “This License” refers to version 3 of the GNU General Public License. “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. “The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. A “covered work” means either the unmodified Program or a work based on the Program. To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. 61
Miguel Angel Hernanz Hernanz The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms 62
Miguel Angel Hernanz Hernanz added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: •a) The work must carry prominent notices stating that you modified it, and giving a relevant date. •b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”. •c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. •d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: •a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. •b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. •c) Convey individual copies of the object code with a copy of the written offer to provide 63
Miguel Angel Hernanz Hernanz the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. •d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. •e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available 64
Miguel Angel Hernanz Hernanz to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: •a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or •b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or •c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or •d) Limiting the use for publicity purposes of names of licensors or authors of the material; or •e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or •f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 65
Miguel Angel Hernanz Hernanz 8. Termination You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peerto-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 66
Miguel Angel Hernanz Hernanz 11. Patents A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”. A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 67
Miguel Angel Hernanz Hernanz 12. No Surrender of Others' Freedom If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 68
Miguel Angel Hernanz Hernanz 16. Limitation of Liability IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16 If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS 69
Miguel Angel Hernanz Hernanz Índice de ilustraciones Ilustración 1 - Diagrama de subsistemas...........................................................................................15 Ilustración 2 - Diagrama de casos de uso de la aplicación de escritorio...........................................15 Ilustración 3 - Diagrama de casos de uso de la aplicación Android..................................................16 Ilustración 4 - Diagrama de casos de uso de la página Web..............................................................17 Ilustración 5 - Diagrama de casos de uso de Arduino........................................................................17 Ilustración 6 - Diagrama de casos de uso del sistema (simplificado)................................................18 Ilustración 7 - Diagrama de Contexto del sistema - Nivel 0..............................................................66 Ilustración 8 - Diagrama de Flujo de Datos - Nivel 1........................................................................66 Ilustración 9 - Diagrama de Flujo de Datos - Nivel 2 - Control de los sistemas del invernadero.....67 Ilustración 10 - Diagrama del Flujo de Datos - Nivel 2 - Gestión de órdenes...................................67 Ilustración 11 - Diagrama del Flujo de Datos - Nivel 2 - Procesado de datos...................................67 Ilustración 12 - Diagrama del Flujo de Datos - Nivel 2 - Gestión de lecturas...................................68 Ilustración 13 - Diagrama del Flujo de Datos - Nivel 2 – Control de condiciones...........................68 Ilustración 14 - Diagrama del Flujo de Datos - Nivel 2 - Sistema de información...........................69 Ilustración 15 - Diagrama Entidad-Relación del sistema..................................................................70 Ilustración 16 - Diagrama de paquetes..............................................................................................73 Ilustración 17 - Diagrama de flujo del dispositivo Arduino..............................................................74 Ilustración 18 - Diagrama de flujo de la aplicación de escritorio......................................................75 Ilustración 19 - Diagrama de flujo de la aplicación Android.............................................................76 Ilustración 20 - Diagrama de flujo de la página web.........................................................................77 Ilustración 21 - Información actual de los sensores.........................................................................101 Ilustración 22 - Gráficos de evolución temporal de las variables....................................................101 Ilustración 23 - Controles y actividad de los sistemas remotos.......................................................102 Ilustración 24 - Nivel de agua en depósito......................................................................................102 Ilustración 25 - Información sobre condiciones del invernadero....................................................102 Ilustración 26 - Selectores................................................................................................................103 Ilustración 27 - Interfaz de la aplicación de escritorio.....................................................................104 Ilustración 28 - Error de conexión...................................................................................................104 Ilustración 29 - Pantalla inicial de la aplicación Android................................................................105 Ilustración 30 - Menú de la aplicación Android..............................................................................106 Ilustración 31 - Nivel de agua en la aplicación Android (45%).......................................................106 Ilustración 32 - Nivel de agua en la aplicación Android (80%).......................................................106 Ilustración 33 - Configuración de rangos en la aplicación Android................................................107 Ilustración 34 - Información de conexión con ap. escritorio...........................................................107 Ilustración 35 - Pantalla de problemas de conexión........................................................................107 Ilustración 36 - Menú de la página web...........................................................................................108 Ilustración 37 - Sección Ultimas Lecturas de la página web...........................................................109 Ilustración 38 - Sección Estadísticas de la página web....................................................................110 Ilustración 39 - Sección Estado Actual de la web............................................................................111 Ilustración 40 - Sección Consumo de Agua de la página web.........................................................111 Ilustración 41 - Sección Temperaturas Registradas de la página web.............................................112 Ilustración 42 - Sección Sobre Hortduino de la página web............................................................112 2
Miguel Angel Hernanz Hernanz Índice de tablas Tabla 1 - Objetivo del sistema - Recibir información de sensores remotos........................................8 Tabla 2 - Objetivo del sistema - Mostrar información de sensores remotos........................................8 Tabla 3 - Objetivo del sistema - Almacenar la información recibida..................................................8 Tabla 4 - Objetivo del sistema - Cambiar estado de los sistemas de riego/ventilación.......................9 Tabla 5 - Objetivo del sistema - Mostrar el estado y modo de funcionamiento de los sistemas de riego y ventilación...............................................................................................................................9 Tabla 6 - Objetivo del sistema - Control automatizado de los sistemas de riego/ventilación.............9 Tabla 7 - Objetivo del sistema - Consulta de información vía web...................................................10 Tabla 8 - Objetivo del sistema - Informar sobre las condiciones actuales del invernadero...............10 Tabla 9 - Requisitos de información - Información sobre los sensores remotos...............................11 Tabla 10 - Requisitos de Información - Información sobre el estado actual de los sistemas de riego y ventilación.......................................................................................................................................12 Tabla 11 - Requisitos de Información - Información sobre el modo de control de los sistemas de riego y ventilación.............................................................................................................................12 Tabla 12 - Requisitos de Información - Información sobre la configuración de rangos aceptables en variables.............................................................................................................................................13 Tabla 13 - Requisitos de Información - Información sobre el estado actual de las condiciones del invernadero........................................................................................................................................13 Tabla 14 - Actores - Usuario del sistema...........................................................................................14 Tabla 15 - Actores - Dispositivo Arduino..........................................................................................14 Tabla 16 - Actores - Aplicación de escritorio....................................................................................14 Tabla 17 - Actores - Aplicación Android...........................................................................................14 Tabla 18 - Caso de uso RF-01 Recibir información sobre luminosidad............................................19 Tabla 19 - Caso de uso RF-02 Recibir información sobre temperatura interior................................20 Tabla 20 - Caso de uso RF-03 Recibir información sobre temperatura exterior...............................21 Tabla 21 - Caso de uso RF-04 Recibir información sobre humedad ambiental................................22 Tabla 22 - Caso de uso RF-05 Recibir información sobre humedad del suelo..................................23 Tabla 23 - Caso de uso RF-06 Recibir información sobre nivel de agua..........................................24 Tabla 24 - Caso de uso RF-07 Cambiar modo de control del sistema de riego.................................25 Tabla 25 - Caso de uso RF-08 Cambiar modo de control del sistema de ventilación.......................26 Tabla 26 - Caso de uso RF-09 Mostrar modo de control del sistema de ventilación........................27 Tabla 27 - Caso de uso RF-10 Mostrar modo de control del sistema de riego..................................28 Tabla 28 - Caso de uso RF-11 Enviar lecturas a aplicación de escritorio..........................................29 Tabla 29 - Caso de uso RF-12 Reenviar lecturas a aplicación Android............................................30 Tabla 30 - Caso de uso RF-13 Guardar el estado de los sistemas de riego y ventilación..................31 Tabla 31 - Caso de uso RF-14 Guardar la configuración de los rangos aceptables de las variables monitorizadas.....................................................................................................................................32 Tabla 32 - Caso de uso RF-15 Almacenar lecturas y estados en la base de datos.............................33 Tabla 33 - Caso de uso RF-16 Guardar el estado actual de las condiciones del invernadero............34 Tabla 34 - Caso de uso RF-17 Activar sistema de riego en Arduino.................................................35 Tabla 35 - Caso de uso RF-18 Desactivar sistema de riego en Arduino............................................36 Tabla 36 - Caso de uso RF-19 Recibir órdenes en Arduino...............................................................37 Tabla 37 - Caso de uso RF-20 Enviar órdenes a Arduino..................................................................38 Tabla 38 - Caso de uso RF-21 Enviar órdenes a aplicación de escritorio.........................................39 Tabla 39 - Caso de uso RF-22 Activar sistema de riego en Arduino.................................................40 Tabla 40 - Caso de uso RF-23 Desactivar sistema de ventilación en Arduino..................................41 3
Miguel Angel Hernanz Hernanz Tabla 41 - Caso de uso RF-24 Establecer conexión con Arduino.....................................................42 Tabla 42 - Caso de uso RF-25 Mostrar datos de lecturas recibidas...................................................43 Tabla 43 - Caso de uso RF-26 Comprobar condiciones....................................................................44 Tabla 44 - Caso de uso RF-27 Configurar rangos aceptables............................................................45 Tabla 45 - Caso de uso RF-28 Mostrar condiciones actuales del invernadero..................................46 Tabla 46 - Caso de uso RF-29 Recibir órdenes desde Android.........................................................47 Tabla 47 - Caso de uso RF-30 Cargar la configuración.....................................................................48 Tabla 48 - Caso de uso RF-31 Mostrar gráficos temporales de variables.........................................49 Tabla 49 - Caso de uso RF-32 Cambiar intervalo de actualización de gráficos................................50 Tabla 50 - Caso de uso RF-33 Mostrar configuración de red............................................................51 Tabla 51 - Caso de uso RF-34 Recibir lecturas de Arduino...............................................................52 Tabla 52 - Caso de uso RF-35 Salvar la configuración.....................................................................53 Tabla 53 - Caso de uso RF-36 Establecer conexión ap. escritorio/Android......................................54 Tabla 54 - Caso de uso RF-37 Generar página web Ultimas Lecturas..............................................55 Tabla 55 - Caso de uso RF-38 Generar página web Estadísticas.......................................................56 Tabla 56 - Caso de uso RF-39 Generar página web Temperaturas....................................................57 Tabla 57 - Caso de uso RF-40 Generar página web Consumo de Agua............................................58 Tabla 58 - Caso de uso RF-41 Generar página web Estado Actual...................................................59 Tabla 59 - Caso de uso RF-42 Obtener datos de la base de datos.....................................................60 Tabla 60 - Caso de uso RF-43 Obtener input de usuario...................................................................61 Tabla 61 - Caso de uso RF-44 Establecer conexión con servidor XAMPP.......................................62 Tabla 62 - Requisito no funcional RNF-01 Interoperabilidad...........................................................63 Tabla 63 - Requisito no funcional RNF-02 Accesibilidad.................................................................63 Tabla 64 - Requisito no funcional RNF-03 Diseño de la interfaz de usuario....................................63 Tabla 65 - Requisito no funcional RNF-04 Respuesta rápida...........................................................63 Tabla 66 - Matriz de rastreabilidad objetivos/requisitos (1/2)...........................................................64 Tabla 67 - Matriz de rastreabilidad objetivos/requisitos (2/2)...........................................................65 Tabla 1 - Procedimiento setup...........................................................................................................78 Tabla 2 - Procedimiento loop.............................................................................................................78 Tabla 3 - Procedimiento lecturaSensores...........................................................................................78 Tabla 4 - Procedimiento lecturaPing..................................................................................................78 Tabla 5 - Procedimiento lecturaSensores...........................................................................................79 Tabla 6 - Procedimiento enviarDatos.................................................................................................79 Tabla 7 - Procedimiento ejecutarOrdenes..........................................................................................79 Tabla 8 - Procedimiento estadoRiego................................................................................................79 Tabla 9 - Procedimiento estadoVent..................................................................................................79 Tabla 10 - Procedimiento setup.........................................................................................................80 Tabla 11 - Procedimiento draw..........................................................................................................80 Tabla 12 - Procedimiento establecerConexion..................................................................................80 Tabla 13 - Procedimiento mostrarMenuConfigConex.......................................................................80 Tabla 14 - Procedimiento inicializaConfig........................................................................................81 Tabla 15 - Procedimiento inicializarAnimacion................................................................................81 Tabla 16 - Procedimiento almacenarLecturas....................................................................................81 Tabla 17 - Procedimiento salvarLecturas...........................................................................................82 Tabla 18 - Procedimiento salvarConfig.............................................................................................82 Tabla 19 - Procedimiento mostrarDatos............................................................................................82 Tabla 20 - Procedimiento establecerUltimaAct.................................................................................82 Tabla 21 - Procedimiento comprobarCondiciones.............................................................................83 Tabla 22 - Procedimiento dibujarSelectorActualización...................................................................83 Tabla 23 - Procedimiento dibujarSelectoresAct................................................................................83 4
Miguel Angel Hernanz Hernanz Tabla 24 - Procedimiento dibujarBotonesyEstados...........................................................................84 Tabla 25 - Procedimiento dibujarGraficosyEjes................................................................................84 Tabla 26 - Procedimiento dibujarSelector.........................................................................................84 Tabla 27 - Procedimiento dibujarSelectores......................................................................................85 Tabla 28 - Procedimiento dibujarEstadoOrdenes..............................................................................85 Tabla 29 - Procedimiento dibujarGrafico..........................................................................................85 Tabla 30 - Procedimiento dibujarDeposito........................................................................................86 Tabla 31 - Procedimiento dibujarEjes................................................................................................86 Tabla 32 - Procedimiento mostrarLeyenda........................................................................................86 Tabla 33 - Procedimiento dibujarBoton.............................................................................................87 Tabla 34 - Procedimiento punteroSobreBoton...................................................................................87 Tabla 35 - Procedimiento punteroSobreTrianguloArriba..................................................................87 Tabla 36 - Procedimiento punteroSobreTrianguloAbajo...................................................................88 Tabla 37 - Procedimiento enviarOrdenes...........................................................................................88 Tabla 38 - Procedimiento mouseClicked...........................................................................................88 Tabla 39 - Procedimiento mouseReleased.........................................................................................88 Tabla 40 - Procedimiento keyReleased..............................................................................................89 Tabla 41 - Procedimiento receive......................................................................................................89 Tabla 42 - Procedimiento setup.........................................................................................................90 Tabla 43 - Procedimiento draw..........................................................................................................90 Tabla 44 - Procedimiento dispatchTouchEvent.................................................................................90 Tabla 45 - Procedimiento mostrarInicio............................................................................................91 Tabla 46 - Procedimiento mostrarMenu............................................................................................91 Tabla 47 - Procedimiento mostrarMenuInfo......................................................................................91 Tabla 48 - Procedimiento dibujarBotonesMenu................................................................................91 Tabla 49 - Procedimiento dibujarSelectores......................................................................................91 Tabla 50 - Procedimiento establecerConexion..................................................................................92 Tabla 51 - Procedimiento dispatchTouchEvent.................................................................................92 Tabla 52 - Procedimiento inicializaConfig........................................................................................92 Tabla 53 - Procedimiento inicializarAnimacion................................................................................92 Tabla 54 - Procedimiento salvarConfig.............................................................................................93 Tabla 55 - Procedimiento mostrarDatos............................................................................................93 Tabla 56 - Procedimiento comprobarCondiciones.............................................................................93 Tabla 57 - Procedimiento dibujarEstadoOrdenes..............................................................................93 Tabla 58 - Procedimiento dibujarDeposito........................................................................................94 Tabla 59 - Procedimiento dibujarBotonOrdenes...............................................................................94 Tabla 60 - Procedimiento enviarOrdenes...........................................................................................94 Tabla 61 - Procedimiento punteroSobreBoton...................................................................................95 Tabla 62 - Procedimiento receive......................................................................................................95 Tabla 63 - menu.php..........................................................................................................................96 Tabla 64 - estadisticas.php.................................................................................................................96 Tabla 65 - ultimaslect.php..................................................................................................................97 Tabla 66 - actual.php..........................................................................................................................97 Tabla 67 - temperaturas.php...............................................................................................................97 Tabla 68 - consumoagua.php.............................................................................................................97 Tabla 69 - index.php..........................................................................................................................98 Tabla 70 - estadoactual.php...............................................................................................................98 Tabla 71 - ultimosdatos.php...............................................................................................................98 Tabla 72 - sketchDeposito.pde...........................................................................................................98 Tabla 73 - sketchConsulta.pde...........................................................................................................99 5
Miguel Angel Hernanz Hernanz Tabla 74 - sketchEstadisticas.pde......................................................................................................99 Tabla 75 - estilo.css............................................................................................................................99 Tabla 76 - Batería de pruebas de Arduino........................................................................................125 Tabla 77 - Batería de pruebas de la aplicación de escritorio (I)......................................................126 Tabla 78 - Batería de pruebas de la aplicación de escritorio (II).....................................................127 Tabla 79 - Batería de pruebas de la aplicación Android (I).............................................................128 Tabla 80 - Batería de pruebas de la aplicación Android (II)............................................................129 Tabla 81 - Batería de pruebas de la Página Web..............................................................................130 6
Miguel Angel Hernanz Hernanz 1 ANÁLISIS DE REQUISITOS DEL SISTEMA 1.1 INTRODUCCIÓN El presente Proyecto Fin de Carrera está dedicado a desarrollar un sistema de monitorización y control de invernadero apoyado en la popular plataforma de hardware libre Arduino y en tecnologías web. Este sistema, compuesto por tres aplicaciones diferenciadas, recibirá datos acerca de las principales variables implicadas en el crecimiento de los cultivos, como pueden ser la humedad del suelo, humedad ambiental y temperatura, obtenidos mediante una red de sensores colocados en el invernadero. La información enviada desde los sensores será procesada por la aplicación de escritorio, la cual se encargará de su almacenamiento en una base de datos externa y de la automatización y control del riego y ventilación mediante sendos actuadores mecánicos. Esta aplicación de escritorio también será capaz de mostrar los datos recibidos por red desde los sensores en tiempo real y establecer las condiciones máximas y mínimas que se han de mantener para cada variable, alertando al usuario si se encuentran fuera de rango. El usuario podrá seleccionar el modo automático o manual para el control del riego y la ventilación, de modo que se active el sistema de riego si la humedad del suelo cae por debajo de un determinado valor mínimo aceptable o se accione el sistema de ventilación si la temperatura o humedad interior superan un límite máximo. Para apoyar a la aplicación de escritorio, la aplicación móvil será una réplica en versión reducida de las funcionalidades e interfaz de la aplicación de escritorio, contando con las ventajas de movilidad que ofrecen los dispositivos ANDROID. A diferencia de la aplicación de escritorio, la aplicación móvil no tendrá la funcionalidad de incorporar los datos recibidos a la base de datos externa, pero si podrá ajustar los rangos aceptables de las variables monitorizadas y activar/desactivar los controles de riego y ventilación. Por último, se dispondrá de una página web donde el usuario podrá visualizar gráficamente la información almacenada en la base de datos por la aplicación principal y tener acceso a estadísticas y gráficos históricos de la evolución de las condiciones ambientales del cultivo durante diferentes periodos temporales. En dicha página web se mostrará de forma dinámica la última lectura recibida en los 30 segundos anteriores, el estado de las alertas y sistemas de riego y ventilación, el consumo de agua para riego y el porcentaje restante disponible en el depósito, entre otra información útil para el usuario. A continuación se enumeran los objetivos y requisitos del sistema, tabulados de acuerdo a la plantilla recomendada en Metodología para la Elicitación de Requisitos de Sistemas Software1 [A. Durán, B. Bernardez] (2000). Se ha escogido esta forma de presentación por su claridad y estandarización. 1Documento disponible en www.lsi.us.es/~informes/lsi-2000-10.pdf 7
Miguel Angel Hernanz Hernanz 1.2 OBJETIVOS DEL SISTEMA OBJ-01 Recibir información de sensores remotos Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Descripción El sistema deberá recibir la información de forma remota desde diversos sensores Importancia Importante Urgencia Alta Estado Validado Estabilidad alta Comentarios Este objetivo es atribuible a las aplicaciones de escritorio y Android Tabla 1 - Objetivo del sistema - Recibir información de sensores remotos OBJ-02 Mostrar información de sensores remotos Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Descripción El sistema deberá mostrar la información recibida de forma remota desde diversos sensores Importancia Importante Urgencia Alta Estado Validado Estabilidad alta Comentarios Este objetivo es atribuible a las aplicaciones de escritorio y Android. Incluye la representación numérica y gráfica de los datos recibidos. Tabla 2 - Objetivo del sistema - Mostrar información de sensores remotos OBJ-03 Almacenar información recibida Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Descripción El sistema deberá ser capaz de almacenar los datos recibidos desde los sensores remotos en una base de datos Importancia Importante Urgencia Alta Estado Validado Estabilidad alta Comentarios Este objetivo es atribuible a la aplicación de escritorio Tabla 3 - Objetivo del sistema - Almacenar la información recibida 8
Miguel Angel Hernanz Hernanz OBJ-04 Cambiar el estado de los sistemas de riego/ventilación Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Descripción El sistema deberá ser capaz de cambiar el estado de los sistemas de riego y ventilación del invernadero de forma remota a petición del usuario. Importancia Importante Urgencia Alta Estado Validado Estabilidad alta Comentarios Este objetivo es atribuible a las aplicaciones de escritorio y Android Tabla 4 - Objetivo del sistema - Cambiar estado de los sistemas de riego/ventilación OBJ-05 Mostrar el estado y modo de funcionamiento de los sistemas de riego/ventilación Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Descripción El sistema deberá ser capaz de mostrar el estado de los sistemas de riego y ventilación del invernadero. Importancia Importante Urgencia Alta Estado Validado Estabilidad alta Comentarios Este objetivo es atribuible a las aplicaciones de escritorio y Android Tabla 5 - Objetivo del sistema - Mostrar el estado y modo de funcionamiento de los sistemas de riego y ventilación OBJ-06 Control automatizado de los sistemas de riego/ventilación Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Descripción El sistema deberá ser capaz de cambiar el estado de los sistemas de riego y ventilación del invernadero de forma remota en base a los parámetros establecidos por el usuario Importancia Importante Urgencia Alta Estado Validado Estabilidad alta Comentarios Este objetivo es atribuible a las aplicaciones de escritorio y Android Tabla 6 - Objetivo del sistema - Control automatizado de los sistemas de riego/ventilación 9
Miguel Angel Hernanz Hernanz OBJ-07 Consulta de información vía web Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Descripción El sistema deberá ser capaz de mostrar de forma gráfica información relevante para el usuario en la página web asociada. Esto contempla la última lectura recibida desde los sensores remotos, el estado de los sistemas de riego y ventilación, las temperaturas registradas, el nivel del depósito para riego y el histórico de la evolución de las variables monitorizadas. Importancia Importante Urgencia Normal Estado Validado Estabilidad alta Comentarios n/a Tabla 7 - Objetivo del sistema - Consulta de información vía web OBJ-08 Informar sobre las condiciones actuales del invernadero Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Descripción El sistema deberá ser capaz de mostrar información acerca de las condiciones de temperatura, humedad y nivel de agua referentes al invernadero Importancia Importante Urgencia Alta Estado Validado Estabilidad alta Comentarios Este objetivo es atribuible a las aplicaciones de escritorio y Android y a la página web Tabla 8 - Objetivo del sistema - Informar sobre las condiciones actuales del invernadero 10
Miguel Angel Hernanz Hernanz 1.3 REQUISITOS DE INFORMACIÓN RI-01 Información procedente de los sensores remotos Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Objetivos asociados OBJ-01 Recibir información de sensores remotos OBJ-03 Almacenar la información recibida Requisitos asociados RF-01 Recibir información sobre luminosidad RF-02 Recibir información sobre temperatura exterior RF-03 Recibir información sobre temperatura interior RF-04 Recibir información sobre humedad ambiental RF-05 Recibir información sobre humedad del suelo RF-06 Recibir información sobre nivel de agua RF-15 Almacenar lecturas y estados en la base de datos Descripción El sistema deberá almacenar y acceder a la información enviada por los sensores remotos Datos específicos •Valor de la luminosidad registrada en el sensor remoto •Valor de la temperatura exterior registrada en el sensor remoto •Valor de la temperatura interior registrada en el sensor remoto •Valor de la humedad ambiental registrada en el sensor remoto •Valor de la humedad del suelo registrada en el sensor remoto •Valor del nivel de agua registrada en el sensor remoto Intervalo temporal Indefinido Importancia Importante Urgencia Alta Estado Validado Estabilidad Alta Comentarios La información recibida sobre las lecturas de los sensores remotos es atribuible a la aplicaciones de escritorio Tabla 9 - Requisitos de información - Información sobre los sensores remotos 11
Miguel Angel Hernanz Hernanz 18 Ilustración 6 - Diagrama de casos de uso del sistema (simplificado)
Miguel Angel Hernanz Hernanz 1.4.3 CASOS DE USO DEL SISTEMA RF-01 Recibir información sobre luminosidad Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Objetivos asociados OBJ-01 Recibir información de sensores remotos Requisitos asociados RI-01 Información procedente de los sensores remotos Descripción Recibe en Arduino la información de luminosidad del sensor Precondición Dispositivo Arduino en funcionamiento Secuencia normal Paso Acción p1 Leer luminosidad en el pin de entrada asignado p2 Guardar el valor obtenido en la variable correspondiente Postcondición El valor de luminosidad está disponible para su envío Excepciones Paso Acción n/a n/a Rendimiento Dentro del intervalo de tiempo asignado a la lectura de sensores Frecuencia esperada Una lectura cada 1.5 segundos Importancia Alta Urgencia Alta Estado Validado Estabilidad Alta Comentarios n/a Tabla 18 - Caso de uso RF-01 Recibir información sobre luminosidad 19
Miguel Angel Hernanz Hernanz RF-02 Recibir información sobre temperatura interior Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Objetivos asociados OBJ-01 Recibir información de sensores remotos Requisitos asociados RI-01 Información procedente de los sensores remotos Descripción Recibe en Arduino la información de temperatura interior del sensor Precondición Dispositivo Arduino en funcionamiento Secuencia normal Paso Acción p1 Leer temperatura en el pin de entrada asignado p2 Guardar el valor obtenido en la variable correspondiente Postcondición El valor de temperatura interior está disponible para su envío Excepciones Paso Acción p1 Si el sensor enviá una lectura errónea (NaN), el valor asignado es 0 Rendimiento Dentro del intervalo de tiempo asignado a la lectura de sensores Frecuencia esperada Una lectura cada 1.5 segundos Importancia Alta Urgencia Alta Estado Validado Estabilidad Alta Comentarios n/a Tabla 19 - Caso de uso RF-02 Recibir información sobre temperatura interior 20
Miguel Angel Hernanz Hernanz RF-03 Recibir información sobre temperatura exterior Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Objetivos asociados OBJ-01 Recibir información de sensores remotos Requisitos asociados RI-01 Información procedente de los sensores remotos Descripción Recibe en Arduino la información de temperatura exterior del sensor Precondición Dispositivo en funcionamiento Secuencia normal Paso Acción p1 Leer temperatura exterior en el pin de entrada asignado y descartarla p2 Leer temperatura exterior en el pin de entrada y sumar este valor a la variable temporal p3 Esperar 100 milisegundos para estabilizar lecturas p4 Repetir los pasos 3 y 4 diez veces p5 Asignar el valor de la variable temporal dividido entre diez al resultado devuelto Postcondición El valor de temperatura exterior está disponible para su envío Excepciones Paso Acción n/a n/a Rendimiento Dentro del intervalo de tiempo asignado a la lectura de sensores Frecuencia esperada Una lectura cada 1.5 segundos Importancia Alta Urgencia Alta Estado Validado Estabilidad Alta Comentarios n/a Tabla 20 - Caso de uso RF-03 Recibir información sobre temperatura exterior 21
Miguel Angel Hernanz Hernanz RF-04 Recibir información sobre humedad ambiental Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Objetivos asociados OBJ-01 Recibir información de sensores remotos Requisitos asociados RI-01 Información procedente de los sensores remotos Descripción Recibe en Arduino la información de humedad ambiental del sensor Precondición Dispositivo en funcionamiento Secuencia normal Paso Acción p1 Leer humedad ambiental en el pin de entrada asignado p2 Guardar el valor obtenido en la variable correspondiente Postcondición El valor de humedad ambiental está disponible para su envío Excepciones Paso Acción p1 Si el sensor envía una lectura errónea (NaN), el valor asignado es 0 Rendimiento Dentro del intervalo de tiempo asignado a la lectura de sensores Frecuencia esperada Una lectura cada 1.5 segundos Importancia Alta Urgencia Alta Estado Validado Estabilidad Alta Comentarios n/a Tabla 21 - Caso de uso RF-04 Recibir información sobre humedad ambiental 22
Miguel Angel Hernanz Hernanz RF-05 Recibir información sobre humedad del suelo Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Objetivos asociados OBJ-01 Recibir información de sensores remotos Requisitos asociados RI-01 Información procedente de los sensores remotos Descripción Recibe en Arduino la información de humedad del suelo del sensor Precondición Dispositivo en funcionamiento Secuencia normal Paso Acción p1 Si se ha cumplido el intervalo de actualización, continuar p2 Activar el pin de salida a 5 voltios p3 Esperar 5 milisegundos para estabilizar p4 Leer valor recibido en el pin de entrada asignado p5 Desactivar el pin de salida con 0 voltios Postcondición El valor de temperatura exterior está disponible para su envío Excepciones Paso Acción p1 Si no se ha cumplido el intervalo de actualización, mantener la lectura anterior para su envío Rendimiento Dentro del intervalo de tiempo asignado a la lectura de sensores Frecuencia esperada Una lectura cada 10 segundos Importancia Alta Urgencia Alta Estado Validado Estabilidad Alta Comentarios Lectura espaciada para evitar desgaste del sensor Tabla 22 - Caso de uso RF-05 Recibir información sobre humedad del suelo 23
Miguel Angel Hernanz Hernanz RF-06 Recibir información sobre nivel de agua Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Objetivos asociados OBJ-01 Recibir información de sensores remotos Requisitos asociados RI-01 Información procedente de los sensores remotos Descripción Recibe en Arduino la información de nivel de agua del sensor Precondición Dispositivo en funcionamiento Secuencia normal Paso Acción p1 Cambiar el modo del pin asignado a modo salida (OUTPUT) p2 Activar el pin de salida a 5 voltios durante 15 milisegundos p3 Desactivar el pin de salida con 0 voltios p4 Esperar 20 milisegundos p5 Cambiar el modo del pin asignado a modo entrada (INPUT) p6 Recibir el eco de retorno en el pin asignado p7 Calcular la distancia hasta la superficie del agua empleando el tiempo de retorno y la velocidad del sonido (29 cm/milisegundo) p8 Devolver en la variable correspondiente el valor porcentual del nivel de agua basándose en el valor obtenido en paso 6 y la profundidad del depósito Postcondición El porcentaje de nivel de agua restante está disponible para su envío Excepciones Paso Acción p8 Si el valor es negativo, se retorna el valor 0 Rendimiento Dentro del intervalo de tiempo asignado a la lectura de sensores Frecuencia esperada Una lectura cada 1.5 segundos Importancia Alta Urgencia Alta Estado Validado Estabilidad Alta Comentarios n/a Tabla 23 - Caso de uso RF-06 Recibir información sobre nivel de agua 24
Miguel Angel Hernanz Hernanz RF-07 Cambiar modo de control del sistema de riego Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Objetivos asociados OBJ-04 Cambiar el estado de los sistemas de riego/ventilación OBJ-06 Control automatizado de los sistemas de riego/ventilación Requisitos asociados RF-26 Comprobar condiciones Descripción Cambia el modo de control del sistema de riego alternando entre el modo manual (ON y OFF) y el modo automático (AUTO) Precondición Dispositivo Arduino en funcionamiento Conexión disponible con Arduino Conexión con servidor XAMPP Aplicación de escritorio/Android en funcionamiento Secuencia normal Paso Acción p1 El usuario hace click o pulsa el botón de control del sistema de riego p3 El estado del sistema de riego cambia p4 La nueva configuración se guarda en el archivo config.txt del servidor p5 Si el nuevo estado implica una activación o desactivación del sistema de riego basado en las condiciones impuestas por el usuario, las nuevas órdenes son enviadas a Arduino Postcondición El modo de control del sistema de riego ha cambiado El nuevo modo de control aparece en la interfaz del usuario Excepciones Paso Acción n/a n/a Rendimiento De uno a cinco segundos en ser efectivo en Arduino Frecuencia esperada Un cambio por segundo Importancia Alta Urgencia Alta Estado Validado Estabilidad Alta Comentarios El modo de control viene representado en la interfaz de usuario por el texto y el color del botón asociado a cada modo Tabla 24 - Caso de uso RF-07 Cambiar modo de control del sistema de riego 25
Miguel Angel Hernanz Hernanz RF-08 Cambiar modo de control del sistema de ventilación Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Objetivos asociados OBJ-04 Cambiar el estado de los sistemas de riego/ventilación OBJ-06 Control automatizado de los sistemas de riego/ventilación Requisitos asociados RF-26 Comprobar condiciones Descripción Cambia el modo de control del sistema de ventilación alternando entre el modo manual (ON y OFF) y el modo automático (AUTO) Precondición Dispositivo Arduino en funcionamiento Conexión disponible con Arduino Conexión con servidor XAMPP Aplicación de escritorio/Android en funcionamiento Secuencia normal Paso Acción p1 El usuario hace click o pulsa el botón de control del sistema de ventilación p3 El estado del sistema de ventilación cambia p4 La nueva configuración se guarda en el archivo config.txt del servidor p5 Si el nuevo estado implica una activación o desactivación del sistema de ventilación basado en las condiciones impuestas por el usuario, las nuevas órdenes son enviadas a Arduino Postcondición El modo de control del sistema de ventilación ha cambiado El nuevo modo de control aparece en la interfaz del usuario Excepciones Paso Acción n/a n/a Rendimiento De uno a cinco segundos en ser efectivo en Arduino Frecuencia esperada Un cambio por segundo Importancia Alta Urgencia Alta Estado Validado Estabilidad Alta Comentarios El modo de control viene representado en la interfaz de usuario por el texto y el color del botón asociado a cada modo Tabla 25 - Caso de uso RF-08 Cambiar modo de control del sistema de ventilación 26
Miguel Angel Hernanz Hernanz RF-09 Mostrar modo de control del sistema de ventilación Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Objetivos asociados OBJ-05 Mostrar el estado y modo de funcionamiento de los sistemas de riego y ventilación Requisitos asociados RF-12 Reenviar lecturas a aplicación Android Descripción Muestra el modo de control actual del sistema de ventilación, alternando entre el modo manual (ON y OFF) y el modo automático (AUTO) Precondición Dispositivo Arduino en funcionamiento Conexión disponible con Arduino Conexión con servidor XAMPP Aplicación de escritorio/Android en funcionamiento Secuencia normal Paso Acción p1 La aplicación carga la configuración p2 Se muestra el modo de control actual del sistema de ventilación Postcondición El modo de control del sistema de ventilación aparece en la interfaz Excepciones Paso Acción p1 Si no es posible cargar la configuración, se genera la configuración por defecto con valores igual a 0 Rendimiento Instantáneo Frecuencia esperada Un cambio por segundo Importancia Alta Urgencia Alta Estado Validado Estabilidad Alta Comentarios El modo de control viene representado en la interfaz de usuario por el texto y el color del botón asociado a cada modo Tabla 26 - Caso de uso RF-09 Mostrar modo de control del sistema de ventilación 27
Miguel Angel Hernanz Hernanz RF-16 Guardar el estado actual de las condiciones del invernadero Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Objetivos asociados OBJ-01 Recibir información de sensores remotos OBJ-02 Mostrar información de sensores remotos OBJ-03 Almacenar información recibida OBJ-08 Informar sobre las condiciones actuales del invernadero Requisitos asociados RI-05 Información sobre el estado actual de las condiciones del invernadero RF-35 Salvar la configuración Descripción Guarda en el archivo condiciones.txt es estado actual de las condiciones del invernadero con el siguiente formato: •-1 : No se alcanza el nivel mínimo establecido para la condición •0: Situación normal •1: Se ha superado el nivel máximo permitido para la condición Precondición Dispositivo Arduino en funcionamiento Conexión disponible con Arduino y aplicación de escritorio Conexión con servidor XAMPP Aplicación de escritorio en funcionamiento Secuencia normal Paso Acción p1 Determinar si ha ocurrido un cambio en las condiciones actuales p2 La aplicación de escritorio construye una cadena de texto con el valor asociado al estado de cada condición, separado por comas, y el estado actual de los sistemas de riego y ventilación (activo o inactivo) p3 Se escribe la cadena en el archivo condiciones.txt Postcondición El archivo condiciones.txt contiene una cadena numérica con los valores representativos del estado de cada condición y de la actividad de los sistemas de riego y ventilación. La cadena debe contener un total de 6 comas separadoras. Excepciones Paso Acción p2 Si el archivo no existe, es creado. Si existe, se sobrescribe. Rendimiento Inferior a 5 segundos Frecuencia esperada n/a Importancia Alta Urgencia Alta Estado Validado Estabilidad Alta Comentarios n/a Tabla 33 - Caso de uso RF-16 Guardar el estado actual de las condiciones del invernadero 34
Miguel Angel Hernanz Hernanz RF-17 Activar sistema de riego en Arduino Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Objetivos asociados OBJ-04 Cambiar estado de los sistemas de riego y ventilación OBJ-06 Control automatizado de los sistemas de riego y ventilación OBJ-08 Informar sobre las condiciones actuales del invernadero Requisitos asociados RF-19 Recibir órdenes en Arduino RF-20 Enviar órdenes a Arduino Descripción Activa el sistema de riego accionando el actuador mecánico asociado Precondición Dispositivo Arduino en funcionamiento Conexión disponible con Arduino y aplicación de escritorio Conexión con servidor XAMPP Aplicación de escritorio en funcionamiento Secuencia normal Paso Acción p1 Se recibe un paquete UDP con la orden de activación del sistema de riego p2 Se activa el pin de salida asociado al actuador mecánico con 5 voltios Postcondición El sistema de riego está en funcionamiento Excepciones Paso Acción n/a n/a Rendimiento Inferior a 5 segundos Frecuencia esperada Dependiente de las condiciones ambientales Importancia Alta Urgencia Alta Estado Validado Estabilidad Alta Comentarios n/a Tabla 34 - Caso de uso RF-17 Activar sistema de riego en Arduino 35
Miguel Angel Hernanz Hernanz RF-18 Desactivar sistema de riego en Arduino Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Objetivos asociados OBJ-04 Cambiar estado de los sistemas de riego y ventilación OBJ-06 Control automatizado de los sistemas de riego y ventilación Requisitos asociados RF-19 Recibir órdenes en Arduino RF-20 Enviar órdenes a Arduino Descripción Desactiva el sistema de riego accionando el actuador mecánico asociado Precondición Dispositivo Arduino en funcionamiento Conexión disponible con Arduino y aplicación de escritorio Conexión con servidor XAMPP Aplicación de escritorio en funcionamiento Secuencia normal Paso Acción p1 Se recibe un paquete UDP con la orden de desactivación del sistema de riego p2 Se desactiva el pin de salida asociado al actuador mecánico con 0 voltios Postcondición El sistema de riego no está en funcionamiento Excepciones Paso Acción n/a n/a Rendimiento Inferior a 5 segundos Frecuencia esperada Dependiente de las condiciones ambientales Importancia Alta Urgencia Alta Estado Validado Estabilidad Alta Comentarios n/a Tabla 35 - Caso de uso RF-18 Desactivar sistema de riego en Arduino 36
Miguel Angel Hernanz Hernanz RF-19 Recibir órdenes en Arduino Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Objetivos asociados OBJ-04 Cambiar estado de los sistemas de riego y ventilación OBJ-06 Control automatizado de los sistemas de riego y ventilación OBJ-08 Informar sobre las condiciones actuales del invernadero Requisitos asociados RF-11 Enviar lecturas a aplicación de escritorio RF-17 Activar sistema de riego RF-18 Desactivar sistema de riego RF-22 Activar sistema de ventilación RF-23 Desactivar sistema de ventilación RF-20 Enviar órdenes a Arduino Descripción Activa o desactiva los sistemas de riego y ventilación. Genera una petición de envío de lecturas a la IP asociada al paquete UDP. Precondición Dispositivo Arduino en funcionamiento Conexión disponible con Arduino y aplicación de escritorio Conexión con servidor XAMPP Aplicación de escritorio en funcionamiento Secuencia normal Paso Acción p1 Si existe un paquete UDP disponible en el buffer de entrada, se copia su contenido en la variable que mantiene la última orden activa. p2 El primer byte del mensaje se descarta p3 El sistema de riego se activa (1) o desactiva (0) según el segundo byte del mensaje p4 El sistema de ventilación se activa (1) o desactiva (0) usando el tercer byte del mensaje Postcondición El sistema de riego está en funcionamiento Excepciones Paso Acción p1 Si no hay un paquete UDP disponible, se mantiene la última orden recibida Rendimiento Inferior a 5 segundos Frecuencia esperada Cada 1.5 segundos Importancia Alta Urgencia Alta Estado Validado Estabilidad Alta Comentarios n/a Tabla 36 - Caso de uso RF-19 Recibir órdenes en Arduino 37
Miguel Angel Hernanz Hernanz RF-20 Enviar órdenes a Arduino Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Objetivos asociados OBJ-04 Cambiar estado de los sistemas de riego y ventilación OBJ-06 Control automatizado de los sistemas de riego y ventilación OBJ-08 Informar sobre las condiciones actuales del invernadero Requisitos asociados RF-19 Recibir órdenes en Arduino RF-24 Establecer conexión con Arduino RF-26 Comprobar condiciones Descripción Envía nuevas órdenes a la aplicación de escritorio Solicita el reenvío de las lecturas de sensores a la IP de origen del paquete UDP. Precondición Dispositivo Arduino en funcionamiento Conexión disponible con Arduino y aplicación de escritorio Conexión con servidor XAMPP Aplicación de escritorio en funcionamiento Secuencia normal Paso Acción p1 Si el usuario cambia el modo de control a modo automático, se evalúan las condiciones fijadas por el usuario en las variables monitorizadas y se asigna el valor numérico correspondiente a la orden a enviar (1=ON, 0=OFF) para cada sistema. p2 Si el usuario cambia el modo de control a modo manual, se asigna el valor numérico correspondiente a la orden a enviar (1=ON, 0=OFF) para cada sistema. p3 La aplicación de escritorio construye el paquete UDP a enviar con tres bytes: el primero será el valor 1 y a continuación seguirán las órdenes para el sistema de riego (0/1) y el sistema de ventilación (0/1). p4 El paquete UDP con las órdenes es enviado a la IP de Arduino Postcondición Arduino recibe las órdenes a ejecutar. Arduino envía las lecturas de los sensores a la IP de la aplicación de escritorio Excepciones Paso Acción * Si se han recibido órdenes en la aplicación de escritorio provenientes de la aplicación Android, se actualiza el estado y configuración del sistema de acuerdo a éstas, se guarda la configuración y se envían a Arduino Rendimiento Inferior a 5 segundos Frecuencia esperada Cada 1.5 segundos Importancia Alta Urgencia Alta Estado Validado Estabilidad Alta Comentarios n/a Tabla 37 - Caso de uso RF-20 Enviar órdenes a Arduino 38
Miguel Angel Hernanz Hernanz RF-21 Enviar órdenes a aplicación de escritorio Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Objetivos asociados OBJ-04 Cambiar estado de los sistemas de riego y ventilación OBJ-06 Control automatizado de los sistemas de riego y ventilación OBJ-08 Informar sobre las condiciones actuales del invernadero Requisitos asociados RF-29 Recibir órdenes desde Android RF-26 Comprobar condiciones RF-36 Establecer conexión ap. escritorio/Android RF-35 Salvar la configuración Descripción Envía nuevas órdenes a la aplicación de escritorio desde la aplicación Android Solicita el reenvío de las lecturas de sensores a la aplicación Android. Precondición Dispositivo Arduino en funcionamiento Conexión disponible con Arduino y aplicación de escritorio Conexión con servidor XAMPP Aplicaciones de escritorio y Android en funcionamiento Secuencia normal Paso Acción p1 Si el usuario cambia el modo de control a modo automático, se evalúan las condiciones fijadas por el usuario en las variables monitorizadas y se asigna el valor numérico correspondiente a la orden a enviar (1=ON, 0=OFF) para cada sistema. p2 Si el usuario cambia el modo de control a modo manual, se asigna el valor numérico correspondiente a la orden a enviar (1=ON, 0=OFF) para cada sistema. p3 La aplicación Android construye el paquete UDP a enviar con tres bytes: el primero indica si se ha modificado la configuración general en la aplicación Android (1) o simplemente se solicita el reenvío de las lecturas recibidas (0) y a continuación seguirán las órdenes para el sistema de riego (0/1) y el sistema de ventilación (0/1). p4 El paquete UDP con las órdenes es enviado a la aplicación de escritorio Postcondición Arduino recibe las órdenes a ejecutar. Arduino envía las lecturas de los sensores a la IP de la aplicación de escritorio Excepciones Paso Acción * Si se han efectuado cambios en la configuración de la aplicación de escritorio, se actualiza el estado y configuración del sistema recargando la configuración en la aplicación Android. Rendimiento Inferior a 5 segundos Frecuencia esperada Cada 1.5 segundos Importancia Alta Urgencia Alta Estado Validado Estabilidad Alta Comentarios n/a Tabla 38 - Caso de uso RF-21 Enviar órdenes a aplicación de escritorio 39
Miguel Angel Hernanz Hernanz RF-22 Activar sistema de ventilación en Arduino Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Objetivos asociados OBJ-04 Cambiar estado de los sistemas de riego y ventilación OBJ-06 Control automatizado de los sistemas de riego y ventilación OBJ-08 Informar sobre las condiciones actuales del invernadero Requisitos asociados RF-19 Recibir órdenes en Arduino RF-20 Enviar órdenes a Arduino Descripción Activa el sistema de ventilación accionando el actuador mecánico asociado Precondición Dispositivo Arduino en funcionamiento Conexión disponible con Arduino Conexión disponible con aplicación de escritorio Conexión con servidor XAMPP Aplicación de escritorio en funcionamiento Secuencia normal Paso Acción p1 Se recibe un paquete UDP con la orden de activación del sistema de ventilación en Arduino p2 Se activa el pin de salida asociado al actuador mecánico con 5 voltios Postcondición El sistema de ventilación está en funcionamiento Excepciones Paso Acción n/a n/a Rendimiento Inferior a 5 segundos Frecuencia esperada Dependiente de las condiciones ambientales Importancia Alta Urgencia Alta Estado Validado Estabilidad Alta Comentarios n/a Tabla 39 - Caso de uso RF-22 Activar sistema de riego en Arduino 40
Miguel Angel Hernanz Hernanz RF-23 Desactivar sistema de ventilación en Arduino Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Objetivos asociados OBJ-04 Cambiar estado de los sistemas de riego y ventilación OBJ-06 Control automatizado de los sistemas de riego y ventilación Requisitos asociados RF-19 Recibir órdenes en Arduino RF-20 Enviar órdenes a Arduino Descripción Desactiva el sistema de ventilación accionando el actuador mecánico asociado Precondición Dispositivo Arduino en funcionamiento Conexión disponible con Arduino Conexión disponible con aplicación de escritorio Conexión con servidor XAMPP Aplicación de escritorio en funcionamiento Secuencia normal Paso Acción p1 Se recibe un paquete UDP con la orden de desactivación del sistema de ventilación p2 Se desactiva el pin de salida asociado al actuador mecánico con 0 voltios Postcondición El sistema de ventilación no está en funcionamiento Excepciones Paso Acción n/a n/a Rendimiento Inferior a 5 segundos Frecuencia esperada Dependiente de las condiciones ambientales Importancia Alta Urgencia Alta Estado Validado Estabilidad Alta Comentarios n/a Tabla 40 - Caso de uso RF-23 Desactivar sistema de ventilación en Arduino 41
Miguel Angel Hernanz Hernanz RF-24 Establecer conexión con Arduino Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Objetivos asociados OBJ-01 Recibir información de sensores remotos OBJ-02 Mostrar información de sensores remotos OBJ-03 Almacenar información recibida OBJ-04 Cambiar estado de los sistemas de riego y ventilación OBJ-06 Control automatizado de los sistemas de riego y ventilación OBJ-08 Informar sobre las condiciones actuales del invernadero Requisitos asociados RF-34 Recibir lecturas de Arduino RF-20 Enviar órdenes a Arduino RF-33 Mostrar configuración de red Descripción Indica si hay comunicación disponible entre Arduino y la aplicación de escritorio Precondición Conexión con servidor XAMPP Aplicación de escritorio en funcionamiento Secuencia normal Paso Acción p1 La aplicación de escritorio envía paquetes UDP a la dirección IP de Arduino con las órdenes a ejecutar. p2 Se espera la respuesta del dispositivo Arduino en el socket de escucha UDP p3 La conexión se define activa si el número de paquetes esperados es menor o igual a dos Postcondición El sistema de riego no está en funcionamiento Excepciones Paso Acción p3 Si el número de paquetes esperados es mayor a dos, se muestra el menú de configuración de red Rendimiento Inferior a 3 segundos Frecuencia esperada Cada intervalo de solicitud de lecturas / envío de órdenes Importancia Alta Urgencia Alta Estado Validado Estabilidad Alta Comentarios n/a Tabla 41 - Caso de uso RF-24 Establecer conexión con Arduino 42
Miguel Angel Hernanz Hernanz RF-25 Mostrar datos de lecturas recibidas Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Objetivos asociados OBJ-01 Recibir información de sensores remotos OBJ-02 Mostrar información de sensores remotos OBJ-05 Mostrar el estado y modo de funcionamiento de los sistemas de riego y ventilación OBJ-08 Informar sobre las condiciones actuales del invernadero Requisitos asociados RF-34 Recibir lecturas de Arduino Descripción Muestra en la interfaz los datos de la última lectura recibida de Arduino Precondición Dispositivo Arduino en funcionamiento Conexión disponible con Arduino Conexión disponible con aplicación de escritorio Conexión con servidor XAMPP Aplicación de escritorio en funcionamiento Secuencia normal Paso Acción p1 La aplicación de escritorio recibe un paquete UDP conteniendo los valores de los sensores separados por comas p2 Si la aplicación Android está en funcionamiento, el paquete UDP es reenviado a la IP de la aplicación Android. p3 El contenido del paquete UDP es troceado y asignado a cada variable correspondiente usando el carácter coma como separador de valores. p4 Se muestra en pantalla el nombre de cada variable junto con el valor asignado Postcondición El usuario puede ver en la pantalla los datos de la última lectura recibida Excepciones Paso Acción p1 Si el paquete UDP no es de la longitud esperada, se sustituyen todos los datos por ceros y se muestra un error. p1 Si no se recibe ningún paquete, se muestra el menú de configuración de red o un mensaje de espera Rendimiento 1.5 segundos Frecuencia esperada Cada 1.5 segundos Importancia Alta Urgencia Alta Estado Validado Estabilidad Alta Comentarios n/a Tabla 42 - Caso de uso RF-25 Mostrar datos de lecturas recibidas 43
Miguel Angel Hernanz Hernanz RF-32 Cambiar intervalo de actualización de gráficos Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Objetivos asociados OBJ-08 Informar sobre las condiciones actuales del invernadero Requisitos asociados RF-31 Mostrar gráficos temporales de las variables Descripción Cambia el intervalo de dibujado/actualización de los gráficos temporales Precondición Dispositivo Arduino en funcionamiento Conexión disponible con Arduino Conexión disponible con aplicación de escritorio Conexión con servidor XAMPP Aplicación de escritorio en funcionamiento Secuencia normal Paso Acción p1 Se muestra en pantalla los selectores de actualización para cada unidad de tiempo (horas, minutos y segundos) p2 El usuario modifica el intervalo usando los botones de incremento y decremento en cada unidad de tiempo mostrada. p3 Se convierte cada intervalo modificado a milisegundos y se combinan en la variable encargada de controlar si se ha cumplido el intervalo de actualización de gráficos. Postcondición La configuración de actualización de gráficos temporales ha sido cambiada Excepciones Paso Acción N/a N/a Rendimiento No definido Frecuencia esperada No definido Importancia Alta Urgencia Alta Estado Validado Estabilidad Alta Comentarios n/a Tabla 49 - Caso de uso RF-32 Cambiar intervalo de actualización de gráficos 50
Miguel Angel Hernanz Hernanz RF-33 Mostrar configuración de red Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Objetivos asociados OBJ-01 Recibir información de sensores remotos OBJ-02 Mostrar información de sensores remotos OBJ-04 Cambiar el estado de los sistemas de riego y ventilación OBJ-05 Mostrar el estado y modo de funcionamiento de los sistemas de riego y ventilación OBJ-06 Control automatizado de los sistemas de riego y ventilación OBJ-08 Informar sobre las condiciones actuales del invernadero Requisitos asociados RF-36 Establecer conexión aplicación de escritorio/Android RF-24 Establecer conexión con Arduino Descripción Muestra la ventana de configuración de red al usuario Precondición Dispositivo Arduino en funcionamiento Conexión disponible con Arduino Conexión disponible con aplicación de escritorio Conexión con servidor XAMPP Aplicación de escritorio en funcionamiento Secuencia normal Paso Acción p1 Se muestra en pantalla la dirección IP usada para conectar a Arduino p2 El usuario introduce la nueva dirección IP y guarda los cambios pulsando ENTER. La nueva dirección IP introducida es usada para conectar. p3 Se muestra en pantalla el puerto usado para conectar a Arduino p4 El usuario introduce el nuevo puerto y guarda los cambios pulsando ENTER. El nuevo puerto se usa en la conexión. Postcondición Los datos usados para conectar a Arduino han sido cambiados (ap. Escritorio) Se muestra la pantalla de espera con la información de conexión (Android) Excepciones Paso Acción p2 En la aplicación Android, no se puede modificar la IP p4 En la aplicación Android, no se puede modificar el puerto Rendimiento Si el contador de paquetes esperados supera el límite de 2 (3 segundos) Frecuencia esperada No definido Importancia Alta Urgencia Alta Estado Validado Estabilidad Alta Comentarios n/a Tabla 50 - Caso de uso RF-33 Mostrar configuración de red 51
Miguel Angel Hernanz Hernanz RF-34 Recibir lecturas de Arduino Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Objetivos asociados OBJ-01 Recibir información de sensores remotos OBJ-02 Mostrar información de sensores remotos OBJ-05 Mostrar el estado y modo de funcionamiento de los sistemas de r/v OBJ-06 Control automatizado de los sistemas de riego y ventilación OBJ-08 Informar sobre las condiciones actuales del invernadero Requisitos asociados RF-26 Comprobar condiciones RF-25 Mostrar datos de lecturas recibidas RF-24 Establecer conexión con Arduino RF-31 Mostrar gráficos temporales de las variables RF-12 Reenviar lecturas a aplicación Android RF-15 Almacenar lecturas y estados en la base de datos Descripción Recibe las lecturas de los sensores enviadas por Arduino en la aplicación de escritorio Precondición Dispositivo Arduino en funcionamiento Conexión disponible con Arduino Conexión disponible con aplicación de escritorio Conexión con servidor XAMPP Aplicación de escritorio en funcionamiento Secuencia normal Paso Acción p1 La aplicación de escritorio mantiene un socket de escucha UDP en el puerto especificado. p2 Si recibe un paquete UDP procedente de la dirección IP de Arduino, se continua en el siguiente paso. p3 Si el tamaño del paquete UDP es correcto, se convierte la información contenida a una cadena de texto (se utiliza en otros procedimientos). p4 La cadena de texto es troceada usando el carácter “,” como separador de valores. Los valores son incorporados a los arrays de las variables en la posición correspondiente para dibujar los gráficos temporales (ver RF-31) p5 Se marca la conexión como activa y se reinicializa el contador de paquetes esperados a 0. Postcondición Los datos de los sensores enviados por Arduino son recibidos correctamente en la aplicación de escritorio Excepciones Paso Acción p2 Si el paquete procede de otra dirección IP, se reenvía la última lectura p3 Si el tamaño no es correcto, se usa el valor 0 en todos los campos Rendimiento 1.5 segundos Frecuencia esperada Una lectura recibida cada 1.5 segundos como máximo Importancia Alta Urgencia Alta Estado Validado Estabilidad Alta Comentarios n/a Tabla 51 - Caso de uso RF-34 Recibir lecturas de Arduino 52
Miguel Angel Hernanz Hernanz RF-35 Salvar la configuración Versión 1.0 Autores Miguel Angel Hernanz Hernanz Objetivos asociados OBJ-04 Cambiar el estado de los sistemas de riego y ventilación OBJ-05 Mostrar el estado y modo de funcionamiento de los sistemas de r/v OBJ-06 Control automatizado de los sistemas de riego y ventilación Requisitos asociados RI-03 Información sobre el método de control de los sistemas de riego y ventilación RI-04 Información sobre la configuración de rangos aceptables de variables RI-05 Información sobre el estado actual de las condiciones del invernadero RF-13 Guardar el estado de los sistemas de riego y ventilación RF-14 Guardar la configuración de los rangos aceptables RF-16 Guardar el estado actual de las condiciones RF-27 Configurar rangos aceptables RF-44 Establecer conexión con el servidor XAMPP RF-21 Enviar órdenes a aplicación escritorio Descripción Guarda la configuración y estado del sistema en el servidor XAMPP Precondición Dispositivo Arduino en funcionamiento Conexión disponible con Arduino Conexión disponible con aplicación de escritorio Conexión con servidor XAMPP Aplicación de escritorio en funcionamiento Secuencia normal Paso Acción p1 La aplicación de escritorio recopila la información relativa a los rangos aceptables de las variables monitorizadas en una cadena de texto. Cada valor se separa usando el caracter “;” y ocupa una determinada posición dentro de esta cadena. p2 Se añaden los códigos del modo de control de los sistemas de riego y ventilación a la cadena del paso 1 de acuerdo con el formato numérico recogido en la descripción del caso de uso RF-13 p3 La cadena de texto construida en los pasos 1 y 2 se guarda en el archivo config.txt en el servidor XAMPP p4 La aplicación de escritorio reúne los códigos de estado de las condiciones del invernadero separados por comas en una cadena de texto. p5 Se añade el estado actual de los sistemas de riego y ventilación con el código de estado asociado a cada uno (0=inactivo, 1=activo) p6 La cadena de texto construida en los pasos 4 y 5 se guarda en el archivo condiciones.txt en el servidor XAMPP Postcondición La configuración y el estado actual del sistema se ha guardado en los archivos correspondientes del servidor XAMPP Excepciones Paso Acción 3 y 4 Si el archivo no existe, se crea. Si existe, el contenido es sobrescrito Rendimiento 5 segundos máximo Frecuencia esperada Con cada cambio de condiciones o configuración Importancia Alta Urgencia Alta Estado Validado Estabilidad Alta Tabla 52 - Caso de uso RF-35 Salvar la configuración 53
Miguel Angel Hernanz Hernanz RF-36 Establecer conexión ap. escritorio/Android Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Objetivos asociados OBJ-01 Recibir información de sensores remotos OBJ-02 Mostrar información de sensores remotos OBJ-04 Cambiar el estado de los sistemas de riego y ventilación OBJ-05 Mostrar el estado y modo de funcionamiento de los sistemas de r/v OBJ-06 Control automatizado de los sistemas de riego y ventilación OBJ-08 Informar de las condiciones actuales del invernadero Requisitos asociados RF-12 Reenviar lecturas a aplicación Android RF-21 Enviar órdenes a aplicación de escritorio RF-30 Cargar la configuración RF-33 Mostrar configuración de red Descripción Indica si la conexión entre la aplicación de escritorio y la aplicación de Android está activa. Precondición Dispositivo Arduino en funcionamiento Conexión disponible con Arduino Conexión disponible con aplicación de escritorio Conexión con servidor XAMPP Aplicaciones de escritorio y Android en funcionamiento Secuencia normal Paso Acción p1 La aplicación Android lee la dirección IP a la que conectarse desde el archivo IP.txt del servidor XAMPP. p2 Se envía un paquete UDP a la dirección obtenida en el paso 1 p3 Se recibe un paquete UDP procedente de la dirección IP con la última lectura recibida de los sensores. p4 Se reinicializa a 0 el contador de paquetes esperados y se marca como activa la conexión. Postcondición La configuración y el estado actual del sistema se ha guardado en los archivos correspondientes del servidor XAMPP Excepciones Paso Acción p1 Si el archivo no existe, se aborta la ejecución de la aplicación Android p3 Si no se reciben paquetes UDP en el intervalo esperado, se incrementa el contador de paquetes esperados. p4 Si el contador de paquetes esperados supera el valor 2, se marca la conexión como inactiva y se muestra en pantalla la configuración de red. Rendimiento 3 segundos Frecuencia esperada Con cada recepción de lecturas Importancia Alta Urgencia Alta Estado Validado Estabilidad Alta Comentarios n/a Tabla 53 - Caso de uso RF-36 Establecer conexión ap. escritorio/Android 54
Miguel Angel Hernanz Hernanz RF-37 Generar página web Ultimas Lecturas Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Objetivos asociados OBJ-07 Consulta de información vía web OBJ-08 Informar de las condiciones actuales del invernadero Requisitos asociados RF-43 Obtener input de usuario Descripción Genera la página web con la información de las últimas lecturas en forma de gráficos ajustables por el usuario Precondición Conexión con servidor XAMPP (servicios MySQL y servidor web Apache) Secuencia normal Paso Acción p1 El usuario accede con su navegador a la sección Ultimas Lecturas de la web p2 Se genera la página web en el servidor usando el valor por defecto (1 hora) y se envía al navegador del usuario. p3 El usuario puede variar el intervalo temporal a mostrar en los gráficos seleccionando uno de los valores en la lista desplegable. Esto genera una petición al servidor web con el nuevo intervalo elegido. p4 El servidor consulta a la base de datos para extraer los datos requeridos por el usuario y los envía al navegador. Postcondición La página web solicitada se muestra en el navegador del usuario. Excepciones Paso Acción p2 Si se produce un error al consultar la base de datos, se muestra en pantalla Rendimiento Indeterminado Frecuencia esperada Indeterminado Importancia Alta Urgencia Alta Estado Validado Estabilidad Alta Comentarios El usuario puede desplazar el cursor del ratón por encima de los gráficos para obtener valores mas precisos. Tabla 54 - Caso de uso RF-37 Generar página web Ultimas Lecturas 55
Miguel Angel Hernanz Hernanz RF-38 Generar página web Estadísticas Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Objetivos asociados OBJ-07 Consulta de información vía web OBJ-08 Informar de las condiciones actuales del invernadero Requisitos asociados RF-43 Obtener input de usuario Descripción Genera la página web con la información gráfica sobre la evolución de las variables monitorizadas y el estado de los sistemas a lo largo de un periodo de tiempo modificable por el usuario. Precondición Conexión con servidor XAMPP (servicios MySQL y servidor web Apache) Secuencia normal Paso Acción p1 El usuario accede con su navegador a la sección Estadísticas de la web p2 Se genera la página web en el servidor usando el valor por defecto (medio día) y se envía al usuario. p3 El usuario puede variar el intervalo temporal a mostrar en el gráfico de estadísticas, así como seleccionar las variables a mostrar. Esto genera una petición al servidor web con las opciones escogidas por el usuario. p4 El servidor consulta a la base de datos para extraer los datos requeridos por el usuario y los envía al navegador. Postcondición La página web solicitada se muestra en el navegador del usuario. Excepciones Paso Acción p2 Si se produce un error al consultar la base de datos, se muestra en pantalla Rendimiento Indeterminado Frecuencia esperada Indeterminado Importancia Alta Urgencia Alta Estado Validado Estabilidad Alta Comentarios n/a Tabla 55 - Caso de uso RF-38 Generar página web Estadísticas 56
Miguel Angel Hernanz Hernanz RF-39 Generar página web Temperaturas Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Objetivos asociados OBJ-07 Consulta de información vía web OBJ-08 Informar de las condiciones actuales del invernadero Requisitos asociados RF-43 Obtener input de usuario Descripción Genera la página web con la información disponible sobre la evolución de las temperaturas del invernadero en un intervalo modificable por el usuario. Precondición Conexión con servidor XAMPP (servicios MySQL y servidor web Apache) Secuencia normal Paso Acción p1 El usuario accede con su navegador a la sección Temperaturas de la web p2 Se genera la página web en el servidor usando el valor por defecto (un día) y se envía al usuario p3 El usuario puede variar el intervalo temporal a mostrar introduciendo un valor en el campo Número de días. Esto genera una petición al servidor web con el intervalo de días escogido por el usuario. p4 El servidor consulta a la base de datos para extraer los datos requeridos por el usuario y los envía al navegador. Postcondición La página web solicitada se muestra en el navegador del usuario. Excepciones Paso Acción p2 Si se produce un error al consultar la base de datos, se muestra en pantalla Rendimiento Indeterminado Frecuencia esperada Indeterminado Importancia Alta Urgencia Alta Estado Validado Estabilidad Alta Comentarios n/a Tabla 56 - Caso de uso RF-39 Generar página web Temperaturas 57
Miguel Angel Hernanz Hernanz RF-40 Generar página web Consumo de Agua Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Objetivos asociados OBJ-07 Consulta de información vía web OBJ-08 Informar de las condiciones actuales del invernadero Requisitos asociados RF-42 Obtener datos de la base de datos Descripción Genera la página web con la información disponible sobre el nivel actual de agua en el depósito de riego, el consumo total y medio y la previsión de duración del agua para riego en base al consumo y el nivel restante. Precondición Conexión con servidor XAMPP (servicios MySQL y servidor web Apache) Secuencia normal Paso Acción p1 El usuario accede con su navegador a la sección Consumo de Agua de la web p2 Se genera la página web en el servidor usando los datos obtenidos de la base de datos. p3 Se envía la página web al navegador del usuario Postcondición La página web solicitada se muestra en el navegador del usuario. Excepciones Paso Acción p2 Si se produce un error al consultar la base de datos, se muestra en pantalla Rendimiento Indeterminado Frecuencia esperada Indeterminado Importancia Alta Urgencia Alta Estado Validado Estabilidad Alta Comentarios n/a Tabla 57 - Caso de uso RF-40 Generar página web Consumo de Agua 58
Miguel Angel Hernanz Hernanz RF-41 Generar página web Estado Actual Versión 1.0 Autores Miguel Angel Hernanz Hernanz Fuentes n/a Objetivos asociados OBJ-07 Consulta de información vía web OBJ-08 Informar de las condiciones actuales del invernadero Requisitos asociados RF-43 Obtener estados y condiciones Descripción Genera la página web con la información disponible sobre el nivel actual de agua en el depósito de riego, el consumo total y medio y la previsión de duración del agua para riego en base al consumo y el nivel restante. Precondición Conexión con servidor XAMPP (servicios MySQL y servidor web Apache) Secuencia normal Paso Acción p1 El usuario accede con su navegador a la sección Estado Actual de la web p2 El servidor lee las condiciones actuales del archivo condiciones.txt y la configuración del archivo config.txt p3 El servidor asocia a cada condición y estado la imagen correspondiente en función del código numérico asignado. p4 El servidor obtiene los estados y las condiciones de la última lectura registrada en la base de datos. p5 La página web generada con toda la información de los pasos anteriores se envía al navegador del usuario. Postcondición La página web solicitada se muestra en el navegador del usuario. Excepciones Paso Acción p2 Si se produce un error al consultar la base de datos, se muestra en pantalla Rendimiento Indeterminado Frecuencia esperada Indeterminado Importancia Alta Urgencia Alta Estado Validado Estabilidad Alta Comentarios Esta página se autorefresca cada 30 segundos para obtener la última información recibida en el sistema. Tabla 58 - Caso de uso RF-41 Generar página web Estado Actual 59
Miguel Angel Hernanz Hernanz 2 ESPECIFICACIÓN FUNCIONAL DEL SISTEMA 2.1 MODELO DE PROCESOS DEL SISTEMA En este apartado se abordan las funciones del sistema desde el punto de vista del desarrollador, donde se define qué debe hacer el sistema internamente para cumplir los objetivos y funciones recogidos en los requisitos. En primer lugar se presentan los Diagramas de Flujo de Datos (DFD) en los que se muestra la circulación de la información dentro del sistema. En el Diagrama de Flujo de Datos de nivel 0, también llamado Diagrama de Contexto, se indican las interacciones que realiza el sistema con las entidades externas del entorno, ofreciendo una visión general del sistema a nivel relacional. Para detallar mas en profundidad los diversos subsistemas y el intercambio de información entre ellos, se emplean Diagramas de Flujo de Datos a mas bajo nivel, útiles para apreciar qué relaciones son establecidas y la información con la que trabaja cada elemento de forma mas específica. 66 Ilustración 7 - Diagrama de Contexto del sistema - Nivel 0 Ilustración 8 - Diagrama de Flujo de Datos - Nivel 1
Miguel Angel Hernanz Hernanz 67 Ilustración 10 - Diagrama del Flujo de Datos - Nivel 2 - Gestión de órdenes Ilustración 11 - Diagrama del Flujo de Datos - Nivel 2 - Procesado de datos Ilustración 9 - Diagrama de Flujo de Datos - Nivel 2 - Control de los sistemas del invernadero
Miguel Angel Hernanz Hernanz 68 Ilustración 12 - Diagrama del Flujo de Datos - Nivel 2 - Gestión de lecturas Ilustración 13 - Diagrama del Flujo de Datos - Nivel 2 – Control de condiciones
Miguel Angel Hernanz Hernanz Se ha optado por desarrollar los Diagramas de Flujo de Datos hasta el nivel 2 para cada nodo mostrado en el DFD-Nivel 1, pues este nivel ofrece una buena visión del intercambio de información en forma bastante concisa pero sin entrar en el nivel de detalle de niveles siguientes que supondrían explotar cada nodo de nivel 2 a un árbol demasiado grande y complejo. 2.2 MODELO DE DATOS DEL SISTEMA El modelo de datos del sistema tiene como objetivo describir las estructuras de datos que existen en el sistema y la forma en que se relacionan, así como las operaciones que se pueden efectuar sobre los datos. Para describir estas estructuras se emplean Diagramas de Entidad-Relación (DER) con los que se representan gráficamente las entidades relevantes del sistema de información junto a las interrelaciones y propiedades correspondientes. En la siguiente ilustración aparece representado el diagrama Entidad-Relación del sistema Hortduino. 69 Ilustración 14 - Diagrama del Flujo de Datos - Nivel 2 - Sistema de información
Miguel Angel Hernanz Hernanz En el diagrama de la ilustración anterior se han obviado algunos atributos de poca importancia para el sistema de datos como pueden ser direcciones IP y puertos con objeto de simplificar y facilitar la lectura del diagrama Entidad-Relación. En este proyecto se ha optado por una aproximación mixta en lo referente al almacenamiento persistente de los diferentes datos usados por el sistema: mientras que las lecturas enviadas desde los sensores son almacenadas por la aplicación de escritorio en una base de datos para facilitar su posterior tratamiento, las configuraciones y estado actual del invernadero son almacenados en sendos archivos de texto, requeridos para el inicio y configuración de las aplicaciones de escritorio y Android. 70 Ilustración 15 - Diagrama Entidad-Relación del sistema
Miguel Angel Hernanz Hernanz 3 DISEÑO DEL SISTEMA 3.1 DISEÑO DE LA BASE DE DATOS Con la información disponible en el diagrama Entidad-Relación, se procede al diseño de la base de datos destinada a almacenar la información enviada desde el dispositivo Arduino. Para cada variable, se tiene en cuenta el rango máximo que pueden alcanzar los valores que ofrece cada sensor para asignar el tipo de campo correspondiente. Dado que únicamente se considera la entidad Array de sensores como objeto de almacenaje, será necesaria una única tabla para pasar del modelo Entidad-Relación al modelo relacional. Además de la información procedente de las lecturas, la base de datos utilizará dos campos extra, añadidos para posibilitar consultas mas específicas: un índice, que se asignará de manera unívoca a cada registro añadido a la base de datos y será la clave primaria para acceder a la tabla, y la marca de tiempo (time stamp) en la que se incorpora el nuevo registro a la base de datos. A partir de lo anterior, la estructura de las tablas de la base de datos se ha establecido de la siguiente forma: Tablas lecturas y actual Columna Tipo Nulo Predeterminado Enlaces a Comentarios Indice int(11) No - lecturas→Indice Único, autoincremento Fecha timestamp No CURRENT_TIMESTAMP Luminosidad int(4) No - TempExterior float No - TempInterior int(3) No - HumAmbiente int(3) No - HumSuelo int(4) No - NivelAgua int(4) No - EstadoRiego int(1) No - EstadoVent int(1) No - Tabla 68 - Estructura interna de la base de datos La tabla actual de la base de datos es la encargada de almacenar la lectura mas reciente enviada por Arduino. Posee una estructura idéntica a la tabla lecturas, en la que se almacenan todas las lecturas recibidas, pero con la peculiaridad de que sólo es usado un registro que se actualiza con la nueva información recibida de forma mas regular que en la tabla lecturas. 71
Miguel Angel Hernanz Hernanz 3.2 DISEÑO DE LOS ARCHIVOS DE CONFIGURACIÓN Los archivos de configuración son los encargados de almacenar la configuración de los rangos aceptables para las condiciones supervisadas y el modo de control de los sistemas de riego y ventilación, todo ello basado en la elección del usuario. El formato usado en cada uno de ellos es el de valores numéricos separados mediante un caracter delimitador (coma o punto y coma), todo ello en una única línea de texto plano. El orden específico en el que se aparecen los valores se asocia a cada variable mediante el siguiente convenio: Archivo config.txt <luminosidad>;<temperatura interior>;<temperatura exterior>;<humedad ambiental>;<humedad del suelo>;<nivel de agua>;<modo de control sistema riego>;<modo de control sistema ventilación>; El código asociado a los modos de control de los sistemas de riego y ventilación establece las siguientes convenciones: •0 : El sistema se establece en modo apagado (OFF) manualmente por el usuario •1 : El sistema se establece en modo encendido (ON) manualmente por el usuario •2 : El sistema se establece en modo de funcionamiento automático (AUTO) y actúa en base a la configuración aceptable de rangos que el usuario ha establecido. Archivo condiciones.txt <estado temperatura interior>,<estado temperatura exterior>,<estado humedad ambiental>,<estado humedad del suelo>,<estado nivel de agua>,<actividad sistema de riego>,<actividad sistema de ventilación> El código interno para representar cada estado se establece en lo siguiente: •-1 : El estado actual indica que no se alcanza el valor mínimo establecido para esa variable • 0 : El estado actual indica una situación normal (dentro de los rangos permitidos) • 1 : El estado actual indica que se ha sobrepasado el límite máximo fijado para esa variable Para indicar la actividad de los sistemas de riego y ventilación se utiliza el valor 1 si el sistema en cuestión se encuentra activo en ese momento y el valor 0 en caso contrario. Archivo ip.txt Este archivo contiene la dirección IP de la aplicación de escritorio. Es necesario para indicar a la aplicación Android la dirección a la cual tiene que solicitar el reenvío de las lecturas y se genera mediante la invocación del script PHP getip.php que escribe en el archivo una línea de texto con formato de dirección IP (cuatro grupos de tres dígitos, separados por puntos) 72
Miguel Angel Hernanz Hernanz 3.3 DISEÑO DE LAS APLICACIONES 3.3.1 DIAGRAMA DE PAQUETES En la anterior ilustración se puede ver la división en paquetes del sistema Hortduino y sus dependencias. Los paquetes representan las capacidades disponibles en el sistema y muestran en su interior las herramientas encargadas de las funciones en cada caso. Para las labores de monitorización, la aplicación de escritorio es la encargada de las funciones de supervisión de las condiciones del invernadero, recibidas en las lecturas que el dispositivo Arduino envía a dicha aplicación de forma periódica. Las funciones de control pueden ser ejecutadas por la aplicación de escritorio o bien por la aplicación para dispositivos Android actuando a través de la aplicación de escritorio. Por último, las tareas sobre manejo de información pueden ser efectuadas por las aplicaciones de escritorio y Android (para visualizar datos en tiempo real y guardar la información recibida en la base de datos), y por la página web si se desea consultar la información almacenada en la base de datos. La aplicación de escritorio es la pieza fundamental del sistema, ya que interviene en las tres funciones básicas que presenta el sistema Hortduino. 73 Ilustración 16 - Diagrama de paquetes
Miguel Angel Hernanz Hernanz 3.3.2 DIAGRAMA DE FLUJO DEL DISPOSITIVO ARDUINO 74 Ilustración 17: Diagrama de flujo del dispositivo Arduino
Miguel Angel Hernanz Hernanz 3.3.3 DIAGRAMA DE FLUJO DE LA APLICACIÓN DE ESCRITORIO 75 Ilustración 18 - Diagrama de flujo de la aplicación de escritorio