Source: http://docplayer.es/1252362-Adquisicion-de-la-temperatura-media-de-un-edificio-mediante-comunicacion-inalambrica.html
Timestamp: 2017-04-26 22:26:30+00:00

Document:
ADQUISICIÓN DE LA TEMPERATURA MEDIA DE UN EDIFICIO MEDIANTE COMUNICACIÓN INALÁMBRICA - PDF
Download "ADQUISICIÓN DE LA TEMPERATURA MEDIA DE UN EDIFICIO MEDIANTE COMUNICACIÓN INALÁMBRICA"
Julio Muñoz Mora
1 ESCUELA POLITÉCNICA SUPERIOR UNIVERSIDAD DE BURGOS ADQUISICIÓN DE LA TEMPERATURA MEDIA DE UN EDIFICIO MEDIANTE COMUNICACIÓN INALÁMBRICA GRADO EN ELECTRÓNICA INDUSTRIAL Y AUTOMÁTICA AUTOR: Óscar González Díez TUTOR: Miguel Ángel Lozano Pérez JULIO DE 2014 2 UNIVERSIDAD DE BURGOS ESCUELA POLITÉCNICA SUPERIOR GRADO EN INGENIERÍA ELECTRÓNICA INDUSTRIAL Y AUTOMÁTICA TRABAJO FIN DE GRADO RESUMEN DEL TRABAJO FIN DE GRADO Título: Adquisición de la temperatura media de un edificio mediante comunicación inalámbrica. Autor: Óscar González Díez Tutor: Miguel Ángel Lozano Pérez RESUMEN Desarrollo de un sistema electrónico compuesto por dos dispositivos (maestro y esclavo) cuyo objetivo es adquirir la temperatura media de un edificio y que alcance la temperatura deseada mediante una señal de control que enviaremos a sus calderas. Podremos visualizar las temperaturas adquiridas y modificar la temperatura deseada desde el dispositivo maestro o a través de Internet desde una página web o aplicación Android. ABSTRACT Development of an electronic system composed of two devices (master and slave) whose objective is to acquire the average temperature of a building and it reaches the desired temperature by a control signal that we will send to their boilers. We can visualize the acquired temperatures and modify the desired temperature from the master device or online from a website or an Android app. Avda. Cantabria, s/n Burgos3 Contenido del Trabajo de Fin de Grado El presente proyecto ha sido realizado bajo la supervisión del Departamento de Electrónica de Ingeniería Técnica Industrial de la Escuela Universitaria Politécnica Superior de Burgos. Dicho proyecto ha sido realizado por el alumno Óscar González Díez bajo la tutoría de D. Miguel Ángel Lozano. El objetivo principal del proyecto es gobernar unas calderas de un edificio (por ejemplo un hotel de dos plantas) mediante un dispositivo maestro que además realizará la medida de la temperatura media del edificio en conjunto con un dispositivo esclavo. En la elaboración del sistema se ha elegido la plataforma de hardware libre Arduino, por la variedad de modelos y su gran versatilidad. El sistema mediante los dispositivos creados realizará la adquisición de temperatura mediante un termistor. El dispositivo esclavo se la transmitirá al maestro a través de ZigBee o Bluetooth. Para facilitar las conexiones y reducir el cableado al máximo se realizarán las placas de circuito impreso necesarias (por ejemplo una shield para el dispositivo esclavo). Podremos visualizar las temperaturas medidas, así como modificar la temperatura deseada desde el dispositivo maestro (que incorpora una shield con LCD y botones) o a través de Internet gracias a la unión de dos Servicios Web: Xively y Temboo. Xively nos sirve para almacenar en la nube la información proveniente del dispositivo maestro y poder manejarla directamente desde su propia página web o a través de un smarthone mediante una aplicación para Android creada específicamente para este proyecto. Por otro lado Temboo tiene como función facilitar la comunicación de nuestra placa de Arduino del dispositivo maestro y de nuestra aplicación Android con la nube creada en Xively. Avda. Cantabria, s/n Burgos4 ÍNDICE DE CONTENIDO 1. MEMORIA MEMORIA DESCRIPTIVA Antecedentes y objetivo del proyecto Descripción del proyecto Componentes principales del sistema Componentes secundarios del sistema Comunicación entre dispositivos principales Descripción y justificación de la solución adoptada Introducción Dispositivo maestro Dispositivo esclavo Sensor de temperatura Módulos de comunicación entre maestro-esclavo Interacción física con el dispositivo maestro Eliminación de barreras físicas Presupuestos ANEJO I: DATOS DE PARTIDA ANEJO II: ARDUINO Introducción Arduino UNO R Arduino Yún Entorno de Desarrollo Diagrama de pines Arduino UNO Diagrama de pines Arduino Yún... 255 1.4. ANEJO III: COMPONENTES Termistor DS18B Shield LCD + Keypad Módulos Bluetooth HC-05 y HC Módulos Zigbee MRF24J40MA ANEJO IV: SERVICIOS WEB ANEJO V: DESARROLLO DE LOS DISPOSITIVOS Sublime Text Dispositivo esclavo Codigo Fuente Arduino UNO Dispositivo maestro Código Fuente Arduino Yún Indicaciones para el cableado del Arduino Yún Servicio NO-IP ANEJO VI: DISEÑO DE LAS PCB ANEJO VII: ANDROID Android Studio Interfaz de Usuario Notificaciones Android Tareas en Segundo Plano Emulación de la Aplicación Generar la Aplicación Ejecutable APK Desarrollo de la Aplicación para Android Código fuente de la Aplicación para Android REFERENCIAS... 996 2. PLANOS PRESUPUESTO Partidas Alzadas a Jutificar Diseño de los dispositivos Diseño de la Aplicación para Android Mediciones Cuadro de Precios Nº Cuadro de Precios Nº Presupuesto de Ejecución Material Presupuesto de Ejecución por Contrata PLIEGO DE CONDICIONES Pliego de Prescripciones Técnicas Generales Pliego de Prescripciones Técnicas Particulares CAPÍTULO 1: Condiciones Generales CAPÍTULO 2: Condiciones de Uso CAPÍTULO 3: Especificaciones Facultativas CAPÍTULO 4: Condiciones que deben reunir los materiales CAPÍTULO 5: Proceso de Fabricación CAPÍTULO 6: Cláusulas de garantía y plazos de ejecución CAPÍTULO 7: Cláusulas legales7 ÍNDICE DE ILUSTRACIONES Ilustración 1. Arduino Yún (www.arduino.cc) Ilustración 2. Arduino UNO (www.arduino.cc) Ilustración 3. Dallas DS18B20 (www.bricogeek.com) Ilustración 4. LCD Keypad Shield 16x2 HD44780 (www.ajpdsoft.com) Ilustración 5. RF Transceiver Module MRF24J40MA (www.media.digikey.com) Ilustración 6. Bluetooth Module HC-05 Master-Slave (www.ebay.com) Ilustración 7. Bluetooth Module HC-06 Slave (www.ebay.com)... 3 Ilustración 8. Esquema de comunicaciones Ilustración 9. Shield LCD + Keypad en un Arduino UNO (www.ebay.com) Ilustración 10. Logo Arduino (www.arduino.cc) Ilustración 11. Comunicación entre ATmega32u4 y AR9331 (www.arduino.cc) Ilustración 12. Esquema de componentes del Yún (www.arduino.cc) Ilustración 13. Leds en Arduino Yún (www.arduino.cc) Ilustración 14. Esquema de botones de reset del Yún (www.arduino.cc) Ilustración 15. SSID del Arduino Yún Ilustración 16. Conectándose al Arduino Yún Ilustración 17. Menú de autentificación Ilustración 18. Menú principal de configuración Ilustración 19. Aviso de configuración Ilustración 20. Menú principal de configuración una vez conectado Ilustración 21. Entorno de Desarrollo Ilustración 22. Elección de Placa y Puerto Ilustración 23. Memoria utilizada en un sketch BareMinimum Ilustración 24. Ventana del Monitor Serie Ilustración 25. Diagrama de Pines Arduino UNO (www.giltesa.com) Ilustración 26. Diagrama de Pines Arduino Yún (www.giltesa.com) Ilustración 27. Sensor DS18B20 de Dallas (www.tallerarduino.com) Ilustración 28. Conexiones para el Termistor DS18B Ilustración 29. Referencia de pines de la shield (www.dfrobot.com) Ilustración 30. Elementos de la shield (www.dfrobot.com) Ilustración 31. Pines torneados tipo hembra (www.electronicabf.com) Ilustración 32. HC-05 & HC-06 (www.diymakers.es) Ilustración 33. Conexiones del módulo HC Ilustración 34. Vinculación y recepción Bluetooth Ilustración 35. Conexiones para la configuración del HC Ilustración 36. Diagrama de pines MRF24J40MA (Datasheet MRF24J40MA) Ilustración 37. Esquema de conexiones MRF24J40MA Ilustración 38. Canales en Xively Ilustración 39. Sublime Text Ilustración 40. Compilación del código para Arduino UNO (Versión Bluetooth) Ilustración 41. Compilación del código para Arduino UNO (Versión Zigbee) Ilustración 42. Compilación del código para Arduino Yún (Versión Bluetooth) Ilustración 43. Compilación del código para Arduino Yún (Versión Zigbee) Ilustración 44. Configuración módem Thomson STx6v Ilustración 45. Configuración TP-Link TL-WR941N Ilustración 46. Conexión SSH con el Arduino Yún Ilustración 47. Conexión SFTP con el Arduino Yún8 Ilustración 48. Modificación del archivo uhttpd Ilustración 49. Configuración Servicio NO-IP Ilustración 50. Esquema de conexiones para la shield en Eagle Ilustración 51. Diseño de la PCB para la shield en Eagle Ilustración 52. PCB de la shield Ilustración 53. Shield conectada al Arduino UNO Ilustración 54. PCB de la placa para el Arduino Yún Ilustración 55. Placa montada y conectada al Arduino Yún Ilustración 56. PCB de la placa para del MRF24J40MA Ilustración 57. Placa del MRF24J40MA montada Ilustración 58. Nuevo proyecto en Android Studio Ilustración 59. Estructura proyecto Android Studio Ilustración 60. Interfaz gráfica de diseño de Android Studio Ilustración 61. Creación de AVD en Android Studio Ilustración 62. Selección del tipo de emulación en Android Studio Ilustración 63. Creación del archivo APK en Android Studio Ilustración 64. Logo de la aplicación Android Ilustración 65. Interfaz diseñada y en funcionamiento9 MEMORIA10 1. MEMORIA 1.1. MEMORIA DESCRIPTIVA Antecedentes y objetivo del proyecto. La domótica, se define como la integración de la tecnología en el diseño inteligente de un recinto cerrado. Los servicios que ofrece se agrupan en: Programación y ahorro energético Confort Seguridad Comunicaciones Accesibilidad En España existen empresas que se dedican a la fabricación de equipamiento homologado de acuerdo a los estándares internacionales, así como empresas dedicadas a la implantación de estos sistemas desde hace más de 14 años [1]. El objetivo del proyecto es diseñar un sistema que permita adquirir la temperatura media de un hotel de dos plantas, así como gobernar las calderas. La idea del proyecto está concretamente pensada para hoteles situados en zonas frías, que cierran en invierno y tienen que tener especial cuidado de mantener una temperatura media mínima para que las tuberías no se congelen y evitar averías mayores. Por lo tanto, por razones de accesibilidad el sistema se ha de diseñar para que se pueda interactuar con él a larga distancia además de in situ. Memoria Descriptiva 1 de 13411 Descripción del proyecto. El objetivo es comunicar de manera estable y en tiempo real dos placas de Arduino, una maestra y otra esclava; y a su vez comunicar la maestra con Internet para poder interactuar con un ordenador o un smartphone Componentes principales del sistema Arduino maestro Ilustración 1. Arduino Yún (www.arduino.cc). Arduino esclavo Ilustración 2. Arduino UNO (www.arduino.cc) Componentes secundarios del sistema Sensor de temperatura (termistor) Ilustración 3. Dallas DS18B20 (www.bricogeek.com). Memoria Descriptiva 2 de 12412 Pantalla LCD + Keypad Ilustración 4. LCD Keypad Shield 16x2 HD44780 (www.ajpdsoft.com). Módulo transceptor de Radio Frecuencia o módulo Bluetooth Ilustración 5. RF Transceiver Module MRF24J40MA (www.media.digikey.com). Ilustración 6. Bluetooth Module HC-05 Master-Slave (www.ebay.com). Ilustración 7. Bluetooth Module HC-06 Slave (www.ebay.com). Memoria Descriptiva 3 de 124 13 Comunicación entre dispositivos principales Maestro Esclavo Ilustración 8. Esquema de comunicaciones. Memoria Descriptiva 4 de 12414 Descripción y justificación de la solución adoptada Introducción Este proyecto se va a basar en Arduino, que es una plataforma de electrónica abierta (hardware libre) para la creación de prototipos basada en software y hardware flexibles y fáciles de usar. Se creó para artistas, diseñadores, aficionados y cualquiera interesado en crear entornos u objetos interactivos. Arduino puede tomar información del entorno a través de sus pines de entrada de toda una gama de sensores y puede afectar aquello que le rodea controlando luces, motores y otros actuadores. Además tiene multitud de shields, que son circuitos impresos que facilitan la conexión de sensores, relés, LCD, etc. El microcontrolador en la placa Arduino se programa mediante el lenguaje de programación Arduino (basado en C/C++) y el entorno de desarrollo Arduino (basado en Processing) que para proyectos sencillos está bien pero cuando queremos realizar algún proyecto más complejo como es el caso no es suficiente, por lo que utilizaremos el entorno Sublime Text con el Package Arduino-like IDE, que nos aporta las características que necesitaremos del entorno original. Los proyectos hechos con Arduino pueden ejecutarse sin necesidad de conectar a un ordenador, solo necesitándolo para su programación [2] Dispositivo maestro De la gama de placas Arduino, la que mejor se ajusta a las características que queremos para nuestro dispositivo maestro es el Arduino Yún, una placa similar al Arduino Leonardo pero que incorpora conector USB estándar, un slot para tarjetas microsd, WiFi y conectividad Ethernet; por lo que nos permite utilizar el shield de LCD + Keypad que hubiera sido imposible de combinar con la shield WiFi. Además es la primera placa Arduino que incluye Linux, en concreto una distribución llamada Linino basada en OpenWRT; por lo que es similar a un Router WiFi. Es decir, que por un lado contamos con toda la conectividad y capacidad de desarrollo de un Arduino y por el otro con una máquina Linux, lo que hace que podamos ejecutar comandos, aplicaciones o scripts en el lado Linux mientras que utilizamos su conectividad Ethernet y WiFi. Para facilitar la programación web, incluye una librería puente (bridge) que conecta las transacciones HTTP entre los dos lados (Linux y microcontrolador), lo que facilita muchísimo el uso de Servicios Web [3]. Memoria Descriptiva 5 de 12415 Dispositivo esclavo En este caso, entre la gama de placas Arduino tenemos varias que reúnen las características necesarias; pero sin duda la Arduino UNO R3 es una elección acertada ya que es una opción barata y existe multitud de información en Internet de este modelo (no es así en el caso del modelo Yún) por lo que podemos solventar problemas más fácilmente aprovechando su similitud con el Arduino Yún a la hora de comprobar errores Sensor de temperatura El termistor elegido es el Dallas DS18B20 que se comunica de forma digital, con una precisión de 9 a 10 bits desde -55C a 125C con un margen de error de tan solo 0.5 ºC. [4] La ventaja principal que presentan estos sensores es que cada sensor incorpora de fábrica un número de serie de 64 bits que permite que conectar hasta 100 dispositivos a un único pin y a una distancia máxima de nuestro Arduino de 200 metros. Dichos sensores emplean el protocolo de comunicación en serie 1-wire [5] Módulos de comunicación entre maestro-esclavo Ante la diversidad de opciones disponibles se han seleccionado Zigbee (estándar IEEE ) y Bluetooth (estándar IEEE ) como las especificaciones a utilizar en nuestro proyecto. ZigBee es el nombre de la especificación de un conjunto de protocolos de alto nivel de comunicación inalámbrica para su utilización con radiodifusión digital de bajo consumo y funciona en la banda de 2,4 GHz. Su objetivo son las aplicaciones que requieren comunicaciones seguras con baja tasa de envío de datos y maximización de la vida útil de sus baterías. Además de su bajo consumo ofrece una fácil integración (se fabrican nodos con muy poca electrónica) así como topología de red en malla, estrella o árbol [1]. El módulo más popular para utilizar con Arduino es el Xbee por su interfaz USART que facilita la puerta en marcha, pero también es caro; sobre todo si queremos incluir gran cantidad de esclavos. Por lo tanto es preferible utilizar un módulo como el MRF24J40MA, con menor consumo de corriente, mayor sensibilidad y un costo menor que el Xbee, con la única desventaja del uso de la interfaz SPI [6]. Memoria Descriptiva 6 de 12416 El Bluetooth es un estándar de comunicación inalámbrica que permite la transmisión de datos a través de radiofrecuencia en la banda de 2,4 GHz. Existen muchos módulos Bluetooth para usarlos en nuestros proyectos de electrónica, pero los más utilizados son los módulos de JY-MCU, ya que son muy económicos y fáciles de encontrar en el mercado. Son módulos pequeños y con un consumo muy bajo que nos permitirán agregar funcionalidades Bluetooth a nuestro Arduino. Estos módulos contienen el chip con una placa de desarrollo con los pins necesarios para la comunicación serie. Existen dos modelos de módulos Bluetooth: el HC-05 que puede ser maestro/esclavo, y el HC-06 que solo puede actuar como esclavo. La diferencia entre maestro y esclavo es que en modo esclavo es el dispositivo quien se conecta al módulo, mientras que en modo maestro es el módulo quien se conecta con un dispositivo [7]. ZigBee es muy similar al Bluetooth pero con algunas diferencias y ventajas para domótica como: Una red ZigBee puede constar de un máximo de nodos distribuidos en subredes de 255 nodos, frente a los ocho máximos de una subred (Piconet) Bluetooth. Zigbee tiene más alcance que Bluetooth. Menor consumo eléctrico que el de Bluetooth. En términos exactos, ZigBee tiene un consumo de 30 ma transmitiendo y de 3 μa en reposo, frente a los 40 ma transmitiendo y 0,2 ma en reposo que tiene el Bluetooth. Este menor consumo se debe a que el sistema ZigBee se queda la mayor parte del tiempo dormido, mientras que en una comunicación Bluetooth esto no se puede dar, y siempre se está transmitiendo y/o recibiendo. Tiene una velocidad de hasta 250 kbit/s, mientras que en Bluetooth es de hasta 3000 kbs. Debido a las velocidades de cada uno, uno es más apropiado que el otro para ciertas cosas. Por ejemplo, mientras que el Bluetooth se usa para aplicaciones como los teléfonos móviles y la informática casera, la velocidad del ZigBee se hace insuficiente para estas tareas, desviándolo a usos tales como la Domótica, los productos dependientes de la batería, los sensores médicos, y en artículos de juguetería, en los cuales la transferencia de datos es menor [1]. Para la magnitud del proyecto con el uso del Bluetooth es suficiente y bastante recomendable (por la facilidad conexión de los módulos) ya que de precio son parecidos. Es adecuado tener en cuenta la posibilidad de utilizar Zigbee en el caso de necesitar más alcance, cuando se tienen más de 7 dispositivos esclavos, o simplemente se busca un menor consumo. Memoria Descriptiva 7 de 12417 Interacción física con el dispositivo maestro En la actualidad la opción ideal hubiera sido elegir una shield de pantalla táctil, pero su precio es alto así como el consumo en memoria de su librería, lo que nos hubiera obligado a simplificar e incluso eliminar el resto de servicios que queremos incorporar a nuestro dispositivo maestro. Por lo que finalmente la opción más aceptable ha sido utilizar una shield que incorpora una pantalla LCD 16x2 + keypad de 6 botones y hace uso del driver Hitachi HD44780, compatible con la librería LiquidCrystal de Arduino [8]. Ilustración 9. Shield LCD + Keypad en un Arduino UNO (www.ebay.com) Eliminación de barreras físicas En este caso la solución está en utilizar Internet como puente de unión entre el dispositivo maestro y otros dispositivos que tenemos al alcance como un smarphone o un ordenador personal que puedan controlarlo. Utilizaremos Servicios Web para interactuar con el Arduino maestro a través de con el ordenador desde una página web y con smartphone, este último mediante una aplicación Android; ya que es el sistema operativo para móviles más extendido en la actualidad. El Arduino Yún nos permite conectarnos a Internet a través de una conexión Ethernet o WiFi. Ya que a la hora de realizar la programación es muy distinto si se usa un tipo de conexión u otra es preferible decantarse por una, en este caso será WiFi por su facilidad de configuración y por los beneficios de movilidad, ya que nos permite tener el Arduino Yún alimentado con baterías y poder moverlo a nuestro antojo. Memoria Descriptiva 8 de 12418 Presupuestos. El presupuesto recoge los costes de diseño y montaje de un dispositivo maestro y otro esclavo, así como de los elementos necesarios para la comunicación entre ambos dispositivos y el dispositivo maestro con Internet. Las partidas alzadas en que se divide el presupuesto quedan definidas en el anejo de justificación de precios. El total del coste de ejecución material de los prototipos asciende a la cantidad de cuatro mil ciento ochenta y un euros. El total del coste de ejecución por contrata asciende a la cantidad de seis mil sesenta y ocho euros. Memoria Descriptiva 9 de 12419 ANEJOS A LA MEMORIA20 1.2. ANEJO I: DATOS DE PARTIDA Inicialmente ya tenemos seleccionados los elementos que van a formar parte de nuestro proyecto pero aún no sabemos cómo funcionan y menos aún como hacerlos trabajar en conjunto. Por lo tanto comenzaremos por aprender las características y funcionalidades de las placas Arduino que utilizaremos, por lo que es imperativo tener buenos conocimientos de programación en lenguaje C/C++, que es el lenguaje en el que se basa su programación. Para ello podemos aprender de un curso online muy bien estructurado que se encuentra en la siguiente dirección: Cuando se tengan los conocimientos básicos para poder manejarse en el entorno Arduino, se realizarán las conexiones necesarias acompañadas de su correspondiente código de programación para hacer funcionar los distintos componentes que forman este proyecto. Comenzando por los más sencillos como los termistores, después la pantalla LCD + Keypad y finalmente los módulos de Bluetooth y Zigbee. Después de tener los dispositivos configurados y comprobar que funcionan correctamente se procederá a hacerlos funcionar en común, para lo cual utilizaremos Sublime Text, un entorno de programación más adecuado que el original de Arduino que es muy sencillo y poco intuitivo. Una vez funcionen se realizará la programación y configuración respondiente a la comunicación con los Servicios Web y se añadirán los extras correspondientes como por ejemplo guardar la temperatura deseada en la EEPROM para que cada vez que se encienda la placa restaure el último valor asignado. También se mostrará como acceder desde Internet al panel de configuración del Arduino Yún a través de un Servicio NO-IP, aunque no se incluirá en el código del proyecto por falta de espacio en la memoria de Yún. Cuando todo funcione correctamente se procederá a crear las placas de circuito impreso necesarias diseñándolas mediante el software Eagle. Finalmente tan solo queda desarrollar la aplicación para Android que pueda interactuar con Xively mediante el software Android Studio. Pero primero necesitaremos algunos conocimientos de programación en lenguaje Java que podremos obtener a través de un curso que nos proporciona el usuario codigofacilito en Youtube. Anejos a la Memoria 11 de 124 21 1.3. ANEJO II: ARDUINO Ilustración 10. Logo Arduino (www.arduino.cc) Introducción Se trata de una plataforma de hardware libre, basada en una placa con un microcontrolador y un entorno de desarrollo; que puede permite adquirir información del entorno y controlar motores, luces y otros actuadores a través de sus entradas analógicas y digitales. Al ser hardware libre, tanto su diseño como su distribución son de carácter libre. Por lo que puede utilizarse libremente para el desarrollo de cualquier tipo de proyecto sin haber adquirido ninguna licencia. [1] Las placas pueden montarse a mano o comprarse, para este proyecto es preferible comprarlas ya hechas para evitar complicaciones. En el caso del Arduino UNO su coste no es mucho mayor que el propio coste del microcontrolador y el Arduino Yún tiene un coste demasiado elevado como para jugársela a montarlo uno mismo. Existen en el mercado una serie de adaptadores (llamados shields) que se montan sobre la placa y permiten ampliar sus características añadiendo, por ejemplo: una pantalla LCD + Keypad, un driver para manejo de motores, un chip GPS o adaptar la salida serie a WiFi, Bluetooth o Ethernet. El entorno de desarrollo es multiplataforma y se puede descargar de forma gratuita para Windows, Mac OS X y Linux. Para este proyecto se ha de descargar la última versión beta existente ya que es la única que de momento funciona con el Arduino Yún (puesto a la venta en 2013), para poder hacerlo se ha de acceder a la zona de descargas de la web de Arduino en inglés, ya que en español no aparecen las versiones beta. Anejos a la Memoria 12 de 12422 Arduino UNO R3 Es uno de los modelos más famosos de Arduino, y se trata de una placa microcontroladora basada en el ATmega328, compuesto por una Memoria Flash de 32 KB (0.5 KB usados por el bootloader), una SRAM de 2 KB, una EEPROM de 1 KB y 16 MHz de velocidad de reloj. Cuenta con un conector ICSP, un botón de reset y 6 entradas analógicas numeradas de A0 a A5 (con una resolución de 10 bit). Una entrada analógica puede ser usada como un pin digital, refiriéndose a ellos desde el número 14 (entrada analógica 0) a 19 (entrada analógica 5). También tiene 14 entradas/salidas digitales que funcionan a 5V y una corriente máxima de 40mA por pin, cada uno con una resistencia pull-up de Ohm (desactivada por defecto). Existen pines especiales como: Puerto serie: 0 (RX) y 1 (TX). Interrupciones Externas: 2 (INT0) y 3 (INT1). Salidas PWM (resolución de 8 bit): 3, 5, 6, 9, 10 y 11. SPI: 10 (SS), 11 (MOSI), 12 (MISO) y 13 (SCK). LED: 13. Se alimenta a través del conector USB (a través del cual también se programa) o clavija hembra tipo Jack a una tensión de entre 6 a 20V, aunque el rango recomendado es de 7 a 12V para evitar que la placa se vuelva inestable o se queme el regulador de tensión [2] Arduino Yún Es uno de los modelos más nuevos y el primero de la gama en incorporar Linux. La placa electrónica está compuesta por un ATmega32u4 que es el mismo que utiliza el Arduino Leonardo y además un Atheros AR9331 donde corre una distribución de Linux llamada Linino que está basada en OpenWRT. Ambos procesadores de comunican a mediante un puente (Bridge) a través del puerto serie, por lo que podemos tener problemas si utilizamos a la vez el puerto serie para otras transmisiones. Ilustración 11. Comunicación entre ATmega32u4 y AR9331 (www.arduino.cc). Anejos a la Memoria 13 de 12423 La Memoria Flash que utiliza el ATmega32u4 es de 32KB (donde 4 KB son usados por el bootloader, bastante más que el Arduino UNO), la SRAM de 2,5 KB y la EEPROM de 1KB y 16 MHz de velocidad de reloj. Por otro lado el Atheros AR9331 cuenta con una velocidad de 400MHz, 64 MB de Memoria RAM DDR2 y 16 MB de Memoria Flash. Otra de las novedades que encontramos en el Arduino Yún es en una interfaz WiFi (IEEE b/g/n) de serie en la placa, aunque también incorpora un puerto Ethernet (IEEE /100Mbit/s), un puerto para microsd y un USB-A (2.0 Host) que permite conectar aparatos como unidades de almacenamiento, teclado, ratón, webcam, etc. Este modelo incorpora un conector microusb a través del cual podremos enviar la programación (también se puede hacer vía WiFi) y alimentar la placa con 5V, por lo que si no lo conectamos a un ordenador con un cargador de smartphone es suficiente. También se puede alimentar a través del pin Vin pero al carecer de regulador de tensión hay que tener cuidado de no pasarse de tensión, ya que podríamos quemar la placa. Ilustración 12. Esquema de componentes del Yún (www.arduino.cc). La disposición de los pines así como la del conector ICSP es similar a la del Arduino UNO, por lo que la gran cantidad de shields diseñadas para el UNO son compatibles con el Yún. Anejos a la Memoria 14 de 12424 En el Yún todos los 20 pines son digitales y como en el UNO funcionan a 5V con una corriente máxima de 40mA por pin e incorporan una resistencia pullup de Ohm (desactivada por defecto). En cuanto a los pines especiales los únicos que se mantienen sin cambios con respecto al Arduino UNO son los del Puerto serie: 0 (RX) y 1 (TX) y el pin 13 del LED. El número de pines para Interrupciones Externas aumenta y no mantiene la misma nomenclatura que es la siguiente: 3 (INT0), 2 (INT1), 0 (INT2), 1 (INT3) and 7 (INT4). Desaparecen los pines del SPI por lo que si necesitamos conectar a esos pines deberemos de hacer uso del conector ICSP. En el caso de las salidas PWM (con 8 bit de resolución) pasamos de tener 6 a 7 pines al incorporar a la lista el pin 13, quedando los pines: 3, 5, 6, 9, 10, 11 y 13. Por otro lado pasamos de 6 (de A0 a A5) a 12 entradas analógicas (con 10 bit de resolución) al incorporar los pines: 4, 6, 8, 9, 10, y 12. Ilustración 13. Leds en Arduino Yún (www.arduino.cc). En la última versión de la distribución linux de Linino el led correspondiente al USB luce para avisar que el arranque de la distribución de Linux se ha completado (aproximadamente 80 segundos después del arranque del Yún). Anejos a la Memoria 15 de 12425 Otro cambio importante es en este modelo tenemos 3 botones de reset. Ilustración 14. Esquema de botones de reset del Yún (www.arduino.cc). 32U4 RST: reinicia el chip ATmega32u4. Yún RST: reinicia el procesador AR9331, es decir, vacía la RAM y termina los programas en ejecución en el entorno Linux. WLAN RST: Tiene doble función, si presionamos durante 5 segundos hará que el led azul de WLAN comience a parpadear, indicando que el entorno Linux y la configuración WiFi se están reiniciando, es decir, el Yún actuará como un punto de acceso WiFi. En el caso de que presionemos durante 30 segundos dejaremos el entorno Linux tal y como venía el día que compramos nuestro Arduino. Anejos a la Memoria 16 de 124 26 Configuración Si es la primera vez que encendemos el Arduino Yún o no está configurado para conectarse a ninguna red WiFi, se iniciará en modo punto de acceso WiFi. Por lo que unos 80 segundos después de haber encendido el Yún aparecerá una red WiFi con SSID Arduino Yún-direcciónmac. Ilustración 15. SSID del Arduino Yún. Nos conectamos a ella desde un ordenador u otro dispositivo que cuente con un navegador tipo Chrome, Firefox, Safari, Internet Explorer, etc. Ilustración 16. Conectándose al Arduino Yún. Una vez conectados para entrar al panel de configuración debemos acceder a la IP a través del navegador, si es la primera vez que accedemos la contraseña será arduino. Ilustración 17. Menú de autentificación. Anejos a la Memoria 17 de 12427 Desde el panel principal de configuración podemos modificar el nombre del Yún, así como su contraseña, zona horaria y configurar los parámetros de la red WiFi a la que se va a conectar. Ilustración 18. Menú principal de configuración. Una vez hayamos puesto los parámetros correspondientes pulsamos en Configure & Restart y nos aparecerá la siguiente ventana pidiéndonos que nos conectemos a la red WiFi que hemos configurado. Ilustración 19. Aviso de configuración. Una vez termine de cargar podremos conectarnos a través de la dirección: https://nombrearduino.local/ Anejos a la Memoria 18 de 12428 Para que nuestro navegador pueda acceder a la dirección anterior desde Windows tenemos que tener instalado un software de Apple llamado Bonjour que podemos descargar de la siguiente dirección: https://www.apple.com/es/support/bonjour/ Si no queremos instalar el software anterior, podemos acceder directamente poniendo la IP de red del Yún en el navegador. Podemos descubrir que IP de tiene nuestro Yún desde el panel de configuración de nuestro Router o haciendo uso de una aplicación llamada Wireless Network Watcher que podemos descargar de: Esta aplicación viene muy bien para saber en todo momento si nuestro Arduino Yún está conectado a nuestra red, por ejemplo aquellas veces que queremos programar la placa de Arduino vía WiFi y el Entorno de Desarrollo no lo detecta; podremos saber si es culpa del Entorno o que no está conectado. Como la IP asignada es dinámica, es preferible asignarle una IP estática desde el Router para no tener que estar buscándola siempre. Finalmente una vez conectados podemos comprobar que nuestro Arduino Yún ya tiene conexión a Internet. Además podremos configurar multitud de opciones del entorno Linux que para este proyecto no serán necesarias. Ilustración 20. Menú principal de configuración una vez conectado. Anejos a la Memoria 19 de 124 29 Entorno de Desarrollo Se trata de un software creado por Arduino para facilitar la programación de los microcontroladores de sus placas y comunicarse con ellas. Está constituido por un editor de texto, un área de mensajes, una serie de menús y botones de acceso a las funciones más comunes. Ilustración 21. Entorno de Desarrollo. El programa dónde escribiremos nuestro código se denomina "sketch". Podemos encontrar distintos ejemplos en el menú: Archivo > Ejemplos. Un elemento muy importante de nuestro programa son las librerías, que proveen de funcionalidad extra a nuestro sketch y se pueden añadir desde el menú: Programa > Importar Librería, ocupando siempre las primeras líneas de nuestro programa. Como por ejemplo: #include <EEPROM.h> En muchos casos nos encontraremos que para hacer funcionar ciertos componentes necesitaremos descargar una librería del fabricante e importarla a nuestro Entorno de Desarrollo. Para ello simplemente tenemos que colocar la carpeta de la librería (que incluye los dos archivos de extensión.h y.cpp ) en la carpeta libraries de la instalación. Anejos a la Memoria 20 de 12430 Algunas librerías ya vienen de serie como: EEPROM, LiquidCrystal (para manejar un LCD), SoftwareSerial (para crear puertos serie virtuales en pines que no sean el 0 y 1) o Brigde (para que nuestro sketch interactúe con la distribución de Linux). Tras las librerías, asignaremos nombres a los pines que vamos a utilizar para facilitar su posterior llamada y existen diferentes formas: #define NombrePin 13 int NombrePin = 13; const int NombrePin = 13; Para evitar errores hay que tener siempre en cuenta que menos cuando usamos #include y #define, los demás comandos han de acabar en ;. Después lo normal es crear las variables y constantes restantes de igual forma que lo hubiéramos hecho en C/C++, pero en caso de utilizar ciertas librerías como LiquidCrystal conviene inicializarlas primero: LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7); En setup, tenemos una función que solo se ejecutará una vez por lo que en ella escribiremos los comandos que necesiten una sola ejecución al iniciar el sketch como pueden ser comandos de inicialización tipo: Bridge.begin(); También es el lugar indicado para configurar los pines designados anteriormente como entradas o salidas a través del comando pinmode : pinmode(nombrepin, INPUT); pinmode(nombrepin, OUTPUT); En el caso de salidas digitales podemos cambiar su estado entre alto (5V) y bajo (0V) con el comando digitalwrite : digitalwrite(nombrepin, HIGH); digitalwrite(nombrepin, LOW); Para salidas PWM podemos dar un valor de entre 0 y 5V a través del comando analogwrite : analogwrite(nombrepin, valor ); El valor tiene una resolución de 8 bits, por lo que puede tomar valores de entre 0 a 255. Siendo 255 el valor correspondiente a 5V. Anejos a la Memoria 21 de 124 31 En la función loop incluiremos aquel código que queremos que se ejecute indefinidamente, aunque en ciertos casos será necesario realizar esperas, por lo que usaremos el comando delay : delay(1000); //Espera de 1 segundo En otros casos queremos temporizar ciertos comandos pero sin parar la ejecución de la función loop, para ello utilizaremos el siguiente código: long unsigned timer=0, time; void loop() { time=millis(); if(time-timer>1000) //Temporización de 1 segundo { //Código a ejecutar timer=millis(); } } Tras la función loop escribiremos todas aquellas funciones y métodos que requiera nuestro programa. Antes de compilar y subir el código a nuestro Arduino, debemos seleccionar la placa que vamos a programar y el puerto a través del cual se ha conectado. Para ello accedemos al menú Herramientas. Ilustración 22. Elección de Placa y Puerto. Anejos a la Memoria 22 de 12432 Finalmente ya podemos compilar y enviar nuestro programa desde los botones situados a la izquierda de la barra de herramientas, si encuentra algún error nos avisará del mismo en el área de mensajes. En el caso de estar todo correcto nos avisará de la cantidad de Memoria Flash y SRAM utilizadas. Ilustración 23. Memoria utilizada en un sketch BareMinimum. Como podemos ver al compilar un sketch BareMinimum (sin código) en el Arduno Yún, ocupa como mínimo el 15% de memoria de programa; algo que no sucede con el Arduino UNO que tan solo ocupa un 1%. Esto se debe al tamaño que ocupa el bootloader y que reduce de forma importante el tamaño que puede alcanzar nuestro programa. Una vez tengamos el programa cargado podemos interactuar con él a través del puerto serie mediante el Monitor Serie, al que podemos acceder a través del botón situado a la derecha de la barra de herramientas. Ilustración 24. Ventana del Monitor Serie. Para ello inicializamos el puerto serie a 9600 baudios con el comando: Serial.begin(9600); Después podemos leer o escribir caracteres a través del puerto serie: char recibido = Serial.read(); Serial.printf( Hola ); Anejos a la Memoria 23 de 12433 Diagrama de pines Arduino UNO Ilustración 25. Diagrama de Pines Arduino UNO (www.giltesa.com). Anejos a la Memoria 24 de 12434 Diagrama de pines Arduino Yún Ilustración 26. Diagrama de Pines Arduino Yún (www.giltesa.com). Anejos a la Memoria 25 de 12435 1.4. ANEJO III: COMPONENTES Primero vamos a estudiar las características de cada componentes, para después realizar el conexionado físico de los componentes mediante una placa de pruebas (protoboard) que cuenta con orificios conectados entre sí, siguiendo un patrón de líneas, en el cual se pueden insertar componentes electrónicos y cables para crear prototipos de circuitos electrónicos. Para simular el conexionado de los componentes utilizaremos un software gratuito llamado Fritzing. Además incluiremos un código sencillo para probar el funcionamiento de cada componente Termistor DS18B20 Es un sensor de temperatura digital que mide en grados Celsius con una resolución programable de 9 a 12 bits. Tiene un encapsulado TO-92 y se comunica a través del bus 1-Wire, lo que permite que varios termistores se comuniquen a través de un solo cable, ya que cada uno posee un identificador único de 64 bits. Tiene un rango de medición de -55 a 125ºC con una precisión de 0,5ºC cuando se encuentra entre un rango de -10 a 85ºC. El rango de alimentación es de 3 a 5,5V. En nuestro Arduino tenemos pines de alimentación de 3,3 y 5V, como es mejor no quedarse corto alimentaremos los termistores a 5V. Tarda como máximo de 750 ms en adquirir la temperatura cuando se realiza a una resolución de 12 bit. [9] En este proyecto usaremos dos DS18B20 de la marca Dallas (aunque existen otras marcas que lo fabrican como Maxim). Ilustración 27. Sensor DS18B20 de Dallas (www.tallerarduino.com). Anejos a la Memoria 26 de 12436 Esquema de conexiones Ilustración 28. Conexiones para el Termistor DS18B20. La resistencia pull-up utilizada tiene un valor de ohmnios. Código de prueba #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS A5 OneWire onewire(one_wire_bus); DallasTemperature sensors(&onewire); float temperatura; void setup(void) { Serial.begin(9600); sensors.begin(); } void loop(void) { sensors.requesttemperatures(); temperatura=(sensors.gettempcbyindex(0)); Serial.print("Temperatura: "); Serial.print(temp); Serial.println(" C"); delay(5000); } Anejos a la Memoria 27 de 124 37 Con el código anterior visualizaremos el valor que nos da el sensor de temperatura cada 5 segundos a través del Monitor Serie. Como podemos ver en las primeras líneas del código el uso del sensor DS18B20 requiere el uso de dos librerías, así como su inicialización: #include <OneWire.h> #include <DallasTemperature.h> Podemos descargarlas de los siguientes enlaces: Shield LCD + Keypad Esta shield sirve para proporcionar una interfaz fácil de usar que nos permite interactuar directamente con el Arduino. Cuenta con una pantalla LCD de 2x16 que utiliza los pines 4, 5, 6, 7, 8, 9 y 10. Soporta ajuste de contraste y el encendido/apagado de la iluminación. También cuenta con 6 botones conectados al pin analógico A0, 5 de los cuales son configurables: Seleccionar, Arriba, Abajo, Izquierda y Derecha. El botón no configurable es el de Reset. Ilustración 29. Referencia de pines de la shield (www.dfrobot.com). Anejos a la Memoria 28 de 12438 La utilización de una shield nos evita utilizar la placa de pruebas para realizar la gran cantidad de conexiones que llevaría en el caso de querer montar los componentes por separado por lo que la shield nos permite una conexión rápida y más fiable que con cables. Pines sin utilizar Ilustración 30. Elementos de la shield (www.dfrobot.com). Como podemos ver en la ilustración anterior la shield nos da acceso al conector ICSP, el problema es que nos oculta las conexiones al resto de pines que no está utilizando. Por suerte esta shield tiene a la vista los agujeros correspondientes a los pines libres por lo que para hacerlos accesibles soldaremos conectores de pines torneados tipo hembra. Ilustración 31. Pines torneados tipo hembra (www.electronicabf.com). Por lo tanto tendremos disponibles los pines: 0, 1, 2, 3, 11, 12, 13, A1, A2, A3, A4 y A5. Anejos a la Memoria 29 de 12439 El Entorno de Desarrollo de Arduino incorpora de serie la librería LiquidCrystal ; que permite a la placa Arduino controlar displays LCD basados en el chipset Hitachi HD44780 (o compatibles). La biblioteca trabaja en modo 4-bit o en 8-bit (es decir, por medio de 4 u 8 líneas de datos, además de RS, ENABLE, y, opcionalmente, las líneas de control RW). Por lo tanto para configurar el LCD mediante la función LiquidCrystal() tenemos las siguientes opciones: LiquidCrystal lcd(rs,enable,d4,d5,d6,d7); LiquidCrystal lcd (rs,rw,enable,d4,d5,d6,d7); LiquidCrystal lcd(rs,enable,d0,d1,d2,d3,d4,d5,d6,d7); LiquidCrystal lcd(rs,rw,enab,d0,d1,d2,d3,d4,d5,d6,d7); Con el LCD que tenemos utilizamos la sintaxis marcada en negrita y para conocer los pines nos fijamos en la ilustración 27 [2]. Otras funciones importantes para el manejo del LCD son: lcd.begin(16, 2); Donde inicializamos el LCD indicando su número de columnas (16) y líneas (2). lcd.clear(); Borra el contenido de nuestra pantalla LCD. lcd.setcursor(0, 1); Coloca el cursor en la columna (0) y en la línea (1) elegida, como hemos designado 16 columnas los valores a seleccionar van de 0 a 15 y con 2 líneas de 0 a 1, por lo que al seleccionar la columna 0 en la línea 1 estamos colocando el cursor donde queremos escribir en el primer carácter de la segunda línea. lcd.print("texto"); lcd.print(variable); Es la función que más utilizaremos y es la que imprimirá el texto o variable que queramos en la pantalla LCD. Podemos conocer más funciones en la web de Arduino: Anejos a la Memoria 30 de 12440 Código de prueba #include <LiquidCrystal.h> LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7); void setup() { lcd.begin(16, 2); lcd.print("hola Mundo!"); } void loop() { begins with 0): lcd.setcursor(0, 1); lcd.print(millis()/1000); } Con el anterior código se mostrará Hola Mundo! en la línea superior del LCD y en la inferior aparecerá un contador que irá aumentando a cada segundo que pase. Si se quieren probar que los botones funcionan podemos utilizar el botón de Reset que no necesita ser configurado para funcionar. Para profundizar en el uso de botones y la creación de menús es recomendable probar los ejemplos que hay en la siguiente dirección: Otro detalle a tener en cuenta es que algunos caracteres no se muestran correctamente en la pantalla LCD, como el símbolo de grado º [10]. Por lo que diseñaremos nuestro propio carácter con una matriz tipo byte: byte chargrado[8] = { 0b00111, 0b00101, 0b00111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000 }; Y podremos finalmente crearlo e imprimirlo en la pantalla LCD con: lcd.createchar(0, grado); lcd.write(byte(0)); Anejos a la Memoria 31 de 12441 Módulos Bluetooth HC-05 y HC-06 Los son muy similares: tienen las mismas especificaciones y ambos se configuran a través de comandos AT desde un ordenador o cualquier dispositivo que posea una comunicación en serie (Tx/Rx). Su principal diferencia es que en que el módulo HC-05 tiene el pin KEY disponible que permite ponerlo en modo de configuración AT por lo que admite muchos más comandos; esto hace que pueda cambiar entre modo esclavo y maestro, por lo que el HC-06 solo puede actuar como esclavo. La diferencie entre modo maestro y esclavo es que en modo esclavo es el dispositivo el que se conecta al módulo, mientras que en modo maestro es el módulo el que se conecta con un dispositivo [7]. Ilustración 32. HC-05 & HC-06 (www.diymakers.es). Conexiones: Vcc: Alimentación del módulo entre 3,6V y 6V. GND: La masa del módulo. TXD: Transmisión de datos. RXD: Recepción de datos. KEY: Poner a nivel alto (5V) para entrar en modo configuración del módulo (solo el modelo HC-05). STATE: Para conectar un led de salida para visualizar cuando se comuniquen datos (solo el modelo HC-05). Especificaciones [11]: Versión Bluetooth: v2.0+edr. Versión USB: v1.1/2.0 Frecuencia: 2.4GHz ISM band. Potencia de transmisión: 4dBm, Clase 2. Sensibilidad: -84dBm en 0.1% BER. Velocidad asíncrona: 2.1Mbps (Máx.) / 160 kbps. Velocidad síncrona: 1Mbps/1Mbps. Seguridad: Autentificación y encriptación. Alimentación: +3.3VDC 50mA. Temperatura de trabajo: 5 ~ +45 ºC. Anejos a la Memoria 32 de 12442 Inicialmente cada módulo viene por defecto con su modelo como nombre, la contraseña: 1234 y trabajando a una velocidad de 9600 baudios que es la velocidad usada normalmente en Bluetooth, aunque el módulo soporta velocidades de 2400 a baudios. Podemos probar ambos módulos por separado en modo esclavo, conectándonos a ellos desde un smartphone con una aplicación terminal que podemos encontrar fácilmente en la tienda de aplicaciones. Para probar la comunicación entre ambos módulos deben estar configurados a la misma velocidad (dejaremos los 9600 bps que vienen por defecto) y la misma contraseña, que cambiaremos por seguridad. Además deberemos cambiar a modo maestro el módulo HC-05, que cuando encuentre el módulo HC-06 y compruebe que tienen la misma contraseña se conectará automáticamente. Vamos a comprobar el funcionamiento de ambos módulos por separado, para ello probaremos un código receptor para el HC-05 que irá conectado al Arduino Yún y un código emisor para el HC-06 que irá conectado al Arduino UNO, cuyas conexiones se muestran a continuación y son comunes a ambos módulos. Esquema de conexiones Ilustración 33. Conexiones del módulo HC-06. Como podemos ver los pines Tx/Rx de la placa y el módulo están cruzados, esto es así porque el pin transmisor tiene que estar conectado al receptor y viceversa. Para utilizar estos módulos no necesitaremos librerías extra, ya que se comunican directamente a través del puerto serie gracias a un chip UART. Anejos a la Memoria 33 de 12443 Código de prueba (Emisor HC-06 & UNO) void setup() { pinmode(bt, OUTPUT); digitalwrite(bt, HIGH); Serial.begin(9600); } void loop() { Serial.println("1"); delay(1000); Serial.println("0"); delay(1000); } Para la comunicación en serie del módulo desde Arduino Yún deberemos cambiar los comandos Serial por Serial1 ya que el primero es utilizado por el puerto USB-Host. Aunque para transmitir mensajes al Monitor Serie deberemos de seguir usando Serial. Código de prueba (Receptor HC-05 & Yún) char interruptor; void setup() { pinmode(13, OUTPUT); Serial1.begin(9600); } void loop() { if(serial1.available() > 0) { delay(5); interruptor = Serial1.read(); if(interruptor == '1') digitalwrite(13, HIGH); if(interruptor == '0') digitalwrite(13, LOW); } } Anejos a la Memoria 34 de 124 44 Hay un detalle que no hemos tenido en cuenta en el código de prueba correspondiente al Arduino UNO, y es que a menudo cuando enviamos un sketch por el puerto serie y el módulo Bluetooth ya está comunicándose por él se produce un error de comunicación y el sketch no se envía. La solución está en conectar la alimentación del módulo a una salida digital y en la función setup ponerla a estado alto para que suministre 5V al módulo. Según los códigos de prueba el emisor emite cada un segundo 1 o 0 y el receptor dependiendo de si recibe 1 enciende o 0 apaga el led que lleva incorporada la placa. Para realizar las comprobaciones utilizaremos un smarphone, para ello primero deberemos vincularlo a nuestros módulos y después conectarnos. Ilustración 34. Vinculación y recepción Bluetooth. Al conectarnos el led del módulo deja de parpadear y se luce constantemente, en caso de desconexión vuelve a parpadear. En el caso del HC-05 nada más conectarnos recibiremos unos y ceros, en cambio cuando nos conectemos al HC-06 deberemos enviar nosotros los ceros y unos para que se encienda o apague el led del Arduino Yún. Reutilizando los códigos de prueba anteriores vamos a comprobar el funcionamiento de ambos módulos comunicándose entre sí, pero primero debemos configurarlos. Anejos a la Memoria 35 de 12445 Aunque ambos son configurables desde la consola del Monitor Serie, para configurar el módulo HC-06 simplemente enviaremos un sketch con la configuración pertinente, que es más sencillo que el proceso que utilizaremos para configurar el módulo HC-05. void setup() { Serial.begin(9600); Código de configuración HC-06 //Damos tiempo para que el módulo arranque delay(5000); Serial.print("AT"); //Hay que esperar 1 segundo entre cada comando AT delay(1000); //Cambio de nombre: AT+NAME seguido del nombre Serial.print("AT+NAMEBT_Esclavo"); delay(1000); //Cambio de la velocidad AT+BAUD y seguido el número //correspondiente: baudios baudios baudios baudios (por defecto) baudios baudios baudios baudios Serial.print("AT+BAUD4"); delay(1000); //Configuracion Password, se envía AT+PIN y seguido //password que queremos Serial.print("AT+PIN2014"); } void loop() { } Anejos a la Memoria 36 de 12446 En el caso del HC-05 realizaremos la configuración escribiendo los comandos AT a través el Monitor Serie que utiliza los pines 0 y 1, por lo tanto utilizaremos la librería SoftwareSerial para crear un puerto serie virtual a través del cual nos comunicaremos con el módulo. Sabremos que está en modo configuración AT porque el led azul que tiene parpadea más despecio. Esquema de conexiones Ilustración 35. Conexiones para la configuración del HC-05. Código de configuración HC-05 #include <SoftwareSerial.h> SoftwareSerial BT(10,11); //10 RX, 11 TX void setup() { Serial.begin(9600); BT.begin(38400); Serial.println("Inicio de comandos AT: "); } void loop() { if(serial.available()) BT.write(Serial.read()); } if(bt.available()) Serial.write(BT.read()); Podemos ver que la comunicación con el módulo HC-05 en modo configuración AT se hace a una velocidad de baudios, esta velocidad es independiente de la que le configuremos y se debe a que si olvidamos la velocidad a la que le hemos configurado no podremos conectarnos para configurarlo. Anejos a la Memoria 37 de 12447 Una vez enviado el sketch con el código de configuración abrimos el Monitor Serie, asegurándonos de que está configurado correctamente; para ello tiene que tener una velocidad de 9600 baudios, con el Desplazamiento automático activado y en modo No hay fin de línea que se corresponden a los códigos \r\n de C/C++ [7]. Ahora para comprobar que la conexión es correcta enviamos el comando AT, si es todo correcto nos responde con OK. Lo bueno de este modo de configuración es que además de modificar parámetros también podemos consultarlos. Por ejemplo con el comando AT+NAME, si queremos conocer el nombre del dispositivo debemos enviar AT+NAME? y nos devolverá el nombre (si no ha sido modificado será HC-05) seguido de un OK. Para modificar el nombre enviaremos AT+NAME=BT_Maestro y si la modificación se ha realizado correctamente nos devolverá un OK y el dispositivo pasará a llamarse: BT_Maestro. En este caso no es importante asignar un nombre porque va a trabajar en modo maestro y no aparecerá visible. Para cambiar el módulo en modo maestro usamos AT+ROLE. El parámetro a asignar puede ser uno de los siguientes: 0 = Modo esclavo. 1 = Modo Maestro. 2 = Slave-Loop: Modo esclavo pasivo en la que los datos que recibe del módulo maestro se los transmite de vuelta. Si se realiza la consulta del valor asignado mediante el comando AT+ROLE? y el dispositivo nunca ha sido configurado nos devolverá un 0, ya que viene en modo esclavo de serie. Para pasarlo a maestro enviamos el comando AT+ROLE=1. Otro parámetro importante es AT+PSWD, si probamos el comando AT+PSWD nos devolverá 1234 si nunca ha sido cambiada. Procederemos a cambiarla para que tenga la misma contraseña que el módulo esclavo y así se pueda conectar a él, por lo tanto enviaremos el siguiente comando: AT+PSWD=2014 [12]. Finalmente podemos comprobar si funciona correctamente la comunicación entre ambos módulos, tan solo tenemos que conectarlos como cuando les probamos individualmente y si se han configurado correctamente el HC-05 automáticamente establecerá conexión con el HC-06, éste dejará de parpadear y la luz se quede fija. El HC-05 seguirá parpadeando porque al ser maestro siempre está buscando esclavos. Anejos a la Memoria 38 de 124 48 Módulos Zigbee MRF24J40MA El módulo es un transceptor de montaje superficial desarrollado por Microchip y certificado en el estándar IEEE y la plataforma Zigbee 2006, trabaja en la frecuencia de 2.4 GHz, tiene integrada una antena PCB y soporta las especificaciones ZigBe y MiWi [13]. Características destacadas [14]: Transceptor de 2.4 GHz con el estándar IEEE Antena integrada al PCB e interface con MCUs del tipo SPI a 4 hilos. Tasa de Transmisión: 250 Kbps Bajo consumo: TX = 23 ma / RX = 19 ma / Sleep = 2 μa. Rango: Interior = 38m / Exterior o con línea de vista = 120m Mecanismo anti-colisión por hardware CSMA-CA. Respuesta ACK automática. Motor de Seguridad en hardware AES 128. Diagrama de pines Ilustración 36. Diagrama de pines MRF24J40MA (Datasheet MRF24J40MA). Esquema de conexiones Ilustración 37. Esquema de conexiones MRF24J40MA. Anejos a la Memoria 39 de 12449 Como podemos ver en el esquema de conexiones y ya se comentó cuando se explico en el apartado de Arduino: en el Arduino UNO tiene pines especiales que actúan como pines del SPI, esto nos permite incluir el módulo MRF24J40MA en la shield que fabricaremos para esta placa. En cambio en el Arduino Yún no los tenemos por lo que tendremos que usar el conector ICSP, que la shield que utilizaremos si incorpora. Aunque utilicen mucho cableado estos módulos no requieren configuración y tan solo debemos librería específica para usarlos con Arduino, la podemos descargar de la siguiente dirección: https://github.com/karlp/mrf24j40-arduino-library Esta librería trae consigo tres códigos de prueba: solo transmisión, solo recepción y otro con transmisión y recepción. Basándonos en estos códigos crearemos los códigos de ejemplo para emisor y receptor. #include <SPI.h> #include <mrf24j.h> Código de prueba (Emisor) const int pin_reset = 6; const int pin_cs = 10; const int pin_interrupt = 2; Mrf24j mrf(pin_reset, pin_cs, pin_interrupt); void setup() { mrf.reset(); mrf.init(); mrf.set_pan(0xcafe); //PAN_ID mrf.address16_write(0x6001); //Dirección attachinterrupt(0, interrupt_routine, CHANGE); interrupts(); } void interrupt_routine() { mrf.interrupt_handler(); } void loop() { mrf.send16(0x6002,"enciende 1"); delay(5000); } Anejos a la Memoria 40 de 12450 #include <SPI.h> #include <mrf24j.h> Código de prueba (Receptor) const int pin_reset = 6; const int pin_cs = 10; const int pin_interrupt = 2; char val[50]; int flag=0; Mrf24j mrf(pin_reset, pin_cs, pin_interrupt); void setup() { pinmode(13, OUTPUT); Serial.begin(9600); mrf.reset(); mrf.init(); mrf.set_pan(0xcafe); //PAN ID mrf.address16_write(0x6002); //Dirección attachinterrupt(1, interrupt_routine, CHANGE); interrupts(); }; void interrupt_routine() { mrf.interrupt_handler(); } void loop() { mrf.check_flags(&handle_rx, &handle_tx); if(flag == 1) { flag = 0; digitalwrite(13,high); delay(500); digitalwrite(13,low); } } void handle_rx() { for (int i = 0; i < mrf.rx_datalength(); i++) { val[i]=mrf.get_rxinfo()->rx_data[i]; if (val[i]=='1') flag=1; } Serial.println(val); } void handle_tx() {} Anejos a la Memoria 41 de 12451 1.5. ANEJO IV: SERVICIOS WEB Nuestro objetivo es utilizar el Servicio Web Xively para poder comunicarnos con el Arduino Yún desde un ordenador o smartphone. Para facilitar este cometido existe Temboo, otro Servicio Web que nos ofrece el código necesario para leer/escribir datos en Xively desde el Arduino Yún o la aplicación Android. Lo primero que haremos será configurar nuestra cuenta en Xively, pero antes debemos registrarnos en la siguiente dirección: https://xively.com/signup Una vez en nuestra cuenta accedemos a la pestaña Develop y clickamos en Add Device. Escribimos el nombre de nuestro dispositivo que en este caso llamaremos Termoduino y también podemos escribir una descripción, así como configurar la privacidad del dispositivo como privada o pública. Una vez añadido nuestro dispositivo accedemos a su página donde añadiremos los canales que vamos a utilizaren nuestro proyecto: Ilustración 38. Canales en Xively. Al agregarlos podemos elegir las unidades las unidades de medida, el símbolo e incluso podemos asignar un valor inicial. El orden de los canales es importante para cuando realicemos una lectura desde la aplicación de Android, ya que el código obtenido estará en formato JSON y accederemos a sus valores como si fuera una matriz. Para comunicarnos con Xively a través de Temboo necesitaremos el Feed ID y la API Key, que podemos encontrar en la página de nuestro dispositivo. Desde la propia página podemos visualizar y modificar los valores en tiempo real a través de gráficas que podemos configurar para que nos muestren ciertos intervalos de tiempo. Al haber configurado nuestro dispositivo con privacidad pública podemos consultar el valor de nuestras variables sin estar en nuestra cuenta, desde: https://xively.com/feeds/ Feed ID Anejos a la Memoria 42 de 12452 Una vez configurado el Servicio Web Xively, es momento de crear una o varias cuentas de Temboo a través de su página web: https://www.temboo.com La idea de crear más de una cuenta es porque el servicio gratuito está limitado a lecturas/escrituras al mes, llamados choreos por Temboo. Por lo tanto podemos utilizar una cuenta para la aplicación Android y una o varias para el Arduino Yún, ya que los códigos de lectura y escritura pueden utilizar credenciales diferentes. Además podemos temporizar una modificación de credenciales para que la cuenta cambie cada cierto tiempo y no tener que preocuparnos por la limitación. Ahora desde Temboo accedemos a la pestaña Library y en el menú de la izquierda hacemos click en Xively, luego en ReadWriteData y abrimos dos ventanas, una para ReadFeed y otra para "WriteData. En APIKey y FeedID ponemos los datos de nuestra cuenta Xively y en OPTIONAL INPUT tenemos diversas opciones. En el caso de realizar una lectura lo más importante es el apartado Datastreams donde podemos seleccionar uno o varios canales, aunque también podemos dejarlo vacío y nos devolverá un código en formato JSON con la lectura de todos los canales. Para la escritura es necesario definir el DatastreamID que es el canal en el que queremos escribir y Value que es el valor que le vamos a dar. Finalmente podemos hacer click en Run y obtendremos el código, pero antes debemos seleccionar en que lenguaje queremos obtenerlo: seleccionaremos Java para obtener los códigos para la aplicación Android y para el Arduino Yún necesitaremos activar el lot Mode y seleccionar Arduino Yún. Para utilizar estos códigos necesitaremos las librerías ciertas librerías.. El Entorno de Arduino ya cuenta con las librerías de Bridge y Temboo, pero esta última actualizarla por la última versión disponible: https://www.temboo.com/sdk/arduino En el caso de Android, descargaremos todas las librerías para Android de: https://www.temboo.com/sdk/android Solo nos interesan las dos siguientes: temboo-android-sdk-core Xively Cuando desarrollemos la aplicación para Android ya explicaremos como importarlas en nuestro proyecto. Anejos a la Memoria 43 de 12453 1.6. ANEJO V: DESARROLLO DE LOS DISPOSITIVOS Ahora que tenemos los conocimientos necesarios sobre los componentes y los Servicios Web, vamos a desarrollar los dispositivos maestro y esclavo. Para crear el código necesario, vamos a utilizar Sublime Text. Se trata de un Entorno de Desarrollo al que daremos las mismas funcionalidades que el entorno original de Arduino, pero éste es mucho más potente y con muchas más facilidades a la hora de manejar el código Sublime Text Lo primero que debemos hacer es descargar el programa de la dirección: Una vez lo hayamos abierto vamos a añadir el extra que nos permite interactuar con Arduino como si utilizásemos el Entorno original y otro que nos permite exportar el código en HTML para visualizarlo mejor. Para ello primero debemos instalar Package Control a través de la consola, la mostramos a través del menú: View > Show Console y después copiamos y ejecutamos el código correspondiente a la versión que hayamos elegido (Sublime 2 ó 3) de la siguiente dirección: https://sublime.wbond.net/installation Ahora lo abrimos desde el menú: Preferences > Package Control y se nos desplegará una lista de comandos, accederemos a Install Package e instalamos Arduino-like IDE y ExportHTML. Finalmente tan solo tenemos que configurar las rutas desde el menú Arduino > Preferences, principalmente la de la IDE original ya que depende de ella para funcionar. Para exportar el código en HTML, pulsamos la combinación Control+Shit+P, elegimos Export to HTML: Show Export Menu y finalmente seleccionamos Browser View Color. Para facilitar el acceso a la compilación y transferencia del sketch, así como el acceso al Monitor Serie vamos a crear unos atajos a través del menú Preferences > Key Bindings User dónde escribiremos: [ { "keys": ["f4"], "command": "compile_sketch" }, { "keys": ["f5"], "command": "upload_sketch" }, { "keys": ["f6"], "command": "start_serial_monitor" } ] Anejos a la Memoria 44 de 124 54 Para mayor accesibilidad desde el menú View > Layout podemos configurar nuestro entorno para trabajar con 2 columnas y así programar para el Arduino UNO y Yún al mismo tiempo. Ilustración 39. Sublime Text Dispositivo esclavo El objetivo de este dispositivo es el de utilizar una placa Arduino UNO para medir la temperatura con un sensor DS18B20 y transmitirla a un Arduino Yún a través de Bluetooth con un módulo HC-06 o de Zigbee con un módulo MRF24J40MA. Al tratar de hacer funcionar un código que sirva para ambos módulos nos encontramos con que el módulo Bluetooth al poco tiempo de estar conectado a otro dispositivo se pierde la conexión, por lo que es mejor crear dos versiones del código, y cargar el sketch correspondiente al tipo de conexión que queremos utilizar. Se pretende crear una shield que contenga el sensor de temperatura y unos zócalos donde podamos conectar los módulos de comunicación; por lo que tenemos que tener especial cuidado en la elección de pines, ya que una elección incorrecta puede complicar el diseño hasta el punto de tener que utilizar las dos caras de la placa en vez de una. Comenzaremos por crear la versión para Bluetooth, cuyo funcionamiento podremos a través del smartphone, y después la adaptaremos el código a la versión Zigbee. Anejos a la Memoria 45 de 12455 Codigo Fuente Arduino UNO Versión Bluetooth 1 // Librerías necesarias para realizar funciones del sensor DS18B20 2 #include <OneWire.h> 3 #include <DallasTemperature.h> 4 5 #define ONE_WIRE_BUS A5 // Definimos el pin conectado al terminal DQ del termistor 6 #define BT 2 // Definimos el interruptor del dispositivo bluetooth 7 8 OneWire onewire(one_wire_bus); // Configuramos para comunicar con otros dispositivos 1-Wire 9 DallasTemperature sensors(&onewire); // Indicamos el pin asignado al sensor 1-Wire a DallasTemperature void setup(void) 12 { 13 // Encendemos el módulo Bluetooth cada vez que arranca (para evitar problemas al cargar el scketch) 14 pinmode(bt, OUTPUT); 15 digitalwrite(bt, HIGH); 16 Serial.begin(9600); // Iniciamos el puerto serie a 9600 baudios 17 Serial.flush(); // Vacía el búfer de entrada de datos en serie 18 delay(500); sensors.begin(); // Inicializamos el sensor DS18B20 21 } void loop(void) 24 { 25 String temp_str = String(temperatura()); // Obtenemos la temperatura y la guardamos en una string 26 Serial.println(temp_str); // Enviamos la temperatura mediante bluetooth (puerto serie) 27 delay(500); 28 } // Función para realizar la lectura de temperatura del sensor 31 float temperatura() 32 { 33 sensors.requesttemperatures(); 34 return sensors.gettempcbyindex(0); 35 } Anejos a la Memoria 46 de 12456 Versión Zigbee 1 // Librerías necesarias para realizar funciones del sensor DS18B20 y el módulo MRF24J40MA 2 #include <OneWire.h> 3 #include <DallasTemperature.h> 4 5 #include <SPI.h> 6 #include <mrf24j.h> 7 8 #define ONE_WIRE_BUS A5 // Definimos el pin conectado al terminal DQ del termistor 9 10 OneWire onewire(one_wire_bus); // Configuramos para comunicar con otros dispositivos 1-Wire 11 DallasTemperature sensors(&onewire); // Indicamos el pin asignado al sensor 1-Wire a DallasTemperature //Definimos y asociamos al módulo los pines de Reset, CS y de Interrupción 14 const int pin_reset = 4; 15 const int pin_cs = 5; 16 const int pin_interrupt = 3; Mrf24j mrf(pin_reset, pin_cs, pin_interrupt); char temp_arr[6]; // Por Zigbee no se puede enviar cadenas por lo que creamos un array del mismo tamaño long last_time; void setup(void) 25 { 26 Serial.begin(9600); // Iniciamos el puerto serie a 9600 baudios 27 Serial.flush(); // Vacía el búfer de entrada de datos en serie 28 delay(500); // Iniciamos el módulo MRF24J40MA y configuramos el PAN_ID así como su dirección y pin de interrupción 31 mrf.reset(); 32 mrf.init(); 33 mrf.set_pan(0xcafe); //PAN_ID 34 mrf.address16_write(0x6001); //Dirección // Seleccionado pin de interrupción INT1 (Pin 3) 37 attachinterrupt(1, interrupt_routine, CHANGE); 38 interrupts(); 39 delay(500); sensors.begin(); // Inicializamos el sensor DS18B20 42 } void interrupt_routine() 45 { 46 mrf.interrupt_handler(); 47 } Anejos a la Memoria 47 de 12457 48 49 void loop(void) 50 { 51 String temp_str = String(temperatura()); // Obtenemos la temperatura y la guardamos en una string 52 temp_str.tochararray(temp_arr, 6); // Transformamos la cadena a un array de caracteres 53 mrf.send16(0x6002,temp_arr); // Enviamos el array mediante Zigbee (interfaz SPI) 54 delay(500); 55 } // Función para realizar la lectura de temperatura del sensor 58 float temperatura() 59 { 60 sensors.requesttemperatures(); 61 return sensors.gettempcbyindex(0); 62 } Compilación en el Entorno de Desarrollo de Arduino Ilustración 40. Compilación del código para Arduino UNO (Versión Bluetooth). Ilustración 41. Compilación del código para Arduino UNO (Versión Zigbee). Anejos a la Memoria 48 de 12458 Dispositivo maestro Comenzaremos por mostrar la temperatura adquirida por el dispositivo maestro en el LCD y a continuación haremos lo mismo pero con la temperatura adquirida por el dispositivo esclavo, cuyo código ya hemos desarrollado. Para el Arduino Yún también crearemos dos versiones del código, esto se debe a problemas con la memoria disponible. Aún teniendo los códigos por separado ambos alcanzarán el 99% de memoria de programa ocupada. Por lo que según queramos utilizar un tipo u otro de comunicación tendremos que cargar los sketches correspondientes. En el caso del Arduino Yún al tener la shield que ocupa gran cantidad de los pines disponibles, nuestro problema es la falta de ellos. Pero al tener que crear distintos códigos para Bluetooth y Zigbee los pines disponibles pueden tener diferentes conexiones según el código. Por ejemplo en la versión Zigbee utilizaremos los pines 11 y 12 para las conexiones RESET y CS del módulo, en cambio en la versión Bluetooth utilizaremos esos pines como RX y TX del puerto serie virtual que crearemos gracias a la librería SoftwareSerial. No utilizamos el puerto serie que viene predefinido en los pines 0 y 1 porque interfiere con el Bridge, cuando éste se conecta al Servicio Web. El dispositivo tardará unos 80 segundos en realizar el primer arranque ya que debe cargar el entorno Linux para poder tener disponible la comunicación por WiFi, los posteriores reset que realicemos tardarán mucho menos en realizarse. Una vez arrancado tendremos en el LCD la visualización de temperaturas, lo que será nuestro menú principal. A través del botón Right accederemos a un menú secundario y para volver al menú principal tan solo deberemos utilizar el botón Left. Asignaremos ciertos límites al uso de los botones, para que solo puedan usarse en el menú adecuado. En el menú secundario podremos ver y modificar la temperatura deseada con los botones Up y Down entre 0 y 30ºC. Cuando alcancemos los límites aparecerá los botones dejarán de funcionar y nos aparecerá un aviso en el LCD un aviso. Finalmente implementaremos los Servicios Web, para ello se realizaremos un ciclo temporizado que comenzará por la lectura de la temperatura deseada por si ha sido modificada desde la web de Xively o desde la aplicación para Android y posteriormente realizará las escrituras las dos temperaturas adquiridas por los sensores. Anejos a la Memoria 49 de 12459 El Arduino Yún no dispone de ejecución en segundo plano (comando fork en C/C++) como en el caso de la aplicación para Android que si lo tiene, por lo tanto cada vez que se comunica con el Servicio Web son aproximadamente unos 5 segundos que nuestra placa no podrá realizar ninguna otra operación. Por lo tanto cuando nos encontremos en el menú secundario y se realice una comunicación con el Servicio Web, aparecerá un aviso en el LCD. Pulsando el botón Select la temperatura deseada se transmitirá al Servicio Web Xively y también se guardará en la EEPROM. El microcontrolador de la placa Arduino tiene 512 bytes de memoria EEPROM, cuyos valores se mantienen cuando la placa está apagada (como un pequeño disco duro). El Entorno de Arduino ya incluye la librería necesaria que te permite leer y escribir esos bytes. Para leer/escribir en la EEPROM utilizamos los siguientes comandos: EEPROM.read(dirección); EEPROM.write(dirección, valor); Disponemos de 512 direcciones (de 0 a 511) y el valor que le podemos asignar es de 0 a 255 aunque para guardar la temperatura deseada solo utilizaremos valores de 0 a 30. Si nunca se ha modificado la EEPROM del Arduino tendrá el valor 255 de forma predefinida, que es muy superior al límite. Para evitar este problema incluiremos el siguiente código en la función setup : if(eeprom.read(0)==255) EEPROM.write(0, 20); Por último hacemos que la temperatura deseada sea transmitida automáticamente a las calderas mediante una señal control a través de una salida digital PWM. Consideramos que 5V corresponden a 30ºC, y al tener 8 bit de resolución en la salida PWM podemos dar valores de 0 a 255 por lo tanto para calcular el valor que enviar utilizaremos la siguiente fórmula: Señal de control = (temp_deseada*255)/30 Como el control de las calderas se va a hacer por tensión, conectaremos un led con una resistencia de 220 ohmnios para visualizar la variación de la temperatura deseada. Anejos a la Memoria 50 de 12460 Código Fuente Arduino Yún Versión Bluetooth 1 // Librerías para realizar funciones con la EEPROM, LCD, sensor DS18B20, Web Service Temboo y puerto Serie 2 #include <EEPROM.h> 3 #include <LiquidCrystal.h> 4 #include <OneWire.h> 5 #include <DallasTemperature.h> 6 #include <Bridge.h> 7 #include <Temboo.h> 8 #include <SoftwareSerial.h> 9 10 #define CONTROL_SIGNAL 3 // Definimos pin para mandar la señal de control a la caldera 11 #define ONE_WIRE_BUS A5 // Definimos el pin conectado al terminal DQ del termistor SoftwareSerial BT(11, 12); // (11 RX, 12 TX) Creamos nuestro propio puerto serie para no inteferir con el Bridge OneWire onewire(one_wire_bus); // Configuramos para comunicar con otros dispositivos 1-Wire 16 DallasTemperature sensors(&onewire); // Indicamos el pin asignado al sensor 1- Wire a DallasTemperature 17 LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7); // Inicializamos el display byte chargrado[8] = { // Creamos el caracter 'º' mediante un array de 8 bytes 20 0b00111, 21 0b00101, 22 0b00111, 23 0b00000, 24 0b00000, 25 0b00000, 26 0b00000, 27 0b }; //Información para Temboo 31 String TEMBOO_ACCOUNT = "oscarute"; 32 String TEMBOO_APP_KEY_NAME = "Termoduino"; 33 String TEMBOO_APP_KEY = "b63318f189df451898aa54d563881e7a"; //Información para Xively 36 String FeedID = " "; 37 String APIKey = "9WBw2EamK7kCqpZN1L0ZlHHImDV0XBihjrySjQ9e3jRQNpcg"; long unsigned timer=0, time; // Variables para el temporizador int temp_deseada; // Temperatura deseada 42 float temp[3]; // Temperaturas medidas 43 char temp_a[7]; // Array que recibirá la temperatura int m=0, n=0; // Variable para la selección de menú y selección de acción en Temboo Anejos a la Memoria 51 de 12461 46 47 // Variables necesarias para el uso de botones 48 int adc_key_val[5]={50, 200, 400, 600, 800}; 49 int NUM_KEYS=5; 50 int adc_key_in; 51 int key=-1; 52 int oldkey=-1; void setup(void) 56 { 57 // Inicializamos el display 58 lcd.clear(); 59 lcd.begin(16, 2); // Establecemos el número de columnas y filas del display 60 lcd.setcursor(3,0); 61 lcd.print("termoduino"); 62 delay(2000); 63 lcd.setcursor(0,1); 64 lcd.print("iniciando BRIDGE"); Bridge.begin(); // Iniciamos el puente entre arduino y linino (linux) 67 lcd.setcursor(0,1); 68 lcd.print("creado POR OSCAR"); 69 Serial.begin(9600); // Iniciamos el puerto serie a 9600 baudios 70 BT.begin(9600); // Iniciamos el puerto serie dedicado al Bluetooth a 9600 baudios sensors.begin(); // Inicializamos el sensor DS18B pinmode(control_signal, OUTPUT); // Definimos la salida para mandar la señal de control // Si es la primera vez que arranca establece el valor predeterminado de la temperatura en la EEPROM 77 if(eeprom.read(0)==255) 78 EEPROM.write(0, 20); 79 temp_deseada=eeprom.read(0); // Asignamos la temperatura guardada en la EEPROM 80 } void loop(void) { 83 time = millis(); 84 if (time < timer) // Evitamos el problema de desbordamiento que ocurre aproximadamente cada 50 días 85 { 86 timer = millis(); 87 } temp[1]=temperatura_1(); // Actualizamos las temperatura del sensor 90 temp[2]=temperatura_2(); // Actualiza la temperatura recibida por Bluetooth if(time - timer > 60000) 93 { 94 if (m==1) 95 { 96 lcd.setcursor(0,1); 97 lcd.print(" ESPERA "); Anejos a la Memoria 52 de 12462 98 } 99 switch (n) 100 { 101 case 0: 102 temp_deseada=tembooread(); 103 n++; 104 break; 105 case 1: 106 TembooWrite(String(temp[1]), "Temperatura_1"); 107 n++; 108 break; 109 case 2: 110 TembooWrite(String(temp[2]), "Temperatura_2"); 111 n = 0; 112 break; 113 } 114 timer = millis(); 115 } analogwrite(control_signal, (temp_deseada*255)/30); // Enviamos la señal de control a la caldera menu(m); // Comprobamos si se ha seleccionado otro menú 120 pulsadores(); // Comprobamos si se ha pulsado algún botón 121 } // Función para realizar la lectura de temperatura del sensor 125 float temperatura_1() 126 { 127 sensors.requesttemperatures(); 128 return sensors.gettempcbyindex(0); 129 } // Función para recibir la temperatura por el puerto serie 132 float temperatura_2() 133 { 134 if(bt.available() > 0) 135 { 136 delay(5); 137 for (int i=0 ; i < 7 ; i++) 138 temp_a[i] = BT.read(); 139 } 140 return atof(temp_a); // Transformamos el array en un número flotante 141 } // Función para representar el Menú Principal 144 void temperatura_lcd(int t) 145 { 146 lcd.setcursor(0,t-1); 147 lcd.print("temp."); 148 lcd.print(t); 149 lcd.print(" = "); 150 lcd.setcursor(9, t-1); 151 lcd.print(temp[t]); 152 lcd_grado(t); 153 } Anejos a la Memoria 53 de 12463 // Función para representar el Menú Secundario 156 void temperatura_deseada(int temp_deseada) 157 { 158 lcd.setcursor(0,0); 159 lcd.print("t.deseada = "); 160 lcd.setcursor(12, 0); 161 lcd.print(temp_deseada); 162 lcd_grado(1); 163 } // Función para representar el símbolo de la temperatura 166 void lcd_grado(int t) 167 { 168 lcd.createchar(0, chargrado); 169 lcd.setcursor(14, t-1); 170 lcd.write(byte(0)); 171 lcd.print("c"); 172 } // Representación del Menú correspondiente en el LCD 175 void menu(int m) 176 { 177 lcd.clear(); 178 switch (m) 179 { 180 case 0: // Menú Principal 181 temperatura_lcd(1); 182 temperatura_lcd(2); 183 break; 184 case 1: // Menú Secundario 185 temperatura_deseada(temp_deseada); 186 break; 187 } 188 } // Función para los botones 191 void pulsadores() 192 { 193 adc_key_in = analogread(0); // Leemos el valor de la pulsación 194 key = get_key(adc_key_in); // Obtenemos el botón pulsado 195 if (key!= oldkey) // Si se detecta una tecla pulsada delay(50); // Espera para evitar los rebotes de las pulsaciones 198 adc_key_in = analogread(0); // Leemos el valor de la pulsación 199 key = get_key(adc_key_in); // Obtenemos el botón pulsado 200 if (key!= oldkey) 201 { 202 if (key == 0){ // Se ha pulsado la tecla derecha 203 if (m<1) 204 m++; 205 } 206 if (key == 1) { // Se ha pulsado la tecla arriba 207 if (m==1 && temp_deseada<30) 208 temp_deseada++; 209 if (m==1 && temp_deseada==30) 210 { Anejos a la Memoria 54 de 12464 211 lcd.setcursor(2,1); 212 lcd.print("valor MAXIMO"); 213 delay(500); 214 } 215 } 216 if (key == 2) { // Se ha pulsado la tecla abajo 217 if (m==1 && temp_deseada>0) 218 temp_deseada--; 219 if (m==1 && temp_deseada==0) 220 { 221 lcd.setcursor(2,1); 222 lcd.print("valor MINIMO"); 223 delay(500); 224 } 225 } 226 if (key == 3) { // Se ha pulsado la tecla izquierda 227 if (m>0) 228 m--; 229 } 230 if (key == 4){ // Se ha pulsado la tecla de selección 231 if (m==1 && temp_deseada>0) 232 { 233 EEPROM.write(0, temp_deseada); 234 lcd.setcursor(4,1); 235 lcd.print("guardado"); 236 TembooWrite(String(temp_deseada), "Temperatura_deseada"); 237 } 238 } 239 } 240 } // Función para convertir el valor leído en analógico en un número de botón pulsado 243 int get_key(unsigned int input) 244 { 245 int k; for (k = 0; k < NUM_KEYS; k++) 248 { 249 if (input < adc_key_val[k]) 250 { 251 return k; 252 } 253 } if (k >= NUM_KEYS)k = -1; // Error en la lectura 256 return k; 257 } void TembooWrite(String temp_str, String temperatura) 260 { 261 TembooChoreo WriteDataChoreo; // Invoca el cliente 264 WriteDataChoreo.begin(); Anejos a la Memoria 55 de 12465 // Configura las credenciales de la cuenta 267 WriteDataChoreo.setAccountName(TEMBOO_ACCOUNT); 268 WriteDataChoreo.setAppKeyName(TEMBOO_APP_KEY_NAME); 269 WriteDataChoreo.setAppKey(TEMBOO_APP_KEY); // Configura el dato a escribir 272 WriteDataChoreo.addInput("DatastreamID", temperatura); 273 WriteDataChoreo.addInput("FeedID", FeedID); 274 WriteDataChoreo.addInput("Value", temp_str); 275 WriteDataChoreo.addInput("APIKey", APIKey); // Identifica el lugar donde se ha de escribir 278 WriteDataChoreo.setChoreo("/Library/Xively/ReadWriteData/WriteData"); // Escribe el valor en Xively y cierra la conexión 281 WriteDataChoreo.run(); 282 WriteDataChoreo.close(); 283 } int TembooRead() 286 { 287 TembooChoreo ReadFeedChoreo; // Invoca el cliente 290 ReadFeedChoreo.begin(); // Configura las credenciales de la cuenta 293 ReadFeedChoreo.setAccountName(TEMBOO_ACCOUNT); 294 ReadFeedChoreo.setAppKeyName(TEMBOO_APP_KEY_NAME); 295 ReadFeedChoreo.setAppKey(TEMBOO_APP_KEY); // Configura el dato a leer 298 ReadFeedChoreo.addInput("FeedID", FeedID); 299 ReadFeedChoreo.addInput("APIKey", APIKey); 300 ReadFeedChoreo.addInput("Datastreams", "Temperatura_deseada"); // Identifica el lugar donde se ha de leer 303 ReadFeedChoreo.setChoreo("/Library/Xively/ReadWriteData/ReadFeed"); // Obtenemos el valor buscado y cerramos la conexión 306 ReadFeedChoreo.run(); 307 String info_temperatura_deseada=""; 308 while(readfeedchoreo.available()) { 309 info_temperatura_deseada.concat((char)readfeedchoreo.read()); 310 } 311 int index = info_temperatura_deseada.indexof("current_value"); 312 String temp_value(info_temperatura_deseada.substring(index+16, index+18)); 313 ReadFeedChoreo.close(); 314 if(index<0) // Así evitamos errores de lectura si la conexión a Internet falla 315 return temp_deseada; 316 return temp_value.toint(); 317 } Anejos a la Memoria 56 de 12466 Versión Zigbee 1 // Librerías para realizar funciones con la EEPROM, LCD, sensor DS18B20, Web Service Temboo y MRF24J40MA 2 #include <EEPROM.h> 3 #include <LiquidCrystal.h> 4 #include <OneWire.h> 5 #include <DallasTemperature.h> 6 #include <Bridge.h> 7 #include <Temboo.h> 8 #include <SPI.h> 9 #include <mrf24j.h> #define CONTROL_SIGNAL 3 // Definimos pin para mandar la señal de control a la caldera 12 #define ONE_WIRE_BUS A5 // Definimos el pin conectado al terminal DQ del termistor OneWire onewire(one_wire_bus); // Configuramos para comunicar con otros dispositivos 1-Wire 15 DallasTemperature sensors(&onewire); // Indicamos el pin asignado al sensor 1- Wire a DallasTemperature 16 LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7); // Inicializamos el display //Definimos de los pines de Reset, CS y de Interrupción 19 const int pin_reset = 11; 20 const int pin_cs = 12; 21 const int pin_interrupt = 2; Mrf24j mrf(pin_reset, pin_cs, pin_interrupt); byte chargrado[8] = { // Creamos el caracter 'º' mediante un array de 8 bytes 26 0b00111, 27 0b00101, 28 0b00111, 29 0b00000, 30 0b00000, 31 0b00000, 32 0b00000, 33 0b }; //Información para Temboo 37 String TEMBOO_ACCOUNT = "oscarute"; 38 String TEMBOO_APP_KEY_NAME = "Termoduino"; 39 String TEMBOO_APP_KEY = "b63318f189df451898aa54d563881e7a"; //Información para Xively 42 String FeedID = " "; 43 String APIKey = "9WBw2EamK7kCqpZN1L0ZlHHImDV0XBihjrySjQ9e3jRQNpcg"; long unsigned timer=0, time; // Variables para el temporizador int temp_deseada; // Temperatura deseada 48 float temp[3]; // Temperatura deseada y temperaturas medidas 49 char temp_a[7]; // Array que recibirá la temperatura Anejos a la Memoria 57 de 12467 50 51 int m=0, n=0; // Variable para la selección de menú y selección de acción en Temboo // Variables necesarias para el uso de botones 54 int adc_key_val[5]={50, 200, 400, 600, 800}; 55 int NUM_KEYS=5; 56 int adc_key_in; 57 int key=-1; 58 int oldkey=-1; void setup(void) 62 { 63 // Inicializamos el display 64 lcd.clear(); 65 lcd.begin(16, 2); // Establecemos el número de columnas y filas del display 66 lcd.setcursor(3,0); 67 lcd.print("termoduino"); 68 delay(2000); 69 lcd.setcursor(0,1); 70 lcd.print("iniciando BRIDGE"); Bridge.begin(); // Iniciamos el puente entre arduino y linino (linux) 73 lcd.setcursor(0,1); 74 lcd.print("creado POR OSCAR"); // Iniciamos el módulo MRF24J40MA y configuramos el PAN_ID así como su dirección y pin de interrupción 77 mrf.reset(); 78 mrf.init(); 79 mrf.set_pan(0xcafe); //PAN_ID 80 mrf.address16_write(0x6002); //Dirección 81 attachinterrupt(1, interrupt_routine, CHANGE); // Seleccionado pin de interrupción INT0 (Pin 2) 82 interrupts(); 83 delay(500); sensors.begin(); // Inicializamos el sensor DS18B pinmode(control_signal, OUTPUT); // Definimos la salida para mandar la señal de control // Si es la primera vez que arranca establece el valor predeterminado de la temperatura en la EEPROM 90 if(eeprom.read(0)==255) 91 EEPROM.write(0, 20); 92 temp_deseada=eeprom.read(0); // Asignamos la temperatura guardada en la EEPROM 93 } void interrupt_routine() 96 { 97 mrf.interrupt_handler(); 98 } Anejos a la Memoria 58 de 12468 101 void loop(void) { 102 time = millis(); 103 if (time < timer) // Evitamos el problema de desbordamiento que ocurre aproximadamente cada 50 días 104 { 105 timer = millis(); 106 } temp[1]=temperatura_1(); // Actualizamos las temperatura del sensor 109 mrf.check_flags(&handle_rx, &handle_tx); // Actualiza la temperatura recibida por Zigbee if(time - timer > 60000) 112 { 113 if (m==1) 114 { 115 lcd.setcursor(0,1); 116 lcd.print(" ESPERA "); 117 } 118 switch (n) 119 { 120 case 0: 121 temp_deseada=tembooread(); 122 n++; 123 break; 124 case 1: 125 TembooWrite(1, "Temperatura_1"); 126 n++; 127 break; 128 case 2: 129 TembooWrite(2, "Temperatura_2"); 130 n = 0; 131 break; 132 } 133 timer = millis(); 134 } analogwrite(control_signal, (temp_deseada*255)/30); // Enviamos la señal de control a la caldera menu(m); // Comprobamos si se ha seleccionado otro menú 139 pulsadores(); // Comprobamos si se ha pulsado algún botón 140 } // Función para realizar la lectura de temperatura del sensor 144 float temperatura_1() 145 { 146 sensors.requesttemperatures(); 147 return sensors.gettempcbyindex(0); 148 } 149 Anejos a la Memoria 59 de 12469 150 void handle_rx() // Código para la recepción por RF 151 { 152 for (int i = 0; i < mrf.rx_datalength(); i++) 153 temp_a[i]=mrf.get_rxinfo()->rx_data[i]; 154 temp[1]=atof(temp_a); 155 } void handle_tx() {} // Código para transmitir, aquí no tiene ninguna función // Función para representar el Menú Principal 161 void temperatura_lcd(int t) 162 { lcd.setcursor(0,t-1); 165 lcd.print("temp."); 166 lcd.print(t); 167 lcd.print(" = "); 168 lcd.setcursor(9, t-1); 169 lcd.print(temp[t]); 170 lcd_grado(t); 171 } // Función para representar el Menú Secundario 174 void temperatura_deseada(int temp_deseada) 175 { 176 lcd.clear(); 177 lcd.setcursor(0,0); 178 lcd.print("t.deseada = "); 179 lcd.setcursor(12, 0); 180 lcd.print(temp_deseada); 181 lcd_grado(1); 182 } // Función para representar el símbolo de la temperatura 185 void lcd_grado(int t) 186 { 187 lcd.createchar(0, chargrado); 188 lcd.setcursor(14, t-1); 189 lcd.write(byte(0)); 190 lcd.print("c"); 191 } // Representación del Menú correspondiente en el LCD 194 void menu(int m) 195 { 196 switch (m) 197 { 198 case 0: // Menú Principal 199 temperatura_lcd(1); 200 temperatura_lcd(2); 201 break; 202 case 1: // Menú Secundario 203 temperatura_deseada(temp_deseada); 204 break; 205 } 206 } Anejos a la Memoria 60 de 12470 // Función para los botones 209 void pulsadores() 210 { 211 adc_key_in = analogread(0); // Leemos el valor de la pulsación 212 key = get_key(adc_key_in); // Obtenemos el botón pulsado 213 if (key!= oldkey) // Si se detecta una tecla pulsada delay(50); // Espera para evitar los rebotes de las pulsaciones 216 adc_key_in = analogread(0); // Leemos el valor de la pulsación 217 key = get_key(adc_key_in); // Obtenemos el botón pulsado 218 if (key!= oldkey) 219 { 220 if (key == 0){ // Se ha pulsado la tecla derecha 221 if (m<1) 222 m++; 223 } 224 if (key == 1) { // Se ha pulsado la tecla arriba 225 if (m==1 && temp_deseada<30) 226 temp_deseada++; 227 if (m==1 && temp_deseada==30) 228 { 229 lcd.setcursor(2,1); 230 lcd.print("valor MAXIMO"); 231 delay(500); 232 } 233 } 234 if (key == 2) { // Se ha pulsado la tecla abajo 235 if (m==1 && temp_deseada>0) 236 temp_deseada--; 237 if (m==1 && temp_deseada==0) 238 { 239 lcd.setcursor(2,1); 240 lcd.print("valor MINIMO"); 241 delay(500); 242 } 243 } 244 if (key == 3) { // Se ha pulsado la tecla izquierda 245 if (m>0) 246 m--; 247 } 248 if (key == 4){ // Se ha pulsado la tecla de selección 249 if (m==1 && temp_deseada>0) 250 { 251 EEPROM.write(0, temp_deseada); 252 lcd.setcursor(4,1); 253 lcd.print("guardado"); 254 TembooWrite(0, "Temperatura_deseada"); 255 } 256 } 257 } 258 } 259 Anejos a la Memoria 61 de 12471 260 // Función para convertir el valor leído en analógico en un número de botón pulsado 261 int get_key(unsigned int input) 262 { 263 int k; for (k = 0; k < NUM_KEYS; k++) 266 { 267 if (input < adc_key_val[k]) 268 { 269 return k; 270 } 271 } if (k >= NUM_KEYS)k = -1; // Error en la lectura 274 return k; 275 } void TembooWrite(int n, String temperatura) 278 { 279 TembooChoreo WriteDataChoreo; // Invoca el cliente 282 WriteDataChoreo.begin(); // Configura las credenciales de la cuenta 285 WriteDataChoreo.setAccountName(TEMBOO_ACCOUNT); 286 WriteDataChoreo.setAppKeyName(TEMBOO_APP_KEY_NAME); 287 WriteDataChoreo.setAppKey(TEMBOO_APP_KEY); String temp_str = String(temp[n]); 290 if (n==0) 291 temp_str = String((int)temp[n]); // Configura el dato a escribir 294 WriteDataChoreo.addInput("DatastreamID", temperatura); 295 WriteDataChoreo.addInput("FeedID", FeedID); 296 WriteDataChoreo.addInput("Value", temp_str); 297 WriteDataChoreo.addInput("APIKey", APIKey); // Identifica el lugar donde se ha de escribir 300 WriteDataChoreo.setChoreo("/Library/Xively/ReadWriteData/WriteData"); // Escribe el valor en Xively y cierra la conexión 303 WriteDataChoreo.run(); 304 WriteDataChoreo.close(); 305 } int TembooRead() 308 { 309 TembooChoreo ReadFeedChoreo; // Invoca el cliente 312 ReadFeedChoreo.begin(); 313 Anejos a la Memoria 62 de 124 72 314 // Configura las credenciales de la cuenta 315 ReadFeedChoreo.setAccountName(TEMBOO_ACCOUNT); 316 ReadFeedChoreo.setAppKeyName(TEMBOO_APP_KEY_NAME); 317 ReadFeedChoreo.setAppKey(TEMBOO_APP_KEY); // Configura el dato a leer 320 ReadFeedChoreo.addInput("FeedID", FeedID); 321 ReadFeedChoreo.addInput("APIKey", APIKey); 322 ReadFeedChoreo.addInput("Datastreams", "Temperatura_deseada"); // Identifica el lugar donde se ha de leer 325 ReadFeedChoreo.setChoreo("/Library/Xively/ReadWriteData/ReadFeed"); // Obtenemos el valor buscado y cerramos la conexión 328 ReadFeedChoreo.run(); 329 String info_temperatura_deseada=""; 330 while(readfeedchoreo.available()) { 331 info_temperatura_deseada.concat((char)readfeedchoreo.read()); 332 } 333 int index = info_temperatura_deseada.indexof("current_value"); 334 String temp_value(info_temperatura_deseada.substring(index+16, index+18)); 335 ReadFeedChoreo.close(); 336 if(index<0) // Así evitamos errores de lectura si la conexión a Internet falla 337 return temp_deseada; 338 return temp_value.toint(); 339 } Compilación en el Entorno de Desarrollo de Arduino Ilustración 42. Compilación del código para Arduino Yún (Versión Bluetooth). Ilustración 43. Compilación del código para Arduino Yún (Versión Zigbee). Anejos a la Memoria 63 de 124 73 Indicaciones para el cableado del Arduino Yún C.I. YUN V o 3 Tx 12 Rx 11 DQ A5 GND GND Vcc 5V MISO SCK RESET 5V MOSI GND MRF24J40MA YUN + ICSP SCK SCK CS SDI 12 MOSI SDO INT MISO 2 WAKE RESET 11 V IN GND 3,3V GND Anejos a la Memoria 64 de 12474 Servicio NO-IP Vamos a realizar un ejemplo de cómo acceder al panel de configuración de nuestro Arduino Yún a través de Internet utilizando el Servicio NO-IP. Contamos con los siguientes aparatos para la conexión a Internet: Módem: Thomson STx6v6. Router: TP-Link TL-WR941N. En principio podemos conectarnos por Internet a nuestro Yún, accediendo a su IP de Internet a través de un navegador, pero antes debemos acceder al Router y redirecionar las peticiones del puerto 80; que es el que usan las conexiones HTTP a la IP de red nuestro Arduino Yún. Por lo que le deberemos asignar una IP de red fija. Como la IP de internet suele ser dinámica, utilizaremos el Servicio NO-IP para solventar este problema. En nuestro caso tenemos un problema, y es que el módem redirecciona automáticamente el puerto 80 a la página de configuración del módem, por lo que deberemos utilizar otro puerto. En este caso será el Comenzaremos por abrir el puerto 8080 en el módem, al cual accedemos poniendo nuestra IP de Internet en el navegador: Ilustración 44. Configuración módem Thomson STx6v6. Anejos a la Memoria 65 de 124 75 Tras haber asignado una IP fija a nuestro Arduino Yún, vamos a redireccionar a esa IP las peticiones realizadas al puerto Ilustración 45. Configuración TP-Link TL-WR941N. El Arduino Yún está configurado para recibir peticiones al puerto 80, por lo que deberemos reconfigurarlo para que acepte peticiones en el Llevareremos a cabo la reconfiguración modificando el archivo uhttpd situado en la carpeta /etc/config de la memoria dedicada a la distribución Linux. Para acceder a esa carpeta utilizaremos una conexión SFTP (SSH File Transfer Protocol) a través del software FileZilla. Para realizar la conexión SFTP necesitamos un paquete llamado opensshsftp-server, que instalaremos conectándonos por SSH al Arduino Yún con un software llamado PuTTY. Ilustración 46. Conexión SSH con el Arduino Yún. Anejos a la Memoria 66 de 124 76 Para realizar el login utilizaremos root como usuario y la contraseña que pusimos al configurar el Arduino Yún, si nunca la modificamos la contraseña por defecto es arduino. Después descargaremos el paquete a través del comando: opkg update Y finalmente instalaremos el paquete openssh-sftp-server : opkg install openssh-sftp-server Una vez instalado podremos acceder al archivo buscado con FileZilla: Ilustración 47. Conexión SFTP con el Arduino Yún. Modificamos el archivo uhttpd, duplicando el código referente al puerto 80 y asignando el puerto Después lo transferimos al Yún. Ilustración 48. Modificación del archivo uhttpd. Anejos a la Memoria 67 de 12477 Una vez configurados el módem, Router y Arduino Yún deberemos crear una cuenta en la web de NO-IP a través de la siguiente dirección: https://www.noip.com/sign-up Después accedemos a Add Host, escribimos el nombre que queremos dar a nuestro host y elegiremos uno de los dominios gratuitos disponibles. Ilustración 49. Configuración Servicio NO-IP. En este caso elegimos el nombre termoduino y el dominio no-ip.org. El host creado se asignará a la IP de Internet utilizada para la configuración del servicio, y tardará un rato en estar disponible, cuando lo esté podremos acceder a través de la dirección: https://termoduino.no-ip.org En el desarrollo del código hay que tener en cuenta que si la IP no es renovada cada 30 días la cuenta es bloqueada. Por lo tanto actualizaremos la IP cada 24h y para evitar quedarnos sin acceso cada 30 minutos se comprobará si la IP ha cambiado y en caso afirmativo se actualizará. Además en la temporización utilizaremos una variable long unsigned que se desbordará cada 50 días, para la cual crearemos un parche. Utilizaremos la función GET que nos proporciona la librería HttpClient en conjunto con la librería Bridge para obtener nuestra IP, así como para enviarla al Servicio NO-IP. Código para utilizar el Servicio NO-IP 1 #include <Bridge.h> 2 #include <HttpClient.h> 3 4 long unsigned antes=0, antes_24=0, ahora; 5 String webip="", webipsaved=""; 6 String 7 8 void setup() { 9 Bridge.begin(); 10 Serial.begin(9600); 11 while (!Serial); 12 delay(1000); 13 renuevaip(); // Renovamos la IP del servicio NO-IP en cada arranque 14 } Anejos a la Memoria 68 de 12478 15 16 void loop() { 17 ahora = millis(); 18 // Evitamos el problema de desbordamiento que ocurre aproximadamente cada 50 días 19 if (ahora < antes) { 20 antes = millis(); 21 antes_24 = millis(); 22 } 23 if(ahora - antes > ) // Comprueba la IP cada 30 minutos y si ésta ha cambiado la renueva 24 { 25 // Renueva la IP cada 24h para evitar perder la cuenta gratuita de NO-IP 26 if(ahora - antes_24 > ) { 27 antes_24 = millis(); 28 webipsaved=""; // Eliminamos la IP guardada para forzar la siguiente renovación 29 } 30 antes = millis(); 31 renuevaip(); 32 } 33 delay(5000); 34 } // Función para renovar la IP externa en el servicio NO-IP 37 void renuevaip() 38 { 39 HttpClient client; 40 client.get("http://ipecho.net/plain"); 41 if (!client.available()) { // Si no obtenemos la IP de una web por estar caída tenemos otra de reserva 42 client.get("http://icanhazip.com/"); 43 if (!client.available()) // En el caso de no tener internet accedemos directamente al aparato sin la espera 44 return; 45 } 46 else; 47 while (client.available()) 48 webip.concat((char)client.read()); // Comprobamos si la IP ha cambiado para renovarla 51 if (webip!=webipsaved) { 52 client.get(peticion+webip); 53 webipsaved=webip; 54 } 55 } Anejos a la Memoria 69 de 12479 1.7. ANEJO VI: DISEÑO DE LAS PCB Vamos a realizar el diseño de tres placas de circuito impreso. La primera será una shield para el Arduino UNO que contendrá el sensor de temperatura, así como los zócalos para poder conectar los módulos de Bluetooth y Zigbee. Después realizaremos dos placas más: una placa para el Arduino Yún que contendrá el sensor de temperatura, un zócalo para poder conectar el módulo Bluetooth y la salida de donde obtendremos la señal de control; y la otra será para la conexión del módulo Zigbee con el Arduino Yún. El software que utilizaremos se llama Eagle y en su versión gratuita podremos diseñar placas de hasta 10x8cm, suficiente para nuestras necesidades. Podremos descargarlo de la siguiente dirección: Eagle trabaja con bibliotecas de componentes, por lo que usaremos la biblioteca de SparkFun que contiene gran cantidad de componentes, entre ellos el Arduino UNO. La podemos descargar de la siguiente dirección: https://github.com/sparkfun/sparkfun-eagle-libraries Necesitaremos otro par de librerías los DS18B20 y MRF24J40MA: Para instalarlas tan solo debemos descomprimir las librerías y meterlas en la carpeta lbr, localizada en la ruta donde instalamos Eagle. Para activarlas debemos dar click derecho en Libreries y luego en Use all. Ahora abrimos Projects y para crear cada uno de los proyectos daremos click derecho en la carpeta eagle y seleccionaremos New Project. Le damos un nombre y luego doble click para abrirlo (aparece un círculo verde), finalmente daremos otra vez click derecho y eligiremos New > Schematic. Se abrirá automáticamente la aplicación Schematic donde realizaremos las conexiones entre componentes. Es posible poner el fondo negro para mejorar la visualización de los componentes accediendo en el menú: Options > User interface y en Layout y Schematic cambiamos White por Black. A la izquierda de la aplicación tenemos una barra de herramientas que nos ayudará en el diseño de nuestra placa. El primer paso es añadir los componentes, para ello utilizamos la herramienta Add y nos aparecerá una ventana con todas las librerías que están cargadas. Mediante el buscador Search podemos encontrar los componentes, por ejemplo buscamos Arduino y encontraremos ARDUINO_R3_SHIELD. Anejos a la Memoria 70 de 12480 Cuando encontremos el componente hacemos doble click sobre él y podremos añadirlo a nuestro diseño tantas veces como queramos haciendo click izquierdo, si hacemos click derecho el componente rotará. Cuando tengamos todos los componentes y terminales de alimentación/masa, realizaremos las conexiones con la herramienta Net, si alguna conexión es complicada simplemente dejaremos el hilo suelto en ambos pines y los conectaremos dándoles el mismo nombre con la herramienta Name. Ilustración 50. Esquema de conexiones para la shield en Eagle. En el caso de los módulos Bluetooth en vez de añadir el componente en sí hemos añadido un zócalo de 4 pines. Una vez finalizadas las conexiones pasaremos al diseño de la placa, para ello hacemos click en Generate/switch to board situado en la barra de herramientas superior y se nos abrirá la aplicación Board. En esta aplicación tendremos una vista en planta de los componentes que teníamos en Schematic con su forma física real y de un recuadro que representa la PCB. Aparecen unas líneas entre las conexiones de los componentes que nos guiarán a la hora de colocar los componentes sobre el recuadro. Realizaremos el ruteado de pistas de forma automática mediante la herramienta Autorouter. Al abrirla seleccionaremos N/A en Top para no utilizar la capa superior y * en la Bottom, así utilizaremos una sola capa. Anejos a la Memoria 71 de 124 81 Al crear una placa lo que hacemos es eliminar el cobre sobrante, por lo que facilitaremos la fabricación creando un plano de masas. Para ello utilizaremos la herramienta Polygon para crear un rectángulo alrededor del ruteado, después hacemos click derecho sobre él y accedemos a Properties para asignar el valor 0.5 en Insolate. Después mediante la herramienta Name asignamos el nombre GND al rectángulo y finalmente volvemos a utilizar la herramienta Autorouter, esta vez obtendremos un ruteado similar al de la siguiente ilustración. Ilustración 51. Diseño de la PCB para la shield en Eagle. Para poder exportar nuestro diseño desde la herramienta Layer settings hacemos invisibles todas las capas menos las de Bottom y Pads. Para crear la placa podemos imprimir el diseño directamente desde el programa o exportarlo a través del menú File > Export > Image y activando Monochrome obtendremos una imagen en blanco y negro [16]. Anejos a la Memoria 72 de 12482 Una vez fabricada, la placa y su montaje tendrán el siguiente aspecto: Ilustración 52. PCB de la shield. Ilustración 53. Shield conectada al Arduino UNO. Anejos a la Memoria 73 de 12483 Para crear las placas de conexiones de Arduino Yún y MRF24J40MA seguiremos el mismo proceso, obteniendo los siguientes resultadoss: Ilustración 54. PCB de la placa para el Arduino Yún. Ilustración 55. Placa montada y conectada al Arduino Yún. Anejos a la Memoria 74 de 12484 Ilustración 56. PCB de la placa para del MRF24J40MA. Ilustración 57. Placa del MRF24J40MA montada. Anejos a la Memoria 75 de 124 85 1.8. ANEJO VII: ANDROID Comenzamos por aprender los conceptos básicos como la instalación del Entorno de Desarrollo Android Studio, como crear un configurar un proyecto Android, su estructura y los elementos más importantes de la misma. Después descubriremos cómo añadir los elementos necesarios a la interfaz de usuario de nuestro programa (como cuadros de texto y botones), así como otras funcionalidades que utilizaremos como las notificaciones Toast y tareas en segundo plano. Aprenderemos a emular nuestro programa a través del propio emulador de Android Studio o nuestro smartphone, a crear la aplicación ejecutable en formado apk y finalmente pasaremos a desarrollar la aplicación Android Studio Lo primero que debemos hacer descargar e instalar el Android Studio, así como las librerías del Java JDK (Java Development Kit) que son indispensables para ejecutar el emulador de Android y algunas herramientas de depuración. Para crear una aplicación debemos acceder a New Project donde elegiremos los nombres de la aplicación, módulo y paquete. Otras cosas que podremos configurar es la versión mínima de Android que será soportada por nuestra aplicación, el tema o si le daremos un icono. Ilustración 58. Nuevo proyecto en Android Studio. En los siguientes elegiremos la imagen para el icono, el tipo de activity (ventana de la aplicación) que queremos y el nombre que asignaremos a la activity y layout (interfaz gráfica de la activity). Anejos a la Memoria 76 de 124 86 Tras la configuración tendremos una estructura similar a la siguiente: Ilustración 59. Estructura proyecto Android Studio. A continuación describimos los elementos que nos importan de la misma: Carpeta /libs/ Contiene las librerías que utilizará nuestra aplicación. Para añadir la librería tenemos que copiar el archivo.jar desde el explorador de archivos de nuestro ordenador y pegarlo en la carpeta haciendo click derecho en la carpeta libs y seleccionando Paste. Después debemos dar click derecho sobre el archivo y elegir Add as Library. Carpeta /src/ Esta carpeta contendrá todo el código fuente de la aplicación, como el código de la interfaz gráfica, clases auxiliares, etc. Inicialmente Android Studio creará el código básico de la pantalla (MainActivity.java) principal de la aplicación, cuyo nombre hemos dado en la configuración. Anejos a la Memoria 77 de 124 87 Carpeta /res/ Contiene todos los recursos necesarios para el proyecto. En las carpetas drawable tenemos las imágenes que utilizamos en el proyecto como por ejemplo el icono de la aplicación, para diferentes resoluciones. En la carpeta values guardaremos diferentes valores, como dimensiones (dimens.xml), estilos (styles.xml) y cadenas de texto strings.xml. Entre los recursos creados por defecto tenemos activity_main.xml en la carpeta layout que contiene la interfaz gráfica de la pantalla principal de nuestra aplicación y que podemos modificar directamente como código o a través de una interfaz de diseño muy completa, donde podremos elegir el modelo de smartphone (en este caso un Nexus 5) que queramos utilizar como base para el diseño de la interfaz gráfica de la aplicación. Ilustración 60. Interfaz gráfica de diseño de Android Studio. Fichero AndroidManifest.xml Contiene la definición en XML de los aspectos principales de la aplicación, como su identificación (nombre, versión, icono, etc.), sus componentes (pantallas, mensajes, etc.), las librerías auxiliares utilizadas o los permisos necesarios para su ejecución [17]. Por ejemplo para añadir el permiso para acceder a Internet debemos incluir el siguiente código antes de la etiqueta <application>. <uses-permission android:name="android.permission.internet" /> Anejos a la Memoria 78 de 12488 Interfaz de Usuario Disponemos de multitud de elementos en este apartado, por lo que nos vamos a centrar en los utilizados para el proyecto; que serán los layouts, botones y cuadros de texto. Layout Los layout son elementos no visuales destinados a controlar la distribución, posición y dimensiones de los controles que se insertan en su interior. Existen varios tipos como: FrameLayout Es el más importante de todos, coloca sus controles alineados con su esquina superior izquierda, de forma que cada control quedará oculto por el control siguiente. Los elementos incluidos podrán establecer su forma de ajustarse al layout mediante sus propiedades android:layout_width y android:layout_height. Dando el valor match_parent el elemento ajusta su dimensión al layout contenedor, en cambio con wrap_content el elemento tomará las dimensiones de su contenido. LinearLayout El siguiente layout apila los elementos uno tras otro de forma horizontal o vertical según se establezca su propiedad android:orientation. Aquí los elementos también pueden establecer sus dimensiones dentro del layout mediante los parámetros anteriormente mencionados, pero aquí además tenemos la propiedad android:layout_weight que nos va a permitir dar a los elementos contenidos en el layout unas dimensiones proporcionales entre ellas. TableLayout y GridLayot Permite distribuir los elementos de forma tabular, definiendo filas y columnas. Tan solo difieren en la forma que tiene cada uno de colocar y distribuir sus elementos en el espacio disponible. RelativeLayout Este layout permite especificar la posición de cada elemento de forma relativa a otro elemento incluido en el layout. Anejos a la Memoria 79 de 12489 Botones Los botones tienen básicamente dos tipos: pulsador o interruptor, que se corresponden a Control Button y Control ToggleButton. Para asignar el texto que aparecerá en el botón utilizamos la propiedad android:text, en la cual podemos escribirlo directamente o a través de una cadena (String) que tendremos que declarar en strings.xml. android:text="nombre del botón" También existe un tercer tipo de botón para utilizar una imagen como botón llamado Control ImageButton. Para este proyecto utilizaremos Control Button, para utilizarlo primero le asignamos un identificador con el parámetro android:id, por ejemplo: Los botones pueden lanzar muchos eventos, pero el más común es el evento onclick, que se lanza cada vez que el usuario pulsa sobre él. Para ello debemos definir un nuevo objeto View.OnClickListener() y asociarlo al botón con el métido setonclicklistener(). Por ejemplo: private Button boton; boton = (Button)findViewById(R.id.miboton); boton.setonclicklistener(new View.OnClickListener() { public void onclick(view arg0) { // Código a ejecutar } }); Para implementarlo en nuestro código, debemos incluirlo en la función oncreate de nuestro código Java. Cuadros de Texto Existen principalmente dos tipos: Control TextView que se utilizan para mostrar un determinado texto al usuario y Control EditText que además permite modificar el texto directamente desde la interfaz. Ambos son manipulables desde el código Java, por lo que asignando un id con el parámetro android:id podemos modificar su contenido mediante la función settext() o leerlo con gettext() [17]. Anejos a la Memoria 80 de 12490 Notificaciones Android Las notificaciones en Android se realizan de las siguientes formas: Notificaciones Toast. Notificaciones de la Barra de Estado. Cuadro de Diálogo: Diálogo de Alerta. Diálogo de Selección. Diálogos Personalizados. Para nuestro programa tan solo aprenderemos a utilizar la notificación Toast. Un toast es un mensaje que se muestra en la pantalla durante unos segundos y después desaparece sin requerir ningún tipo de acción por parte del usuario. Para su implementación se utiliza un código como: Toast toast_ejemplo = Toast.makeText(getApplicationContext(), "Texto a mostrar", Toast.LENGTH_SHORT); toast_ejemplo.setgravity(gravity.right Gravity.TOP, 10, 0); toast_ejemplo.show(); Tiene diferentes parámetros que podemos configurar, como la duración que puede ser corta LENGTH_SHORT o larga LENGTH_LONG. También podemos elegir donde queramos que aparezca, mediante el parámetro Gravity y los valores: RIGHT (derecha), LEFT (izquierda), TOP (arriba) y BOTTOM (abajo). Además para más precisión podemos designar las coordenadas en el eje de abscisas y ordenadas Tareas en Segundo Plano Todos los componentes de una aplicación Android, tanto las actividades o los servicios se ejecutan en el mismo hilo de ejecución, llamado hilo principal. Por lo tanto si vamos a realizar una operación larga o costosa el hilo va a bloquear la ejecución del resto de componentes de la aplicación. Para ello utilizaremos una clase auxiliar proporcionada por Android llamada AsyncTask, la cual se compone de las siguientes funciones: onpreexecute() Se ejecutará antes del código principal de nuestra tarea. Se suele utilizar para preparar la ejecución de la tarea, inicializar la interfaz, etc. doinbackground() Contendrá el código principal de nuestra tarea. onprogressupdate() Anejos a la Memoria 81 de 12491 Se ejecutará cada vez que llamemos a la función PublishProgress() desde la función doinbackground(). onpostexecute() Se ejecutará cuando finalice la función doinbackground(). oncancelled() Se ejecutará cuando se cancele la ejecución de la tarea antes de su finalización normal. Código de ejemplo private class hilosecundario extends AsyncTask<String, Integer, Boolean> protected Boolean doinbackground(string... params) { // Código principal de nuestra tarea PublishProgress(3); return true; } protected void onprogressupdate(integer... values) { /* Código cuya ejecución depende de doinbackground } protected void onpostexecute(boolean resultado) { // Código que se ejecutará tras finalizar doinbackground } } En este ejemplo la función doinbackground recibirá variable tipo cadena (string) y devolverá una tipo booleano (true/false) que será recibida por la función onpostexecute. Por otro lado la función onprogressupdate recibirá una variable tipo entero de PublishProgress situada dentro de doinbackground [17]. Anejos a la Memoria 82 de 124 92 Emulación de la Aplicación A la hora de probar y depurar aplicaciones podemos hacerlo a través de un emulador conocido como dispositivo virtual (Android Virtual Device) sino disponemos de un smartphone con Android. Para crear el dispositivo virtual accedemos al AVD Manager situado en el menú Tools > Android. Entramos en Device Definitions donde tenemos todos los dispositivos de la gama Nexus de Google (creador de Android), seleccionamos el deseado y damos click en Create AVD. Ilustración 61. Creación de AVD en Android Studio. Después seleccionamos el skin, la versión de Android que queremos probar y reduciremos la memoria RAM que utilizará ya que si nuestro ordenador no cuenta con 8 GB de memoria RAM o más difícilmente podrá soportar los 2 GB que pide el Nexus 5 por ejemplo. En el caso de querer probar directamente con el dispositivo (en este caso un Nexus 5) deberemos conectarlo al ordenador por cable, pero primero tendremos que tener instalados los drivers para ADB. ADB significa "Android Debugging Bridge" o en español "Puente de depuracion de Android". Que es una Herramienta que viene junto con el SDK de Android y nos permite acceder y controlar un dispositivo Android desde una PC. Anejos a la Memoria 83 de 124 93 Finalmente para ejecutar la aplicación accedemos a Run > Run y elegimos el AVD creado o en nuestro caso el dispositivo físico. Ilustración 62. Selección del tipo de emulación en Android Studio Generar la Aplicación Ejecutable APK Una vez terminada nuestra aplicación, para transformarla en una aplicación ejecutable con extensión.apk accedemos al menú Build y seleccionamos Generate Signed APK, tras aceptar un aviso tenemos: Ilustración 63. Creación del archivo APK en Android Studio. Solo nos queda crear una Key store path en la que configuramos: la contraseña de la Key store, alias del creador, otra contraseña, la validez temporal de la aplicación y un certificado con la información del creador. Anejos a la Memoria 84 de 124 94 Desarrollo de la Aplicación para Android Crearemos un nuevo proyecto en Android Studio, a aplicación la llamaremos Termoduino, con tema Holo y utilizaremos el siguiente logo: Ilustración 64. Logo de la aplicación Android. Una vez terminada la configuración inicial tendremos el Entorno de Desarrollo con los archivos por defecto. Comenzamos por diseñar la interfaz de nuestra aplicación a través de la interfaz de diseño del Android Studio, modificando el archivo activity_main.xml y guardando las cadenas (string) utilizadas en en el archivo strings.xml. El resultado es el de la será similar al de la ilustración de la izquierda, donde los TextView utilizados que no contienen ningún texto no serán visibles hasta que probemos la aplicación y adquieran los datos de Xively. Ilustración 65. Interfaz diseñada y en funcionamiento. Anejos a la Memoria 85 de 12495 Una vez diseñada la interfaz, pasamos a crear las funcionalidades de nuestro programa modificando el archivo MainActivity.java. Para añadir las acciones de los botones utilizaremos el código ya visto la función oncreate, declarando el botón fuera de la misma. Después implementaremos la comunicación con el servicio web Xively a través de Temboo, para lo que utilizaremos los códigos y librerías que obtuvimos en el ANEJO IV: SERVICIOS WEB. Las librerías ya sabemos como importarlas a nuestro proyecto, en cambio para la implementación de los códigos deberemos adaptar los pasos de la guía de ejemplo que nos proporciona Temboo para la comunicación con Xively a través de la siguiente dirección: https://www.temboo.com/android/getting-started Esta guía nos muestra como: 1. Importar las librerías necesarias al Entorno de Desarrollo. Modificar el archivo AndroidManifest.xml para incluir el permiso necesario para acceder a Internet. 2. Configurar la id de un elemento TextView. 3. Crear un hilo secundario e incluir un código que realiza una lectura en la función doinbackground y en la función onpostexecute muestra como guardar el resultado en una variable. 4. Finalmente en la función oncreate asigna el valor de la variable al TextView a través del id que le dimos. Por lo que hemos visto hasta ahora, podríamos decir que tenemos los suficientes conocimientos para seguir los pasos, incluso sin la guía. Una vez tengamos comunicación con Xively para enviar y recibir datos daremos las funcionalidades que queremos en la aplicación. Haremos que nada más abrir la aplicación reciba la temperatura deseada y las dos temperaturas adquiridas así como la fecha y hora de su última actualización. En caso de querer actualizar tan solo deberemos pulsar el botón de Actualizar, cuando se lleve a cabo aparecerá una notificación Toast que pondrá Actualización completada. En caso de no tener conexión a Internet al iniciar o al pulsar el botón Actualizar se iniciará un hilo en segundo plano que cada 5 segundos comprobará si hay conexión a Internet y cuando haya se conectará a Xively para recibir los datos. Anejos a la Memoria 86 de 12496 Para crear el hilo secundario no utilizaremos una función AsyncTask, sino que crearemos un nuevo Runnable expuesto en el siguiente código: // Hilo secundario que comprueba cada 5 segundos si hay Internet para intentar actualizar Runnable estado_actualizador = new Runnable() public void run() { if(isonline(false)) { new XivelyRead().execute(); return; } actualizador.postdelayed(estado_actualizador, tiempo); } }; Para realizar la comprobación de si hay conexión a Internet utilizaremos una función que además requiere un nuevo permiso, que tendremos que añadir junto al permiso de conexión a Internet antes de la etiqueta <aplication> en el archivo AndroidManifest.xml. <uses-permission android:name="android.permission.access_network_state" /> La función que utilizaremos es la siguiente, aunque la modificaremos para que la primera vez que accediendo a la aplicación o pulsando el botón Actualizar muestre un mensaje de que no hay conexión y una vez iniciado el hilo que cada 5 segundos comprueba la conexión lo se vuelva a mostrar. // Función que comprueba si hay conexion a Internet public boolean isonline(void msg) { ConnectivityManager cm = (ConnectivityManager) getsystemservice(context.connectivity_service); NetworkInfo netinfo = cm.getactivenetworkinfo(); if (netinfo!= null && netinfo.isconnectedorconnecting()) { return true; return false; } Esta función, así como la resolución de muchos problemas con el código han sido obtenidas de la siguiente dirección. Finalmente implementamos que el botón Enviar transmita la variable tipo entero que contiene su correspondiente TextView a Xively mostrando el toast Enviado correctamente y que podamos modificar el valor del TextView con los botones + y - en un intervalo de 0 a 30. Si pulsamos - en 0 se mostrará el toast Valor mínimo alcanzado y si se pulsa + en 30 se mostrará Valor máximo alcanzado. Anejos a la Memoria 87 de 12497 Código fuente de la Aplicación para Android activity_main.xml 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" tools:context="com.termoduino.app.mainactivity" 10 android:focusable="true"> <LinearLayout 13 android:orientation="vertical" 14 android:layout_width="fill_parent" 15 android:layout_height="fill_parent" 16 android:layout_alignparenttop="true" 17 android:weightsum="1"> <TextView android:layout_width="wrap_content" 22 android:layout_height="wrap_content" 23 android:textsize="32dp" 24 android:textstyle="bold" android:layout_gravity="center_horizontal" /> <LinearLayout 29 android:orientation="horizontal" 30 android:layout_width="200dp" 31 android:layout_height="wrap_content" 32 android:layout_gravity="center_horizontal" 33 android:weightsum="1" 34 android:textalignment="center"> <EditText 37 android:layout_width="130dp" 38 android:layout_height="wrap_content" android:layout_centervertical="true" 41 android:layout_alignparentright="true" 42 android:layout_alignparentend="true" 43 android:textsize="50dp" 44 android:textstyle="bold" 45 android:background="#000000ff" 46 android:textcolor="#ffffff" 47 android:layout_gravity="center_horizontal right" 48 android:numeric="decimal" 49 android:gravity="right" 50 android:focusable="false" 51 android:layout_marginleft="5dp" /> Anejos a la Memoria 88 de 12498 52 53 <TextView 54 android:layout_width="wrap_content" 55 android:layout_height="wrap_content" android:textsize="50dp" 59 android:textstyle="bold" 60 android:textcolor="#ffffff" 61 android:textalignment="viewend" 62 android:layout_gravity="right" 63 android:layout_marginleft="5dp" /> 64 </LinearLayout> <LinearLayout 67 android:orientation="horizontal" 68 android:layout_width="200dp" 69 android:layout_height="wrap_content" 70 android:layout_gravity="center_horizontal"> <Button 73 android:layout_width="61dp" 74 android:layout_height="wrap_content" android:textsize="20dp" 78 android:layout_gravity="center_vertical" 79 android:textstyle="bold" /> <Button 82 android:layout_width="wrap_content" 83 android:layout_height="wrap_content" android:textsize="20dp" 87 android:layout_gravity="center_vertical" /> <Button 90 android:layout_width="61dp" 91 android:layout_height="wrap_content" android:textsize="20dp" 95 android:layout_gravity="center_vertical" 96 android:textstyle="bold" /> 97 </LinearLayout> <TextView android:layout_width="wrap_content" 102 android:layout_height="wrap_content" 103 android:textsize="32dp" 104 android:layout_gravity="center_horizontal top" 105 android:textstyle="bold" 106 android:layout_margintop="15dp" /> 107 Anejos a la Memoria 89 de 12499 108 <LinearLayout 109 android:orientation="horizontal" 110 android:layout_width="200dp" 111 android:layout_height="wrap_content" 112 android:layout_gravity="center_horizontal"> <TextView 115 android:layout_width="130dp" 116 android:layout_height="wrap_content" android:textsize="50dp" 119 android:textcolor="#ffffff" 120 android:gravity="right" 121 android:layout_gravity="right" 122 android:singleline="false" 123 android:textstyle="bold" 124 android:layout_marginleft="5dp" /> <TextView 127 android:layout_width="wrap_content" 128 android:layout_height="wrap_content" android:textsize="50dp" 132 android:textstyle="bold" 133 android:textcolor="#ffffff" 134 android:layout_gravity="right" 135 android:layout_marginleft="5dp" /> 136 </LinearLayout> <TextView 139 android:layout_width="wrap_content" 140 android:layout_height="wrap_content" android:layout_gravity="center_horizontal" /> <TextView android:layout_width="wrap_content" 147 android:layout_height="wrap_content" 148 android:textsize="32dp" 149 android:layout_gravity="center_horizontal" 150 android:textstyle="bold" 151 android:layout_margintop="10dp" /> <LinearLayout 154 android:orientation="horizontal" 155 android:layout_width="200dp" 156 android:layout_height="wrap_content" 157 android:layout_gravity="center_horizontal"> 158 Anejos a la Memoria 90 de 124100 159 <TextView 160 android:layout_width="130dp" 161 android:layout_height="wrap_content" android:textsize="50dp" 164 android:textcolor="#ffffff" 165 android:singleline="false" 166 android:textstyle="bold" 167 android:gravity="right" 168 android:layout_gravity="right" 169 android:layout_marginleft="5dp" /> <TextView 172 android:layout_width="wrap_content" 173 android:layout_height="wrap_content" android:textsize="50dp" 177 android:layout_gravity="right" 178 android:textstyle="bold" 179 android:textcolor="#ffffff" 180 android:layout_marginleft="5dp" /> 181 </LinearLayout> <TextView 184 android:layout_width="wrap_content" 185 android:layout_height="wrap_content" android:layout_gravity="center_horizontal" /> <Button 190 android:layout_width="wrap_content" 191 android:layout_height="wrap_content" android:textsize="20dp" 195 android:layout_margintop="5dp" 196 android:layout_gravity="center_horizontal" /> 197 </LinearLayout> 198 </RelativeLayout> strings.xml 1 <?xml version="1.0" encoding="utf-8"?> 2 <resources> 3 4 <string name="app_name">termoduino</string> 5 <string name="temperatura_deseada">temperatura deseada</string> 6 <string name="temperatura_1">temperatura 1</string> 7 <string name="temperatura_2">temperatura 2</string> 8 <string name="enviar">enviar</string> 9 <string name="menos">-</string> 10 <string name="mas">+</string> 11 <string name="actualizar">actualizar</string> 12 <string name="grado">ºc</string> 13 </resources> Anejos a la Memoria 91 de 124101 AndroidManifest.xml 1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.termoduino.app" > 4 5 <uses-permission android:name="android.permission.internet" /> 6 <uses-permission android:name="android.permission.access_network_state" /> 7 8 <application 9 android:allowbackup="true" > 13 <activity 14 android:name="com.termoduino.app.mainactivity" 15 > <intent-filter> 18 <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> 21 </intent-filter> 22 </activity> 23 </application> </manifest> Anejos a la Memoria 92 de 124102 MainActivity.java 1 package com.termoduino.app; 2 3 import android.app.activity; 4 import android.content.context; 5 import android.net.connectivitymanager; 6 import android.net.networkinfo; 7 import android.os.bundle; 8 import android.os.handler; 9 import android.view.gravity; 10 import android.view.menu; 11 import android.view.menuitem; 12 import android.view.view; 13 import android.widget.button; 14 import android.widget.edittext; 15 import android.widget.textview; 16 import android.os.asynctask; 17 import android.util.log; 18 import android.widget.toast; import com.temboo.library.xively.readwritedata.readfeed; 21 import com.temboo.library.xively.readwritedata.readfeed.*; 22 import com.temboo.library.xively.readwritedata.writedata; 23 import com.temboo.library.xively.readwritedata.writedata.*; 24 import com.temboo.core.temboosession; import org.json.jsonobject; 27 import org.json.jsonarray; public class MainActivity extends Activity { private Button enviar; 32 private Button mas; 33 private Button menos; 34 private Button actualizar; 35 private int tiempo = 5000; // 5 seconds por defecto 36 private Handler actualizador; 37 private Boolean write = false; protected void oncreate(bundle savedinstancestate) { 41 super.oncreate(savedinstancestate); 42 setcontentview(r.layout.activity_main); 43 actualizador = new Handler(); 44 if(isonline(true)) // Comprobamos si hay conexión a internet para evitar FC 45 new XivelyRead().execute(); // Actualizamos las temperatras al iniciar la app 46 else 47 startrepeatingtask(); // Intentamos actualizar cada 5 segundos 48 final EditText temp_deseada = (EditText)findViewById(R.id.temp_deseada); Anejos a la Memoria 93 de 124103 49 50 enviar = (Button)findViewById(R.id.enviar); enviar.setonclicklistener(new View.OnClickListener() { 53 public void onclick(view arg0) 54 { 55 if(isonline(true)) // Comprobamos si hay conexión a internet para evitar FC 56 // Creamos una tarea en segundo plano para enviar la Temperatura deseada al webservice 57 new XivelyWrite().execute(temp_deseada.getText().toString()); 58 } 59 }); mas = (Button)findViewById(R.id.mas); mas.setonclicklistener(new View.OnClickListener() { 64 public void onclick(view arg0) { 65 if(write) { // Solo funciona si la escritura está habilitada 66 String temp_str = temp_deseada.gettext().tostring(); 67 int temp_int = Integer.valueOf(temp_str); 68 if (temp_int < 30) { 69 temp_int++; 70 temp_deseada.settext(string.valueof(temp_int)); 71 } else { 72 Toast toast_limitesuperior = Toast.makeText(getApplicationContext(), "Valor máximo alcanzado", Toast.LENGTH_SHORT); 73 toast_limitesuperior.setgravity(gravity.right Gravity.TOP, 10, 0); 74 toast_limitesuperior.show(); 75 } 76 } 77 } 78 }); menos = (Button)findViewById(R.id.menos); menos.setonclicklistener(new View.OnClickListener() { 83 public void onclick(view arg0) { 84 if(write) { // Solo funciona si la escritura está habilitada 85 String temp_str = temp_deseada.gettext().tostring(); 86 int temp_int = Integer.valueOf(temp_str); 87 if (temp_int > 0) { 88 temp_int--; 89 temp_deseada.settext(string.valueof(temp_int)); 90 } else { 91 Toast toast_limiteinferior = Toast.makeText(getApplicationContext(), "Valor mínimo alcanzado", Toast.LENGTH_SHORT); 92 toast_limiteinferior.setgravity(gravity.right Gravity.TOP, 10, 0); 93 toast_limiteinferior.show(); 94 } 95 } 96 } 97 }); 98 Anejos a la Memoria 94 de 124104 99 actualizar = (Button)findViewById(R.id.actualizar); actualizar.setonclicklistener(new View.OnClickListener() { 102 public void onclick(view arg0) 103 { 104 if(isonline(true)) // Comprobamos si hay conexión a internet para evitar FC 105 // Cremos una tarea en segundo plano para actualizar la temperatura 106 new XivelyRead().execute(); 107 else 108 startrepeatingtask(); // Intentamos actualizar cada 5 segundos 109 } 110 }); 111 } public boolean oncreateoptionsmenu(menu menu) { 115 // Inflate the menu; this adds items to the action bar if it is present. 116 getmenuinflater().inflate(r.menu.main, menu); 117 return true; 118 } public boolean onoptionsitemselected(menuitem item) { 122 // Handle action bar item clicks here. The action bar will 123 // automatically handle clicks on the Home/Up button, so long 124 // as you specify a parent activity in AndroidManifest.xml. 125 return super.onoptionsitemselected(item); 126 } // Hilo secundario que lee los datastreams de Xively 129 private class XivelyRead extends AsyncTask<Void, Void, JSONObject> { protected JSONObject doinbackground(void... arg0) { 133 try { 134 // Inicia la sesión en Temboo 135 TembooSession session = new TembooSession("oscarute", "Termoduino", "b63318f189df451898aa54d563881e7a"); 136 ReadFeed readfeedchoreo = new ReadFeed(session); // Obtenemos el objeto para el conjunto de entradas a leer 139 ReadFeedInputSet readfeedinputs = readfeedchoreo.newinputset(); // Establece las entradas a leer 142 readfeedinputs.set_feedid(" "); 143 readfeedinputs.set_apikey("9wbw2eamk7kcqpzn1l0zlhhimdv0xbihjrysjq9e3jrqnpcg"); // Ejecuta la lectura 146 ReadFeedResultSet readfeedresults = readfeedchoreo.execute(readfeedinputs); 147 JSONObject resultado = new JSONObject(readFeedResults.get_Response()); 148 return resultado; } catch(exception e) { 151 Log.e(this.getClass().toString(), e.getmessage()); 152 } 153 return null; 154 } Anejos a la Memoria 95 de 124105 // Obtenemos la información en JSON por lo que lo manipulamos para obtener la información deseada 158 protected void onpostexecute(jsonobject resultado) { 159 try { 160 JSONArray datastreams = resultado.getjsonarray("datastreams"); // Obtenemos el valor de Temperatura JSONObject datastream_1 = datastreams.getjsonobject(0); 164 String value_1 = datastream_1.getstring("current_value"); 165 String data_1 = datastream_1.getstring("at"); 166 TextView temp_1 = (TextView) findviewbyid(r.id.temp_1); 167 TextView fecha_1 = (TextView) findviewbyid(r.id.fecha_1); 168 temp_1.settext(value_1); 169 fecha_1.settext("actualizado: "+data_1.substring(8,10)+"/"+ data_1.substring(5, 7)+"/"+data_1.substring(0, 4)+" - "+ data_1.substring(11, 16)); // Obtenemos el valor de Temperatura JSONObject datastream_2 = datastreams.getjsonobject(1); 173 String value_2 = datastream_2.getstring("current_value"); 174 String data_2 = datastream_2.getstring("at"); 175 TextView temp_2 = (TextView) findviewbyid(r.id.temp_2); 176 TextView fecha_2 = (TextView) findviewbyid(r.id.fecha_2); 177 temp_2.settext(value_2); 178 fecha_2.settext("actualizado: "+data_2.substring(8, 10)+"/"+ data_2.substring(5, 7)+"/"+ data_2.substring(0, 4)+" - "+ data_2.substring(11, 16)); // Obtenemos el valor de Temperatura deseada 181 JSONObject datastream_3 = datastreams.getjsonobject(2); 182 String value_3 = datastream_3.getstring("current_value"); 183 TextView temp_3 = (TextView) findviewbyid(r.id.temp_deseada); 184 temp_3.settext(value_3); write=true; // Habilita la escritura para los botones "+ y -" Toast toast_actualizado = Toast.makeText(getApplicationContext(), "Actualización completada", Toast.LENGTH_SHORT); 189 toast_actualizado.setgravity(gravity.right Gravity.TOP, 10, 0); 190 toast_actualizado.show(); 191 } catch(exception e) { 192 Log.e(this.getClass().toString(), e.getmessage()); // Si ocurre algún problema, se registra 193 } 194 } 195 } Anejos a la Memoria 96 de 124106 // Hilo secundario para la escritura en Xively de la Temperatura deseada 198 private class XivelyWrite extends AsyncTask<String, Void, Boolean> { protected Boolean doinbackground(string... params) { 202 try { 203 // Inicia la sesión en Temboo 204 TembooSession session = new TembooSession("oscarute", "Termoduino", "b63318f189df451898aa54d563881e7a"); 205 WriteData writedatachoreo = new WriteData(session); // Obtenemos el objeto para el conjunto de entradas a escribir 208 WriteDataInputSet writedatainputs = writedatachoreo.newinputset(); // Establece la credencial usada para la ejecución 211 writedatainputs.setcredential("oscarute"); // Establece las entradas a escribir 214 writedatainputs.set_datastreamid("temperatura_deseada"); 215 writedatainputs.set_value(params[0]); // Ejecuta la escritura 218 WriteDataResultSet writedataresults = writedatachoreo.execute(writedatainputs); 219 return true; } catch(exception e) { 222 Log.e(this.getClass().toString(), e.getmessage()); // Si ocurre algún problema, se registra 223 } 224 return null; 225 } 226 protected void onpostexecute(boolean resultado) { 227 try { 228 if(resultado){ 229 Toast toast_enviado = Toast.makeText(getApplicationContext(), "Enviado correctamente", Toast.LENGTH_SHORT); 230 toast_enviado.setgravity(gravity.right Gravity.TOP, 10, 0); 231 toast_enviado.show(); 232 } 233 else { 234 Toast toast_enviado = Toast.makeText(getApplicationContext(), "Error en envío", Toast.LENGTH_SHORT); 235 toast_enviado.setgravity(gravity.right Gravity.TOP, 10, 0); 236 toast_enviado.show(); 237 } 238 } catch(exception e) { 239 Log.e(this.getClass().toString(), e.getmessage()); // Si ocurre algún problema, se registra 240 } 241 } 242 } 243 Anejos a la Memoria 97 de 124107 244 // Función que comprueba si hay conexion a internet, si recibe true" muestra mensaje 245 public boolean isonline(boolean msg) { 246 ConnectivityManager cm = 247 (ConnectivityManager) getsystemservice(context.connectivity_service); 248 NetworkInfo netinfo = cm.getactivenetworkinfo(); 249 if (netinfo!= null && netinfo.isconnectedorconnecting()) { 250 return true; 251 } 252 if (msg) { 253 Toast toast_sininternet = Toast.makeText(getApplicationContext(), "No hay conexión a Internet", Toast.LENGTH_SHORT); 254 toast_sininternet.setgravity(gravity.right Gravity.TOP, 10, 0); 255 toast_sininternet.show(); 256 } 257 return false; 258 } // Hilo secundario que comprueba cada 5 segundos si hay internet para intentar actualizar 261 Runnable estado_actualizador = new Runnable() { 263 public void run() { 264 if(isonline(false)) { 265 new XivelyRead().execute(); 266 return; 267 } 268 actualizador.postdelayed(estado_actualizador, tiempo); 269 } 270 }; void startrepeatingtask() { 273 estado_actualizador.run(); 274 } 275 } Anejos a la Memoria 98 de 124108 1.9. REFERENCIAS [1] [2] [3] [4] [5] [6] [7] [8] [9] Datasheet DS18B20 - Dallas Semiconductor. [10] [11] [12] HC-03/05 Embedded Bluetooth Serial Communication Module AT command set. [13] [14] Datasheet MRF24J40MA - Microchip. [15] [16] Curso de confección de placas PCB por Renato Aloi en Youtube. [17] Curso de programación Android creado por Salvador Gómez Oliver. Disponible en Memoria 99 de 134109 PLANOS 2. PLANOS110 Fecha Nombre Dibujado Comprobado 17/07/2014 Óscar González Díez ESCUELA UNIVERSITARIA POLITECNICA GRADO INGENIERIA ELECTRONICA INDUSTRIAL Y AUTOMATICA Id. s. norma Escala Plano Nº: 1/9 - ESQUEMÁTICO SHIELD ARDUINO UNO Sustituye a: Sustuido por:111 Fecha Nombre Dibujado Comprobado 17/07/2014 Óscar González Díez ESCUELA UNIVERSITARIA POLITECNICA GRADO INGENIERIA ELECTRONICA INDUSTRIAL Y AUTOMATICA Id. s. norma Escala Plano Nº: 2/9 3:1 PLACA DE CIRCUITO IMPRESO SHIELD ARDUINO UNO Sustituye a: Sustuido por:112 Fecha Nombre Dibujado Comprobado 17/07/2014 Óscar González Díez ESCUELA UNIVERSITARIA POLITECNICA GRADO INGENIERIA ELECTRONICA INDUSTRIAL Y AUTOMATICA Id. s. norma Escala Plano Nº: 3/9 - ESQUEMÁTICO PLACA DE CONEXIONES PARA ARDUINO YUN Sustituye a: Sustuido por:113 Fecha Nombre Dibujado Comprobado 17/07/2014 Óscar González Díez ESCUELA UNIVERSITARIA POLITECNICA GRADO INGENIERIA ELECTRONICA INDUSTRIAL Y AUTOMATICA Id. s. norma Escala Plano Nº: 4/9 3:1 PLACA DE CIRCUITO IMPRESO PLACA DE CONEXIONES PARA ARDUINO YUN Sustituye a: Sustuido por:114 Fecha Nombre Dibujado Comprobado 17/07/2014 Óscar González Díez ESCUELA UNIVERSITARIA POLITECNICA GRADO INGENIERIA ELECTRONICA INDUSTRIAL Y AUTOMATICA Id. s. norma Escala Plano Nº: 5/9 - ESQUEMATICO PLACA DE CONEXIONES PARA MRF24J40MA Sustituye a: Sustuido por:115 Fecha Nombre Dibujado Comprobado 17/07/2014 Óscar González Díez ESCUELA UNIVERSITARIA POLITECNICA GRADO INGENIERIA ELECTRONICA INDUSTRIAL Y AUTOMATICA Id. s. norma Escala Plano Nº: 6/9 3:1 PLACA DE CIRCUITO IMPRESO PLACA DE CONEXIONES PARA MRF24J40MA Sustituye a: Sustuido por:116 Fecha Nombre Dibujado Comprobado 17/07/2014 Óscar González Díez ESCUELA UNIVERSITARIA POLITECNICA GRADO INGENIERIA ELECTRONICA INDUSTRIAL Y AUTOMATICA Id. s. norma Escala Plano Nº: 7/9 - ESQUEMATICO SHIELD LCD + KEYPAD Sustituye a: Sustuido por:117 Fecha Nombre Dibujado Comprobado 17/07/2014 Óscar González Díez ESCUELA UNIVERSITARIA POLITECNICA GRADO INGENIERIA ELECTRONICA INDUSTRIAL Y AUTOMATICA Id. s. norma Escala 2:1 PLACA DE CIRCUITO IMPRESO SHIELD LCD + KEYPAD CAPA INFERIOR Plano Nº: 8/9 Sustituye a: Sustuido por:118 Fecha Nombre Dibujado Comprobado 17/07/2014 Óscar González Díez ESCUELA UNIVERSITARIA POLITECNICA GRADO INGENIERIA ELECTRONICA INDUSTRIAL Y AUTOMATICA Id. s. norma Escala 2:1 PLACA DE CIRCUITO IMPRESO SHIELD LCD + KEYPAD CAPA SUPERIOR Plano Nº: 9/9 Sustituye a: Sustuido por:119 PRESUPUESTO Presupuesto 110 de 124120 3. PRESUPUESTO 3.1. Partidas Alzadas a Jutificar Diseño de los dispositivos MANO DE OBRA 180 horas de un ingeniero técnico a 20 /hora COMPONENTES Cantidad Coste/Unidad Coste Total Arduino Yún 1 66,00 66,00 Arduino UNO 1 21,00 21,00 Shield LCD + Keypad 1 12,00 12,00 Módulo HC-05/HC-06 o MRF24J40MA 2 10,00 20,00 Cables 6 0,10 0,60 Resistencia 4k7 2 0,15 0,30 Sensor DS18B20 2 1,00 2,00 Placa de Circuito impreso 3 3,00 9,00 Conector hembra 40 pin 3 1,30 3,90 Conector hembra 40 pin torneados 1 1,10 1,10 Conector hembra largo (Arduino) 6 pin 6 0,50 3,00 Conector hembra largo (Arduino) 8 pin 2 0,50 1,00 TOTAL 140 COSTE TOTAL: Diseño de la Aplicación para Android. MANO DE OBRA 20 horas de un ingeniero técnico a 20 /hora COSTE TOTAL: 400 Presupuesto 111 de 124121 3.2. Mediciones DESIGNACIÓN DE LA UNIDAD P.A.1 P.A.2 NOMBRE Diseño de los dispositivos Diseño de la aplicación para Android UNIDADES 1 1 Burgos a 15 de Julio de 2014 Firmado: Óscar González Díez Presupuesto 112 de 124122 3.3. Cuadro de Precios Nº1 Nº de orden de la unidad Nombre de la unidad Precio en letra Precio en cifra 1 Diseño de los dispositivos Tres mil setecientos cuarenta euros Diseño de la aplicación para Android Cuatrocientos euros 400 Burgos a 15 de Julio de 2014 Firmado: Óscar González Díez Presupuesto 113 de 124123 1.1. Cuadro de Precios Nº2 Partida Alzada Nº1: Diseño de los dispositivos. Mano de obra Componentes TOTAL Partida Alzada Nº2: Diseño de la aplicación para Android. Mano de obra TOTAL Burgos a 15 de Julio de 2014 Firmado: Óscar González Díez Presupuesto 114 de 124124 1.2. Presupuesto de Ejecución Material Nº Unidad Designación Unidad Diseño de los 1 dispositivos Diseño de la aplicación 2 para Android Medición Unidades Precio Unitario Precio total Total Costes Indirectos (1%) 41 TOTAL DEL PRESUPUESTO DE EJECUCIÓN MATERIAL Asciende el presupuesto de Ejecución Material a la cantidad de cuatro mil ciento ochenta y un euros. Burgos a 15 de Julio de 2014 Firmado: Óscar González Díez Presupuesto 115 de 124125 1.3. Presupuesto de Ejecución por Contrata Presupuesto de ejecución material Gastos Generales (15%) 627 Beneficio Industrial (6%) 248 Total parcial IVA (21%) TOTAL PRESUPUESTO DE EJECUCIÓN POR CONTRATA Asciende el presupuesto de Ejecución por contrata a la cantidad de seis mil sesenta y ocho euros. Burgos a 15 de Julio de 2014 Firmado: Óscar González Díez Presupuesto 116 de 124126 PLIEGO DE CONDICIONES127 2. PLIEGO DE CONDICIONES 2.1. Pliego de Prescripciones Técnicas Generales Normativa a seguir para la realización del proyecto: Reglamento de baja tensión. Norma UNE : 1973: Vocabulario electrotécnico. Norma UNE-EN : Compatibilidad electromagnética. Norma UNE-EN : Requisitos para cables y conductores. Norma UNE : Código para la marca de resistencias y condensadores. Valores y tolerancias. Norma UNE : Equipos electrónicos y sus componentes. Ensayos fundamentales climáticos y de robustez mecánica. Norma UNE : Técnica circuitos impresos. Parámetros fundamentales. Sistema de cuadrícula. Ley de prevención de riesgos laborales 31/1995 de 8 de Noviembre. Ordenanza de Seguridad e Higiene en el Trabajo, aprobada por orden ministerial el 9 de Marzo de Normas de Seguridad VED 0510/ Pliego de Prescripciones Técnicas Particulares CAPÍTULO 1: Condiciones Generales En este apartado hacemos referencia a la ejecución del proyecto siguiendo las normas vigentes y las disposiciones legales, para los trabajos especificados en el proyecto y no modificados en el pliego de condiciones o en los contratos particulares, que se lleven a cabo entre la propiedad y el contratista. Artículo 1 El presente pliego es parte de la documentación del proyecto que se cita y regirá en los procesos de fabricación del mismo. Artículo 2 Todas las normas citadas el Pliego de Prescripciones generales, deberán de ser cumplidas a lo largo de la ejecución del presente proyecto. En caso de contradicción entre algunas de ellas, se atenderá a la más restrictiva. Artículo 3 La empresa encargada de la ejecución del proyecto deberá nombrar un Director de Proyecto, que tendrá un nivel técnico adecuado y conocerá el Pliego de Condiciones. La misión del Director será supervisar la total ejecución e instalación del proyecto y responder ante la Dirección Técnica. El Director de Proyecto podrá delegar alguna de sus funciones en segundas personas, siempre bajo su responsabilidad y con conocimiento de la Dirección Técnica. Pliego de Condiciones 118 de 124128 Artículo 4 Si el Director de Proyecto cree conveniente la realización de alguna modificación en el presente proyecto, deberá comunicárselo a la Dirección Técnica, sin cuya aprobación no podrá llevarse acabo. En caso contrario, será la empresa que ejecute el proyecto la responsable de todas las consecuencias derivadas. Artículo 5 Se entregará a la empresa encargada de la ejecución del proyecto un ejemplar libre de gastos. La Dirección Técnica se reserva el derecho de introducir modificaciones en el proyecto para su mejora. Siendo preciso advertir a la empresa de ejecución previamente, para reducir gastos innecesarios. Estas modificaciones no supondrán un incremento del presupuesto. Artículo 6 Al realizar la ejecución del proyecto se dispondrá de una guía de montaje, del cual se hará cargo la empresa montadora, y en el que se anotarán las órdenes y circunstancias que se estimen oportunos. El libro deberá ir firmado por el Director de Proyecto CAPÍTULO 2: Condiciones de Uso Artículo 1 Los dispositivos están diseñados para medir la temperatura y enviar una señal de control a las calderas con la temperatura deseada. Artículo 2 La distancia a la que se pueden comunicar los dispositivos depende de la tecnología utilizada (Bluetooth o Zigbee) y de los obstáculos que haya entre medias como paredes, mobiliario, etc. Artículo 3 La aplicación desarrollada solo funciona en smartphone con sistema operativo Android. Artículo 4 Como la comunicación con el servicio web depende de la señal inalámbrica se deben tener en cuenta las posibles interferencias en función del entorno de uso. Pliego de Condiciones 119 de 124129 CAPÍTULO 3: Especificaciones Facultativas Artículo 1 El presente proyecto ha de ser ejecutado bajo la supervisión de un Ingeniero Técnico Industrial Electrónico o bien por una persona que posea una titulación de conocimientos específicos similares. Artículo 2 Una vez contratada la empresa responsable de la ejecución del proyecto se procederá al nombramiento del Director de Proyecto. Artículo 3 Durante la completa ejecución del proyecto el Director de Proyecto deberá garantizar el cumplimiento de todas las normas, leyes y ordenanzas especificadas en el Pliego de Prescripciones Técnicas Generales. Artículo 4 El personal encargado de la ejecución del proyecto deberá poseer los conocimientos y especialización adecuada. Artículo 5 No se dará por finalizada la ejecución del proyecto hasta haber logrado un correcto funcionamiento. Artículo 6 El adjudicatario del proyecto, podrá solicitar la revisión de los precios unitarios, si su pretensión está fundada en disposiciones legales, de carácter general, promulgadas con fecha posterior a la de su oferta. Artículo 7 El contratista no podrá hacer ningún trabajo que ocasione suplementos de costes, si no se dispone de la autorización estricta por parte de la Directiva Técnica. Artículo 8 Los diferentes documentos del presente proyecto están interrelacionados. Todo aquello que está mencionado en el Pliego de Condiciones, y omitido en la memoria y viceversa, deberá ser ejecutado como si estuvieran en ambos documentos. En caso de existir alguna contradicción entre el documento de planos y el pliego de condiciones, prevalecerá lo descrito en este último. Pliego de Condiciones 120 de 124130 CAPÍTULO 4: Condiciones que deben reunir los materiales Artículo 1 Todos los componentes necesarios para el desarrollo del proyecto se adquirirán en comercios o a través de distribuidores especializados en componentes electrónicos y eléctricos. Artículo 2 Dado que todos los componentes empleados, han sido extraídos de catálogos actualizados y todos los elementos están normalizados, se exigirá con exactitud los valores, tipos, tolerancias y otras características especificadas en el listado de componentes. Artículo 3 Se exigirá que los componentes lleven el certificado correspondiente que demuestre que han sido fabricados cumpliendo la normativa vigente y estén homologados. Para ello se probará su funcionamiento de cada uno de los componentes requeridos, siendo el equipo ejecutor el encargado de determinar los límites que garanticen la calidad del producto final y el responsable de los posibles fallos provocados por la calidad de los materiales. Artículo 4 Algunos de los elementos utilizados en el proyecto son producidos por varios fabricantes, siendo sus características exactamente iguales. En caso de duda deberán comprobarse en las hojas de características al final del proyecto. Las características técnicas deberán tomarse como patrón, desechando aquellos componentes que no las cumplan CAPÍTULO 5: Proceso de Fabricación Artículo 1 El proceso de fabricación se realizará siguiendo de manera secuencial los siguientes pasos: 1. Preparación de los componentes: los componentes se adquirirán siguiendo las pautas dadas en el capítulo anterior, se comprobarán y realizarán los ensayos necesarios para garantizar la calidad de los mismos. 2. Obtención de la placa de circuito impreso: para la obtención de la litografía se utilizarán el proceso descrito en ANEJO VI. El proceso de fabricación podrá ser cualquiera siempre y cuando se obtengan los resultados indicados en el Anejo nombrado.. 3. Soldadura y montaje de los componentes: La manipulación de los componentes se realizará con guantes especializados. No se deben utilizar prendas de nylon debido a que se pueden cargar fácilmente electroestáticamente y estropear los componentes. Durante todo el proceso de soldadura el soldador deberá estar conectado a tierra. Pliego de Condiciones 121 de 124131 Artículo 2 La empresa ejecutora tiene la obligación de realizar las obras según las normas vigentes. El Director de Proyecto y la Dirección Técnica deben velar y exigir su cumplimiento. Artículo 3 La Dirección Técnica se reserva el derecho de visitar las instalaciones donde se ejecuta el proyecto, pudiendo rechazarlas en caso de no cumplir con alguna de las condiciones impuestas en el proyecto. Artículo 4 El equipo ejecutor debe cumplir con las normas y leyes relativas a la seguridad de los operarios. De manera que el incumplimiento de estas quedará bajo su responsabilidad CAPÍTULO 6: Cláusulas de garantía y plazos de ejecución Artículo 1 El cliente queda autorizado a utilizar para el desarrollo de este proyecto los materiales que cumplan las condiciones indicadas en el pliego de condiciones, sin necesidad de reconocimiento previo de la empresa proyectista. Artículo 2 El cliente no tendrá derecho a indemnización por causas de pérdidas, averías o perjuicios ocasionados en el desarrollo del proyecto. Será de cuenta de la empresa contratista indemnizar a quien corresponda y cuando a ello hubiere lugar, de todos los daños y prejuicios que puedan causarse por las operaciones de desarrollo y ejecución del proyecto. El contratista será responsable de todos los accidentes que por inexperiencia o descuido, sobrevinieran durante la fabricación del equipo electrónico. Artículo 3 Los plazos de ejecución totales y parciales indicados en el contrato empezarán a contar a partir de la fecha en que se comunique a la empresa proyectista la adjudicación del proyecto. Artículo 4 Una vez terminado el equipo electrónico en los quince días siguientes a la petición de la empresa proyectista se hará la recepción provisional del equipo por la empresa contratista, requiriendo para ello la presencia de una persona autorizada por cada empresa y levantándose por duplicado el acta correspondiente que firmaran las dos partes. Si se detectasen fallos de funcionamiento, la empresa contratista los comunicará por escrito a la empresa proyectista para su reparación, fijando un plazo prudencial. Pliego de Condiciones 122 de 124132 Artículo 5 Hasta que tenga lugar la recepción definitiva, la empresa proyectista es la responsable de la conservación del equipo electrónico siendo de su cuenta las reparaciones por defecto de diseño y ejecución. Como garantía de la bondad de la obra se descontará a la empresa contratista en la última liquidación, el 3% del importe total de la obra. Esta cantidad, devengando un interés igual al oficial fijado por el Banco de España para efectos comerciales, quedará depositada durante dos años para responder a posibles deficiencias que durante este tiempo pudiesen presentarse, transcurrido el cual tendrá derecho el contratista a que se le reciba definitivamente la obra y la devolución de la parte no empleada del depósito más los intereses CAPÍTULO 7: Cláusulas legales Artículo 1 En el caso de observarse defectos de funcionamiento en el equipo electrónico diseñado con relación a lo exigido en el pliego de condiciones, la empresa contratista podrá proponer a la empresa proyectista la aceptación de estas taras con la rebaja económica que estime oportuna. De no conformarse la empresa proyectista con la rebaja quedará obligado al rediseño y construcción de toda la parte del equipo electrónico afectada por los defectos señalados. Artículo 2 La empresa contratista podrá ordenar la inspección o ensayo de cualquier elemento o componente del equipo electrónico diseñado por el método que juzgue más conveniente. Artículo 3 Los costos se revisarán siempre que resulten modificadas las condiciones económicas de los costos de materiales en una diferencia superior al 5% al valor prefijado del precio estipulado en el presupuesto. La parte interesada según se trate de un aumento o disminución, deberá advertírselo a la otra parte. Artículo 4 Los pagos valorados se abonarán dentro del mes siguiente a la fecha de redacción. Cualquier retraso sobre estos plazos será indemnizado con el interés oficial para efectos comerciales fijado por el Banco de España. Pliego de Condiciones 123 de 124 133 Artículo 5 En el plazo máximo de un mes desde la recepción del equipo electrónico por parte de la empresa contratista ésta deberá realizar la liquidación definitiva. De existir fianza, ésta se devolverá en el mes siguiente a la finalización del plazo de garantía estipulado de no haber reclamaciones de terceros, daños Si la fianza no bastara al cumplir el déficit de liquidación se procederá al reintegro de la diferencia con arreglo a lo dispuesto en la legislación vigente. Artículo 6 En el caso de retraso injustificado sobre los plazos fijados se impondrá a la empresa proyectista una multa del 1,5% del presupuesto asignado como pago valorado. Artículo 7 Todas las cuestiones que pudieran surgir sobre la interpretación, perfeccionamiento y cumplimiento de las condiciones del contrato entre ambas partes serán resueltas por la comisión arbitral. La comisión arbitral deberá dictar resolución después de oídas las partes después de los quince días siguientes al planteamiento del asunto de la misma. Durante este plazo, la empresa proyectista deberá acatar las órdenes de la empresa contratista sin perjuicio de reclamar las indemnizaciones correspondientes si la resolución fuese favorable. Pliego de Condiciones 124 de 124 Mostrar más
PROYECTO DE ELECTRÓNICA Sistema de Alarma Raúl Lapaz de Juan Francisco Javier López Alcarria 1 ÍNDICE - Objetivo:... 3 - Justificación:... 3 - Plan de trabajo:... 3 A) Montaje del circuito en protoboards:... Más detalles TARJETA HC-05 ARDUINO
TARJETA HC-05 ARDUINO TABLA DE CONTENIDO INTRODUCCIÓN... 3 DESCRIPCIÓN... 4 Características Hardware... 4 Características del Software... 4 ETAPAS Y CARACTERISTICAS ESPECÍFICAS... 5 1. Entrada de voltaje... Más detalles AUTOMATIZACIÓN - CURSO: 2010-2011- Práctica 3: Automatización de una Puerta de Garaje mediante Arduino
AUTOMATIZACIÓN - CURSO: 2010-2011- Fernando Torres Medina Juan Antonio Corrales Ramón Carlos Alberto Jara Bravo Grupo de Innovación Educativa en Automática Departamento de Física, Ingeniería de Sistemas Más detalles Especificaciones técnicas de los prototipos:
Especificaciones técnicas de los prototipos: Sensor de Temperatura y Humedad Relativa Sensor de Humedad de la Hoja CARACTERÍSTICAS SENSOR HUMEDAD DE LA HOJA El Sensor de Humedad de la hoja está diseñado Más detalles Servicio Despega Contrato. MANUAL DE CONFIGURACIÓN Cisco Wifi con Windows 7
MANUAL DE CONFIGURACIÓN 1 Índice 1. Descripción breve de los componentes 3 2. Conexión a la red wifi 4 3. Seguridad de la red wifi 8 4. Crear el icono de conexión 14 5. Resolución de incidencias 23 6. Más detalles VIII. CONTROL USANDO SIMULINK Y ARDUINO
VIII. CONTROL USANDO SIMULINK Y ARDUINO Los entornos de Diseño de Sistemas de Control Asistido por Ordenador (CACSD) están experimentando notables cambios durante los últimos años. Estos avances afectan Más detalles AUTOMATIZACIÓN - CURSO: 2010-2011- Práctica 4: Sistema de Monitorización de tiempo mediante Arduino
AUTOMATIZACIÓN - CURSO: 2010-2011- Juan Antonio Corrales Ramón Carlos Alberto Jara Bravo Fernando Torres Medina Grupo de Innovación Educativa en Automática Departamento de Física, Ingeniería de Sistemas Más detalles Arduino I. José Manuel Ruiz Gutiérrez
Arduino I Qué es Arduino? Arduino = Plataforma para physical computing de código abierto Plataforma = Tarjeta I/O + entorno de programación + Componentes Physical computing: computación ubicua, interfaces Más detalles Tema: Introducción a la Plataforma Arduino
Facultad: Ingeniería Escuela: Electrónica Asignatura: Interfaces y Periféricos Tema: Introducción a la Plataforma Arduino Objetivos Específicos. Conocer la plataforma de hardware libre Arduino 2. Desarrollar Más detalles Unidad 3: El sistema operativo. Trabajo con conexión.
Unidad 3: El sistema operativo. Trabajo con conexión. 1.- Red de ordenadores Vamos a describir que es una red informática o red de ordenadores. Una red informática es un sistema de interconexión entre Más detalles Microtutorial Arduino
Microtutorial Arduino ii Arduino Abstract Arduino es, probablemente, la plataforma más popular del ámbito del hardware libre. En esta plataforma se combinan el hardware propiamente dicho, placas y shields, Más detalles Especificaciones técnicas. Power, Inputs and Outputs. Operating Voltage Input Voltage (recommended) Input Voltage (limits) Analog Input Pins
Especificaciones técnicas Microcontroller Operating Voltage Input Voltage (recommended) Input Voltage (limits) Digital I/O Pins Analog Input Pins DC Current for I/O Pin DC Current for 3.3V Pin Flash Memory Más detalles Introducción a Arduino. 2. Para qué puedo utilizar Arduino?
1. Qué es Arduino? Arduino es una plataforma open-hardware basada en una sencilla placa con entradas y salidas (E/S), analógicas y digitales, y en un entorno de desarrollo que implementa el lenguaje Processing/Wiring. Más detalles Comunicación Arduino Bluetooth JY-MCU
CREATIVIDAD AHORA Comunicación Arduino Bluetooth JY-MCU Tutorial Arduino Creatividad Ahora 9/17/2013 martes, 17 de septiembre de 2013 2 Tutorial del Manejo del Modulo Bluetooth JY-MCU 1. Introducción Comúnmente Más detalles 2.- PLATAFORMA ARDUINO (HARDWARE)
2.- PLATAFORMA ARDUINO (HARDWARE) La plataforma Arduino es una plataforma open-hardware basada en una sencilla placa con entradas y salidas (E/S), analógicas y digitales. El elemento principal el microcontrolador Más detalles Guía de Usuario Convertidor USB-Serial
Guía de Usuario Convertidor USB-Serial Tecnología Digital del Bajío Av. Vicente Guerrero 1003 Irapuato, Gto. Mex. C.P. 36690 Teléfono: (462) 145 35 22 www.tecdigitaldelbajio.com ventas@tecdigitaldelbajio.com Más detalles DISPLAYS DE CRISTAL LIQUIDO
DISPLAYS DE CRISTAL LIQUIDO INDICE MANUAL DE REFERENCIA DEL LCD 1.- INTRODUCCION 2.- CARACTERISTICAS DEL DISPLAY 2.1.- Aspecto físico 2.2.- Alimentación 2.3.- Los caracteres del LCD 2.4.- La memoria del Más detalles Universidad Luterana Salvadoreña. Cátedra: Redes I. Docente: Ing. Manuel de Jesús Flores
Universidad Luterana Salvadoreña Cátedra: Redes I Docente: Ing. Manuel de Jesús Flores Evaluación: Entrega de proyecto final Fecha de entrega: 30/0/2015 Desarrollar un programa Cliente Servidor con Arduino Más detalles INSTRUMENTACIÓN AVANZADA Departamento de Ingeniería Eléctrica y Electromecánica Facultad de Ingeniería Universidad Nacional de Mar del Plata
Control y monitoreo a través de servidor Ethernet ARDUINO + ETHERNET SHIELD CLIENTES WEB: PC VARIADOR DE VELOCIDAD SERVIDOR WEB ROUTER SMARTPHONE ACCIONAMIENTO ELECTROMECÁNICO INTERNET TABLET 2 Control Más detalles Servicio Despega. MANUAL DE CONFIGURACIÓN Thomson Wifi con Leopard OS X
1 MANUAL DE CONFIGURACIÓN 2 Índice 1. Introducción al cablemodem Thomson 3 2. Guía rápida de configuración 3 3. Descripción breve de los componentes 4 4. Instalación del CableModem 4 5. Configuración wifi Más detalles INGENIERÍA ELECTRÓNICA E INSTRUMENTACIÓN TESIS DE GRADO
INGENIERÍA ELECTRÓNICA E INSTRUMENTACIÓN TESIS DE GRADO César Jácome 2013 INGENIERÍA ELECTRÓNICA E INSTRUMENTACIÓN DISEÑO E IMPLEMENTACIÓN DE UN PROTOTIPO DE RED INALÁMBRICA TIPO MESH, PARA EL MONITOREO Más detalles MANUAL DE USUARIO ARDUINO DMX MASTER SHIELD MCI-TDD-01588 REV. 1.0
MANUAL DE USUARIO ARDUINO DMX MASTER SHIELD MCI-TDD-01588 REV. 1.0 Ingeniería MCI Ltda. Luis Thayer Ojeda 0115 of. 1105, Providencia, Santiago, Chile. MANUAL DE USUARIO ARDUINO DMX MASTER SHIELD Página Más detalles Creación de redes AirPort Extreme
apple Creación de redes AirPort 2 Contenido 1 Introducción 5 Acerca de AirPort 5 Cómo funciona AirPort 6 Cómo se proporciona acceso inalámbrico a Internet 6 Configuración del acceso a Internet de la estación Más detalles Proyecto de Introducción a la Ingeniería. Domótica accesible. Prendido/apagado de un electrodoméstico a través de una página web.
Proyecto de Introducción a la Ingeniería Domótica accesible Prendido/apagado de un electrodoméstico a través de una página web. Damian Galdames 201312040.7 Esteban Jara - 201330002-2 Gerson Pincheira - Más detalles BIENVENIDOS ÍNDICE PÁGINA 2 CONTENIDO CONOZCA SU ROUTER CONFIGURACIÓN INICIAL ANTES DE CONTINUAR CONEXIÓN MODO ALÁMBRICA CONEXIÓN MODO INÁLAMBRICA
WR 860 BGN BIENVENIDOS Gracias por adquirir su ROUTER WR 860 BGN. Con tecnología inalámbrica IEEE 802.11n, el router brinda la máxima velocidad y alcance para crear una red diseñada para su hogar o espacio Más detalles Reproductor multimedia Android Manual de Usuario
Reproductor multimedia Android Manual de Usuario Nota: 1. Gracias por adquirir nuestro producto, este manual contiene información importante sobre el manejo del reproductor multimedia Android. Léalo detenidamente Más detalles MANUAL DE USUARIO Sensor de temperatura y humedad digital MCI-SEN-01561 REV. 1.0
MANUAL DE USUARIO Sensor de temperatura y humedad digital MCI-SEN-01561 REV. 1.0 Ingeniería MCI Ltda. Luis Thayer Ojeda 0115 of. 1105, Providencia, Santiago, Chile. Página 2 de 10 Ingeniería MCI Ltda. Más detalles Indicador de pesaje XR5000
Indicador de pesaje XR5000 Es fácil tomar decisiones de gestión Capturando la mayor variedad de datos de animales necesarios permite tomar las decisiones acertadas. Se usa para identificar rápidamente Más detalles CONVERSOR EXTERNO RS232-RS485/RS422 AUTO-VELOCIDAD AUTO-RTS
CONVERSOR EXTERNO RS232-RS485/RS422 AUTO-VELOCIDAD AUTO-RTS CARACTERÍSTICAS Conversor RS232-RS485/RS422 externo con detección automática de la transmisión (Auto-RTS) y detección automática de la velocidad Más detalles Como configurar la cámara IP FD7131 de Vivotek
Como configurar la cámara IP FD7131 de Vivotek Hoy en día es posible, sin necesidad de grandes gastos, vigilar su hogar ó su negocio a través de internet, bien a través de un ordenador ó de un teléfono Más detalles EZ Web Lynx. Manual Rápido de Usuario
EZ Web Lynx Manual Rápido de Usuario 1.- Introducción El módulo EZ Web Lynx ha sido desarrollado para permitir la conexión a una red Ethernet de cualquier sistema embebido de la manera más sencilla y económica Más detalles 2 1.1 2 1.2 2 2. SOFTWARE +... 3 3. COMUNICACIÓN - CONEXIÓN DEL DISPOSITIVO...
Manual de software Dynamic Plus Fecha: 03/04/2014 Manual Software Dynamic Plus v2.0.5 ÍNDICE GENERAL 1. INTRODUCCIÓN... 2 1.1 Configuración mínima del PC... 2 1.2 Instalación del Software Dynamic Plus... Más detalles Software EasyKool. Manual de instrucciones
Software EasyKool Manual de instrucciones 2 1 Índice 1 Índice 1 Índice... 3 1.1. Indicaciones sobre este manual... 5 2 Especificaciones... 5 2.1. Uso... 5 2.2. Requisitos del sistema... 6 3 Primeros pasos... Más detalles Guía de configuración Cable-Modem THOMPSON TCW750-4
Guía de configuración Cable-Modem THOMPSON TCW750-4 Indice de contenidos: 1.- Descripción del equipo... - 2-1.1.- Panel Frontal... - 2-1.2.- Panel trasero... - 3-1.3.- Panel lateral... - 3-2.- Administración Más detalles INSTALAR Y CONFIGURAR ROUTER INALÁMBRICO Y TARJETA USB INALÁMBRICA:
INSTALAR Y CONFIGURAR ROUTER INALÁMBRICO Y TARJETA USB INALÁMBRICA: Página 1 de 15 INSTALAR Y CONFIGURAR ROUTER INALÁMBRICO Y TARJETA USB INALÁMBRICA: Feb-2006 CONCEPTRONIC ROUTER + AP 54,40 CONCEPTRONIC Más detalles DFRduino Romeo, todo en un controlador (RoMeo V1.0) Por favor, lea atentamente este manual antes de encender el dispositivo.
DFRduino Romeo, todo en un controlador (RoMeo V1.0) Por favor, lea atentamente este manual antes de encender el dispositivo. DFRduino Romeo Romeo es un microcontrolador de todo-en-uno diseñado especialmente Más detalles @ Manual de Instalación Kit Router Thomson ST 510 y ST530 Indice 1 Material incluido dentro del Kit Router ADSL 2 Previo a la instalación 3 Instalación de los microfiltros 4 Instalación del Router Thomson Más detalles Introducción a Arduino
9 de Noviembre de 2012 Indice-I Plataforma Estándar Electrónica IDE Conceptos básicos electrónica Ley de Ohm y efecto Joule Ruido, puntos sin conexión y efecto rebote Semiconductores Conceptos básicos Más detalles Guía rápida de instalación
Guía rápida de instalación Nota Extensor Universal de Cobertura WiFi El modelo que se toma como ejemplo en esta guía de usuario es el TL-WA830RE. 34 Conexión del hardware Paso 1: Coloque el extensor de Más detalles Programación de dispositivos Arduino Asignatura Sistemas Digitales!
Programación de dispositivos Arduino Asignatura Sistemas Digitales! Gabriel Astudillo Muñoz Escuela de Ingeniería Civil en Informática Universidad de Valparaíso, Chile http://informatica.uv.cl Descripción Más detalles Instituto Tecnológico de Colima
Instituto Tecnológico de Colima Departamento de Ingeniería Industrial Ingeniería en Mecatrónica Materia: Programación Avanzada Unidad 3 Practica 12 Detector de presencia con sensor HC-SR501 Alumnos: Hernández Más detalles Guía de configuración ARRIS
Guía de configuración ARRIS DG950S TG952S y TG862S Indice de contenidos: 1.- Descripción del equipo... - 2-1.1.- Panel Frontal... - 2-1.2.- Panel trasero... - 3-2.- Administración y configuración del router... Más detalles Conversor. IB RS485 Ethernet
Conversor IB RS485 Ethernet 2010 Ibercomp SA Manual versión Marzo 2010 Si encuentra un error en este manual o sugiere alguna mejora o aclaración rogamos nos lo comunique. Página 1 de 11 Introducción El Más detalles Guía de configuración Router TP-Link TL-WR542G TL-WR740 / 741 TL-WR840 / 841 TL-WR940 / 941
Guía de configuración Router TP-Link TL-WR542G TL-WR740 / 741 TL-WR840 / 841 TL-WR940 / 941 Indice de contenidos: 1.- Descripción del equipo... - 2-1.1.- Panel Frontal... - 2-1.2.- Panel trasero... - 3-2.- Más detalles Comunicaciones vía Bluetooth
Autor: José Manuel CanoAutor: José Manuel Cano Guía Rápida Guía Rápida Comunicaciones vía Bluetooth 1. Introducción 2. Cableados e indicadores 3. Configuración 4. Pruebas realizadas Autor: Virginia Sánchez Más detalles Manual de usuario Sunways Modem analógico, RDSI, GSM. Español
Manual de usuario Sunways Modem analógico, RDSI, GSM Español Índice 1. Introducción...3 1.1. Indicaciones generales...3 2. Descripción del producto...4 2.1. Características básicas...4 2.2. Volumen de Más detalles SiAM Conversor Versión 2.0. siam CONVERSOR EXTERNO RS232-RS485 AUTO-VELOCIDAD AUTO-RTS. software i automatismes morvedre. Manual del usuario
SISTEMAS ELECTRÓNICOS Y AUTOMÁTICOS PRACTICAS DE MICROCONTROLADORES PIC PRÁCTICA 7: El módulo LCD El módulo LCD Ejemplos de funcionamiento - 1 - 1. Objetivos: - Conocer el funcionamiento y programación Más detalles TUTORIAL PARA CREAR UN SERVIDOR FTP
TUTORIAL PARA CREAR UN SERVIDOR FTP A continuación ustedes podrán observar y luego implementar el informe que elaboré a fin de que TODOS puedan aprender a montar y mantener su propio Servidor FTP. Comenzaremos Más detalles GESTIÓN INTELIGENTE EN AGRICULTURA Y MEDIO AMBIENTE
2015 GESTIÓN INTELIGENTE EN AGRICULTURA Y MEDIO AMBIENTE ÍNDICE Agricultura y medio ambiente 3 Software de monitorización y control Country-ex Country-ex PRO Country-ex Premium 10 10 10 Country-ex mobile Más detalles JGCBusing Manual de Usuario v1.0
JGCBusing Manual de Usuario v1.0 Agosto 2012 Tabla de Contenido 1. Introducción... 3 2. JGCBusing. Herramienta Web... 4 2.1. Descripción... 4 2.2. Creación de una configuración desde cero... 8 2.3. Generación Más detalles 5.2 Plataforma de Desarrollo Para la Interfaz de Usuario
5.1 Introducción Para la comunicación entre SATEDU y su estación terrena se necesita ajustar ciertos parámetros de comunicación de la Tarjeta de Comunicaciones como la tasa de transmisión, el número de Más detalles Prácticas de Introducción a los Computadores Curso 2000-2001 1 WINDOWS 95
Prácticas de Introducción a los Computadores Curso 2000-2001 1 Novedades WINDOWS 95 Windows 95 es un sistema operativo orientado a documentos. Permite la asociación de la extensión de cada fichero a un Más detalles Manual de WAP300CP Punto de Acceso de 300 Mbps 802.11N
WAP300CP 1 Manual de WAP300CP Punto de Acceso de 300 Mbps 802.11N WAP300CP 2 Introducción. El WAP300, es un punto de acceso con la tecnología 802.11n capaz de conectarse a 300Mbps, así mismo es perfectamente Más detalles TARJETA M95 L80 ARDUINO
Características del datalogger autónomo EJERCICIO: El datalogger o registrador debe sensar la temperatura ambiente cada 1s y guardarla junto a la fecha y hora de adquisición en un archivo.txt alojado en Más detalles Manual de Usuario. Arduino WiFi Shield. Rev. 1.5 MCI-MA-0071
Manual Usuario de Arduino WiFi Shield Página 1 de 16 Manual de Usuario Arduino WiFi Shield Rev. 1.5 MCI-MA-0071 MCI Ltda. Luis Thayer Ojeda 0115. Oficina 402 Santiago, Chile Tel: +56 2 3339579 Fax: +56 Más detalles CEADENSoft Visual DataLogger 1.0
CENTRO DE APLICACIONES TECNOLÓGICAS Y DESARROLLO NUCLEAR CEADENSoft Visual DataLogger 1.0 Software de aplicación para datalogger DL-1a Índice 1 - Introducción...1 2 - Requerimientos....1 3 - Instalación Más detalles Corporacion Universitaria Autonoma del Cauca EJEMPLARIZACION DE COMUNICACIÓN ENTRE DOS MODOULOS XBEE SERIE 2.
EJEMPLARIZACION DE COMUNICACIÓN ENTRE DOS MODOULOS XBEE SERIE 2. RESUMEN Hoy en día son muchos los dispositivos que cumplen la función de comunicarse uno con el otro, siendo útiles y cumpliendo objetivos Más detalles Informática Tema 3 4º E.S.O.
REDES 3 1.- Redes Informáticas. 1.1. Qué es una red. Una red es un conjunto de ordenadores conectados entre sí, que pueden compartir datos (imágenes, documentos, etc.) y recursos (una impresora, disco Más detalles MANUAL PARA CONFIGURAR UNA RED ENTRE 2 PC S QUE USAN WIN 98SE/XP Y CONEXIÓN COMPARTIDA A INTERNET
MANUAL PARA CONFIGURAR UNA RED ENTRE 2 PC S QUE USAN WIN 98SE/XP Y CONEXIÓN COMPARTIDA A INTERNET INDICE PROPÓSITO DEL MANUAL MATERIALES NECESARIOS CONSEJOS PREVIOS TARJETAS DE RED EN WINDOWS 98 SE TARJETAS Más detalles Manual de usuario para el lector biométrico EZCLOCK
Manual de usuario para el lector biométrico EZCLOCK Pasos a seguir para la correcta instalación del equipo 1. Realizar la conexión de alimentación del equipo 2. Inserte una memoria USB o una tarjeta SD Más detalles Router ADSL Ethernet y USB Guía de inicio rápido (léame primero)
Router ADSL Ethernet y USB Guía de inicio rápido (léame primero) Versión 0.3 La garantía del producto no es aplicable a daños producidos por tormentas, sobretensiones o voltaje incorrecto. Introducción Más detalles MANUAL DE USUARIO Arduino WiFi Shield (WizFi220) MCI-MA- 01050 REV. 2.0
MANUAL DE USUARIO Arduino WiFi Shield MCI-MA- 01050 REV. 2.0 Ingeniería MCI Ltda. Luis Thayer Ojeda 0115 of. 1105, Providencia, Santiago, Chile. Página 2 de 25 Ingeniería MCI Ltda. Luis Thayer Ojeda 0115 Más detalles Manual del usuario. Gracias por adquirir este dispositivo. Este dispositivo le proporcionará
Manual del usuario Gracias por adquirir este dispositivo. Este dispositivo le proporcionará comunicaciones tableta - PC de alta calidad y entretenimiento basado en la tecnología excepcional con un alto Más detalles Programación básica de su kit de alarma GSM
Programación básica de su kit de alarma GSM Actualizado: 7 de Mayo de 2015 Puede encontrar actualizaciones periódicas de este documento y otros en nuestra web: www.alarmas-zoom.es/ Antes de nada, queremos Más detalles Router Teldat. Interfaz Web
Router Teldat Interfaz Web Doc. DM801 Rev. 10.80 Abril, 2011 ÍNDICE Capítulo 1 Introducción... 1 1. Accediendo a la configuración del router... 2 Capítulo 2 Interfaz Web... 5 1. Estructura... 6 2. Inicio... Más detalles SECCION 0: DESCRIPCIÓN DEL PRODUCTO
SECCION 0: DESCRIPCIÓN DEL PRODUCTO Descripción del Producto Pág.:1 de 11 CONTENIDO CONTENIDO... 2 1. DESCRIPCIÓN GENERAL... 3 1.1. Pantalla LCD... 4 1.2. Teclado... 5 1.3. Impresora... 6 2. DESCRIPCIÓN Más detalles Introducción. Mensaje de los Desarrolladores
Introducción En Aspec System estamos preocupados por los cabios tecnológicos de la vida cotidiana así como las integraciones de la tecnologías de la información en el llamado tele gobierno que está integrando Más detalles Guía de configuración emta ARRIS
Guía de configuración emta ARRIS WTM 552B WTM552H Indice de contenidos: 1.- Descripción del equipo... - 2-1.1.- Panel Frontal... - 2-1.2.- Panel trasero... - 3-2.- Administración y configuración del router... Más detalles EL MICROCONTROLADOR ARDUINO
EL MICROCONTROLADOR ARDUINO Arduino es una plataforma libre de computación de bajo coste basada en una placa de entrada-salida y en un entorno de desarrollo IDE que implementa el lenguaje Processing/WiringHardware. Más detalles WiFi-Repeater. Manual de usuario / User Manual Manuale di istruzioni / Manuel d utilisation REV.1.2
WiFi-Repeater Manual de usuario / User Manual Manuale di istruzioni / Manuel d utilisation REV.1.2 ESPAÑOL Introducción El repetidor WiFi LEOTEC es un dispositivo de conexión de red cableada / inalámbrica Más detalles GESTIÓN INTELIGENTE DE INFRAESTRUCTURAS
2013 2014 2015 GESTIÓN INTELIGENTE DE INFRAESTRUCTURAS www.odins.es ÍNDICE Gestión Ingeligente de Infraestructuras 5 Software de monitorización y control City explorer 11 City explorer mobile 11 Serie Más detalles Configuración básica del Router: Barricade Wireless Broadband Router SMCWBR14S-N4 para el servicio AVIPLUS (Iberbanda)
Configuración básica del Router: Barricade Wireless Broadband Router SMCWBR14S-N4 para el servicio AVIPLUS (Iberbanda) 1 Índice 1 Introducción 2 Antes de empezar 2.1 Datos de configuración 2.2 Conexiones Más detalles Capítulo 2 El equipo comprobador de cables WWG
Índice Controles e indicadores del equipo Pantalla de equipo preparado Información útil acerca de la alimentación eléctrica La unidad de pantalla Los equipos de la Serie LT 8000 son equipos comprobadores Más detalles Actividad 4: Comunicación entre PLC s vía Ethernet
Actividad 4: Comunicación entre PLC s vía Ethernet 1.- Listado de materiales: PC con Tarjeta de red 3com o similar. 2 PLC Omrom CJ1M CPU11 ETN Estos autómatas llevan integrada la tarjeta de comunicaciones Más detalles Guía de Usuario Perfect Net Wireless
Guía de Usuario Perfect Net Wireless Contenido Acerca del Producto... 2 Contenido del Empaque...... 2 Requerimientos del Sistema...... 2 Diseño del Aparato... 2 Para Comenzar a Usarlo...... 4 Instalación Más detalles Guía del usuario. Linksys PLWK400. Kit Extender de red inalámbrica PowerLine AV
Guía del usuario Linksys PLWK400 Kit Extender de red inalámbrica PowerLine AV Contenido Contenido Descripción general.......... 3 Características................... 3 PLE400 3 PLW400 4 Funcionamiento de Más detalles CONFIGURACIÓN DE REDES WI-FI
CONFIGURACIÓN DE REDES WI-FI Para realizar la configuración de redes inalámbricas, más conocidas como WLAN (Wireless LAN) o en su última versión, redes Wi-Fi, es necesario disponer de dos dispositivos Más detalles Slicetex Virtual HMI para Windows (Virtual HMI) Manual de Usuario para Windows
Slicetex Virtual HMI para Windows (Virtual HMI) Manual de Usuario para Windows Autor: Ing. Boris Estudiez 1 Descripción General El presente documento describe el software Virtual HMI para la plataforma Más detalles 1 Introducción. Home Station ADSL
ÍNDICE 1 Introducción 1 2 Descripción general de la interfaz de usuario 2 3 Configuración LAN y WLAN 8 4 Configuración de la conexión a Internet 11 5 Configuración y estado de los dispositivos conectados Más detalles MANUAL CÁMARA DE MOWAY
MANUAL CÁMARA DE MOWAY Página 2 de 12 Copyright (c) 2011 Bizintek Innova, S.L. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Más detalles Guía de instalación de certificado digital y DNIe. v 04
Guía de instalación de certificado digital y DNIe v 04 14/11/2011 Índice 1 Introducción... 3 2 Requisito de acceso a la sede de Diputación de Valladolid, Cómo incluir en Windows una Entidad de confianza?... Más detalles Comunicación entre un PLC S7-1200 y WinCC Advanced
Comunicación entre un PLC S7-1200 y WinCC Advanced OBJETIVO: Comunicar un S71200 con el Scada WINCC de forma que podamos controlar y supervisar un proceso desde la propia pantalla del PC sin necesidad Más detalles INFORME DE ESTACIÓN DE MONITOREO DE TEMPERATURA GRUPO LAJUCALE
INFORME DE ESTACIÓN DE MONITOREO DE TEMPERATURA GRUPO LAJUCALE LAURA ANDREA (G11NL38laura) LEONARDO CORREA (G11NL08leonardo) JUAN GALVIS (G10NL15juan) CAMILO VALENCIA (G10NL38Camilo) Informe realizado Más detalles Capítulo 1 Cómo conectar el router a Internet
Capítulo 1 Cómo conectar el router a Internet En este capítulo se describe cómo realizar la conexión del router y como utilizarlo para lograr acceso a Internet Contenido de la caja La caja contiene los Más detalles Para alimentar a 110 240 V AC Ref. WLAN-AC-UAE Para alimentar mediante PoE Ref. WLAN-AC-POE-UAE WLAN ACCESS POINT
Para alimentar a 110 240 V AC Ref. WLAN-AC-UAE Para alimentar mediante PoE Ref. WLAN-AC-POE-UAE WLAN ACCESS POINT WLAN Access Point INDICE 1. Descripción de su función:... 1 2. Esquema y conexionado:... Más detalles Si necesita más ayuda técnica, por favor contacte con su distribuidor
24/01/2013 Ins-30075-ES Net2 Unidad de Control Via Radio Paxton Si necesita más ayuda técnica, por favor contacte con su distribuidor Encontrará una lista de distribuidores en nuestra página web en - http://paxton.info/508 Más detalles Smart Buffer Plus Guía de Instalación y Configuración
Smart Buffer Plus Guía de Instalación y Configuración INDICE 1- Introducción...4 2- Conexiones Hardware...5 2.1 Significado de los LED... 5 3- Configuración de Smart Buffer Plus...6 3.1 Configuración Más detalles Integración KNX - LYNX
Integración KNX - LYNX INTEGRACIÓN KNX - LYNX CONTENIDO 1 Introducción... 2 2 Material requerido... 2 3 Configuración del servidor Web Dominium KNX... 3 3.1 Configuración de la interfaz Ethernet... 4 3.2 Más detalles TEMA 3: SISTEMAS OPERATIVOS.
TEMA 3: SISTEMAS OPERATIVOS. 1. QUÉ ES UN SISTEMA OPERATIVO? 2. SISTEMAS OPERATIVOS GRÁFICOS. 3. SISTEMAS OPERATIVOS MÓVILES. 4. EL ENTORNO DE WINDOWS PARA PC. 5. LA APLICACIÓN DEL TEMA. 6. ACTIVIDADES. Más detalles IMPLEMENTACIÓN DE LAS NTIC S EN LOS LABORATORIOS DE CIENCIAS NATURALES MEDIANTE EL USO DE LA PLATAFORMA ARDUINO- PHYSICSSENSOR
IMPLEMENTACIÓN DE LAS NTIC S EN LOS LABORATORIOS DE CIENCIAS NATURALES MEDIANTE EL USO DE LA PLATAFORMA ARDUINO- PHYSICSSENSOR MSc.Diego Aristizábal, Ing. Tatiana Muñoz {daristiz, tcmunoz}@unal.edu.co Más detalles Configuración básica del Router: Barricade Wireless Broadband Router SMCWBR14S-N4 para el servicio AVIPLUS (Iberbanda)
Configuración básica del Router: Barricade Wireless Broadband Router SMCWBR14S-N4 para el servicio AVIPLUS (Iberbanda) 1 Índice 1 Introducción 2 Antes de empezar 3 3 3 2.2 Conexiones 2.3 Indicadores LED Más detalles Manual de uso básico de la aplicación
Manual de uso básico de la aplicación Autor del documento Centro de Apoyo Tecnológico a Emprendedores, Fundación Parque Científico y Tecnológico de Albacete Datos de contacto E-Mail: bilib@bilib.es Página Más detalles Preguntas frecuentes T620
Preguntas frecuentes T620 1.- La PDA no enciende 2.- La batería se descarga rápidamente 3.- Mensajes de error relacionados con la memoria 4.- La pantalla no enciende 5.- Ha olvidado la contraseña 6.- La Más detalles Diseño de Sistemas embebidos y comunicaciones: Aplicaciones de telefonía, RF y localización remota. Ing. José Oliden Martínez
Diseño de Sistemas embebidos y comunicaciones: Aplicaciones de telefonía, RF y localización remota El controlador dentro de un sistema de Control DISPOSITIVO DE MEDICIÓN CONVERSOR ANÁLOGO DIGITAL CONTROLADOR Más detalles Home Station ADSL P.DG A4001N
P.DG A4001N ÍNDICE Portal de configuración web... 1 Selección del idioma... 2 Pantalla de bienvenida... 2 Cambio contraseña... 3 Consejos... 5 Home Station... 6 Red inalámbrica... 7 Seguridad... 7 LAN... Más detalles INSTRUMENTACIÓN AVANZADA Departamento de Ingeniería Eléctrica y Electromecánica Facultad de Ingeniería Universidad Nacional de Mar del Plata
Problema a resolver Ejercicio 2.1 Tomando el ejercicio 1.4 realizar los ajustes necesarios para que además de encenderse un LED en pantalla se encienda un LED físicamente sobre la placa PIC suministrada Más detalles 2017 © DocPlayer.es Política de privacidad | Condiciones del servicio | Feedback

References: resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 Artículo 1
 Artículo 2
 Artículo 3
 Artículo 4
 Artículo 5
 Artículo 6
 Artículo 1
 Artículo 2
 Artículo 3
 Artículo 4
 Artículo 1
 Artículo 2
 Artículo 3
 Artículo 4
 Artículo 5
 Artículo 6
 Artículo 7
 Artículo 8
 Artículo 1
 Artículo 2
 Artículo 3
 Artículo 4
 Artículo 1
 Artículo 2
 Artículo 3
 Artículo 4
 Artículo 1
 Artículo 2
 Artículo 3
 Artículo 4
 Artículo 5
 Artículo 1
 Artículo 2
 Artículo 3
 Artículo 4
 Artículo 5
 Artículo 6
 Artículo 7
 resolución 
 resolución 
 Resolución