Francesc Miralles Benet
SISTEMA DE CONTROL AUTOMÁTICO EN UNA
EXPLOTACIÓN AGRÍCOLA
TRABAJO FIN DE GRADO
Dirigido por Lluís Guash Pesquer
José Luis Ramírez Falo
Grado de Ingeniería Eléctrica
Tarragona
2017
Índice
1 INTRODUCCIÓN .................................................................................................... 6
1.1 Objeto del proyecto ............................................................................................ 6
1.2 Alcance .............................................................................................................. 6
1.3 Situación y emplazamiento de la parcela ........................................................... 6
1.4 Instalaciones existentes ...................................................................................... 7
1.4.1 Instalación de riego ..................................................................................... 7
1.4.2 Suministro de agua a la vivienda ................................................................ 8
1.4.3 Instalación de alumbrado exterior .............................................................. 8
1.5 Requisitos de diseño .......................................................................................... 8
1.5.1 Funcionalidad del sistema requerido .......................................................... 9
1.5.2 Programador del riego ................................................................................ 9
1.5.3 Control del nivel de agua en el depósito................................................... 10
1.5.4 Encendido/Apagado Iluminación exterior ................................................ 10
1.5.5 Apertura/cierre del acceso a la explotación .............................................. 10
2 COMPONENTES DEL SISTEMA DE CONTROL.............................................. 11
2.1 Introducción ..................................................................................................... 11
2.2 Estructura del Sistema de Control ................................................................... 12
2.3 Componentes utilizados en el prototipo ........................................................... 12
2.3.1 Arduino Uno SMD ................................................................................... 12
2.3.2 Herramienta de desarrollo utilizada (IDE) .............................................. 14
2.3.3 Herramienta de desarrollo de la App ,App Inventor 2 ............................. 15
2.3.4 Sensores .................................................................................................... 15
2.3.5 Sensor de ultrasonidos HC-SR04 ............................................................. 16
2.3.6 Sensor de movimiento PIR (HC-SR501) ................................................. 17
2.3.7 Sensor de humedad y temperatura DHT11............................................... 18
2.3.8 Interruptor final de carrera ........................................................................ 19
2.3.9 Módulo: 8 relés 5V .................................................................................. 19
2.3.10 LCD 16x2 por protocolo I2C ................................................................... 21
2.3.11 Reloj RTC DS1302 ................................................................................... 22
2.3.12 Módulo Bluetooth HC-06 ......................................................................... 23
2.3.13 Keypad 3×4 ............................................................................................. 24
2.3.14 Variador de frecuencia.............................................................................. 25
2.3.14.1 Características serie Micromaster ..................................................... 26
2.3.14.2 Esquema General............................................................................... 26
2.3.14.3 Programación del variador ................................................................ 27
3 PROTOTIPO DEL SISTEMA DE CONTROL ..................................................... 31
3.1 Introducción ..................................................................................................... 31
3.2 Esquema general .............................................................................................. 31
3.3 Diseño del encapsulado ................................................................................... 32
3.4 Diseño electrónico del sistema......................................................................... 36
3.4.1 Estructura General del Hardware ............................................................. 36
3.4.2 Módulo de control .................................................................................... 37
3.4.3 Módulo de sensores .................................................................................. 37
3.4.4 Módulo de Actuadores ............................................................................. 38
3.4.5 Módulo de Comunicación ........................................................................ 38
3.4.6 Asignación de los puertos de Arduino ...................................................... 39
3.5 Configuración de los componentes integrados ................................................ 40
3.5.1 Dispositivo Bluetooth ............................................................................... 40
3.5.2 Sensores de presencia ............................................................................... 41
3.5.2.1 Configuración del sensor PIR ........................................................... 41
3.5.3 Variadores de frecuencia .......................................................................... 42
3.5.3.1 Control del riego................................................................................ 43
3.5.3.2 Control del nivel depósito ................................................................. 44
3.5.3.3 Control puerta acceso ........................................................................ 45
3.5.4 Configuración Reloj RTC ......................................................................... 47
3.6 Interfaz de usuario ........................................................................................... 47
3.6.1 Diseño de la aplicación móvil con App Inventor ..................................... 47
3.6.1.1 Designer ............................................................................................ 49
3.6.1.2 App Inventor Blocks Editor .............................................................. 51
3.6.1.3 Análisis del diseño de bloques .......................................................... 51
3.6.1.4 Conclusiones App desarrollada ......................................................... 52
3.6.2 Interfaz local de usuario ........................................................................... 53
3.6.2.1 Menú principal .................................................................................. 53
3.6.2.2 Menú control riego ............................................................................ 53
3.6.2.3 Menú control depósito ....................................................................... 54
3.6.2.4 Menú temporizador bomba riego ...................................................... 54
3.6.2.5 Menú temporizador bomba depósito ................................................. 54
3.6.2.6 Menú Parámetros depósito ................................................................ 54
3.6.2.7 Menú Control iluminación ................................................................ 55
3.6.2.8 Menú control puerta acceso............................................................... 55
3.7 Particularidades del sistema en parcela de estudio .......................................... 55
3.7.1 Instalación del los sensores de movimiento en los puntos de luz ............. 55
3.7.2 Instalación del sensor de ultrasonidos ...................................................... 56
3.7.3 Instalación del sensor detector de presencia en la puerta de acceso ......... 56
4 PRESUPUESTO ..................................................................................................... 58
4.1 Material integrado en el prototipo ................................................................... 58
4.2 Material auxiliar ............................................................................................... 59
4.3 Mano de obra ................................................................................................... 59
4.4 Presupuesto total .............................................................................................. 59
5 Conclusiones ........................................................................................................... 59
5.1 Puntos a destacar .............................................................................................. 60
5.2 Puntos a mejorar .............................................................................................. 61
6 Anexos .................................................................................................................... 62
6.1 Proceso configuración módulo Bluetooth ........................................................ 62
6.1.1 Código ...................................................................................................... 63
6.1.2 Test de comunicación ............................................................................... 64
6.1.3 Configuración del nombre del dispositivo HC-06 .................................... 64
6.1.4 Cambiar Código de Vinculación .............................................................. 65
6.1.5 Configurar la velocidad de comunicación ................................................ 66
6.2 Configuración reloj RTC ................................................................................. 67
6.2.1 Codigo de configuración .......................................................................... 67
6.3 Código programación completo del sistema automático ................................ 68
6.3.1 Definición de variables y llamada de librerías ......................................... 68
6.3.2 Void setup ................................................................................................. 74
6.3.3 Void inicio ................................................................................................ 76
6.3.4 Vooid loop ................................................................................................ 77
7 Esquemas .............................................................................................................. 128
7.1.1 Registro catastro finca ...................... Error! No s'ha definit el marcador.
7.1.2 Esquema instalaciones existentes ........................................................... 129
7.1.2.1 Sistema de riego .............................................................................. 130
7.1.2.2 Sistema llenado depósito ................................................................. 131
7.1.2.3 Instalaciones alumbrado exterior .................................................... 132
7.2 Encapsulado del sistema ................................................................................ 133
7.2.1 Esquema encapsulado nº1 ...................................................................... 134
7.2.2 Esquema encapsulado nº2 ...................................................................... 135
7.3 Distribución de los pines de Arduino para los controladores ........................ 136
7.4 Distribución de la alimentación para los controladores ................................. 137
7.5 Esquema de fuerza ......................................................................................... 138
7.6 Esquema de control ........................................................................................ 139
7.7 Esquema interfaz local ................................................................................... 140
7.7.1 Esquema Interfaz local nº1 ..................................................................... 141
7.7.2 Esquema Interfaz local nº2 ..................................................................... 142
7.7.3 Esquema Interfaz local nº3 ..................................................................... 143
7.7.4 Esquema Interfaz local nº4 ..................................................................... 144
7.7.5 Situación y alcance de los Sensores PIR, en la parcela de estudio ......... 145
7.8 Diagrama de flujo del sistema automático ..................................................... 146
8 Referencias bibliográficas. ................................................................................... 147
Sistema de control automático en una explotación agrícola 6
1 INTRODUCCIÓN
1.1 Objeto del proyecto
La finalidad del trabajo es el diseño e instalación de un sistema fiable y económico que
automatice alguna de las tareas típicas de una explotación agraria: el riego, el suministro
de agua potable, la puerta de acceso y la iluminación exterior. Se optará por ofrecer un
sistema de control con una funcionalidad parecida a la de los sistemas de control
automáticos que hay en el mercado pero a un coste inferior.
Se construirá un prototipo que podrá ser configurado por el usuario de forma local
(mediante teclado y pantalla), o de forma remota mediante una aplicación Android.
1.2 Alcance
El presente proyecto trabajo “sistema de control automático en una explotación agraria
“se encuadra como un trabajo académico final en el que el alumno debe demostrar los
conocimientos que ha adquirido y las capacidades que se prevén en el plan de estudios
del grado de ingeniería eléctrica.
El diseño y la implementación de un prototipo es un proyecto que abarca otras áreas
aparte de la ingeniería eléctrica; se desarrollarán conocimientos de programación,
desarrollo de “aplicaciones apk” prediseñadas o la configuración de microcontroladores.
Esta obra busca la innovación , el desarrollo físico y aplicable al control automático de
cualquier explotación agraria de tamaño medio, gracias a la flexibilidad que ofrece el
sistema.
Por otro lado el auge de los microcontroladores y su desarrollo ha hecho posible que
existan en el mercado una gran gama de componentes fiables y a un precio muy
asequible. Desde esta perspectiva se abarca este proyecto, con el objetivo de diseño e
implementación del sistema más fiable, eficiente y económico que se pueda plantear.
1.3 Situación y emplazamiento de la parcela
Se trata de una parcela de 10.200 m2 (1 hectárea aproximadamente) de superficie,
situada entre la localidad de Tortosa y Bitem .En la explotación agrícola que cuenta con
un pozo propio, hay una vivienda edificada. La superficie agrícola explotada total es de
unos 6800 m2 con una plantación de 350-400 naranjos.
En la Figura 1 se presenta una imagen, que junto a los planos del emplazamiento que se
presentan en los anexos facilitará la visualización de la localización del terreno a
analizar.
Sistema de control automático en una explotación agrícola 7
Figura 1. Vista en planta de la parcela 85 (Google Maps)
De todas formas en el esquema [7.1.1],se detalla la situación de los elementos más
característicos de la parcela.
1.4 Instalaciones existentes
En esta explotación ya hay instalaciones en uso, para las diferentes tareas que se
realizan, riego de los arboles, suministro de agua a la vivienda y puntos de luz
exteriores.
1.4.1 Instalación de riego
El sistema de riego se abastece del agua del pozo mediante el uso de una bomba
trifásica sumergida, de 1.1kW de potencia. Dicha bomba se encuentra a una
profundidad de 11 metros por debajo del nivel de tierra.
El panel de control para este sistema consiste en un pulsador de paro y otro de marcha
que se encuentran dentro de un armario empotrado en la pared de la caseta adyacente,
situado a 3 metros del pozo.
En el esquema [7.1.2.1] se encuentra el esquema de esta instalación.
El agua se canaliza mediante tuberías de PVC, donde se pueden distinguir 3 tramos:
El primer tramo de tuberías tiene una longitud de 40 metros con un diámetro de
18 cm.
El tramo intermedio con una longitud de 20 metros es el encargado de
alimentar a las distintas líneas de riego.
Por último la canalización se divide en cinco líneas de subministro con una
longitud de 120 m que reparten el agua a los diferentes surtidores que existen a
lo largo de las líneas.
Sistema de control automático en una explotación agrícola 8
1.4.2 Suministro de agua a la vivienda
Estas instalaciones consisten en una bomba trifásica exterior, situada en la superficie del
pozo y anclada en la piedra por medio de un sistema de fijación.
El sistema tiene una bomba trifásica de 0,8kW que extrae agua del pozo: esta agua es
conducida por un sistema de tuberías, cuya longitud total es de 52 metros con una altura
a superar de 11 metros hasta el depósito situado en la azotea de la casa. La sección de
canalización es de 6 cm de diámetro.
En el esquema [7.1.2.2] se encuentra el esquema de esta instalación.
El panel de control para el manejo de la bomba encargada de llenar el depósito, se
encuentra su vez, dentro de un armario empotrado en la pared de la caseta adyacente,
situado a 3 metros del pozo. En el mismo se encuentra el contactor de la bomba de
superficie y dos pulsadores: pulsador de paro y marcha.
1.4.3 Instalación de alumbrado exterior
EL sistema de iluminación es muy básico, consiste en 2 puntos de luz gobernados por
un interruptor que se encuentra dentro de la vivienda.
Se utilizan focos halógenos de 400 W para exteriores.
En el esquema [7.1.2.3] se encuentra el esquema de esta instalación.
1.5 Requisitos de diseño
Hay que diseñar un sistema de control para automatizar ciertas tareas en una
explotación agrícola eficiente, fiable y adaptable a diferentes casos.
El objetivo principal es controlar y/o automatizar las tareas más comunes que se puedan
dar en este tipo de actividades, ya sea el riego de los árboles frutícolas, el suministro de
agua potable a la vivienda, la iluminación exterior y la apertura/cierre de la puerta de
acceso.
Para ello, también es un requisito crear una interface adecuada para poder interactuar
con el usuario. Se hará a través de dos vías: local, mediante pantalla y teclado, o remota,
mediante una aplicación para dispositivos Android.
También es necesario que los motores de inducción trifásicos que accionan las bombas
y la puerta de acceso a la propiedad tengan un arranque y parada suave. De este modo
los motores trabajaran en mejores condiciones y se impedirán “golpes de ariete” en la
instalación hidráulica, y golpes entre la puerta y su marco. .
Sistema de control automático en una explotación agrícola 9
Otro punto importante a tener presente, es la adaptabilidad del sistema. Además de ser
compatible con la parcela de estudio, el sistema es adaptable a diferentes casos con el
mínimo cambio en su estructura.
El sistema de control ha de permitir personalizar diferentes variables o estados tales
como:
Temporización de la hora de inicio y fin del sistema de riego por goteo.
Temporización de la hora de inicio y fin del sistema de llenado del depósito si
éste no estuviese lleno.
Temporización de la hora de inicio y fin del sistema de iluminación de la
explotación.
Control por medio de teclado o aplicación móvil del sistema de riego.
Control por medio de teclado o aplicación móvil del sistema de llenado del
depósito.
Control del nivel del agua en el depósito automático.
Control por medio de teclado o aplicación móvil de la apertura o cierre del
acceso a la explotación.
Iluminación automática por detección de presencia.
1.5.1 Funcionalidad del sistema requerido
Como se ha hecho mención en los puntos anteriores, el prototipo ha de controlar y
automatizar diferentes tareas, con funciones muy diversas.
Para la realización de estos procesos es necesario conocer el estado de diferentes
variables como por ejemplo: el nivel de agua contenida en el depósito, la posición en la
que se encuentra la puerta de acceso, etc…
El sistema de control que se implemente en la explotación junto con un conjunto de
sensores, módulos y actuadores habrán de permitir la ejecución correcta de todas
funciones.
A continuación se detallarán todos los procesos a realizar:
1.5.2 Programador del riego
Esta parte del sistema permite al usuario configurar mediante el teclado del dispositivo,
la duración y los días de la semana para accionar el riego por goteo en la explotación.
Igualmente se podrá accionar el bombeo de agua en horas no programadas.
El control de la bomba incluirá un variador de frecuencia que optimice el arranque y
paro así como la ampliación de la vida útil de las instalaciones.
Sistema de control automático en una explotación agrícola 10
1.5.3 Control del nivel de agua en el depósito
El sistema se encargará de accionar la bomba de superficie cuando el nivel de agua esté
bajo un umbral previamente configurado por el operario. Si por el contrario, el nivel de
líquido supera una cierta altura, se procede a la desactivación de ésta.
En el control de la bomba, se incluye un variador de frecuencia que optimiza el
arranque/paro y un sensor para medir la cantidad de agua depositada.
1.5.4 Encendido/Apagado Iluminación exterior
El control de encendido y apagado de las luces podrá hacerse de tres formas diferentes:
Directamente con el uso del teclado físico
Inalámbricamente con el móvil.
Programando la hora de su activación/desactivación gracias al uso del algún
teclado .
Activación de los puntos de luz mediante detectores de presencia, que en todo
caso, se podrán habilitar o deshabilitar dependiendo de la configuración
establecida.
1.5.5 Apertura/cierre del acceso a la explotación
Este sistema controla el motor instalado en la puerta de acceso que está accionada
linealmente siguiendo unas guías.
En el control de acceso se integra un variador de frecuencia. Este elemento permitirá el
cambio de la dirección de giro del motor.
Para evitar accidentes se ha de proveer de algún sistema que detendrá el cierre de la
puerta si detecta un objeto cruzando. Pasados unos segundos, la instalación ha de
comprobar el estado del sistema de seguridad y, en caso negativo, proceder al cierre de
la puerta.
Cuando el usuario quiera acceder o salir del recinto en horas intempestivas, sólo tendrá
que ejecutar la aplicación móvil para gobernar la puerta.
Sistema de control automático en una explotación agrícola 11
2 COMPONENTES DEL SISTEMA DE CONTROL
2.1 Introducción
De cara al control de la explotación agraria, se plantean distintas soluciones disponibles
en el mercado: ordenadores, microcontroladores, PLC.
Un aspecto importante a destacar, es la facilidad de operación para el usuario y su
flexibilidad. Por otra parte, al tratarse de una zona agrícola ubicada en el tramo del río
Ebro, la atmósfera está llena de partículas de polvo y con un alto grado de humedad.
Otra característica que se valora, es el consumo de energía, dado que este sistema
supone el funcionamiento continuo a lo largo del año. Por último, el precio es un punto
muy importante a tener presente. Así que, con todos estos parámetros, la solución se
hace más evidente.
En primer lugar, la instalación de un ordenador como sistema de control, no cumple
todos los requisitos, es decir, el consumo de energía es relativamente elevado; además,
se tendría de añadir una tarjeta con los pines de entrada y salida. Finalmente, el precio lo
sitúa como una de las soluciones menos económicas y viables. El PLC, pese a tener
ventajas superiores, (como por ejemplo la robustez y la estabilidad en la operación),
muy por encima del PC o el microcontrolador, presenta la desventaja del precio además
de una complejidad de manipulación para el usuario. Por tanto, se perfila como una
solución demasiado industrial para este tipo de aplicaciones.
Finalmente, la opción de emplear un microcontrolador presenta ventajas en todos los
puntos clave con el único inconveniente de una baja robustez, que para un entorno
agrario, es insuficiente. El precio se sitúa muy por debajo de las dos soluciones
anteriormente citadas, además de poseer la potencia suficiente para el control de un
sistema de estas características, en una explotación agraria.
El mercado ofrece una gama de microcontroladores muy amplia. Quizás los más
populares a día de hoy, sea los diferentes modelos de la compañía Arduino, con un gran
número de versiones adaptadas a todas las necesidades imaginables. Una de las
principales ventajas es la incorporación de código abierto para su programación, El uso
por parte de los microcontroladores Arduino, de un código abierto, ha permitido que se
puedan encontrar placas a muy buen precio en el mercado. También presenta una
amplísima comunidad activa de usuarios que aportan continuamente nuevos
conocimientos, ampliando así, las posibilidades de esta gamma de microcontroladores.
Sistema de control automático en una explotación agrícola 12
2.2 Estructura del Sistema de Control
El Prototipo integrara diferentes dispositivos que serán descritos a lo largo de este
capítulo.
Los sensores se encargarán de recoger información de las variables de interés, el
controlador procesará los datos recogidos y según la acción que ingrese el usuario por
medio de las diferentes interfaces disponibles, el sistema ejecutará una operación u
otra.
Figura 2. Estructura General del sistema
2.3 Componentes utilizados en el prototipo
A continuación, detallaremos todos los componentes que se han utilizado en el sistema.
En los siguientes capítulos, se procederá a la explicación de su conexionado,
configuración y como se han integrado en todo el conjunto. En cada caso, se justificará
su elección para este proyecto.
2.3.1 Arduino Uno SMD
Arduino Uno R3 es una placa con un microcontrolador de la marca Atmel, con la
circuitería de soporte, donde se incluyen reguladores de tensión, puerto USB (que
permite programar el microcontrolador desde cualquier PC).
Este modelo de Arduino, dispone de 14 pines configurables, como entrada o salida, y a
los que pueden conectarse los sensores y actuadores que sean capaces de transmitir o
recibir señales digitales de 0V hasta los 5V.
También dispone de 6 pines analógicos configurables como entrada o salida. Mediante
las entradas analógicas podemos obtener diferentes datos de los sensores en forma de
Sistema de control automático en una explotación agrícola 13
niveles de tensión. Las salidas analógicas de las que algunos pines disponen, pueden
utilizarse para enviar señales de control en forma de señales PMW.
Cada uno de los 14 pines digitales funcionan con una tensión de 5V y puede
subministrar una corriente máxima de hasta 40 mA.
Cada pin que se encuentran en el microprocesador dispone de una resistencia pull-up
interna de entre 20 KΩ Y 50 KΩ que, por defecto, se encuentran deshabilitadas.
Pines más singulares del modelo UNO de entrada y salida:
RXyTX: Se usan para transmisiones serie de señales TTL.
PMW: Arduino dispone de 6 salidas destinadas a la generación de señales
PMW de hasta 8 bits.
SPI: Los pines 10, 11, 12 y 13 pueden utilizarse para llevar a cabo
comunicaciones SPI, que permiten trasladar información full dúplex en un
entorno Maestro/Esclavo.
I2C: Permite establecer comunicaciones a través de un bus I2C. El bus I2C es
un producto de Phillips para la interconexión se sistemas embebidos. En la
actualidad se pueden encontrar una gran diversidad de dispositivos que utilizan
esta interfaz.
Resumen de las características técnicas:
Microcontrolador Atmega328
Voltaje de operación 5V
Voltaje de entrada 7-12V
Voltaje entrada limite 6-20V
Pines para entrada/ salida digital 14 (6 se pueden utilizar como salida PMW)
Pines para entrada analógica 6
Corriente continua por pin IO 40mA
Corriente continua en el pin 3,3V 50mA
Memoria Flash 32KB
SRAM 2KB
EEPROM 1KB
Frecuencia del reloj 16 MHz
Tabla 1.Características del micorcontrolador
Sistema de control automático en una explotación agrícola 14
Figura 3. ArduinoUNO con microcontrolador en formato SMD
2.3.2 Herramienta de desarrollo utilizada (IDE)
El micro proporciona un software consistente en un entorno de desarrollo (IDE) que
implementa el lenguaje de programación de Arduino y el bootloader ejecutado en la
placa. La principal característica del software de programación y del lenguaje de
programación es su sencillez y facilidad de uso. El software hecho para Arduino es
portable, es decir, el mismo firmware que hemos hecho para un
Arduino/Microcontrolador, sirve para otras placas de la misma plataforma u otras placas
compatibles. Para este proyecto, se ha utilizado la versión 1.6.12 del IDE de Arduino.
La interfaz del IDE de Arduino es sencilla e intuitiva. Tiene en la parte superior un
menú con la mayoría de funciones en el que se pueden configurar diferentes variables:
como el puerto USB, que vamos a usar, y el modelo de microcontrolador que
utilizaremos.
En la parte superior, se encuentra una opción para compilar el código en busca de fallos
(botón con forma de tick) y otro para cargar el código en la placa Arduino (botón con
forma de fecha).
En la parte central de la interfaz del programa es donde se desarrolla el código.
Por último, en la parte inferior, la aplicación nos muestra diferente información cuando
compilamos el código o lo cargamos a la placa, desde los posibles fallos o advertencias
hasta la memoria ocupada por el sketch.
Sistema de control automático en una explotación agrícola 15
Figura 4. Interfaz IDE
2.3.3 Herramienta de desarrollo de la App ,App Inventor 2
App Inventor es una herramienta creada originalmente por Google para la programación
de aplicaciones del sistema operativo Android,se pueden crear aplicaciones nativas para
smartphone o tableta. Actualmente se encuentra en la versión nº2, y está siendo
controlada y mantenida diariamente por el prestigioso MIT-Massachusetts Institute of
Technology.
2.3.4 Sensores
Hoy en día, Arduino ha tomado fuerza dentro de la comunidad de desarrolladores de
aplicaciones electrónicas y se han generado una gran variedad de módulos que permiten
realizar proyectos Arduino de una forma ágil y sencilla. Es por eso que, a continuación,
se describirá la lista de sensores que se han utilizado para la elaboración del sistema de
control automático.
Sistema de control automático en una explotación agrícola 16
2.3.5 Sensor de ultrasonidos HC-SR04
Es un sensor que permitirá detectar objetos o calcular distancias entre distintos puntos.
El sensor ultrasónico HC-SR04 es uno de los sensores más utilizados en proyectos con
Arduino debido al bajo precio e intervalo de detección, ya que es bastante amplio. Va
desde los 3 cm hasta 5 m con una precisión de 3 mm.
Este sensor tiene el mismo funcionamiento que un radar ya que envía pulsos a alta
frecuencia, en este caso en la franja de los ultrasónicos. Está compuesto por dos
piezoeléctricos: un transmisor y receptor ambos en forma de cilindro. El transmisor se
encarga de emitir la señal ultrasónica para luego ser rebotada a través de un objeto,
llegando al cilindro receptor. Debido a que la señal tardará un tiempo en regresar desde
que se emite, es obvio pensar que la velocidad con la cual llegará al receptor está
íntimamente relacionada con la distancia de transmisión y rebote.
Se expresa matemáticamente como: Distancia = 170 (m/s) * t(s)
Para este proyecto, se utilizará el HC-SR04 como medidor del nivel del agua contenida
en el depósito.
Características:
Alimentación 5V.
Rango de medición: 3 cm a 400 cm.
Corriente de alimentación: 15 mA.
Frecuencia del pulso: 40 Khz.
Apertura del pulso ultrasónico: 15º
Señal de disparo: 10uS.
Este sensor tiene únicamente cuatro pines. Dependiendo del fabricante, puede tener
desde tres hasta cinco pines. Para este caso se tiene:
VCC: Voltaje de alimentación
TRIG: Pin de disparo
ECHO: Pin de eco
GND: Ground
Sistema de control automático en una explotación agrícola 17
Figura 5. Sensor de ultrasonidos HC-SR04
2.3.6 Sensor de movimiento PIR (HC-SR501)
Los sensores PIR se basan en la medición de la radiación infrarroja. Todos los cuerpos
emiten una cierta cantidad de energía infrarroja, mayor cuanto mayor es su temperatura.
Los dispositivos PIR disponen de un sensor piezoeléctrico que se encarga de captar esta
radiación y convertirla en una señal eléctrica.
Cada sensor está compuesto por dos captadores de radiación y dispone de un circuito
eléctrico que compensa ambas mediciones. Si ambos campos reciben la misma cantidad
de infrarrojos, la señal eléctrica resultante es nula. Por el contrario, si los dos captadores
reciben una medición diferente, se genera una señal eléctrica.
De esta forma, si un cuerpo atraviesa uno de los campos, se genera una señal eléctrica
diferencial, que es captada por el sensor, y emite una señal digital.
Para este proyecto, se utiliza este tipo de captador para el control de la iluminación
exterior.
Características
El módulo incluye el sensor, lente, controlador PIR BISS0001 y regulador.
Rango de detección: 3 m a 7 m, ajustable mediante trimmer (Sx)
Lente fresnel de 19 zonas, ángulo < 100º
Salida activa alta a 3.3 V
Tiempo en estado activo de la salida configurable mediante trimmer (Tx)
Redisparo configurable mediante jumper de soldadura
Sistema de control automático en una explotación agrícola 18
Consumo de corriente en reposo: < 50 μA
Voltaje de alimentación: 4.5 VDC a 20 VDC
Este sensor tiene únicamente tres pines :
VCC: Alimentación 5V.
GND: Ground
DAT: Pin de datos digita.
Figura 6. Sensor infrarrojos pasivo (PIR)
2.3.7 Sensor de humedad y temperatura DHT11
La temperatura y la humedad son variables, y se pretenden conocerlas en todo
momento, más aun en explotaciones agrícolas .Entre los diferentes modelos de sensores
que existen en el mercado, se ha optado por el DHT 11.
El DHT11 es un sensor de temperatura y humedad digital. Utiliza un sensor capacitivo
de humedad y un termistor para medir el aire circundante, y refleja los datos mediante
una señal digital en el pin de datos.
Características
Alimentación: 3Vdc ≤ Vcc ≤ 5Vdc
Rango de medición de temperatura: 0 a 50 °C
Precisión de medición de temperatura: ±2.0 °C .
Resolución Temperatura: 0.1°C
Rango de medición de humedad: 20% a 90% RH.
Precisión de medición de humedad: 4% RH.
Resolución Humedad: 1% RH
Tiempo de sensado: 1 seg.
Este sensor tiene únicamente tres pines.
Sistema de control automático en una explotación agrícola 19
VCC: Alimentación 5V.
GND: Ground.
DAT: Pin de datos digita.
Figura 7. Sensor DHT11
2.3.8 Interruptor final de carrera
Este dispositivo electromecánico consta de un accionador vinculado mecánicamente a
un conjunto de contactos. Cuando un objeto entra en contacto con el accionador, el
dispositivo opera los contactos para cerrar o abrir una conexión eléctrica.
Figura 8. Esquema eléctrico interruptor final de carrera
2.3.9 Módulo: 8 relés 5V
En este proyecto, el control de los variadores de frecuencia se hace mediante la
configuración y el accionamiento de sus salidas digitales. Para ello, se requiere de una
Sistema de control automático en una explotación agrícola 20
señal de 15 V. El control de las diferentes salidas hacia los variadores se hará con relés
que a su vez están controlados por el microcontrolador.
El prototipo incorpora una tarjeta de relés opto acoplados, formado por 8 canales. Cada
canal es controlado por una entrada TTL, la cual puede ser fácilmente conectada al
Arduino.
Características
Cargas de hasta 250 Vac y 30 Vdc de 10 A.
8 canales independientes protegidos con optoacopladores
8 Relés (Relays) de 1 polo 2 tiros
El voltaje de la bobina del relé es de 5 VDC
Led indicador para cada canal (enciende cuando la bobina del relé esta activa)
Activado mediante corriente: el circuito de control debe proveer una corriente
de 15 a 20 mA
Terminales de conexión de tornillo (clemas)
Terminales de entrada de señal lógica con headers macho.
Este sensor tiene 8 pines de control y 2 pines para la alimentación.
VCC: Alimentación 5V.
GND: Ground.
IN1: Pin control canal 1.
IN2: Pin control canal 2.
IN3: Pin control canal 3.
IN4: Pin control canal 4.
IN5: Pin control canal 5.
IN6: Pin control canal 6.
IN7: Pin control canal 7.
IN8: Pin control canal 8.
Sistema de control automático en una explotación agrícola 21
2.3.10 LCD
16x2 por
protocolo I2C
Las pantallas de cristal líquido LCD (Liquid Cristal Display) tienen la capacidad de
mostrar caracteres alfanuméricos, permitiendo representar la información que generan
los diferentes sensores o procesos que estén activos. La pantalla consta de una matriz de
caracteres 5x8 puntos distribuidos en dos, líneas de 16 caracteres.
Características:
Consumo muy reducido, del orden de 7.5mW
Voltaje de alimentación: 5 VDC
Pantalla de caracteres ASCII, además de los caracteres japoneses
Kanji, caracteres griegos y símbolos matemáticos.
Desplazamiento de los caracteres hacia la izquierda o a la derecha
Memoria de 40 caracteres por línea de pantalla, visualizándose 16 caracteres
por línea.
Movimiento del cursor y cambio de su aspecto
Permite que el usuario pueda programar 8 caracteres
Pueden ser gobernados de 2 formas principales:
Conexión con bus de 4 bits
-Conexión con bus de 8 bits
Conexión por modulo I2C:
Figura 9.Módulo 8 relés
Sistema de control automático en una explotación agrícola 22
Figura 10: LCD 16x2.
EL Módulo adaptador LCD a I2C que se usará está basado en el controlador I2C
PCF8574, el cual es un expansor de entradas y salidas digitales controlado por I2C, este
módulo se usa para controlar un LCD.
Este modulo tiene únicamente cuatro pines.
VCC: Alimentación 5V.
GND: Ground.
SDA: Pin SDA.
SCL: Pin SCL
El modulo solo tiene 4 cables que se corresponden a GND, 5V, SDA y SCL.
Figura 11. Módulo I2C
2.3.11 Reloj RTC DS1302
Sistema de control automático en una explotación agrícola 23
Un módulo RTC (Real Time Clock) o "Reloj de tiempo real" consiste en un circuito
integrado alimentado por una batería que, en todo momento, registra la fecha, día de la
semana y hora, al igual que un reloj digital convencional. Estos datos, únicamente
podrán ser consultados mediante comunicación I2C.
Este módulo permitirá la temporización de todos los procesos que queramos
automatizar dentro de la explotación .Garantiza también, el correcto funcionamiento del
sistema en caso de apagón o interrupción del subministro eléctrico momentáneo.
Características:
Lleva a cabo todas las funciones de un reloj en tiempo real: pues, en tiempo
real, cuenta segundos, minutos, horas, día de la semana, día del mes, mes y año
con compensación de año bisiesto.
RAM interna de 31 x 8
Interfaz en serie sencilla: sólo se requieren tres cables para comunicarse con el
reloj.
Se puede transmitir o recibir la información byte por byte o en modo Burst.
Bajo consumo de potencia: tensión de funcionamiento de 2.0 V a 5.5 V.
Utiliza menos de 300 nA a 2.0V.
Rango de temperatura: de 0 °C a +70 °C.
Este módulo tiene únicamente cinco pines:
VCC: Alimentación 5V.
GND Ground.
CLK: pin reloj.
DAT: pin de I/O, datos.
RST: reset.
Figura 12.Reloj rtcDS1302
2.3.12 Módulo Bluetooth HC-06
Para la comunicación vía móvil con el microcontrolador se ha optado por la tecnología
Bluetooth.
Sistema de control automático en una explotación agrícola 24
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.
El HC 06 es un módulo de Bluetooth tipo slave. Tiene la ventaja de ser económico,
puede encontrarse fácilmente y es sencillo de configurar.
Características:
Los pines de conexión del módulo son VCC, GND, TXD, RXD, STATE Y
WAKEUP.
El led indica el estado de la conexión Bluetooth.
Tensión de alimentación3.6~~6V.
Consumo de corriente cuando no está pareado: 30mA, pareado: 10mA.
Alcance de 20 metros. Pueden ser distancias superiores dependiendo del
entorno.
Configuración mediante comandos AT.
Dimensiones :3.57cm*1.52cm
Este módulo tiene únicamente cuatro pines:
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 a un voltaje de 3,3V.
Figura 13. Modulo Bluetooth
2.3.13 Keypad 3×4
El accionamiento de los diferentes actuadores y la introducción de valores se realizan
mediante la integración de un teclado.
El teclado matricial es un dispositivo compuesto de una serie de pulsadores conectados
de forma matricial (en filas y columnas), el teclado posee los valores 0, 1, 2, 3, 4, 5, 6,
Sistema de control automático en una explotación agrícola 25
7, 8, 9, *, #, estos caracteres ocupan las 12 teclas de un teclado 3×4, para que estos
teclados realicen la función de una matriz, cada casilla es asignada a una fila o a una
columna.
Características:
Dimensiones del teclado: 69,2 x 76,9 x 0,8 mm
Longitud del cable: 3-1 / 3 "o 86m
Alimentación máxima: 35VDC, 100mA
Aislamiento: 100M Omh, 100V
Auto-Adhesión
Este dispositivo utiliza 7 pines como entradas para el microcontrolador.
Figura 14.Teclado matricial
2.3.14 Variador de frecuencia
El variador de frecuencia es un convertidor de energía cuya misión es controlarla y
entregarla al motor de corriente alterna, por medio de la modulación de la frecuencia de
alimentación suministrada al mismo. Un variador de frecuencia es un caso especial de
variador de velocidad. Estos dispositivos forman parte de la familia denominada
Accionamientos en CA (AC Drives), constituida por otros equipos para el manejo de
motores de corriente alterna, tales como Partidores Suaves, que se emplean sólo para la
partida y parada de los motores, y no para modificar la velocidad en régimen
permanente.
La puesta en marcha, la regulación de velocidad o el frenado de los diferentes motores
que intervienen en los procesos agrícolas, se harán mediante el modelo Micromaster .
Sistema de control automático en una explotación agrícola 26
2.3.14.1 Características serie Micromaster
La serie MICROMASTER es una gama de convertidores para modificar la velocidad
de motores trifásicos. Los distintos modelos disponibles abarcan un rango de potencias
desde 120 W para entrada monofásica hasta 75 kW con entrada trifásica.
Los convertidores están controlados por microprocesador y utilizan tecnología IGBT
(Insulated Gate BipoIar Transistor) de última generación. Esto los hace fiables y
versátiles. Un método especial de modulación por ancho de impulsos con frecuencia de
pulsación seleccionable permite un funcionamiento silencioso del motor. Extensas
funciones protectoras, ofrecen una protección excelente tanto del convertidor como del
motor.
Características principales:
Accionamiento de motores con una potencia comprendida entre 120W y
75Kw.
Frecuencia de salida: 0-380 Hz.
Par de puesta en parcha elevado.
Elevada precisión para regular la velocidad.
Dispone de 3 entradas digitales parametrizables y una entrada analógica.
Capacidad de control remoto con el enlace serie RS-485.
Programación de parámetros.
Parámetros predefinidos de fábrica.
Permite el control de la frecuencia de salida con diferentes procedimientos.
Posibilidad de frenado de los motores.
Incorpora una salida relé programable.
2.3.14.2 Esquema General
Sistema de control automático en una explotación agrícola 27
Figura 15. Esquema general del convertidor Micromaster, se pueden distinguir las entradas y salidas tanto de
potencia como de control, y el panel de control.
Las partes principales de este variador son:
Panel de control: sirve para configuración de los diferentes parámetros,
visualización de las diferentes variables mediante el display y el comando del
motor gracias a las teclas de control.
Entradas analógicas, corresponden a los terminales 3 y 4. Estas entradas puede
conectarse una señal de entre 0V Y 10V, la frecuencia de salida del inversor
será proporcional al nivel de tensión que se mida en la entrada.
Entradas digitales, corresponden a los terminales 5,6y 7.Se pueden conectar
tres salidas digitales de un autómata, en este caso serán las salidas de los
diferentes relés controlados por el microcontrolador Arduino. Para realizar la
conexión a las entradas del variador, se utilizará la fuente interna de tensión de
15V cuya salida se encuentra en el terminal 8.
2.3.14.3 Programación del variador
Este modelo dispone de 85 parámetros que permiten configurar el comportamiento del
motor. A continuación, se nombrarán los principales parámetros utilizados:
P001 tipo de visualisación: permite elegir la variable que se quiera ver por la pantalla.
Sistema de control automático en una explotación agrícola 28
P002 Tiempo de aceleración. Esta opción controla la duración desde la puesta en
marcha hasta alcanzar la velocidad de consigna deseada.
P003 Tiempo de desaceleración: permite controlar el tiempo que tardará el motor en
desacelerar su velocidad de rotación hasta el paro.
P005 Consigna de frecuencia digital: permite introducir la frecuencia a la que el motor
funcionará en condiciones nominales.
P006 Selección del origen para la consigna de frecuencia: Para habilitar las entradas
digitales o analógicas en el control de la velocidad del motor.
P007 Control del teclado: habilita las teclas frontales del variador para realizar cambios
como por ejemplo la parada, cambio de la frecuencia que alimenta a la bomba etc.
P009 Ajuste de protección de parámetros
P012 Frecuencia mínima del motor: Permite establecer una velocidad de rotación
mínima del motor.
P012 Frecuencia máxima del motor: Permite establecer un límite de velocidad máxima.
P051 Selección de la función de control:
Permite seleccionar el parámetro que será controlado mediante la activación/
desactivación del la entrada digital DIN1, los parámetros que podemos controlar son:
Deshabilitar entrada.
Giro del motor a derechas.
Giro del motor a izquierdas.
Inversión de giro.
Frecuencias fijas 1-6.
Marcha impulso horario.
Aumento de frecuencia.
Reducción de frecuencia.
Activación del freno CC.
P052 Selección de la función de control:
Permite seleccionar el parámetro que será controlado mediante la activación/
desactivación del la entrada digital DIN2, los parámetros que podemos controlar son:
Deshabilitar entrada.
Giro del motor a derechas.
Giro del motor a izquierdas.
Inversión de giro.
Frecuencias fijas 1-6.
Marcha impulso horario.
Sistema de control automático en una explotación agrícola 29
Aumento de frecuencia.
Reducción de frecuencia.
Activación del freno CC.
P053 Selección de la función de control.
Permite seleccionar el parámetro que será controlado mediante la activación/
desactivación del la entrada digital DIN3, los parámetros que podemos controlar son:
Deshabilitar entrada.
Giro del motor a derechas.
Giro del motor a izquierdas.
Inversión de giro.
Frecuencias fijas 1-6.
Marcha impulso horario.
Aumento de frecuencia.
Reducción de frecuencia.
Activación del freno CC.
P081 Frecuencia nominal de la placa correspondiente al motor:
En este parámetro hay que introducir la frecuencia de funcionamiento nominal del
motor en Hz, definida en la placa de características de cada uno de ellos.
P082 Velocidad nominal de la placa correspondiente al motor:
En este parámetro se debe introducir la velocidad en régimen permanente del motor en
rpm, definida en la placa de características de cada uno de ellos .
P083 Intensidad nominal de la placa correspondiente al motor:
En este parámetro se debe de introducir la intensidad en régimen permanente del motor
en amperios, definida en la placa de características de cada uno de ellos.
P084 Tensión nominal de la placa correspondiente al motor:
En este parámetro se debe de introducir la tensión de alimentación del motor.
P085 Intensidad nominal de la placa correspondiente al motor:
En este parámetro se debe de introducirla potencia del motor en kW.
P086 Limite de intensidad de corriente del motor:
Expresada en % define la intensidad por sobrecarga como porcentaje de la intensidad
nominal del motor que es admisible durante un minuto como máximo.
P944 Reajuste a los valores de fábrica:
Sistema de control automático en una explotación agrícola 30
Si se utiliza esta opción todos los valores volverán al estado predefinido de fábrica
salvo el parámetro P101.
Sistema de control automático en una explotación agrícola 31
3 PROTOTIPO DEL SISTEMA DE CONTROL
3.1 Introducción
En este capítulo se explican las fases del diseño de la estructura física, los circuitos
electrónicos y eléctricos, el firmware y la aplicación Android diseñada para dispositivos
móviles.
En la parte física, se especificará qué solución al encapsulado se ha elegido para
proteger los diferentes circuitos que integran el sistema, frente a los agentes externos o
suciedad del ambiente. La parte eléctrica y electrónica del proyecto incluye los diseños
esquemáticos de todos los elementos involucrados en el prototipo, la estructura general
del hardware con sus módulos de sensores, actuadores y de comunicación. Para la parte
del firmware y de la aplicación para el dispositivo móvil se desarrollan todas las etapas
de la ingeniería de software y se definen la plataforma y los protocolos de comunicación
que se va a implementar.
3.2 Esquema general
A continuación, se presenta el diagrama general del sistema de control, en la figura 16,
y se procede con la descripción de la secuencia del funcionamiento del sistema
completo.
El usuario tiene dos maneras de interactuar con el sistema de control agrícola:
Mediante el teclado instalado en el panel frontal del encapsulado que contiene
toda la electrónica.
De manera remota por medio de la App. Las salidas de los diferentes relés se
activarán o desactivarán dependiendo de la opción que haya escogido el
usuario.
Figura 16. Diagrama general de la interacción de las partes del sistema y el usuario
Sistema de control automático en una explotación agrícola 32
El mecanismo de control es capaz de controlar la iluminación de la explotación
directamente, con el accionamiento de los relés que han sido asociados a dicha tarea.
Para el control de los diferentes motores y bombas, se ha optado por la integración de
diferentes controladores de velocidad. El microcontrolador, mediante la
activación/desactivación de cinco relés, controla los tres variadores de frecuencia. Los
diferentes variadores actúan de un modo u otro, dependiendo de la acción requerida por
el usuario. Así pues, es posible controlar el encendido y apagado, sentido de giro,
velocidad y tiempo de aceleración/desaceleración de los diferentes motores eléctricos.
Se pueden supervisar las variables de operación que son: nivel de almacenamiento en el
depósito y estado de los diferentes relés en la pantalla LCD instalada.
En el esquema [7.8] muestra el diagrama de flujo del prototipo, se detalla la secuencia
de tareas que realiza el dispositivo.
3.3 Diseño del encapsulado
El prototipo se ha construido aprovechando cajas estándar para derivaciones eléctricas,
se trata de una caja estanca rectangular, de superficie y con 10 entradas. Con tapa con
tornillos, fabricado en termoplástico con IP 66 recomendado para exterior. Esta caja
dispone de espacio suficiente para el hardware de interfaz.
La caja ha requerido algunas modificaciones para permitir la conexión de alimentación,
señales desde el exterior o la integración del LCD y teclado.
La integración ha presentado varios retos interesantes, porque es necesario garantizar
que el sistema integrado no sufre interferencias debido a la proximidad de los cables y
dispositivos entre sí. Esto es especialmente importante para las conexiones que
gobiernan los relés (dos de los cuales, gobiernan los puntos de luz que están conectados
a la línea eléctrica de la explotación .Para asegurar el correcto funcionamiento, las
salidas de los relés y los cables que conectan a los diferentes periféricos del sistema
tienen distintas salidas físicas hacia el exterior del encapsulado de otro modo, el modulo
que contiene los ocho relés, está ubicado lo mas lejos de los otros componentes ,en la
parte inferior de la caja de derivación.
En un lateral superior de la caja se ha dispuesto todas las líneas de los conectores de
alimentan a los diferentes dispositivos electrónicos: sensores, modulo Bluetooth, LCD
etc. Y las líneas de comunicación I2C que conecta el microcontrolador con el teclado y
LCD.
Además, el conjunto a dado un cierto grado de robustez al sistema aparte de un sellado
seguro.
Sistema de control automático en una explotación agrícola 33
Figura 17. Vista frontal del encapsulado con el sistema integrado en su interior
Sistema de control automático en una explotación agrícola 34
Figura 17. Vista posterior de la tapadera del encapsulado con el sistema integrado en su interior
Sistema de control automático en una explotación agrícola 35
Figura 18. Vista interior del encapsulado con el sistema integrado
En los esquemas [7.2.1.2 y 7.2.2] se encuentra el encapsulado con los componentes
integrados en su interior.
Sistema de control automático en una explotación agrícola 36
3.4 Diseño electrónico del sistema
En las siguientes secciones se desarrolla el diseño electrónico divido en cuatro partes:
controlador, sensores, actuadores y comunicación.
3.4.1 Estructura General del Hardware
La siguiente figura presenta el esquema general del hardware del sistema de control. En
el diagrama de bloques se pueden visualizar los cuatro módulos que componen el
control electrónico del sistema implementado.
Figura 19: Esquema general del Hardware
El controlador contiene el núcleo del proyecto que es el encargado de procesar la
información proveniente de los sensores, actuadores, y los datos remotos recibidos por
el módulo de comunicación Bluetooth. El módulo de sensores está conformado por: dos
pares de sensores PIR que van a estar ubicados en el exterior. De este modo, cuando
detecten presencia y se den las condiciones horarias, el controlador dará la señal de
activación del punto de luz asociado al sensor PIR correspondiente, un tercer sensor
PIR para asegurar el cierre de la puerta de acceso en condiciones de seguridad, en caso
de que algún objeto cruce la trayectoria durante el proceso de cierre, se detendrá hasta
nueva orden. El sensor por ultrasonidos deberá de ser instalado en la parte interior de la
tapa del depósito de agua para el monitoreo del nivel de superficie. Por último,
localizado dentro del encapsulado, estará el sensor de temperatura y humedad cuyos
datos serán mostrados en la LCD.
El número de actuadores controlados incluyendo los variadores de frecuencia, son ocho:
Sistema de control automático en una explotación agrícola 37
-Dos electrobombas trifásicas, para el caso concreto de la parcela de estudio, una de
ellas están situada dentro del pozo a una profundidad de once metros y la otra una
bomba de superficie, está ubicada a nivel de superficie anclada al borde del perímetro
del pozo.
- Un motor trifásico, que debe realizar la apertura y cierre de la puerta de acceso, tres
variadores que actúan sobre el motor y las electrobombas.
-Por último, ubicados a lo largo de la explotación, dos puntos de luz.
El módulo de comunicación como ya se ha descrito en el capítulo (poner capítulo
correspondiente) usa la tecnología Bluetooth para la comunicación entre la App
instalada en el móvil y el sistema de control.
3.4.2 Módulo de control
La temporización de eventos durante el año o el área de la interacción persona-
microcontrolador requiere de elementos auxiliares conectados al microcontrolador.
Está formado por un teclado matricial 3x4, un reloj RTC de alta precisión, una pantalla
LCD vía I2C de 2x16 caracteres y el núcleo del sistema que contiene el firmware.
Concretamente se trata del microcontrolador Arduino Uno SMD.
El diagrama esquemático del conexionado se encuentra en los anexos [7.3 y 7.4], como
se puede visualizar en diagrama. El uso del PCF8574 vía I2C, ha reducido al mínimo el
número de pines ocupados por este dispositivo.
3.4.3 Módulo de sensores
Las variables que el sistema necesita conocer en todo momento para satisfacer los
requerimientos de diseño, requieren captar una serie de magnitudes físicas que implican
una colección de sensores. Para ello, se han seleccionado las mejores soluciones para
los diferentes casos, teniendo en cuenta los criterios de diseño.
Los diferentes parámetros que el sistema habrá de captar son:
-Nivel del depósito de agua,
- Temperatura y humedad,
- Presencia de movimiento en distintas áreas de la explotación.
Esta parte del sistema está formado por: el sensor de temperatura y humedad DHT-11,
tres sensores de presencia PIC. El diagrama esquemático del circuito se encuentra en los
esquemas [7.3 y 7.4].
Sistema de control automático en una explotación agrícola 38
3.4.4 Módulo de Actuadores
Las diferentes tareas serán realizadas por los actuadores: el motor y las bombas
trifásicas y los puntos de luz o relés que están asociados a ellos. El diagrama
esquemático se encuentra en [7.3 y 7.4], el esquema de fuerza en [7.5], y el esquema de
control en [7.6].
Se distingue en primer lugar, el conexionado del microcontrolador con las conexiones
internas que requiere el control de los relés. En segundo lugar, se muestra el esquema de
fuerza y control; en éste, se visualiza la interacción de los relés controlados por el
microprocesador, conectados a las diferentes entradas de los convertidores de
frecuencia. En el caso de los puntos de luz, los relés controlan directamente la apertura
y cierre de la iluminación. El módulo de actuadores utiliza únicamente las entradas de
control de la tarjeta que contiene los ocho relés.
Para cerrar el circuito de potencia de cada relé, es necesario desenergizar la bobina de
su interior (tensión en puerto de control nula). Por el contrario, si se quiere abrir el
circuito de potencia tiene que haber una señal alta (5 V), en el puerto de control
Todos los circuitos que utilizan los relés se harán mediante la utilización de los
contactos NA (normalmente abiertos).
Relé nº Función asociada
1 Activar/desactivar la bomba de riego.
2 Activar la bomba de suministro de agua, en la
vivienda (máximo caudal).
3 Reducir ½ la frecuencia de alimentación, del
motor que suministra agua a la vivienda (½
del máximo caudal).
4 Activar la apertura de la puerta (giro a
derechas del motor).
5 Activar el cierre de la puerta (giro a izquierdas
del motor).
6 Encender/apagar luces exteriores.
Tabla 2. Acciones asociadas a los reles
3.4.5 Módulo de Comunicación
El sistema podrá conectarse al dispositivo móvil del usuario usando el protocolo de
comunicaciones Bluetooth. El microcontrolador seleccionado soporta este tipo de
tecnología y dispone de dos puertos encargados de la transmisión y recepción de datos,
Tx y Rx respectivamente. Estos pines corresponden al pin digital D0 Y D1.
El dispositivo HC-06, por su coste y fiabilidad, se presenta como una excelente
solución. La información de la configuración de este dispositivo se encuentra en el
anexo [6.1].
Sistema de control automático en una explotación agrícola 39
3.4.6 Asignación de los puertos de Arduino
Los diferentes módulos citados en los sub-apartados anteriores requieren de las
diferentes entradas y salidas del microcontrolador.
A continuación, se adjunta una tabla donde se puede ver cada pin de la placa,
especificando su función, naturaleza del pin, función de entrada o de salida.
Nº Pin
Funció
Digital/Analógico
Salida/Entrada
A0 Control relé nº5 Analógico Salida
A1 Control relé nº6 Analógico Salida
A2 Salida segundo
sensor PIC
Analógico Entrada
A3 Salida primer sensor
PIC
Analógico Entrada
A4 Comunicación I2C ,
puerto SDA
Analógico Entrada
A5 Comunicación I2C ,
puerto SCL
Analógico Salida
D0 Comunicación
Bluetooh, RX
Digital Entrada
D1 Comunicación
Bluetooh, TX
Digital Salida
D2 Control relé nº1 Digital Salida
D3 Control relé nº2 Digital Salida
D4 Control relé nº3 Digital Salida
D5 Control relé nº4 Digital Salida
D6 Final de carrera Digital Entrada
D7 Puerto Trig.
ultrasonidos
Digital Salida
D8 Puerto Echo.
ultrasonidos
Digital Entrada
D9 Sensor presencia
puerta acceso.
Digital Entrada
D10 Puerto CLK reloj rtc. Digital -
D11 Puerto DAT reloj rtc. Digital Entrada
D12 Puerto RST reloj rtc. Digital Salida
D13 Señal digital sensor
DHT 11
Digital Entrada
Tabla 3. Tabla de asignación de los puertos del microcontrolador.
Sistema de control automático en una explotación agrícola 40
Como se desprende de la tabla anterior, todos los puertos de conexión que dispone este
modelo de controlador, han sido utilizados por un elemento u otro, aprovechando al
máximo las posibilidades que ofrece el modelo de placa escogido.
3.5 Configuración de los componentes integrados
Algunos elementos seleccionados requieren ser calibrados y configurados para su
correcta integración y funcionamiento. Seguidamente, se detallarán los pasos seguidos y
la estructura final de cada elemento.
3.5.1 Dispositivo Bluetooth
La configuración de este dispositivo es necesaria para establecer el nombre que
representará al módulo de comunicación, cuando se rastree su señal en el móvil y así
sincronizar los dispositivos. Por otra parte, el modulo Bluetooth solicitará una clave de
acceso al móvil para establecer conexión y, finalmente, la velocidad de transmisión de
la información.
Mediante el envió de comandos AT enviados desde el IDE de Arduino, es posible
modificar diferentes parámetros. El conexionado del microcontrolador junto con los
pasos seguidos se encuentra detalladamente explicado en el anexo [6.1].
A continuación, se puede ver la tabla resumen de los comandos AT utilizados, su
función y la configuración adoptada:
Comando utilizado Función Datos de
configurado
Explicación
AT+BAUD< > Establece la
velocidad de
conexión con el
microcontrolador.
9600 Este valor de 9600
baudes es un valor típico
de velocidad aunque
otros valores también
son compatibles.
AT+NAME<Nombre> Asigna un
nombre al
dispositivo
Bluetooth.
Proyecto
URV
Establecemos el nombre
de “controlador” para su
identificación .
AT+PIN<9025> Configurar el
código PIN de
emparejamiento.
9025 El usuario tendrá que
introducir la contraseña
de 4 dígitos,para
establecer la
comunicación.
Tabla 4. Comandos AT de configuración del dispositivo Bluetooth
Sistema de control automático en una explotación agrícola 41
.
3.5.2 Sensores de presencia
En este proyecto se utilizan tres sensores de este tipo, dos para el circuito de
iluminación exterior y uno para el sistema de cierre de la puerta. Estos dispositivos
tienen en su estructura dos potenciómetros para calibrar la duración del puso de salida y
la sensibilidad.
En los siguientes subapartados se detalla la posición de los diferentes potenciómetros de
cada sensor de presencia PIR.
Calibración del sensor PIR
Básicamente, el sensor requiere un tiempo de preparación para comenzar a tomar
lecturas de forma adecuada. Esto se debe a las condiciones de adaptación de las
operaciones al ambiente para las cuales fue instalado. El tiempo de calibración varía
entre los 10 y 60 segundos. Esta calibración sucederá cada vez que se conecte o reinicie
el prototipo.
3.5.2.1 Configuración del sensor PIR
En el circuito impreso del sensor, hay soldados 2 potenciómetros y un jumper que nos
permiten modificar su comportamiento y adaptarlo a nuestras necesidades, permitiendo
el ajuste del rango de detección y el tiempo de duración de la señal de salida una vez
detectado movimiento.
Figura 20. Ubicación de los potenciómetros para la configuración interna del dispositivo
Nivel de sensibilidad: el potenciómetro situado a la derecha, establece el nivel de
sensibilidad del sensor. Para establecer cuál es la mejor posición, existen factores que
han de tenerse en cuenta. Para el caso de la explotación agraria donde se quiere
implementar el sistema, la existencia de animales como perros y gatos puede activar el
Sistema de control automático en una explotación agrícola 42
sensor cuando no es el objetivo que se busca. En todo caso, se han de realizar una serie
de pruebas y ajustes hasta encontrar la posición que satisfaga al usuario.
Duración del pulso de consigna: ajustando el potenciómetro izquierdo, controlamos la
duración del pulso digital que el pin de salida del sensor envía al sistema de control. En
el algoritmo de programación del micro, la duración del encendido siempre tendrá un
pequeño incremento provocado por la duración del pulso del propio sensor. De este
modo, se requiere que la duración del pulso que genera el PIR, sea lo más corta en el
tiempo.
En todos los sensores de presencia, la posición del potenciómetro izquierdo ha de ser
la que garantice una mínima duración del pulso en el pin de datos, una rotación
antihoraria hasta el tope.
En la detección y apertura de las luces, la posición el potenciómetro derecho, no ha de
situarse al máximo valor de la resistencia, debido a la presencia de pequeños animales o
aves que pueden interferir y activar el sensor. Experimentalmente, la mejor posición
posible, es dar una rotación de entre 140º y 150º.
En el caso del cierre de la puerta de acceso, por seguridad, se calibra el potenciómetro
de su derecha en sentido horario hacia el tope del extremo.
Figura 21. Posición de configuración de los dos potenciómetros, sistema de iluminación
Figura 22. Posición de configuración del potenciómetro, sistema de cierre acceso
3.5.3 Variadores de frecuencia
Sistema de control automático en una explotación agrícola 43
El modelo Micromaster permite la configuración de los diferentes parámetros mediante
la pantalla y las teclas ubicadas en el panel frontal. Es capaz de configurar sus entradas
digitales en función del estado lógico en que se encuentren (15 V o 0 V) e interpreta una
instrucción previamente configurada.
Dependiendo de la tarea que realiza el motor eléctrico, las entradas digitales serán
configuradas de un modo u otro, implicando un comportamiento concreto al motor
eléctrico que controla.
Seguidamente, se justificará y detallará la configuración elegida para cada una de las
tareas que se especifican en los requerimientos en la fase de diseño.
3.5.3.1 Control del riego
La ventaja que integrar este dispositivo en el control de riego radica en aumentar la vida
útil de la instalación, la bomba sumergida y los diferentes elementos que forman la
canalización para evacuar el agua.
Un arranque suave de la bomba de extracción de agua reduce los picos de corriente que
se producen en el arranque del motor así como los esfuerzos mecánicos producidos por
los cambios de presión dentro de las tuberías, evitando el efecto golpe de ariete. Por otra
parte, en el paro de la bomba, también habrá una desaceleración controlada.
Para lograr este objetivo, se ha fijado el tiempo de aceleración/desaceleración, desde la
puesta en marcha hasta alcanzar la velocidad de régimen permanente del motor, o, en el
caso de la desaceleración, desde que se da la consigna de paro hasta que el motor se
para completamente.
A continuación, se exponen los valores introducidos y los programas configurados en
el variador de frecuencia que permiten cumplir los requisitos de diseño:
Nº programa Valor introducido Descripción
002 5 El motor de riego tendrá un
arranque suave que tardará 5
segundos en alcanzar las
condiciones nominales de
funcionamiento.
003 10 El motor de riego tendrá una
parada suave, tardará 10
segundos en alcanzar el paro
por completo.
005 50 Establecemos la frecuencia a
la que funcionará el
convertidor.
006 0 Seleccionamos la frecuencia
de origen programada en
P005.
007 0 Establecemos el control del
variador mediante las
Sistema de control automático en una explotación agrícola 44
entradas digitales (DIN1,
DIN2, DIN3).
051 1 Establecemos el DIN1 como
encendido del motor a
derechas.
052 0 Desactivada entrada DIN 2.
053 0 Desactivada entrada DIN 3.
081 50 Establecemos frecuencia
nominal motor (Hz).
082 1500 Establecemos velocidad
nominal del motor (rpm)
083 5,1 Establecemos corriente
nominal del motor (A)
084 400 Establecemos tensión
nominal motor. (V)
085 1,1 Establecemos potencia
nominal motor (kW)
Tabla 5. Configuración del variador de frecuencia , riego
3.5.3.2 Control del nivel depósito
El llenado del depósito, al igual que sistema de riego, está formado por el motor
trifásico que extrae líquido y el sistema de canalización hasta el depósito, donde se
almacenará el agua para su uso posterior en diferentes aplicaciones, con el añadido de
que, en este caso, por medio del sensor de ultrasonidos, se ha de controlar el nivel de
agua en todo momento y llenar el depósito, en caso de no superar el nivel mínimo de
altura.
Nº programa Valor introducido Descripción
002 5 El motor de riego tendrá un
arranque suave que tardará 5
segundos en alcanzar las
condiciones nominales de
funcionamiento.
003 10 El motor de riego tendrá una
parada suave, tardará 10
segundos en alcanzar el paro
por completo.
005 50 Establecemos la frecuencia a
la que funcionará el
convertidor.
006 0 Seleccionamos la frecuencia
de origen programada en
P005.
007 0 Establecemos el control del
variador mediante las
entradas digitales (DIN1,
DIN2, DIN3).
012 25 Ajustamos la Frecuencia
mínima de funcionamiento
Sistema de control automático en una explotación agrícola 45
para tener dos velocidades de
llenado del depósito.
013 50 Frecuencia máxima del motor
051 1 Establecemos el DIN1 como
encendido del motor a
derechas.
052 12 Cuando esta entrada se active,
el variador proporcionará una
frecuencia menor establecida
en P012.
053 0 Desactivada entrada DIN 3.
081 50 Establecemos frecuencia
nominal motor (Hz).
082 1500 Establecemos velocidad
nominal del motor (rpm)
083 4,3 Establecemos corriente
nominal del motor (A)
084 400 Establecemos tensión
nominal motor. (V)
085 0,8 Establecemos potencia
nominal motor (kW)
Tabla 6. Configuración del variador de frecuencia, suministro de agua en la vivienda
Debido a la sección más reducida del sistema de tuberías en comparación con el sistema
de riego, los cambios de presión y los esfuerzos mecánicos soportados son mayores. El
variador de frecuencia controlará la duración de la aceleración del actuador para evitar
que, tanto los picos de corriente en la activación de la bomba como las variaciones de
presión que se generan dentro de los conductores que canalizan el agua, sean lo más
pequeños posibles, dentro de un tiempo razonable, hasta llegar al régimen permanente
de funcionamiento.
De todos modos, para tener mediciones más correctas del nivel de agua del depósito,
cuando la distancia entre el sensor por ultrasonidos y la superficie del agua sea inferior a
80 Cm, la bomba proporcionará un flujo de agua más reducido, minimizando los errores
de lectura del sensor.
Seguidamente, se expone los valores introducidos y los programas configurados en el
variador de frecuencia que permiten cumplir los requisitos.
3.5.3.3 Control puerta acceso
El control de la apertura y cierre de la puerta de acceso implica un cambio de sentido de
giro en el motor, la integración de un variador de frecuencia controlada por el
microcontrolador. Además, el cambio de sentido de giro ha de permitir la integración
de un sensor de presencia PIR para efectuar el control de forma segura.
Sistema de control automático en una explotación agrícola 46
En la siguiente tabla, se exponen los valores introducidos y los programas configurados
en el variador de frecuencia que permiten cumplir los requisitos:
Nº programa Valor introducido Descripción
002 5 El motor de riego tendrá un
arranque suave que tardará 5
segundos en alcanzar las
condiciones nominales de
funcionamiento.
003 10 El motor de riego tendrá una
parada suave, tardará 10
segundos en alcanzar el paro
por completo.
005 50 Establecemos la frecuencia a
la que funcionará el
convertidor.
006 0 Seleccionamos la frecuencia
de origen programada en
P005.
007 0 Establecemos el control del
variador mediante las
entradas digitales (DIN1,
DIN2, DIN3).
012 50 Ajustamos la Frecuencia
mínima de funcionamiento,
en esta tarea no se requiere de
cambio de velocidad
013 50 Frecuencia máxima del motor
051 1 Establecemos el DIN1 como
encendido del motor a
derechas.
052 2 Establecemos el DIN2 como
encendido del motor a
izquierdas.
053 0 Entrada Din 3 desactivada
081 50 Establecemos frecuencia
nominal motor (Hz).
082 1500 Establecemos velocidad
nominal del motor (rpm)
083 2,6 Establecemos corriente
nominal del motor (A)
084 400 Establecemos tensión
nominal motor. (V)
085 0,4 Establecemos potencia
nominal motor (kW)
Tabla 7. Configuración del variador de frecuencia , puerta acceso
Sistema de control automático en una explotación agrícola 47
3.5.4 Configuración Reloj RTC
Este dispositivo nos permite trabajar con un reloj de tiempo real, que no olvidará la hora
a menos que la pila se agote. En este caso, se perdería toda la configuración y volvería
al estado de fábrica. Para la temporización de las diferentes tareas, es necesario
configurar la fecha y hora.
La configuración de este dispositivo se hace mediante el microcontrolador junto con el
código de programación. Una vez subido el código y ejecutado el algoritmo, el reloj ya
es capaz de proporcionar la hora y fecha actual al sistema de control.
Tanto el código de programación como los pasos seguidos se encuentran al anexo [6.2].
3.6 Interfaz de usuario
Seguidamente, se detallarán los dos modos de comunicación que dispone el prototipo.
En primer lugar, la interfaz remota vía Bluetooth con la explicación detallada de todo el
proceso de diseño de la App y posteriormente, los diferentes menús y submenús de la
interfaz local.
3.6.1 Diseño de la aplicación móvil con App Inventor
App Inventor es un entorno de desarrollo de aplicaciones para dispositivos Android. Se
basa en un servicio web que te permite almacenar en la nube el proyecto y realiza un
seguimiento de sus proyectos. El programa tiene dos partes, en primer lugar Designer,
se implementa la Interfaz de usuario, eligiendo y situando los elementos con los que
éste interactuará, y los componentes que utilizará la aplicación. En el Blocks Editor, se
definirá el comportamiento de los componentes de tu aplicación.
La App del dispositivo móvil transmite valores vía Bluetooth al módulo HC-06. Este
último recibe el dato digital y, se lo envía por el transmisor/receptor digital al Arduino.
El microcontrolador mediante el código de programación, interpreta el valor recibido
como una instrucción. En todo caso activara o desactivara las salidas digitales que
gobiernan los relés y así realizar las diferentes tareas que ya se han descrito en capítulos
anteriores.
Como ya se ha hecho mención, la App del dispositivo móvil enviará diferentes valores
al módulo HC-06. Para este diseño se han elegido números, del 1 al 8. Cada uno de
ellos será interpretado por el sistema de la siguiente forma:
Sistema de control automático en una explotación agrícola 48
Valor enviado/recibido Función asociada en el sistema
1 Encender motor de riego:cerrar el circuito de
potencia del relé nº1 dando la señal al variador
para la puesta en marcha suave de la bomba.
2 Paro del motor de riego: abrir el circuito de
potencia del relé nº1 dando la señal al variador
para la el paro suave de la bomba.
3 Encender motor del llenado del depósito: cerrar el
circuito de potencia del relé nº2 dando la señal al
variador para la puesta en marcha controlada de la
bomba .
4 Apagar motor del llenado del depósito: Abrir el
circuito de potencia del relé nº2 o nº3,en función
del nivel del agua del depósito, dando la señal al
variador para el paro suave de la bomba .
5 Abrir puerta de acceso: cerrar el circuito de
potencia del relé nº4 dando la señal al variador
para la puesta en marcha del motor (giro a
derechas) .
6 Cerrar puerta de acceso: cerrar el circuito de
potencia del relé nº5 dando la señal al variador
para la puesta en marcha del motor (giro a
izquierdas) .
7 Encender luces exteriores : Se activarà el relé nº6
que corresponde a los 2 puntos de luz , cerrando el
circuito de iluminación.
8 Apagar luces del exterior: Abrir el circuito de
potencia del relé nº6, corresponde a los 2 puntos
de luz , abriendo el circuito de iluminación.
Tabla 8. Configuración del la aplicación móvil
Sistema de control automático en una explotación agrícola 49
3.6.1.1 Designer
En Designer, se implementa la Interfaz de usuario, eligiendo y situando los elementos
con los que éste interactuará, y los componentes que utilizará la aplicación.
La idea es disponer de 9 botones en la App del móvil para el manejo del sistema. Las
teclas tendrán implicadas un comportamiento en la aplicación que enviará un dato
numérico para cada caso.
Selección del botón. Nombre asociado. Dato enviado al sistema de
control/función.
Tecla 1 Conectar Establecer conexión con el
HC-06
Tecla 2 Activar riego Enviará el dato
numérico: 1
Tecla 3 Desactivar riego Enviará el dato
numérico: 2
Tecla 4 Activar llenado depósito
agua
Enviará el dato
numérico: 3
Tecla 5 Desactivar llenado depósito
agua
Enviará el dato
numérico: 4
Tecla 6 Abrir puerta de acceso Enviará el dato
numérico: 5
Tecla 7 Cerrar puerta de acceso Enviará el dato
numérico: 6
Sistema de control automático en una explotación agrícola 50
Tecla 8 Encender luces de exterior Enviará el dato
numérico: 7
Tecla 9 Apagar luces de exterior Enviará el dato
numérico: 8
Tabla 9. Configuración del las teclas de la aplicación móvil
La colocación de los diferentes botones es sencilla. Desde la interfaz de la App
Inventor, seleccionamos el elemento “Button” y lo situamos en la posición que ocupará
en la pantalla de dicha App. Finalmente, la interfaz constará de nueve botones y sólo
hará falta programar cada tecla.
Figura 23. Diseño de la interfaz remota
Sistema de control automático en una explotación agrícola 51
3.6.1.2 App Inventor Blocks Editor
En el “Blocks Editor”, se definirá el comportamiento de los componentes de la
aplicación. Cada bloque utilizado, involucra un cierto código de programación,
facilitando y agilizando el proceso de creación de la App. En la interfaz, se distinguen
todos los tipos de bloques con su color característico.
3.6.1.3 Análisis del diseño de bloques
En la creación de la App, hay que tener en cuenta lo que ha de pasar antes y después de
sincronizarse con el dispositivo móvil, es decir, dos estados: antes de presionar el botón
conectar, y después. Para eso, se utilizarán las instrucciones
“BeforePicking/AfterPicking”.
Antes de establecer conexión con el sistema de control de la explotación agraria, la
aplicación debe de buscar todos los dispositivos dentro de su área.
Figura 24. Bloques de programación nº1
En la figura 24, el comando BeforePicking buscará todos los dispositivos y mostrará al
usuario todos los nombres asociados a estos.
Siguiente paso: cuando el usuario haya seleccionado el dispositivo, en nuestro caso el
HC-06, la instrucción AfterPicking ,figura 25, permite establecer el estado de la App
después de la selección del dispositivo.
Figura 25.Bloques de programación nº2
Configuración de los botones:
Para que el controlador del sistema de control active o desactive los diferentes relés
mediante el uso de la aplicación, hace falta que la App le envíe los diferentes datos: en
este caso números.
Asociaremos un número a cada botón que se ha creado en Designer de la siguiente
manera:
Sistema de control automático en una explotación agrícola 52
Figura 26. Bloques de programación nº3
En la figura 26, establecemos el valor que será enviado al HC-06 cuando el usuario
haga clic en “Button1”, en este caso se enviará el valor “1” para desactivar el relé nº1
que controla la entrada digital nº1 del variador de frecuencia del motor de riego.
Para las diferentes teclas de la aplicación se hará un duplicado del bloque cambiando el
botón asociado y el tipo de dato que será enviado, teniendo en cuenta la tabla de
asignaciones anterior.
Figura 27.Conjunto de los bloques de programación asociados a cada botón
3.6.1.4 Conclusiones App desarrollada
La aplicación desarrollada cumple todos los puntos establecidos por el diseño del
sistema, permitiendo la ejecución de todas las tareas de forma remota. La interfaz es
sencilla y directa con los botones justos para el control de la explotación agraria.
El tamaño de la aplicación móvil es de unos 3.7 MB.
Sistema de control automático en una explotación agrícola 53
3.6.2 Interfaz local de usuario
Los esquemas [7.7.1, 7.7.2, 7.7.3 y 7.7.4], muestran las alternativas que ofrece la
interfaz local de usuario. Se despliega cada pantalla de las opciones del modo de
operación del sistema de control automático y las flechas indican el sentido de
navegación en la interfaz hombre-máquina. Este sistema de interfaz permite la
navegación a través de los diferentes menús con el uso de tres teclas del teclado
matricial:
Tecla Función
*
Volver al menú principal.
0 Navegación entre los
diferentes menús.
# “Enter” Entrar en el menú
actual.
1,2,3,4,5,6,7,8,9 Configurar variables del
sistema, ej.: altura del
depósito.
Tabla 10. Función de las teclas, interfaz local
3.6.2.1 Menú principal
La pantalla “menú principal” es la primera que se muestra cuando se inicializa el
sistema. Se muestra en la pantalla LCD, en esta pantalla se visualizan diferentes
parámetros, como la temperatura, riego y la hora actual, además de visualizar las
acciones que se estén realizando.
3.6.2.2 Menú control riego
En el segundo menú (cuando se pulsa una vez la tecla “0”), el usuario puede presionar
los botones que se indican a continuación:
1) Activar la bomba.
2) Desactivar bomba.
3) Salir al menú principal.
Sistema de control automático en una explotación agrícola 54
Para la temporización del motor de riego, a igual que el motor del depósito de agua
tiene un menú dedicado exclusivamente a su temporización, (debido a que se ha
considerado un parámetro que constantemente puede variar), se simplifica y agiliza el
proceso de temporización.
3.6.2.3 Menú control depósito
En el segundo menú, (cuando se pulsa por segunda vez la tecla “0”), el usuario puede
presionar los botones que se indican a continuación:
1) Llenar depósito.
2) Desactivar llenado de depósito.
*) Salir al menú principal.
Para la temporización del motor del depósito, como en el caso del motor de riego, tienen
un menú dedicado exclusivamente a su temporización.
3.6.2.4 Menú temporizador bomba riego
En el tercer menú, (cuando se pulsa por tercera vez la tecla “0”), el usuario visualizará,
en el caso de que se haya temporizado el riego en la explotación, la hora de inicio y hora
final de la temporización. Pulsando la tecla #, el sistema pedirá los valores horarios
necesarios de inicio y final de la temporización para finalmente volver al menú
principal.
3.6.2.5 Menú temporizador bomba depósito
En el cuarto menú, (cuando se pulsa por cuarta vez la tecla “0”), el usuario visualizará,
en el caso que se haya temporizado el llenado del depósito, la hora de inicio y hora final
de la temporización. Pulsando la tecla #, el sistema pedirá los valores horarios
necesarios de inicio y final de la temporización para finalmente volver al menú
principal.
3.6.2.6 Menú Parámetros depósito
En el quinto menú, (cuando se pulsa por quinta vez la tecla “0”), la LCD visualizará el
nivel actual del depósito junto con el Enunciado “Parámetros del depósito”. Si se pulsa
#, el usuario podrá configurar el parámetro de la altura del depósito, mediante la
pulsación de la tecla “4”. Las medidas introducidas de altura son unidades de cm.
Sistema de control automático en una explotación agrícola 55
3.6.2.7 Menú Control iluminación
En el sexto menú, (cuando se pulsa por sexta vez la tecla “0”), el LCD muestra el
menú del control de iluminación. Si se pulsa #, el usuario tiene la posibilidad de
temporizar la activación/desactivación (tecla 3) o encender/apagar directamente la línea
de iluminación. (Tecla: 1 y 2 respectivamente).
1) Activar luces.
2) Desactivar luces.
3) Temporización luces.
*)Salir al menú principal.
3.6.2.8 Menú control puerta acceso
En el séptimo menú, (cuando se pulsa por séptima vez la tecla “0”), el LCD muestra el
menú de acceso. El usuario puede, si se pulsa #, abrir o cerrar la apertura de la puerta,
presionando los botones que se indican a continuación:
1) Abrir puerta.
2) Cerrar puerta.
*) Salir al menú principal.
3.7 Particularidades del sistema en parcela de estudio
Integrar el sistema de control en la parcela añade un grado de dificultad y requiere
superar distancias físicas. A continuación, se detallan las particularidades de la parcela
que afectan a cada componente y la solución adoptada.
3.7.1 Instalación del los sensores de movimiento en los puntos de luz
La longitud del lugar donde se pretende instalar el prototipo hasta los dos puntos de luz,
es de 20 y 25 metros respectivamente. Dicha longitud implica una caída de tensión.
Para este caso, el sensor de movimiento se alimenta a 5 V y tiene un consumo de 50µA.
En cualquier caso, la caída de tensión será mínima pero de igual manera se corroborará.
Sistema de control automático en una explotación agrícola 56
Longitud
(m)
Tensión
alimentación
Consumo de
corriente
Sección cable
(mm2)
Caída de
tensión (V)
Caída de
tensión (%)
20 5V 50*10-6 A 0.75 47*10-6 ≥ 0.1 %
25 5V 50*10-6ª 0.75 60*10-6 ≥ 0.1 %
Tabla 11. Caída de tensión sensor presencia, puntos de luz
Se utilizará un cable de sección 0.75mm2 para todos los pines de los dos sensores.
En el esquema [7.7.5] se muestra la posición y el alcance de detección de estos
dispositivos implantados en la parcela de de estudio.
3.7.2 Instalación del sensor de ultrasonidos
La longitud del lugar desde donde se pretende instalar el prototipo hasta la tapa del
depósito en el cual se debe de instalar el sensor, es de 32 metros. Dicha longitud implica
una caída de tensión. Para este caso, el sensor de movimiento se alimenta a 5 V y tiene
un consumo de 15 mA. En cualquier caso, la caída de tensión será mínima pero de igual
manera se revisará.
Longitud
(m)
Tensión
alimentación
Consumo de
corriente
(A)
Sección
cable
(mm2)
Caída de
tensión
(V)
Caída de
tensión (%)
55 5V 0.135 0.75 35*10-3 0.7 %
Tabla 12. Caída de tensión sensor ultrasonidos
Se utilizará un cable de sección 0.75mm2 para todos los pines del sensor.
3.7.3 Instalación del sensor detector de presencia en la puerta de acceso
La longitud desde donde se pretende instalar el prototipo hasta la puerta de acceso en el
cual se debe instalar el sensor, es de 55 metros. Dicha longitud implica una caída de
tensión. El sensor de movimiento se alimenta a 5 V y tiene un consumo de 15 mA. La
caída de tensión será mínima pero de igual manera se corroborará.
Sistema de control automático en una explotación agrícola 57
Longitud
(m)
Tensión de
alimentación
Consumo
de
corriente
(A)
Sección
cable
(mm2)
Caída de
tensión
(V)
Caída de
tensión
(%)
55 5V 0.15 0.75 40*10-3 0.8 %
Tabla 13. Caída de tensión sensor presencia,puerta acceso
Sistema de control automático en una explotación agrícola 58
4 PRESUPUESTO
En este apartado se presenta una estimación detallada de los costes de realización del
sistema de control implementado en este proyecto fin de grado.
Para el cálculo del presupuesto, se deben tener en cuenta los siguientes aspectos:
Los costes que se mostrarán estarán expresados en Euros.
Se tomarán dos decimales para las cantidades económicas, redondeando en el
caso de que sea necesario.
En el presente documento se especifican los costes asociados a la elaboración del
proyecto “sistema de control automático en una explotación agrícola”, así como los
costes relacionados con la implementación del prototipo. Los costes de los diferentes
elementos, se encuentran desglosados en diferentes grupos:
4.1 Material integrado en el prototipo
Componente Unidades Precio unitario
(€/u)+IVA
Total acumulado
Arduino Uno SMD 1 4.95 4.95
Detector
movimiento PIC
HC-SR501
3 1.35 4,05
Sensor Ultrasonidos
HC-SR04
1 1,00 1,00
Sensor temperatura
y humedad DHT 11
1 1.99 1.99
LCD I2C 1 2.50 2.50
Reloj RTC DS1302 1 1.20 1.20
Módulo Bluetooth
HC-06
1 3.90 3.90
Keypad
3x4
1 2.60 2.60
Interruptor final de
carrera
1 2,15 2,15
HUB USB 2.0 1 5.99 5.99
Conectores
alimentación e I2C
6 0.75 4.50
Caja de conexiones 1 3.75 3.75
Cable USB 2 2.00 4.00
Jumpers 94 0.13 7.00
Elementos de
fijación
componentes
electrónicos
16 0.05 0.80
Sistema de control automático en una explotación agrícola 59
Variador de
frecuencia
Micromaster
3 327,71€ 983.13
TOTAL 1033.51
Tabla 14. Presupuesto material integrado en el prototipo
4.2 Material auxiliar
Componentes Unidades Precio unitario
(€/u)+IVA
Total acumulado
(€)
Destornillador 2 2.50 5,00
Cableado utilizado
durante el desarrollo del
prototipo
12 0.20 2,40
Transformador USB 1 4.99 4.99
Alargador USB 1 6,00 6,00
Pinzas cocodrilo 8 0.30 2,40
Total 20,79
Tabla 15. Presupuesto material auxiliar
4.3 Mano de obra
Tabla 16. Presupuesto mano de obra
4.4 Presupuesto total
Coste asociado Precio(€)
Material integrado en el prototipo 1033,51
Material auxiliar 20,79
Mano de obra 18.000,00
Total proyecto 19.054,30
Tabla 17. Presupuesto total
5 CONCLUSIONES
El proyecto realizado en este documento llamado “sistema de control automático para
una explotación agrícola” consiste en el desarrollo de un prototipo que pueda realizar
las tareas más comunes, control de la iluminación, automatización del riego, del
Personal €/hora Horas utilizadas Total integrante €
Ingeniero eléctrico 60 300 18000,00
TOTAL 18000,00
Sistema de control automático en una explotación agrícola 60
suministro de agua o la apertura y cierre de la puerta de acceso, de manera programada
y que se puedan controlar tanto localmente como a distancia, desde un dispositivo
Android.
La estructura física del prototipo consta de una caja de derivación donde se integran la
gran mayoría de componentes. Esta estructura satisface la normativa
internacional CEI 60529 Degrees of Protection, dando una robustez al sistema y
proporcionando un aislamiento aceptable frente a los diferentes agentes externos.
Acoplado a la estructura, se encuentra el hardware del sistema que compone los
circuitos electrónicos diseñados para el funcionamiento del sistema automático. El
hardware está dividido en 4 módulos: Controlador, Sensores, Actuadores y
Comunicación Bluetooth.
El módulo del controlador consta de un microcontrolador Arduino UNO SMD, un
sistema de reloj de tiempo real RTC y una interfaz local de usuario formada por un
teclado matricial y una pantalla LCD. El controlador, está conectado a todos los demás
módulos. Los parámetros de configuración y programación ingresados por el usuario de
manera local, son procesados de manera que condiciona el funcionamiento del sistema a
gusto de éste y a las diferentes situaciones que puedan darse. El reloj de tiempo real
RTC actualiza constantemente la hora en su memoria RAM interna aunque el
subministro eléctrico se interrumpa, permitiendo la temporización de eventos.
El módulo de los sensores está formado por 3 sensores de presencia: dos para el control
de la iluminación y el último, para el cierre de la puerta de acceso con garantías de
seguridad. Un sensor de temperatura y humedad proporcionará en todo momento dichas
variables que son de gran interés en el sector agrícola, y por último, el sensor por
ultrasonidos que monitoriza el nivel de agua.
El módulo de actuadores está formado por ocho relés, de los cuales serán utilizados seis
de ellos. Éstos, con el cierre o apertura de sus contactos de potencia, gobiernan las
diferentes entradas digitales de los tres variadores de frecuencia, permitiendo el correcto
control de los motores asociados a cada variador.
El módulo de comunicación Bluettoth, permite establecer una comunicación remota con
el usuario, a través de la App diseñada y el dispositivo HC-06. Experimentalmente se ha
comprobado distancia de alcance máxima en la explotación agrícola, entre 20 y 25
metros si el usuario se encuentra en el interior de la vivienda y entre 40 y 50 metros
como máximo si el usuario se encuentra en el exterior, garantizando la comunicación
del dispositivo Android con el sistema de comunicación remota para el caso más
desfavorable, el control de la puerta de acceso.
5.1 Puntos a destacar
A continuación se detallan las características fundamentales del prototipo construido:
El prototipo realizado permite adaptarse a diferentes situaciones gracias a la
sencilla configuración que requiere.
Dispositivo modular, la sustitución de un elemento defectuoso por otro es
sencillo.
El coste de los diferentes componentes y la realización del prototipo están muy
por debajo del precio barajando en otras opciones como los PLC’s .
Ofrece una interfaz sencilla y directa, tanto la remota como la local.
Sistema de control automático en una explotación agrícola 61
Gracias a la utilización del microcontrolador Arduino y la flexibilidad que
ofrece, en el caso de querer ampliar el sistema de control, el microcontrolador
utilizado hace uso de todos sus puertos. Para disponer de más entradas y
salidas, sólo se ha de cambiar el microcontrolador, respetando los puertos ya
utilizados. Una de las mejores opciones, sería la integración del modelo
Arduino MEGA que cuenta con más de 54 puertos, y es capaz de controlar al
menos 5 tarjetas de ocho relés.
5.2 Puntos a mejorar
La robustez del prototipo.
Necesidad de garantizar la estanqueidad en todos los pequeños orificios
practicados en la caja de derivación.
Algunos sensores requieren un encapsulado adicional para su puesta en
marcha, como es el caso del sensor por ultrasonidos ya que se encuentra en un
ambiente húmedo.
El control o la activación automática de los puntos de luz no se hace por
separado debido a la limitación de puertos del modelo Arduino UNO SMD, se
podría solucionar utilizando el modelo Arduino Mega.
Sistema de control automático en una explotación agrícola 62
6 ANEXOS
6.1 Proceso configuración módulo Bluetooth
El siguiente código permite configurar el modulo Bluetooth HC-06 desde Arduino.
Se puede ajustar el nombre, la contraseña y los baudios a usar con el puerto serie.
La configuración Bluetooth se guarda en el módulo, así que no es necesario configurarlo
cada vez que se reinicie el sistema.
Es necesario abrir el monitor serie del IDE para la configuración del dispositivo.
Figura 28. Monitor serie del IDE
Sistema de control automático en una explotación agrícola 63
Figura 29.Conexión con Arduino para la puesta en marcha de la configuración del dispositivo
6.1.1 Código
#include <SoftwareSerial.h> // Incluimos la librería SoftwareSerial
SoftwareSerial BT(10,11); // Definimos los pines RX y TX del Arduino conectados al
Bluetooth .
void setup()
BT.begin(9600); // Inicializamos el puerto serie BT que hemos
creado.
Serial.begin(9600); // Inicializamos el puerto serie.
void loop()
if(BT.available()) // Si llega un dato por el puerto BT se envía
al monitor serial.
Serial.write(BT.read());
Sistema de control automático en una explotación agrícola 64
if(Serial.available()) // Si llega un dato por el monitor serial se
envía al puerto BT.
BT.write(Serial.read());
R
6.1.2 Test de comunicación
Para corroborar el perfecto funcionamiento del módulo HC-06 y el sistema de
comunicación AT, enviamos el comando “AT” y el sistema tiene que devolver “OK” ,
si no, se verificarán las conexiones con el microcontrolador y la alimentación.
Como era de esperar se superó la prueba.
Figura 30. Comprobación de comunicación
6.1.3 Configuración del nombre del dispositivo HC-06
Por defecto, el módulo Bluetooth se llama “HC-06”, para este proyecto el nombre que
se quiere mostrar es : Proyecto URV.
Comando AT enviado: AT+NAME< Proyecto URV >
Respuesta de confirmación esperada: OKsetname
Como era de esperar, la configuración fue exitosa.
Sistema de control automático en una explotación agrícola 65
Figura 31.Confirmación del nombre
6.1.4 Cambiar Código de Vinculación
Por defecto, viene con el código de vinculación “1234”, para cambiarlo y poner el
código requerido por el proyecto, hay que enviar el siguiente comando AT:
Comando AT enviado: AT+PIN<9025>
Respuesta de confirmación esperada: OKsetPIN
La configuración del pin fue adecuada.
Figura 32. Confirmación del código de vinculación
Sistema de control automático en una explotación agrícola 66
6.1.5 Configurar la velocidad de comunicación
La velocidad por defecto es de 9600 baudios, para cambiarlo, aunque en este proyecto
no es necesario ,se hace uso del siguiente comando AT.
Comando AT enviado: AT+BAUD4
Respuesta de confirmación esperada: OK<baudrate>
Cuando el número del final equivale a una velocidad, los valores pueden ser:
Numero Baudrate
1 1200
2 2400
3 4800
4 9600
5 19200
6 38400
7 57600
8 11520
Tabla 18. Velocidades de transmisión de datos
La configuración de la velocidad de comunicación fue correcta.
Figura 33.Confirmación de la velocidad
Sistema de control automático en una explotación agrícola 67
6.2 Configuración reloj RTC
Al configurar el dispositivo RTC, es necesario introducir la hora y fecha exactas, para la
correcta configuración del reloj. Hay que cargar un sketch en el microcontrolador con
el reloj debidamente conectado. Dentro del sketch, como se muestra, se define la hora y
fecha del momento en que se vaya a cargar toda esa información dentro del Arduino. Es
por eso que, la fecha del día que se configuró fue un Martes a las 14:42:59 con data
15/3/2017.
Figura 34.Conexión con Arduino para la puesta en marcha de la fecha y hora del dispositivo
6.2.1 Codigo de configuración
#include <DS1302.h> // Inicialización del modulo
DS1302 rtc(11,12,2); //Asignación de puertos
Time t; //Inicio de la variable que contiene la fecha y hora
void setup()
// Desproteger contra escritura
rtc.halt(false);
rtc.writeProtect(false);
Sistema de control automático en una explotación agrícola 68
rtc.setDOW(TUESDAY); // Configurar día de la semana: MARTES.
rtc.setTime(14,42,59); // Configurar hora en formato 24h con minutos y
segundos.
rtc.setDate(15,3,2017); // Configurar fecha en formato día/mes/año.
void loop()
Una vez subido el programa al microcontrolador, el reloj queda configurado y sigue la
hora en todo momento. No es necesario volver a configurarlo a no ser que se agote la
pila.
6.3 Código programación completo del sistema automático
A lo largo del siguiente subapartado se expondrá el código de programación y se
explicara detalladamente, en primer lugar se detallaran las librerías utilizadas para el
reconocimiento de alguno de los componentes integrados en el prototipo, en segundo
lugar se detallaran las variables del sistema y las constantes y finalmente el programa
principal.
6.3.1 Definición de variables y llamada de librerías
#include <DHT.h> // Librería del sensor dht11.
#include <Wire.h> //Librería Controlador Arduino.
#include <DS1302.h> //Libería reloj rtc.
#include <Keypad_I2C.h> //Librería teclado matricial por I2C.
#include <Keypad.h> //Librería teclado matricial.
#include <LiquidCrystal_I2C.h> // Librería pantalla LCD por protocolo
I2C.
//Declaración de variables y constantes del sistema agrupadas según la
función que desempeñan.
Sistema de control automático en una explotación agrícola 69
//Comunicación Bluetooth.
int estado=0; //Guarda el valor numérico actual enviado desde la App.
int estadoanterior =0; // Guarda el valor numérico anterior enviado
desde la App.
//Sensor presencia nº1.
int val=0; //Variable para la medición del sensor presencia.
boolean activado = false; //Booleano para detectar cuando se ha
detectado pico de presencia.
unsigned int presento1 = 0; //Marcador cuando detecta presencia nº1.
unsigned int presento2 = 0; //Marcador cuando detecta redisparo nº1.
unsigned long tiempo12 = 0; //Variables encargada del contaje del
tiempo.
unsigned long espera = 2000; //Tiempo a esperar o temporizar en
milisegundos.
unsigned long redisparo = 1000; // durante este tiempo comprueba si
hay nuevos disparos en el sensor PIR.
//Sensor presencia nº2.
int val2=0; //variable para la medición del sensor presencia.
boolean activado2 = false; //Variable detección presencia sensor nº2
unsigned long tiempo22 = 0; //Control del tiempo.
unsigned long espera2 = 2000; //Tiempo a esperar en milisegundos.
unsigned long redisparo2 = 1000; // Durante este tiempo si hay nuevos
disparos del PIR, reinicio la temporización.
//Sensor temperatura y humidad
#define DHTPIN 13 //Seleccionamos el pin en el que se conectará el
sensor.
#define DHTTYPE DHT11 //Variable para indicar el modelo de sensor.
DHT dht(DHTPIN, DHTTYPE); //Se inicia una variable que será usada por
Arduino para comunicarse con el sensor.
int h ; //variable que contendrá el valor de humidad.
int t1 ; //variable que contendrá el valor de temperatura.
Sistema de control automático en una explotación agrícola 70
//Reloj RTC.
DS1302 rtc(12,11,10); //Se inicia una variable que será usada por
Arduino para el correcto funcionamiento del reloj.
Time t; //Variable que contendrá la hora actual.
//Teclado I2C con integrado PCF8574.
const byte FILAS = 4; //Indicamos el número de filas del teclado.
const byte COLUMNAS = 4; //Indicamos el número de columnas del
teclado.
char teclas[FILAS][COLUMNAS] = //Indicamos como queremos que nos
devuelva el valor de la tecla pulsada en cada caso.
'1','2','3',
'4','5','6',
'7','8','9',
'*','0','#'
;
byte PinsFilas[FILAS] = 4,5,6,7; //Indicamos los pines de
configuración de filas y columnas.
byte PinsColumnas[COLUMNAS] = 2,1,0;
int i2caddress = 0x3F; //Indicamos la dirección I2C de nuestro
dispositivo.
Keypad_I2C kpd = Keypad_I2C( makeKeymap(teclas), PinsFilas,
PinsColumnas, FILAS, COLUMNAS, i2caddress ); //Configuración de los
parámetros del teclado.
//LCD_I2C
LiquidCrystal_I2C lcd(0x27,16,2); //Configuración de la dirección I2C
de la pantalla y dimensiones LCD.
//Definición Iconos característicos mostrados por LCD.
byte customChar[8] = //Icono LCD humidad.
B00100,
B00100,
Sistema de control automático en una explotación agrícola 71
B01110,
B01110,
B11111,
B11111,
B11111,
B01110
;
byte customChar1[8] = //Icono LCD temperatura.
B00100,
B01010,
B01010,
B01110,
B01110,
B11111,
B11111,
B01110
;
byte customChar2[8] = // Icono grados Celsius.
B11000,
B11000,
B00111,
B01000,
B01000,
B01000,
B01000,
B00111
;
//Variables para la navegación del menú.
int contador = 0 ; //Guarda el número de pulsaciones de la tecla “0”
para la transición a los diferentes menús.
Sistema de control automático en una explotación agrícola 72
bool submenu4 = false ; //Variable necesaria para entrar dentro del
menú nº4.
bool submenu3 = false ; //Variable necesaria para entrar dentro del
menú nº3.
bool submenu2 = false ; //Variable necesaria para entrar dentro del
menú nº2.
bool submenu1 = false ; //Variable necesaria para entrar dentro del
menú nº1.
bool submenu5 = false; //Variable necesaria para entrar dentro del
menú nº5.
bool submenu6 = false; //Variable necesaria para entrar dentro del
menú nº6.
long tiempo = millis() ; //Variable para definir el tiempo entre
transiciones.
//Temporización riego.
char minutos[10]; //Tabla donde se guardarán el valor de la hora de
inicio en minutos.
char horas[10]; //Tabla donde se guardarán el valor de la hora de
inicio.
char minutos1[10]; //Tabla donde se guardarán el valor de la hora
final en minutos.
char horas1[10]; //Tabla donde se guardarán el valor de la hora
final.
float hori = 0; //Valor numérico hora inicio.
float minu = 0; //Valor numérico minutos inicio.
float hori1 = 0; //Valor numérico hora final.
float minu1 = 0; //Valor numérico minutos final.
int horainicio = 0; //Valor numérico entero hora inicio.
int mininicio = 0; //Valor numérico entero minutos inicio.
int horaduracion = 0; ; //Valor numérico entero hora final.
int minduracion = 0; //Valor numérico entero minutos final.
//Temporización suministro agua depósito.
char minutos3[10]; //Tabla donde se guardarán el valor de la hora de
inicio en minutos.
Sistema de control automático en una explotación agrícola 73
char horas3[10]; //Tabla donde se guardarán el valor de la hora de
inicio.
char minutos4[10]; //Tabla donde se guardarán el valor de la hora
final en minutos.
char horas4[10]; //Tabla donde se guardarán el valor de la hora
final.
float hori3 = 0; //Valor numérico hora inicio.
float minu3 = 0; //Valor numérico minutos inicio.
float hori4 = 0; //Valor numérico hora final.
float minu4 = 0; //Valor numérico minutos final.
int horainicio2 = 0; //Valor numérico entero hora inicio.
int mininicio2 = 0; //Valor numérico entero minutos inicio.
int horaduracion2 = 0; ; //Valor numérico entero hora final.
int minduracion2 = 0; //Valor numérico entero minutos final.
//Temporización luces.
char minutos3iluminacion[10]; //Tabla donde se guardarán el valor de
la hora de inicio en minutos.
char horas3iluminacion[10]; //Tabla donde se guardarán el valor de la
hora de inicio.
char minutos4iluminacion[10]; //Tabla donde se guardarán el valor de
la hora final en minutos.
char horas4iluminacion[10]; //Tabla donde se guardarán el valor de
la hora final.
float hori3iluminacion = 0; //Valor numérico hora inicio.
float minu3iluminacion = 0; //Valor numérico minutos inicio.
float hori4iluminacion = 0; //Valor numérico hora final.
float minu4iluminacion = 0; //Valor numérico minutos final.
int horainicio2iluminacion = 0; //Valor numérico entero hora inicio.
int mininicio2iluminacion = 0; //Valor numérico entero minutos
inicio.
int horaduracion2iluminacion = 0; //Valor numérico entero hora final.
int minduracion2iluminacion = 0; //Valor numérico entero minutos
final.
Sistema de control automático en una explotación agrícola 74
bool luz1= false; //variable booleana del sistema de encendido de
luces por presencia nº1.
bool luz2= false; //variable booleana del sistema de encendido de
luces por presencia nº2.
//Sensor ultrasonidos depósito y mesura nivel de agua depósito.
long duration; //variable donde se almacena la señal ECHO del sensor.
long distanceCm; //variable donde se almacena la longitud
monitorizada.
long h_nivel //Variable nivel llenado depósito agua
long hmax_int //Variable distancia entre sensor y nivel del agua,
depósito.
const int TRIG_PIN = 7; //Asigna el pin 7 del microcontrolador al
TRIGGER.
const int ECHO_PIN = 8; //Asigna el pin 8 del microcontrolador al
ECHO.
//Cierre seguridad puerta.
bool Cierredepuerta = false; //Marca de inicio de cierre de la puerta
de acceso.
bool cirpuerta = false; //Marca para el cierre de la puerta de
acceso.
bool rearpuerta = false; //variable del sistema de detección de
presencia.
bool activado3 = false. //Marca para la detección de presencia en
acceso.
int val3 = 0; //Variable para la lectura del dato del sensor
presencia.
int tiempo123 //Variable conteo segundos.
int Finalcarrera = false; //Marca de cierre de la puerta de acceso.
6.3.2 Void setup
El void setup es la primera función en ejecutarse dentro de un programa en Arduino. Es,
básicamente, donde se “setean” las funciones que llevará a cabo el microcontrolador.
Aquí es donde establecemos algunos criterios que requieren una ejecución única.
Código:
Sistema de control automático en una explotación agrícola 75
Serial.begin(9600); //Iniciamos conexión serie.
dht.begin(); //Se inicia el sensor temp/humit.
kpd.begin(); //Iniciamos el teclado.
lcd.init(); //inicialización de la pantalla LCD.
lcd.backlight(); //Activación iluminación LCD
lcd.clear(); //Borra cualquier carácter mostrado en la LCD.
pinMode(A0,OUTPUT); //Asignamos el puerto analógico A0 como
salida(puerto de control relé nº5).
pinMode(A1,OUTPUT); //Asignamos el puerto analógico A1 como
salida(puerto de control relé nº6).
pinMode(A2,INPUT); //Asignamos el puerto analógico A2 como
entrada(datos presencia nº1).
pinMode(A3,INPUT); //Asignamos el puerto analógico A3 como
entrada(datos presencia nº2).
digitalWrite(A0, HIGH); //Salida A0 con valor lógico alto.
digitalWrite(A1, HIGH); //Salida A1 con valor lógico alto.
pinMode(2,OUTPUT); //Asignamos el Puerto digital nº2 como salida.
pinMode(3,OUTPUT); //Asignamos el Puerto digital nº3 como salida.
pinMode(4,OUTPUT); //Asignamos el Puerto digital nº4 como salida.
pinMode(5,OUTPUT); //Asignamos el Puerto digital nº5 como salida.
pinMode(6,INPUT); //Asignamos el Puerto digital nº6 como entrada.
pinMode(9,INPUT); //Asignamos el Puerto digital nº9 como entrada.
pinMode(TRIG_PIN,OUTPUT); //Asigna el pin digital nº7 del al TRIGGER.
pinMode(ECHO_PIN,INPUT); //Asigna el pin digital nº8 al puerto ECHO
del sensor por ultrasonidos.
digitalWrite(2,HIGH); //Salida dig. 2 con valor lógico alto.
digitalWrite(3,HIGH); //Salida dig. 3 con valor lógico alto.
digitalWrite(4,HIGH); //Salida dig. 4 con valor lógico alto.
digitalWrite(5,HIGH); //Salida dig. 5 con valor lógico alto.
digitalWrite(7,HIGH); //Salida dig. 6 con valor lógico alto.
digitalWrite(8,HIGH); //Salida dig. 7 con valor lógico alto.
Sistema de control automático en una explotación agrícola 76
lcd.createChar(0, customChar); //Creación icono humedad.
lcd.createChar(1, customChar1); // Creación icono temperatura.
lcd.createChar(2, customChar2); // Creación icono grados celsius.
inici();//Se hace llamada a función de inicialización de la LCD,
animación encendido.
lcd.clear(); //Se borra cualquier carácter en la LCD.
tiempo = millis(); //Asignamos a la variable “tiempo” el conteo en
milisegundos.
6.3.3 Void inicio
El sistema, cuando se enciende, muestra una animación de bienvenida. Exponiendo el
título de este proyecto.
Código:
void inici()
for (int i = 0; i<=17; i++) //Inicio bucle “subida”.
lcd.setCursor(i,0); //Sitúa el cursor en posición.
lcd.print("."); //Imprime punto.
lcd.setCursor(i,1); //Sitúa el cursor en posición.
lcd.print("."); //Imprime punto.
delay(75); //Esperamos 75 milisegundos.
for (int i = 16; i>=0; i--) //Inicio bucle “bajada”.
lcd.setCursor(i,0); //Sitúa el cursor en posición.
lcd.print(" "); //Imprime punto.
delay(75); //Espera 75 milisegundos.
lcd.setCursor(4,0); //Sitúa el cursor en posición.
lcd.print("SISTEMA DE"); //Imprime texto.
Sistema de control automático en una explotación agrícola 77
delay(300); //Espera 300 milisegundos.
lcd.setCursor(4,1); //Sitúa el cursor en posición.
lcd.print("CONTROL"); //Imprime texto.
delay(1500); //Espera 1,5 segundos.
lcd.clear(); //Se borra cualquier carácter en pantalla.
lcd.setCursor(2,0); //Sitúa el cursor en posición.
lcd.print("AUTOMATICO"); //Imprime texto.
delay(300); //Espera 300 milisegundos.
lcd.setCursor(5,1); //Sitúa el cursor en posición.
lcd.print("EXPLOTACIÓN");
lcd.clear(); //Se borra cualquier carácter en pantalla.
delay(1500); //Espera 1,5 segundos.
lcd.setCursor(3,0); //Sitúa el cursor en posición.
lcd.print("AGRÍCOLA"); //Imprime texto.
delay(1500); //Espera 1,5 segundos.
6.3.4 Vooid loop
La función loop en Arduino, es la que se ejecuta un número
infinito de veces. Al encenderse el Arduino se procesa el
código del setup y luego entra al loop, el cual se repite de
forma indefinida hasta que se apague o se reinicie el
microcontrolador.
Código:
void loop()
char tecla = kpd.getKey(); //Asignamos el valor devuelto por el
teclado a la variable tecla.
if(Serial.available()>0) // Si el puerto serie está habilitado.
Sistema de control automático en una explotación agrícola 78
estado = Serial.read(); // Lee los datos de recibidos el
puerto Serie(datos Bluetooth.
//Configuración teclas menú.
if (tecla=='*') //condición para salir al menú principal.
submenu1 = false ; //Salir del submenú nº1.
submenu2 = false ; //Salir del submenú nº2.
submenu3 = false ; //Salir del submenú nº3.
submenu4 = false ; //Salir del submenú nº4.
submenu5 = false ; //Salir del submenú nº5.
submenu6 = false ; //Salir del submenú nº6.
contador = 0 ; //variable para ir al menú principal.
lcd.clear(); //Se borra cualquier carácter en pantalla.
if (tecla=='#') //Condición para entrar en el submenú del menú
actual.
submenu1 = true ; //Entrar del submenú nº1 si se cumplen
otras condiciones.
submenu2 = true ; //Entrar del submenú nº2 si se cumplen
otras condiciones.
submenu3 = true ; //Entrar del submenú nº3 si se cumplen
otras condiciones.
submenu4 = true ; //Entrar del submenú nº4 si se cumplen
otras condiciones.
submenu5 = true ; //Entrar del submenú nº5 si se cumplen
otras condiciones.
submenu6 = true ; //Entrar del submenú nº6 si se cumplen
otras condiciones.
lcd.clear(); //Se borra cualquier carácter en pantalla.
if (tecla == '0') //Tecla Navegación a los diferentes menús.
submenu1 = false ; //Salir del submenú nº1.
submenu2 = false ; //Salir del submenú nº2.
submenu3 = false ; //Salir del submenú nº3.
Sistema de control automático en una explotación agrícola 79
submenu4 = false ; //Salir del submenú nº4.
submenu5 = false ; //Salir del submenú nº5.
submenu6 = false ; //Salir del submenú nº6.
contador++; //incrementamos el valor del contaje de
“contador”.
tiempo = millis(); //Asignación del valor millis() a la
variable tiempo.
lcd.clear(); //Se borra cualquier carácter en pantalla.
if (contador == 8) //Si llegamos al valor máximo del
contador.
contador = 0; //Reinicio del contaje (dirige al
usuario al menú principal).
//Menú principal.
if(contador==0) //Valor asignado para entrar en el menú
principal.
if (millis() - tiempo < 4000 ) //Primera transición del
menú principal.
t = rtc.getTime(); //Asociamos la variable “t” a la
fecha que proporciona el RTC.
lcd.setCursor(8,0 ); //Sitúa el cursor en posición.
lcd.print(t.hour,DEC); // Imprime en la LCD Hora en
formato 0-23.
lcd.print(":"); // Imprime carácter.
if (t.min < 10 ) //Si el número a imprimir es
menor a diez.
lcd.print("0"); //Imprime primero un cero.
lcd.print(t.min, DEC); // Imprime Minutos.
h = dht.readHumidity(); //lee el valor lógico del
puerto digital 13 y lo guarda en la variable “t”.
lcd.setCursor(0,1); //Sitúa el cursor en posición.
Sistema de control automático en una explotación agrícola 80
lcd.write(0); Imprime icono humedad.
lcd.print(h); // Imprime el valor de humidad en
pantalla.
lcd.print("%"); // Imprime carácter.
t1 = dht.readTemperature(); //Se lee valor lógico
del puerto digital 13 y lo guarda en “t1”.
lcd.setCursor(0,0); // Sitúa el cursor en posición.
lcd.write(1); //Imprime icono temperatura.
lcd.print(t1); //Imprime el valor de temperatura en
pantalla.
lcd.write(2); //Imprime icono grados Celsius.
if ((millis() - tiempo > 4010)&& (millis() - tiempo <
8000))
//Segunda transición del menú principal.
lcd.setCursor(5,0 ); // Sitúa el cursor en posición.
t = rtc.getTime(); //Asociamos la variable “t” a la
fecha que proporciona el RTC.
lcd.print(" "); // Imprime carácter vacio.
lcd.print(t.date, DEC); //Imprime carácter: Día del
mes.
lcd.print("/"); //Imprime carácter.
lcd.print(t.mon); //Imprime carácter: Mes actual.
lcd.print("/"); //Imprime carácter.
lcd.print(t.year, DEC); //Imprime carácter: Año
actual.
if ((millis() - tiempo > 8010)) //Tercera transición
del menú principal.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
tiempo = millis(); //Actualización valor de la
variable “tiempo”.
Sistema de control automático en una explotación agrícola 81
//Menú nº1 riego.
if (contador == 1) //Valor asignado para entrar en el menú
principal.
if(submenu1 == false) //Si no se ha pulsado la tecla “#”
para entrar en submenú.
lcd.setCursor(1,0); // Sitúa el cursor en posición.
lcd.print("Control bomba"); //Imprime texto.
lcd.setCursor(5,1); // Sitúa el cursor en posición.
lcd.print("riego"); //Imprime texto.
if(submenu1 == true) //Si se ha pulsado la tecla “#” para
entrar en submenú.
submenu1 = true ; //Se reafirma asignación.
if (millis() - tiempo < 4000 ) //Primera
transición del menú nº1.
lcd.setCursor(0,0); // Sitúa el cursor en
posición.
lcd.print("1-Activar "); //Imprime texto.
lcd.setCursor(0,1); //Sitúa el cursor en
posición.
lcd.print("2-Paro "); //Imprime texto.
if ((millis() - tiempo > 4010)&& (millis() - tiempo <
8000)) //Segunda transición del
menú nº1.
lcd.setCursor(0,0); //Sitúa el cursor en
posición.
lcd.print("*- Salir "); //Imprime texto.
lcd.setCursor(0,1); //Sitúa el cursor en
posición.
lcd.print(" "); //Imprime texto
vacio.
Sistema de control automático en una explotación agrícola 82
if ((millis() - tiempo > 8010)) //Tercera
transición del menú nº1.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
tiempo = millis(); //Actualización del valor de
la variable “tiempo”.
if (tecla == '1') //Acciones si se pulsa el botón
“1” dentro del menú nº1.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
lcd.setCursor(2,0); //Sitúa el cursor en
posición.
lcd.print("Motor riego"); //Imprime texto.
lcd.setCursor(3,1); //Sitúa el cursor en
posición.
lcd.print("Activado"); //Imprime texto.
digitalWrite(2,LOW); //Cierre del circuito de
potencia del relé nº1.
rele_1 = true; //Asigna valor conforme se ha
cerrado c.potencia relé nº1.
delay(700); //Espera 0,7 segundos.
if (tecla == '2') //Acciones si se pulsa el botón
“2” dentro del menú nº1.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
lcd.setCursor(2,0); //Sitúa el cursor en
posición.
lcd.print("Motor riego"); //Imprime texto.
lcd.setCursor(2,1); //Sitúa el cursor en
posición.
lcd.print("Desactivado"); //Imprime texto.
digitalWrite(2,HIGH); //Apertura del circuito
de potencia del relé nº1.
rele_1 = false; //Asigna valor conforme se ha
abierto el circuito de potencia del relé nº1.
Sistema de control automático en una explotación agrícola 83
delay(700); //Espera 0.7segundos.
//MENU Nº2 suministro agua vivienda.
if (contador == 2) //Valor asignado para entrar en el menú
nº2.
if(submenu2 == false) //Si no se ha pulsado la tecla “#”
para entrar en submenú.
lcd.setCursor(1,0); //Sitúa el cursor en posición.
lcd.print("Control deposito"); //Imprime texto.
lcd.setCursor(5,1); //Sitúa el cursor en posición.
lcd.print("agua"); //Imprime texto.
if(submenu2 == true) //Si se ha pulsado la tecla “#” para
entrar en submenú.
submenu2 = true ; //Se reafirma asignación.
if (millis() - tiempo < 4000 ) //Primera
transición del menú nº2.
lcd.setCursor(0,0); //Sitúa el cursor en
posición.
lcd.print("1- Bombear agua"); //Imprime texto.
lcd.setCursor(0,1); //Sitúa el cursor en
posición.
lcd.print("2- Paro bomba"); //Imprime texto.
if ((millis() - tiempo > 4010)&& (millis() - tiempo <
8000)) //Segunda transición del menú nº2.
lcd.setCursor(0,0); //Sitúa el cursor en
posición.
lcd.print("*- Salir "); //Imprime
texto.
lcd.setCursor(0,1); //Sitúa el cursor en
posición.
Sistema de control automático en una explotación agrícola 84
lcd.print(" "); //Imprime
texto.
if ((millis() - tiempo > 8010)) //Tercera
transición del menú nº2.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
tiempo = millis(); //Actualización del valor
de la variable “tiempo”.
if (tecla == '1') //Acciones si se pulsa el botón
“1” dentro del menú nº2.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
lcd.setCursor(2,0); //Sitúa el cursor en
posición.
lcd.print("Motor BOMBA"); //Imprime texto.
lcd.setCursor(3,1); //Sitúa el cursor en
posición.
lcd.print("Activado"); //Imprime texto.
digitalWrite(3,LOW); //Cierre del circuito de
potencia del relé nº2 (llenado a máximo
caudal).
rele_3 = true; //Asigna valor conforme se ha
cerrado c.potencia nº2.
delay(700); //Espera 0.7segundos.
if (tecla == '2') //Acciones si se pulsa el botón
“2” dentro del menú nº2.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
lcd.setCursor(2,0); //Sitúa el cursor en
posición.
lcd.print("Motor BOMBA"); //Imprime texto.
lcd.setCursor(2,1); //Sitúa el cursor en
posición.
lcd.print("Desactivado"); //Imprime texto.
Sistema de control automático en una explotación agrícola 85
digitalWrite(3,HIGH); //Apertura del circuito
de potencia del relé nº2 (llenado depósito a
alta velocidad).
digitalWrite(4,HIGH); //Apertura del circuito
de potencia del relé nº3 (llenado depósito a
baja velocidad).
rele_3 = false; //Asigna valor conforme se ha
abierto el circuito de potencia nº2 y nº3.
delay(700); //Espera 0.7segundos.
//MENÚ Nº3 temporización riego.
if (contador == 3) //Valor asignado para entrar en el menú
principal.
if(submenu2 == false) //Si no se ha pulsado la tecla “#”
para entrar en submenú.
lcd.setCursor(2,0); //Sitúa el cursor en posición.
lcd.print("Temp. Riego"); //Imprime texto.
if ((horainicio > 0 )||(horaduracion > 0) ||
(mininicio > 0) || (minduracion > 0)) //Si se
ha temporizado el riego.
lcd.setCursor(1,1); //Sitúa el cursor en
posición.
lcd.print(horainicio); //Imprime la hora de
inició que tendrá lugar el riego.
lcd.print(":"); //Imprime texto.
lcd.print(mininicio); //Imprime los minutos de
la hora de inició que tendrá lugar el riego.
lcd.print(" to "); //Imprime texto.
lcd.print(horaduracion); //Imprime la hora de
fin del riego.
lcd.print(":"); //Imprime texto.
lcd.print(minduracion); //Imprime los minutos
de fin del riego.
Sistema de control automático en una explotación agrícola 86
if ((horainicio == 0 )&&(horaduracion == 0)&&
(mininicio == 0)&&(minduracion == 0)) //Si no se ha
temporizado el riego.
lcd.setCursor(1,1); //Sitúa el cursor en
posición.
lcd.print("NO Temporizado"); //Imprime texto.
if(submenu2 == true) //Si se ha pulsado la tecla “#”
para entrar en submenú.
submenu2 = true; //Se reafirma la asignación.
int i=0,j=0,k=0,l=0; //Iniciamos variables
contaje de tablas.
lcd.setCursor(2,0); //Sitúa el cursor en
posición.
lcd.print("HORA INICIO"); //Imprime texto.
for(i=0;i<=1;i++) //El sistema ira pidiendo la
hora en formato 0-24h.
lcd.setCursor(6+i,1); //Sitúa el cursor
en posición del actual dígito a
introducir.
lcd.blink(); //Parpadeo de la posición
ocupada por el digito introducido por
pantalla.
tecla = kpd.waitForKey(); //El sistema
espera a recibir un valor por teclado via
I2C.
if ((tecla != '#') && (tecla != '*'))
//Si el usuario pulsa tecla valida.
horas[i]=tecla; //Asigna valor a la
posición acual de la tabla.
lcd.print(horas); //Imprime el
carácter pulsado.
lcd.clear(); //Se borra cualquier
carácter en pantalla.
Sistema de control automático en una explotación agrícola 87
lcd.setCursor(2,0); //Sitúa el
cursor en posición.
lcd.print("HORA INICIO");
//Imprime texto.
lcd.setCursor(6,1); //Sitúa el
cursor en posición.
lcd.print(horas); //Imprime la
hora de inicio introducida por el
usuario.
if ((tecla == '#') || (tecla ==
'*')) //Si el usuario por error
pulsa una tecla que no es un
número, el sistema lo tendrá en
cuenta y descartará el carácter.
i= i-1 ; //Retrocede posición
dentro del array.
delay(100); //Espera 0.1 segundos.
lcd.noBlink(); //Deja de parpadear la posición
actual del dígito.
delay(250); //Espera 0.25 segundos.
float hori = atoi(horas); // Conversión de
array a float.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
lcd.setCursor(2,0); //Sitúa el cursor en
posición.
lcd.print("MIN. INICIO"); //Imprime texto.
for(j=0;j<=1;j++) //El sistema pide los minutos
de inicio de la temporización dígito a dígito.
lcd.setCursor(6+j,1); //Sitúa el cursor
en posición del dígito a introducir.
lcd.blink(); //parpadea la posición del
dígito a introducir.
Sistema de control automático en una explotación agrícola 88
tecla = kpd.waitForKey(); //El sistema
espera la pulsación de un valor en el
teclado.
if (tecla != '#' && tecla != '*') //Si
la tecla introducida por el usuario es un
carácter numérico se asigna el valor de
la tecla a una posición del array.
minutos[j]=tecla; //Asignación del
valor del teclado al array.
lcd.print(minutos); //Muestra por
pantalla el valor de minutos de
inicio de la temporización.
lcd.clear(); //Se borra cualquier
carácter en pantalla.
lcd.setCursor(2,0); //Sitúa el
cursor en posición.
lcd.print("MIN. INICIO");
//Imprime texto.
lcd.setCursor(6,1); //Sitúa el
cursor en posición.
lcd.print(minutos); //Imprime el
valor de los minutos de inicio de
la temporización.
if ((tecla == '#') || (tecla == '*'))
//Si el usuario por error pulsa una tecla
que no es un número, el sistema lo tendrá
en cuenta y descartará el carácter.
j= j-1 ; //Retrocede posición del
array.
delay(100); //Espera 0.1segundos.
lcd.noBlink(); //Dejar de parpadear la posición
del dígito a introducir.
delay(250); //Espera 0.25 segundos.
float minu = atoi(minutos); // Conversión de
array a float .
Sistema de control automático en una explotación agrícola 89
lcd.clear(); //Se borra cualquier carácter en
pantalla.
lcd.setCursor(2,0); //Sitúa el cursor en
posición.
lcd.print("HORA FINAL"); //El sistema solicita
al usuario la introducción de la hora de fin de
la temporización.
lcd.setCursor(6,1); //Sitúa el cursor en
posición.
for(k=0;k<=1;k++) //El sistema pide la hora
de fin de la temporización.
lcd.setCursor(6+k,1); //Sitúa el cursor
en posición del dígito a introducir.
lcd.blink(); //parpadea la posición del
dígito a introducir.
tecla = kpd.waitForKey(); //El sistema
espera a recibir un valor por teclado vía
I2C.
if (tecla != '#' && tecla != '*') //Si
la tecla introducida por el usuario es un
carácter numérico se asigna el valor de
la tecla a una posición del array.
horas1[k]=tecla; //Asignación del
valor del teclado al array.
lcd.print(horas1); //Muestra por
pantalla el valor de minutos de
inicio de la temporización.
lcd.clear(); //Se borra cualquier
carácter en pantalla.
lcd.setCursor(2,0); //Sitúa el
cursor en posición.
lcd.print("HORA FINAL");
//Solicita al usuario la
introducción de la hora de fin de
la temporización.
lcd.setCursor(6,1); //Sitúa el
cursor en posición.
lcd.print(horas1); //Imprime el
valor de los minutos de inicio de
la temporización en la LCD.
Sistema de control automático en una explotación agrícola 90
if ((tecla == '#') || (tecla == '*'))
//Si el usuario por error pulsa una tecla
que no es un número, el sistema lo tendrá
en cuenta y descartará el carácter.
k= k-1 ; //Retrocede posición del
array.
delay(100); //Espera 0.1 segundos.
lcd.noBlink(); //Deja de parpadear la posición
asignada.
delay(500); //Espera 0.5 segundos.
float hori1 = atoi(horas1); // Conversión de
array a float .
lcd.clear(); //Se borra cualquier carácter en
pantalla.
lcd.setCursor(2,0); //Sitúa el cursor en
posición.
lcd.print("MINUTOS FINAL"); //Solicita al
usuario la introducción de los minutos de fin
de la temporización.
lcd.setCursor(6,1); //Sitúa el cursor en
posición.
for(l=0;l<=1;l++) //El sistema pide los
minutos de fin de la temporización.
lcd.setCursor(6+l,1); //Sitúa el cursor en
posición del dígito a introducir.
lcd.blink(); //parpadea la posición del dígito
a introducir.
tecla = kpd.waitForKey(); //El sistema espera
a recibir un valor por teclado vía I2C.
if (tecla != '#' && tecla != '*') //Si la
tecla introducida por el usuario es un carácter
numérico se asigna el valor de la tecla a una
posición del array.
minutos1[l]=tecla; //Asignación del
valor del teclado al array.
Sistema de control automático en una explotación agrícola 91
lcd.print(minutos1); //Imprime el
carácter pulsado.
lcd.clear(); //Se borra cualquier
carácter en pantalla.
lcd.setCursor(2,0); //Sitúa el cursor en
posición.
lcd.print("MINUTOS FINAL"); //Solicita al
usuario la introducción de los minutos de
fin de la temporización.
lcd.setCursor(6,1); //Sitúa el cursor en
posición.
lcd.print(minutos1); //Imprime el
carácter pulsado.
if ((tecla == '#') || (tecla == '*')) //Si
el usuario por error pulsa una tecla que no es
un número, el sistema lo tendrá en cuenta y
descartará el carácter.
l= l-1 ; //Retrocede posición del array.
delay(100); //Espera 0.1 segundos.
lcd.noBlink(); //Deja de parpadear la posición
asignada.
delay(500); //Espera 0.5 segundos.
float minu1 = atoi(minutos1); // Conversión de
array a float.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
horainicio =hori; //Conversión de float a int
de la hora de inicio de la temporización.
mininicio =minu; //Conversión de float a int
del valor de minutos inicio de la
temporización.
horaduracion =hori1; //Conversión de float a
int. de la hora final de la temporización.
minduracion =minu1; //Conversión de float a
int del valor de minutos final de la
temporización.
Sistema de control automático en una explotación agrícola 92
if (( horainicio> 23 )||( mininicio> 59 )||(
horaduracion> 23 )||( minduracion> 59 )) //Si
el usuario ha introducido un valor en la
configuración de la hora erróneo o fuera de
rango.
for(i=0;i<=1;i++) //borra los valores
de las tablas en cada una de las
posiciones.
horas[i]=0; //Reinicio valor por
defecto.
horas1[i]=0; //Reinicio valor por
defecto.
minutos[i]=0; //Reinicio valor por
defecto.
minutos1[j]=0; //Reinicio valor por
defecto.
lcd.setCursor(1,0); //Sitúa el cursor en
posición.
lcd.print("Hora no valida"); //Se avisa al
usuario de la introducción de un valor fuera de
rango.
delay(700); //Espera 0.7 segundos.
lcd.setCursor(1,0); //Sitúa el cursor en
posición.
lcd.print("Inserte de nuevo "); //Imprime
texto.
delay(700); //Espera 0.7 segundos.
lcd.setCursor(4,1); //Sitúa el cursor en
posición.
lcd.print("la hora "); //Imprime texto.
delay(700); //Espera 0.7 segundos.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
submenu2 == false; //Reinicio del proceso de
configuración del temporizado.
delay(50); //Espera 50 milisegundos.
submenu2 == true; //Reinicio del proceso de
configuración del temporizado.
Sistema de control automático en una explotación agrícola 93
if (( horainicio<= 23 )&&( mininicio<= 59 )&&(
horaduracion<= 23 )&&( minduracion<= 59 ))
//Si los valores de temporización están dentro
de los rangos.
hori =0; //Reinicio valor por defecto.
hori1=0; //Reinicio valor por defecto.
minu=0; //Reinicio valor por defecto.
minu1=0; //Reinicio valor por defecto.
lcd.clear(); //Se borra cualquier
carácter en pantalla.
lcd.setCursor(1,0); //Sitúa el cursor en
posición.
lcd.print("Temp. riego"); //Imprime
texto.
lcd.setCursor(1,1); //Sitúa el cursor en
posición.
lcd.print(horainicio); //Muestra el valor
de la hora de inicio de la temporización.
lcd.print(":"); //Imprime carácter.
lcd.print(mininicio); //Muestra el valor
del minuto de inicio de la temporización.
lcd.print(" to "); //Imprime texto.
lcd.print(horaduracion); //Muestra el
valor de la hora del fin de la
temporización.
lcd.print(":"); //Imprime carácter.
lcd.print(minduracion); //Muestra el
valor del minuto del fin de la
temporización.
delay(1500); //Espera 1,5 segundos.
submenu1 = false; //El usuario después
de temporizar, se le dirige al menú
principal.
submenu2 = false; //El usuario después
de temporizar, se le dirige al menú
principal.
Sistema de control automático en una explotación agrícola 94
contador = 0 ; //Se reinicia el valor
para mostrar el menú principal después de
la configuración de la temporización.
lcd.clear(); //Se borra cualquier
carácter en pantalla.
//Menú nº4, temporizador suministro agua en la vivienda.
if (contador == 4) //Valor asignado para entrar en el menú
nº4.
if(submenu3 == false) //Si no se ha pulsado la tecla “#”
para entrar en submenú.
lcd.setCursor(2,0); //Sitúa el cursor en posición.
lcd.print("Temp. Bomba"); //Imprime texto.
if ((horainicio2 > 0 )||(horaduracion2 > 0 )
||(minduracion2 > 0 ) || ((mininicio2 > 0)) //Si
se ha temporizado el suministro de agua.
lcd.setCursor(1,1); //Sitúa el cursor en
posición.
lcd.print(horainicio2); //Imprime la hora de
inicio de la temporización.
lcd.print(":"); //Imprime texto.
lcd.print(mininicio2); //Imprime los minutos de
la hora de inicio que tendrá lugar el riego.
lcd.print(" to "); //Imprime texto.
lcd.print(horaduracion2); //Imprime la hora de
fin de la temporización.
lcd.print(":"); //Imprime texto.
lcd.print(minduracion2); //Imprime los minutos
de fin de la temporización.
if ((horainicio2 == 0 ) && (horaduracion2 == 0 ) &&
(minduracion2 == 0 ) && (horainicio2 == 0 )) //Si
no se ha temporizado el suministro de agua.
Sistema de control automático en una explotación agrícola 95
lcd.setCursor(1,1); //Sitúa el cursor en
posición.
lcd.print("NO Temporizado"); //Imprime texto.
if(submenu3 == true) //Si se ha pulsado la tecla “#” para
entrar en submenú.
submenu3 = true; //Se reafirma la asignación.
int i=0,j=0,k=0,l=0; //Iniciamos variables contaje
de tablas.
lcd.setCursor(2,0); //Sitúa el cursor en posición.
lcd.print("HORA INICIO"); //Imprime texto.
lcd.setCursor(6,1); //Sitúa el cursor en posición.
for(i=0;i<=1;i++) //El sistema irá pidiendo la hora
en formato 0-24h.
lcd.setCursor(6+i,1); //Sitúa el cursor en
posición.
lcd.blink(); //Parpadeo de la posición ocupada
por el dígito introducido por pantalla.
tecla = kpd.waitForKey(); //El sistema espera
a recibir un valor por teclado vía I2C.
if (tecla != '#' && tecla != '*') //Si el
usuario aprieta tecla valida.
horas3[i]=tecla; //Actualizar posición dentro
de la tabla.
lcd.print(horas3); //Imprime el carácter
pulsado.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
lcd.setCursor(2,0); //Sitúa el cursor en
posición.
lcd.print("HORA INICIO"); //Imprime texto.
lcd.setCursor(6,1); //Sitúa el cursor en
posición.
Sistema de control automático en una explotación agrícola 96
lcd.print(horas3); //Imprime la hora de inicio
introducida por el usuario.
if ((tecla == '#') || (tecla == '*')) //Si
el usuario por error pulsa una tecla que no es
un número, el sistema lo tendrá en cuenta y
descartará el carácter.
i= i-1 ; //Retrocede posición dentro del
array.
delay(100); //Espera 0.1 segundos.
lcd.noBlink(); //Deja de parpadear la posición
actual del dígito.
delay(500); //Espera 0.5 segundos.
float hori3 = atoi(horas3); // Conversión de array a
float.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
lcd.setCursor(2,0); //Sitúa el cursor en posición.
lcd.print("MIN. INICIO"); //Imprime texto.
lcd.setCursor(6,1); //Sitúa el cursor en posición.
for(j=0;j<=1;j++) //El sistema pide los minutos de
inicio de la temporización dígito a dígito.
lcd.setCursor(6+j,1); //Sitúa el cursor en
posición del dígito a introducir.
lcd.blink(); //parpadea la posición del dígito
a introducir.
tecla = kpd.waitForKey(); //El sistema espera
la pulsación de un valor en el teclado.
if (tecla != '#' && tecla != '*') //Si la
tecla introducida por el usuario es un carácter
numérico se asigna el valor de la tecla a una
posición del array.
minutos3[j]=tecla; //Asignación del
valor del teclado al array.
Sistema de control automático en una explotación agrícola 97
lcd.print(minutos3); //Muestra por
pantalla el valor de minutos de inicio de
la temporización.
lcd.clear(); //Se borra cualquier
carácter en pantalla.
lcd.setCursor(2,0); //Sitúa el cursor en
posición.
lcd.print("MIN. INICIO"); //Imprime
texto.
lcd.setCursor(6,1); //Sitúa el cursor en
posición.
lcd.print(minutos3); //Imprime el valor
de los minutos de inicio de la
temporización.
if ((tecla == '#') || (tecla == '*')) //Si
el usuario por error pulsa una tecla que no es
un número, el sistema lo tendrá en cuenta y
descartará el carácter.
j= j-1 ; //Retrocede posición del array.
delay(100); //Espera 0.1segundos.
lcd.noBlink();//Deja de parpadear la posición actual
del dígito.
delay(250); //Espera 0.25 segundos.
float minu3 = atoi(minutos3); // Conversión de array
a float.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
lcd.setCursor(2,0); //Sitúa el cursor en posición.
lcd.print("HORA FINAL"); //El sistema solicita al
usuario la introducción de la hora de fin de la
temporización.
lcd.setCursor(6,1); Sitúa el cursor en posición.
for(k=0;k<=1;k++)//El sistema pide la hora de fin de
la temporización, dígito a dígito.
Sistema de control automático en una explotación agrícola 98
lcd.setCursor(6+k,1); //Sitúa el cursor en
posición del dígito a introducir.
lcd.blink(); //parpadea la posición del dígito
a introducir.
tecla = kpd.waitForKey(); //El sistema espera
a recibir un valor por teclado vía I2C.
if (tecla != '#' && tecla != '*') //Si la
tecla pulsada por el usuario es un carácter
numérico se asigna el valor de la tecla a una
posición del array.
horas4[k]=tecla; //Asignación del valor
del teclado al array.
lcd.print(horas4); //Muestra por
pantalla el valor de minutos de inicio de
la temporización.
lcd.clear(); //Se borra cualquier
carácter en pantalla.
lcd.setCursor(2,0); //Sitúa el cursor en
posición.
lcd.print("HORA FINAL"); //Solicita al
usuario la introducción de la hora de fin
de la temporización.
lcd.setCursor(6,1); //Sitúa el cursor en
posición.
lcd.print(horas4); //Imprime el valor de
los minutos de inicio de la temporización
en la LCD.
if ((tecla == '#') || (tecla == '*')) //Si
el usuario por error pulsa una tecla que no es
un número, el sistema lo tendrá en cuenta y
descartará el carácter.
k= k-1 ; //Retrocede posición del array.
delay(100); //Espera 0.1 segundos.
lcd.noBlink(); //Deja de parpadear la posición
asignada.
delay(500); //Espera 0.5 segundos.
Sistema de control automático en una explotación agrícola 99
float hori4 = atoi(horas4); // Conversión de array a
float .
lcd.clear(); //Se borra cualquier carácter en
pantalla.
lcd.setCursor(2,0); //Sitúa el cursor en posición.
lcd.print("MINUTOS FINAL"); //Solicita al usuario la
introducción de los minutos de fin de la
temporización.
lcd.setCursor(6,1); //Sitúa el cursor en posición del
dígito a introducir.
for(l=0;l<=1;l++) //El sistema pide los minutos de
fin de la temporización, dígito a dígito.
lcd.setCursor(6+l,1); //Sitúa el cursor en
posición del dígito a introducir.
lcd.blink(); //parpadea la posición del dígito
a introducir.
tecla = kpd.waitForKey(); //El sistema espera
a recibir un valor por teclado vía I2C.
if (tecla != '#' && tecla != '*') //Si la
tecla introducida por el usuario es un carácter
numérico se asigna el valor de la tecla a una
posición del array.
minutos4[l]=tecla; //Asignación del valor
del teclado a posición del array.
lcd.print(minutos4); //Imprime el
carácter pulsado.
lcd.clear(); //Se borra cualquier
carácter en pantalla.
lcd.setCursor(2,0); //Sitúa el cursor en
posición.
lcd.print("MINUTOS FINAL"); //Solicita
al usuario la introducción de los minutos
de fin de la temporización.
lcd.setCursor(6,1); //Sitúa el cursor en
posición.
lcd.print(minutos4); //Imprime el
carácter pulsado.
Sistema de control automático en una explotación agrícola 100
if ((tecla == '#') || (tecla == '*')) //Si
el usuario por error pulsa una tecla que no es
un número, el sistema lo tendrá en cuenta y
descartará el carácter.
l= l-1 ; //Retrocede posición del array.
delay(100); //Espera 0,1 segundos.
lcd.noBlink(); //Deja de parpadear la posición.
asignada
delay(100); //Espera 0,1 segundos.
float minu4 = atoi(minutos4); // Conversión de array
a float.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
horainicio2 =hori3; //Conversión de float a int de
la hora de inicio de la temp.
mininicio2 =minu3; //Conversión de float a int del
valor de minutos inicio de la temp.
horaduracion2 =hori4; //Conversión de float a int de
la hora final de la temp.
minduracion2 =minu4; //Conversión de float a int del
valor de minutos final de la temp.
if (( horainicio2> 23 )||( mininicio2> 59 )||(
horaduracion2> 23 )||( minduracion2> 59 ))
//Si el usuario ha introducido un valor en la
configuración de la hora erróneo o fuera de rango.
for(i=0;i<=1;i++) //borra los valores de las
tablas en cada una de las posiciones.
horas3[i]=0; //Reinicio valor por defecto.
horas4[i]=0; //Reinicio valor por defecto.
minutos3[i]=0; //Reinicio valor por defecto.
minutos4[j]=0; //Reinicio valor por defecto.
lcd.setCursor(1,0); //Sitúa el cursor en posición.
lcd.print("Hora no valida");
Sistema de control automático en una explotación agrícola 101
delay(700); //Espera 0,7 segundos.
lcd.setCursor(1,0); //Sitúa el cursor en posición.
lcd.print("Inserte de nuevo "); //Imprime texto.
delay(700); //Espera 0.7 segundos.
lcd.setCursor(4,1); //Sitúa el cursor en posición.
lcd.print("la hora "); //Imprime texto.
delay(700); //Espera 0.7 segundos.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
submenu3 == false; //Reinicio del proceso de
configuración del temporizado.
delay(50); //Espera 50 milisegundos.
submenu3 == true; //Reinicio del proceso de
configuración del temporizado.
if (( horainicio2<= 23 )&&( mininicio2<= 59 )&&(
horaduracion2<= 23 )&&( minduracion2<= 59 )) //Si
los valores de temporización están dentro de los
rangos.
hori =0; //Reinicio valor por defecto.
hori1=0; //Reinicio valor por defecto.
minu=0; //Reinicio valor por defecto.
minu1=0; //Reinicio valor por defecto.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
lcd.setCursor(1,0); //Sitúa el cursor en
posición.
lcd.print("Temp. riego");
lcd.setCursor(1,1); //Sitúa el cursor en
posición.
lcd.print(horainicio2); //Muestra el valor de
la hora de inicio.
lcd.print(":"); //Imprime carácter.
lcd.print(mininicio2); //Muestra el valor del
minuto de inicio.
Sistema de control automático en una explotación agrícola 102
lcd.print(" to "); //Imprime texto.
lcd.print(horaduracion2); //Muestra el valor de
la hora del fin de la temporización.
lcd.print(":"); //Imprime carácter.
lcd.print(minduracion2); //Muestra el valor de
la hora del fin de la temporización.
delay(1500); //Espera 1.5segundos.
submenu3 = false ; //El usuario después de
temporizar, es expulsado del menú de
temporización.
contador = 0 ; //Se reinicia el valor para
mostrar el menú principal después de la
configuración de la temporización.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
//MENU 5, configuración del depósito.
if (contador == 5) //Valor asignado para entrar en el menú nº4.
if(submenu4 == false) //Si no se ha pulsado la tecla “#” para
entrar en submenú.
lcd.setCursor(3,0); //Sitúa el cursor en posición.
lcd.print("Parametros"); //Imprime texto.
lcd.setCursor(0,1); //Sitúa el cursor en posición.
lcd.print("Deposito"); //Imprime texto.
lcd.setCursor(9,1); //Sitúa el cursor en posición.
if(submenu4 == true) //Si se ha pulsado la tecla “#” para
entrar en submenú.
submenu4 = true; //Se reafirma la asignación.
if (millis() - tiempo < 4000 ) //Primer enunciado del
menú nº5.
lcd.setCursor(0,0); //Sitúa el cursor en posición.
Sistema de control automático en una explotación agrícola 103
lcd.print("1-Configurar altura depósito");
lcd.setCursor(5,1); //Sitúa el cursor en posición.
h_nivel = h_max_int – distanceCm ; //Cálculo del
nivel del depósito.
lcd.print(h_nivel); //Muestra por pantalla el valor
de la altura del depósito configurada por el usuario.
lcd.print(" cm"); //Imprime texto.
if ((millis() - tiempo > 4010)&& (millis() - tiempo <
4100)) //Transición intermedia del menú nº5.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
if ((millis() - tiempo > 4100)&& (millis() - tiempo <
8000)) //Segundo enunciado del menú nº5.
lcd.setCursor(0,0); //Sitúa el cursor en posición.
lcd.print("*-Salir ."); //Imprime texto.
lcd.setCursor(5,1); //Sitúa el cursor en posición.
h_nivel = h_max_int – distanceCm ; //Cálculo del
nivel del depósito.
lcd.print(h_nivel); //Muestra por pantalla el valor
de la altura del depósito configurada por el usuario.
lcd.print(" cm"); //Imprime texto.
if ((millis() - tiempo > 8010)) //Segunda transición
intermedia del menú nº5.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
tiempo = millis(); //Asignamos a la variable
“tiempo” el conteo en milisegundos, reiniciamos
cuenta.
if (tecla == '1') //Acciones si se pulsa el botón “1”
dentro del menú nº5.
Sistema de control automático en una explotación agrícola 104
int i=0; //Inicialización de la variable para el
recuento del array.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
for(i=0;i<=2;i++) //El sistema ira pidiendo dígito
a dígito la altura del depósito.
lcd.setCursor(1,0); //Sitúa el cursor en posición.
lcd.print("Altura depósito"); //Imprime texto.
for(i=0;i<=2;i++) //El sistema irá pidiendo la
altura en Cm, dígito a dígito.
lcd.setCursor(6+i,1); //Sitúa el cursor en la
posición actual del dígito a introducir.
lcd.blink(); //Parpadeo de la posición ocupada
por el dígito a introducir por pantalla.
tecla = kpd.waitForKey(); //El sistema espera
a recibir un valor por teclado vía I2C.
if (tecla != '#' && tecla != '*')
//Si el usuario pulsa tecla válida.
h_max[i]=tecla; //Asigna valor a la
posición actual de la tabla.
lcd.print(h_max); //Imprime el carácter
pulsado.
lcd.clear(); //Se borra cualquier
carácter en pantalla.
lcd.setCursor(2,0); //Sitúa el cursor en
posición.
lcd.print("Altura depósito "); //Imprime
texto.
lcd.setCursor(6,1); //Sitúa el cursor en
posición.
lcd.print(h_max); //Imprime el carácter
pulsado.
if ((tecla == '#') || (tecla == '*')) //Si el
usuario por error pulsa una tecla que no es un
nùmero, el sistema lo tendrá en cuenta y descartará
el carácter.
Sistema de control automático en una explotación agrícola 105
i= i-1; //Retrocede posición dentro del array.
delay(100); //Espera 0.1 segundos.
lcd.noBlink(); //Deja de parpadear la posición actual del
dígito.
delay(500) ; //Espera 0.5 segundos.
float h_max_sup = atoi(h_max); // Conversión de array a
float.
lcd.clear(); //Se borra cualquier carácter en pantalla.
lcd.noBlink(); //Deja de parpadear la posición actual del
dígito.
delay(500); //Espera 0.1 segundos.
lcd.clear(); //Se borra cualquier carácter en pantalla.
//Menú nº6 Control de luces.
if (contador == 6) //Valor asignado para entrar en el menú nº4.
if(submenu5 == false) //Si no se ha pulsado la tecla “#” para
entrar en submenú.
lcd.setCursor(4,0); //Sitúa el cursor en posición.
lcd.print("Control"); //Imprime texto.
lcd.setCursor(2,1); //Sitúa el cursor en posición.
lcd.print("iluminación"); //Imprime texto.
if(submenu5 == true) //Si se ha pulsado la tecla “#” para
entrar en submenú.
submenu5 = true ; //Se reafirma la asignación.
if (millis() - tiempo < 2000 ) //Primer enunciado del
menú nº6.
lcd.setCursor(0,0); //Sitúa el cursor en posición.
Sistema de control automático en una explotación agrícola 106
lcd.print("1- ON luz "); //Imprime texto.
lcd.setCursor(0,1); //Sitúa el cursor en posición.
lcd.print("2- OFF luz" ); //Imprime texto.
delay(700); //Espera 0.7 segundos.
if ((millis() - tiempo > 2010)&& (millis() - tiempo <
4010)) //Segundo enunciado del menú nº6.
lcd.setCursor(0,0); //Sitúa el cursor en posición.
lcd.print("3- Temporizar encendido ");
lcd.setCursor(0,1); //Sitúa el cursor en posición.
lcd.print("*- Salir "); //Imprime texto.
if ((millis() - tiempo > 2010)&& (millis() - tiempo <
4000)) //tercer enunciado del menú nº6
lcd.setCursor(0,0); //Sitúa el cursor en posición.
lcd.print(" Temp. Luz " ); //Imprime
texto.
lcd.setCursor(0,1); //Sitúa el cursor en posición.
lcd.print(" "); //Imprime carácter vacío.
lcd.print(horainicio2iluminacion); //Muestra el valor
de la hora de inicio de la temporización.
lcd.print(":");//Imprime carácter.
lcd.print(mininicio2iluminacion); //Muestra el valor
del minuto de inicio de la temporización.
lcd.print(" to ") //Imprime texto;
lcd.print(horaduracion2iluminacion); //Muestra el
valor de la hora del fin de la temporización.
lcd.print(":"); //Imprime carácter.
lcd.print(minduracion2iluminacion); //Muestra el
valor del minuto del fin de la temporización.
lcd.print(" "); //Imprime texto.
if ((millis() - tiempo > 4050)) //transición del menú
nº6.
Sistema de control automático en una explotación agrícola 107
lcd.clear(); //Se borra cualquier carácter en
pantalla.
tiempo = millis();//Actualización del valor de la
variable, para empezar de nuevo, en la primera
transición del menú nº6.
if (tecla == '1') //Acciones si se pulsa el botón “1”
dentro del menú nº6.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
lcd.setCursor(4,0); //Sitúa el cursor en posición.
lcd.print("Luz "); //Imprime texto.
lcd.setCursor(3,1); //Sitúa el cursor en posición.
lcd.print("Activado"); //Imprime texto.
digitalWrite(A1, LOW); //Cierre del circuito de
potencia del relé nº6.
delay(700); //Espera 0.7segundos.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
luz1=true; //Asigna valor conforme se ha cerrado
circuito de potencia nº6.
if (tecla == '2') //Acciones si se pulsa el botón “2”
dentro del menú nº6.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
lcd.setCursor(4,0); //Sitúa el cursor en posición.
lcd.print("Luz 2"); //Imprime texto.
lcd.setCursor(2,1); //Sitúa el cursor en posición.
lcd.print("Activado"); //Imprime texto.
digitalWrite(A1, HIGH); //Apertura del circuito de
potencia del relé nº6.
delay(700); //Espera 0.7 segundos.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
Sistema de control automático en una explotación agrícola 108
luz1=false; //Asigna valor conforme se ha abierto el
circuito de potencia nº6.
if (tecla == '3') //Acciones si se pulsa el botón “3”
dentro del menú nº6.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
int i=0,j=0,k=0,l=0; //Iniciamos variables recuento
de tablas.
lcd.setCursor(2,0); //Sitúa el cursor en posición.
lcd.print("HORA INICIO"); //Imprime texto.
lcd.setCursor(6,1); //Sitúa el cursor en posición.
for(i=0;i<=1;i++) //El sistema irá pidiendo la hora,
en formato 0-24h.
lcd.setCursor(6+i,1); //Sitúa el cursor en
posición del actual dígito a introducir.
lcd.blink(); //Parpadeo de la posición ocupada
por el dígito introducido por pantalla.
tecla = kpd.waitForKey(); //El sistema espera
a recibir un valor por teclado vía I2C.
if (tecla != '#' && tecla != '*') //Si el
usuario pulsa tecla valida.
horas3iluminacion[i]=tecla; //Asigna valor a
la posición actual de la tabla.
lcd.print(horas3iluminacion); //Imprime el
carácter numérico pulsado.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
lcd.setCursor(2,0); //Sitúa el cursor en
posición.
lcd.print("HORA INICIO"); //Imprime texto.
lcd.setCursor(6,1); //Sitúa el cursor en
posición.
lcd.print(horas3iluminacion); //Imprime la
hora de inicio introducida por el usuario.
Sistema de control automático en una explotación agrícola 109
if ((tecla == '#') || (tecla == '*')) //Si
el usuario por error pulsa una tecla que no es
un número, el sistema lo tendrá en cuenta y
descartará el carácter.
i= i-1 ; //Retrocede posición dentro del
array.
delay(100); //Espera 0.1 segundos.
lcd.noBlink(); //Deja de parpadear la posición
actual del dígito.
delay(500); //Espera 0.5 segundos.
float hori3iluminacion = atoi(horas3iluminacion); //
Conversión de array a float.
lcd.clear(); /Se borra cualquier carácter en
pantalla.
lcd.setCursor(2,0); //Sitúa el cursor en posición.
lcd.print("MIN. INICIO"); //Imprime texto.
lcd.setCursor(6,1); //Sitúa el cursor en posición.
for(j=0;j<=1;j++) //El sistema pide los minutos de
inicio de la temporización dígito a dígito.
lcd.setCursor(6+j,1); //Sitúa el cursor en
posición.
lcd.blink(); //parpadea la posición del dígito
a introducir.
tecla = kpd.waitForKey(); //El sistema espera
la pulsación de un valor en el teclado.
if (tecla != '#' && tecla != '*') //Si la
tecla introducida por el usuario es un carácter
numérico se asigna el valor de la tecla a una
posición del array.
minutos3iluminacion[j]=tecla;
//Asignación del valor del teclado al
array.
lcd.print(minutos3iluminacion);
//Muestra por pantalla el valor de
minutos de inicio de la temporización.
Sistema de control automático en una explotación agrícola 110
lcd.clear(); //Se borra cualquier
carácter en pantalla.
lcd.setCursor(2,0); //Sitúa el cursor en
posición.
lcd.print("MIN. INICIO"); //Imprime
texto.
lcd.setCursor(6,1); //Sitúa el cursor en
posición.
lcd.print(minutos3iluminacion);
//Imprime el valor de los minutos de
inicio de la temporización.
if ((tecla == '#') || (tecla == '*')) //Si
el usuario por error pulsa una tecla que no es
un número, el sistema lo tendrá en cuenta y
descartará el carácter.
j= j-1 ; //Retrocede posición del array.
delay(100); //Espera 0.1 segundos.
lcd.noBlink(); //Dejar de parpadea la posición del
dígito a introducir.
delay(500); //Espera 0.5 segundos.
float minu3iluminacion = atoi(minutos3iluminacion);
// Conversión de array a float .
lcd.clear(); //Se borra cualquier carácter en
pantalla.
lcd.setCursor(2,0); //Sitúa el cursor en posición.
lcd.print("HORA FINAL"); //El sistema solicita al
usuario la introducción de la hora de fin de la
temporización.
lcd.setCursor(6,1); //Sitúa el cursor en posición.
for(k=0;k<=1;k++) //El sistema pide la hora de fin
de la temporización.
lcd.setCursor(6+k,1); //Sitúa el cursor en
posición del digito a introducir.
Sistema de control automático en una explotación agrícola 111
lcd.blink(); //parpadea la posición del digito
a introducir.
tecla = kpd.waitForKey(); //El sistema espera
a recibir un valor por teclado vía I2C.
if (tecla != '#' && tecla != '*') //Si la
tecla introducida por el usuario es un carácter
numérico se asigna el valor de la tecla a una
posición del array.
horas4iluminacion[k]=tecla; //Asignación
del valor del teclado al array.
lcd.print(horas4iluminacion); //Muestra
por pantalla el valor de la hora de
inicio de la temporización.
lcd.clear(); //Se borra cualquier
carácter en pantalla.
lcd.setCursor(2,0); //Sitúa el cursor
en posición.
lcd.print("HORA FINAL"); //Solicita al
usuario la introducción de la hora de fin
de la temporización.
lcd.setCursor(6,1); //Sitúa el cursor en
posición.
lcd.print(horas4iluminacion); //Imprime
el valor de los minutos de inicio de la
temporización en la LCD.
if ((tecla == '#') || (tecla == '*')) //Si
el usuario por error pulsa una tecla que no es
un número, el sistema lo tendrá en cuenta y
descartará el carácter.
k= k-1 ; //Retrocede posición del array.
delay(100); //Espera 0.1 segundos.
lcd.noBlink(); Deja de parpadear la posición
asignada del dígito introducido.
delay(500); //Espera 0.5 segundos.
float hori4iluminacion = atoi(horas4iluminacion); //
Conversión de array a float.
Sistema de control automático en una explotación agrícola 112
lcd.clear();//Se borra cualquier carácter en
pantalla.
lcd.setCursor(2,0); //Sitúa el cursor en posición.
lcd.print("MINUTOS FINAL"); //Imprime texto.
lcd.setCursor(6,1); //Sitúa el cursor en posición.
for(l=0;l<=1;l++)//El sistema pide los minutos de fin
de la temporización.
lcd.setCursor(6+l,1); //Sitúa el cursor en la
posición del dígito a introducir.
lcd.blink(); //parpadea la posición del dígito
a introducir.
tecla = kpd.waitForKey(); //El sistema espera
a recibir un valor por teclado vía I2C.
if (tecla != '#' && tecla != '*') //Si la
tecla introducida por el usuario es un carácter
numérico se asigna el valor de la tecla a una
posición del array.
minutos4iluminacion[l]=tecla;
//Asignación del valor del teclado al
array.
lcd.print(minutos4iluminacion);
//Imprime el carácter pulsado.
lcd.clear(); //Se borra cualquier
carácter en pantalla.
lcd.setCursor(2,0); //Sitúa el cursor en
posición.
lcd.print("MINUTOS FINAL"); //Imprime
texto.
lcd.setCursor(6,1); //Sitúa el cursor en
posición.
lcd.print(minutos4iluminacion);
//Imprime el carácter pulsado.
if ((tecla == '#') || (tecla == '*')) //Si
el usuario por error pulsa una tecla que no es
un número, el sistema lo tendrá en cuenta y
descartará el carácter.
l= l-1 ; //Retrocede posición del array.
Sistema de control automático en una explotación agrícola 113
delay(100); //Espera 0.1 segundos.
lcd.noBlink(); //Deja de parpadear la posición
asignada.
delay(500); //Espera 0.5 segundos.
float minu4iluminacion = atoi(minutos4iluminacion);
lcd.clear(); //Se borra cualquier carácter en
pantalla.
horainicio2iluminacion=hori3iluminacion;
//Conversión de float a int de la hora de inicio de
la temporización.
mininicio2iluminacion=minu3iluminacion; //Conversión
de float a int del valor de minutos inicio de la
temporización.
horaduracion2iluminacion=hori4iluminacion;
//Conversión de float a int de la hora final de la
temporización.
minduracion2iluminacion=minu4iluminacion;
//Conversión de float a int del valor de minutos
final de la temporización.
if (( horainicio2> 23 )||( mininicio2> 59 )||(
horaduracion2> 23 )||( minduracion2> 59 ))
//Si el usuario ha introducido un valor en la
configuración de la hora erróneo o fuera de rango.
for(i=0;i<=1;i++) //borra los valores de las
tablas en cada una de las posiciones.
horas3iluminacion[i]=0; //Reinicio valor
por defecto.
horas4iluminacion[i]=0; //Reinicio valor
por defecto.
minutos3iluminacion[i]=0; //Reinicio
valor por defecto.
minutos4iluminacion[j]=0; //Reinicio
valor por defecto.
lcd.setCursor(1,0); //Sitúa el cursor en
posición.
Sistema de control automático en una explotación agrícola 114
lcd.print("Hora no valida"); //Imprime texto.
delay(700); //Espera 0.7 segundos.
lcd.setCursor(1,0); //Sitúa el cursor en
posición.
lcd.print("Inserte de nuevo "); //Imprime
texto.
delay(700); //Espera 0.7 segundos.
lcd.setCursor(4,1); //Sitúa el cursor en
posición.
lcd.print("la hora "); //Imprime texto.
delay(700); //Espera 0.7 segundos.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
submenu5 == false; //Reinicio del proceso de
configuración del temporizado.
delay(50); //Espera 50 microsegundos.
submenu5 == true; //Reinicio del proceso de
configuración del temporizado.
if (( horainicio2iluminacion<= 23 )&&(
mininicio2iluminacion<= 59 )&&(
horaduracion2iluminacion<= 23 )&&(
minduracion2iluminacion<= 59 ))
//Si los valores de temporización están dentro de
los rangos.
hori3iluminacion =0; //Reinicio valor por
defecto.
hori4iluminacion=0; //Reinicio valor por
defecto.
minu3iluminacion=0; //Reinicio valor por
defecto.
minu4iluminacion=0; //Reinicio valor por
defecto.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
lcd.setCursor(1,0); //Sitúa el cursor en
posición.
Sistema de control automático en una explotación agrícola 115
lcd.print("Temp. luz ext."); //Imprime texto.
lcd.setCursor(1,1); //Sitúa el cursor en
posición.
lcd.print(horainicio2iluminacion); //Muestra
el valor de la hora de inicio.
lcd.print(":"); //Imprime carácter.
lcd.print(mininicio2iluminacion); //Muestra el
valor del minuto de inicio.
lcd.print(" to "); //Imprime texto.
lcd.print(horaduracion2iluminacion); //Muestra
el valor de la hora del fin de la
temporización.
lcd.print(":"); //Imprime carácter.
lcd.print(minduracion2iluminacion); //Muestra
el valor del minuto del fin de la
temporización.
delay(1500); //Espera 1.5 segundos.
submenu1 = false ; //El usuario después de
temporizar, se le dirige al menú principal.
submenu2 = false ; //El usuario después de
temporizar, se le dirige al menú principal.
submenu3 = false ; //El usuario después de
temporizar, se le dirige al menú principal.
contador = 0 ; //Se reinicia el valor para
mostrar el menú principal después de la
configuración de la temporización.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
//Menú nº7, control de la puerta de acceso.
if (contador == 7) Valor asignado para entrar en el menú nº7.
Sistema de control automático en una explotación agrícola 116
if(submenu6 == false) //Si no se ha pulsado la tecla “#” para
entrar en submenú
lcd.setCursor(1,0); //Sitúa el cursor en posición.
lcd.print("Control Puerta"); //Imprime texto.
lcd.setCursor(0,1); //Sitúa el cursor en posición.
lcd.print(" "); //Imprime texto vacio.
if(submenu6 == true) //Si se ha pulsado la tecla “#” para
entrar en submenú.
submenu6 = true; //Se reafirma la asignación.
if (millis() - tiempo < 4000 ) //Primer enunciado del
menú nº7.
lcd.setCursor(0,0); //Sitúa el cursor en posición.
lcd.print("1-Abrir puerta "); //Imprime texto.
lcd.setCursor(0,1); //Sitúa el cursor en posición.
lcd.print("2-Cerrar puerta "); //Imprime texto.
if ((millis() - tiempo > 4010)&& (millis() - tiempo <
8000)) //Segundo enunciado del menú nº7.
lcd.setCursor(0,0); //Sitúa el cursor en posición.
lcd.print("*- Salir "); //Imprime texto.
lcd.setCursor(0,1); //Sitúa el cursor en posición.
lcd.print(" "); //Imprime texto.
if ((millis() - tiempo > 8010)) //transición a primer
enunciado, del menú nº7.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
tiempo = millis(); // Actualización del valor de la
variable, para empezar de nuevo, en la primera
transición del menú nº6.
if (tecla == '1') //Acciones si se pulsa el botón “1”
dentro del menú nº7.
Sistema de control automático en una explotación agrícola 117
lcd.clear(); //Se borra cualquier carácter en
pantalla.
lcd.setCursor(2,0); //Sitúa el cursor en posición.
lcd.print("Abriendo puerta"); //Imprime texto.
lcd.setCursor(3,1); //Sitúa el cursor en posición.
lcd.print(" "); //Imprime texto vacío.
digitalWrite(5,LOW); //Cierre del circuito de
potencia del relé nº4.
delay(5000); //Espera 5 segundos.
if (tecla == '2')
lcd.clear(); //Se borra cualquier carácter en
pantalla.
lcd.setCursor(2,0); //Sitúa el cursor en posición.
lcd.print("Cerando puerta"); //Imprime texto.
lcd.setCursor(2,1); //Sitúa el cursor en posición.
lcd.print(" "); //Imprime texto vacío.
digitalWrite(5,HIGH); //Apertura del circuito de
potencia del relé nº4.
delay (700); //Espera 0.7 segundos.
analogWrite(A0,0); //Cierre del circuito de potencia
del relé nº6.
cirpuerta = true; //Activación de la marca del
cerrado de la puerta de acceso.
delay(700); //Espera 0.7 segundos.
//Mesura y control del llenado del depósito.
digitalWrite(TRIG_PIN, LOW); //Desactivación del Trigeer.
delayMicroseconds(2); //Espera 2 microsegundos.
digitalWrite(TRIG_PIN, HIGH); //Activación del Trigeer.
Sistema de control automático en una explotación agrícola 118
delayMicroseconds(10); //Espera 10 microsegundos.
digitalWrite(TRIG_PIN, LOW); //Desactivación del Trigger.
duration = pulseIn(ECHO_PIN,HIGH); // Conversión del tiempo
transcurrido desde el envío de la señal del Trigger, hasta la
captación.
distanceCm = duration / 29.1 / 2 ; // Conversión del tiempo a cm.
//Control de la temporización del riego.
if((t.hour == horainicio )&&(t.min == mininicio )) //Si es la hora
de inicio programado para el riego.
digitalWrite(2,LOW); //Cierre del circuito de potencia del relé
nº1.
else if((t.hour == horaduracion )&&(t.min == minduracion )) //Si
es la hora del fin de la temporización del riego.
digitalWrite(2,HIGH); //Apertura del circuito de potencia del
relé nº1.
//Control de la temporización del riego y cierre de la bomba del
suministro de agua a la vivienda.
if((t.hour == horainicio2 )&&(t.min == mininicio2 )&&(diposit_ple ==
false )) //Si es la hora de inicio programado.
digitalWrite(3,LOW); //Cierre del circuito de potencia del relé
nº2 (caudal máximo de agua).
else if ((t.hour == horaduracion )&&(t.min == minduracion ))
digitalWrite(3,HIGH); //Apertura del circuito de potencia del
relé nº2 (caudal máximo de agua).
digitalWrite(4,HIGH); //Apertura del circuito de potencia del relé nº2
( ½ del caudal máximo de agua).
if ( distanceCm <= 30) //Si la distancia entre el nivel de agua i el
sensor por ultrasonidos es inferior a 30 cm se desactiva la bomba.
digitalWrite(3,HIGH); //Apertura del circuito de potencia del
relé nº2 (caudal máximo de agua).
digitalWrite(4,HIGH); //Apertura del circuito de potencia del
relé nº2 ( ½ del caudal máximo de agua).
Sistema de control automático en una explotación agrícola 119
medio = false ; //Asignación de la variable booleana para cuando
el depósito se encuentra lleno de agua.
diposit_ple = true ; //Asignación de la variable booleana para
cuando el depósito se encuentre lleno de agua.
if (contador == 0) //Si el depósito está lleno y el usuario
está visualizando la interface del menú principal.
lcd.setCursor(6,1); //Sitúa el cursor en posición.
lcd.print("Dep. lleno"); //Indica al usuario el estado del
depósito.
else //Si el depósito no está lleno.
lcd.setCursor(6,1); //Sitúa el cursor en posición.
lcd.print(" "); //Imprime texto vacío.
if ( distanceCm <= 50) //Si la distancia entre el nivel de agua y el
sensor por ultrasonidos es inferior a 50 cm se procederá a reducir
el caudal.
medio = true ; //Asignación del estado del depósito para
reducir el caudal de agua.
if ( medio == true) //Si se ha activado la marca se procede al
cambio de caudal del llenado del depósito.
digitalWrite(3,low); //cierre del circuito de potencia del
relé nº2 (puesta en marcha de la bomba).
delay (400) //Espera 0,4 segundos.
digitalWrite(4,LOW); //Cierre del circuito de potencia del relé
nº3 (½ del caudal máximo de agua, reduce frecuencia alimentación
motor a la mitad).
//Control de la temporización de la iluminación.
if((t.hour == horainicio2iluminacion )&&(t.min ==
mininicio2iluminacion )) //Si es la hora del encendido de las luces
programado.
digitalWrite(A1, LOW); //Cierre del circuito de potencia del
relé nº6.
Sistema de control automático en una explotación agrícola 120
else if ((t.hour == horaduracion2iluminacion )&&(t.min ==
minduracion2iluminacion )) //Si es la hora del apagado de las luces
programado.
digitalWrite(A1, HIGH); //Apertura del circuito de potencia del
relé nº6.
//Control cierre de la puerta de acceso.
val3 = digitalRead(9); //Leemos el valor analógico que nos devuelve
el sensor presencia nº3.
if (cirpuerta == true) //Si se está cerrando la puerta.
if (val3 == HIGH) //si detecta presencia en la puerta
de acceso.
Activado3 = true; //Asignamos marca de presencia en la
puerta.
tiempo123 = millis(); //Reiniciamos recuento de segundos
para dar tiempo a evacuar la zona de acceso.
Rearpuerta = false ; //Asignamos marca de presencia en la
puerta para que ésta no sigua cerrándose.
if (activado3) //Si se ha detectado presencia.
if ((val3 == HIGH) && ( millis() - tiempo123 < redisparo))
//Si dentro del intervalo de tiempo de espera, el sistema
vuelve a detectar presencia.
tiempo123 = millis();//reiniciamos el recuento,
actualización de la variable del tiempo.
if (millis() - tiempo123 < 5000) Si no han pasado más de
cinco segundos.
analogWrite(A0, 255); //Apertura del circuito de potencia
del relé nº5.
else
Rearpuerta = true ; //Marca para el final de conteo fin de
presencia.
if (Rearpuerta == true) //Si durante el intervalo de tiempo no
se ha detectado ninguna presencia.
Sistema de control automático en una explotación agrícola 121
analogWrite(A0, 0); //Cierre del circuito de potencia del
relé nº5.
Finalcarrera = digitalRead(6); //lectura digital de pin.
if (Finalcarrera == HIGH) //Si la puerta ha terminado de
cerrarse.
analogWrite(A0, 255); //Apertura del circuito de potencia
del relé nº5.
Rearpuerta = false ; //Asignamos marca del rearme de la
puerta.
cierrepuerta = false ; //Asignamos marca del fin del cierre
de la puerta de acceso.
//Control de presencia puntos de luz.
val = analogRead(A3); //Leemos el valor analógico que nos devuelve el
sensor presencia nº1.
if (luz1 == false) //Si el usuario no ha activado las luces.
if (val > 100) //si detecta presencia en sensor nº1.
activado = true; //Asignamos marca de detección de
presencia.
tiempo12 = millis();//Reiniciamos conteo de la
duración de la apertura de las luces.
if (activado) //Si se ha detectado presencia.
if ((val > 125) && ( millis() - tiempo12 < redisparo))
//Si detecta presencia durante el recuento.
tiempo12 = millis();//reinicio de la variable del
tiempo.
if (millis() - tiempo12 < espera) //Mientras no termine
el recuento del tiempo transcurrido.
digitalWrite(A1, LOW); //Cierre del circuito de
potencia del relé nº6 (activación de los puntos de
luz).
Sistema de control automático en una explotación agrícola 122
else
digitalWrite(A1,HIGH); //Si ha pasado el recuento
del tiempo transcurrido.
activado = false; //Asignación de valor de fin de
presencia.
val2 = analogRead(A2); //Leemos el valor analógico que nos devuelve
el sensor presencia nº2.
if (luz2 == false) //Si el usuario no ha activado las luces.
if (val2 > 125) //si detecta presencia en sensor nº1.
activado2 = true; //Asignamos marca de detección de
presencia.
tiempo22 = millis(); //reinicio de la variable del tiempo.
if (activado2) //Si se ha detectado presencia.
if ((val2 > 125) && ( millis() - tiempo22 < redisparo2))
//Si detecta presencia durante el conteo de tiempo.
tiempo22 = millis();//reinicio de la variable del
tiempo transcurrido.
if (millis() - tiempo22 < espera2) //Mientras no termine
el recuento del tiempo transcurrido.
digitalWrite(A0,LOW); //Cierre del circuito de
potencia del relé nº6 (activación de los puntos de
luz).
else
digitalWrite(A0,HIGH); //Si ha pasado el conteo del
tiempo transcurrido.
activado2 = false; //Asignación de valor de fin de
presencia.
Sistema de control automático en una explotación agrícola 123
//Control de acciones recibidas por el módulo Bluetooth HC-06.
if((estado== '0')&&(estadoanterior != estado)) //Si el
usuario ha pulsado la tecla asociada al número “0”,y el número
es diferente al enviado con anterioridad.
digitalWrite(2,LOW); //Cierre del circuito de potencia del
relé nº1 (activación de la bomba de riego).
estadoanterior = estado ; //Actualización de estado.
lcd.clear(); //Se borra cualquier carácter en pantalla.
lcd.setCursor(4,0); //Sitúa el cursor en posición.
lcd.print("Riego"); //Imprime texto.
delay(300); //Espera 0.3 segundos.
lcd.setCursor(2,1); //Sitúa el cursor en posición.
lcd.print("Activado"); //Imprime texto.
delay(1000); //Espera 1 segundo.
lcd.clear(); //Se borra cualquier carácter en pantalla.
if((estado== '1')&&(estadoanterior != estado)) //Si el usuario
ha pulsado la tecla asociada al número “1”,y el número es
diferente al enviado con anterioridad.
digitalWrite(2,HIGH); //Apertura del circuito de potencia
del relé nº1 (desactivación de la bomba de riego).
estadoanterior = estado ; //Actualización de estado.
lcd.clear(); //Se borra cualquier carácter en pantalla.
lcd.setCursor(4,0); //Sitúa el cursor en posición.
lcd.print("Riego"); //Imprime texto.
delay(300); //Espera 0.3 segundos.
lcd.setCursor(2,1); //Sitúa el cursor en posición.
lcd.print("Desactivado"); //Imprime texto.
delay(1000); //Espera 1 segundo.
lcd.clear(); //Se borra cualquier carácter en pantalla.
Sistema de control automático en una explotación agrícola 124
if((estado== '2')&&(estadoanterior != estado)) //Si el
usuario ha pulsado la tecla asociada al número “2”,y el número
es diferente al enviado con anterioridad.
if (( 30 < distanceCm)&&(estadoanterior != estado)) //Si
el depósito no está lleno.
digitalWrite(3,LOW); //Cierre del circuito de
potencia del relé nº2 (activación de la bomba de
suministro de agua en la vivienda).
estadoanterior = estado ; //Actualización de estado.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
lcd.setCursor(1,0); //Sitúa el cursor en posición.
lcd.print("Llenando dep."); //Imprime texto.
delay(300); //Espera 0.3 segundos.
lcd.setCursor(3,1); //Sitúa el cursor en posición.
lcd.print("Activado"); //Imprime texto.
delay(700); //Espera 0.7 segundos.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
else if (estadoanterior != estado) //Si el anterior
dato obtenido por el HC-06 es diferentes al actual.
lcd.clear(); Se borra cualquier carácter en
pantalla.
lcd.setCursor(1,0); //Sitúa el cursor en posición.
lcd.print("Deposito lleno"); //Imprime texto.
estadoanterior = estado ; //Actualización del valor
del estado.
delay(700); //Espera 0.7 segundos.
lcd.clear(); //Se borra cualquier carácter en
pantalla.
if((estado== '3')&&(estadoanterior != estado)) //Si el
usuario ha pulsado la tecla asociada al número “3”,y el número
es diferente al enviado con anterioridad.
Sistema de control automático en una explotación agrícola 125
digitalWrite(3,HIGH); //Apertura del circuito de potencia
del relé nº2 (activación de la bomba de suministro de agua
en la vivienda).
digitalWrite(4,HIGH); //Cierre del circuito de potencia
del relé nº3 (activación de la bomba de suministro de agua
en la vivienda).
lcd.clear(); //Se borra cualquier carácter en pantalla.
lcd.setCursor(1,0); //Sitúa el cursor en posición.
lcd.print("Llenando dep."); //Imprime texto.
delay(300); //Espera 0.3 segundos.
lcd.setCursor(2,1); //Sitúa el cursor en posición.
lcd.print("Desactivado"); //Imprime texto.
delay(1000); //Espera 1 segundo.
lcd.clear(); //Se borra cualquier carácter en pantalla.
estadoanterior = estado ; //Actualización del valor del
estado.
if((estado== '4')&&(estadoanterior != estado)) //Si el
usuario ha pulsado la tecla asociada al número “4”,y el número
es diferente al enviado con anterioridad.
digitalWrite(5,HIGH); //Apertura del circuito de potencia
del relé nº4 (apertura de la puerta de acceso).
estadoanterior = estado; //Actualización del valor del
estado.
lcd.clear(); //Se borra cualquier carácter en pantalla.
lcd.setCursor(0,0); //Sitúa el cursor en posición.
lcd.print("Abriendo puerta"); //Imprime texto.
delay(1000); //Espera 1 segundo.
lcd.clear(); //Se borra cualquier carácter en pantalla.
if((estado== '6')&&(estadoanterior != estado)) //Si el
usuario ha pulsado la tecla asociada al número “5”,y el número
es diferente al enviado con anterioridad.
digitalWrite(4,HIGH); //Cierre del circuito de potencia
del relé nº4 (apertura de la puerta de acceso).
delay(400); //Espera 0,4 segundos.
Sistema de control automático en una explotación agrícola 126
digitalWrite(5,LOW); //Apertura del circuito de potencia
del relé nº5 (cierre de la puerta de acceso).
estadoanterior = estado ; //Actualización del valor del
estado.
lcd.clear(); //Se borra cualquier carácter en pantalla.
lcd.setCursor(0,0); //Sitúa el cursor en posición.
lcd.print("Cerrando puerta"); //Imprime texto.
cierrepuerta = true; //Asignación del procedimiento de
cierre de la puerta de acceso.
delay(1000); //Espera 1 segundo.
lcd.clear(); //Se borra cualquier carácter en pantalla.
if((estado== '5')&&(estadoanterior != estado)) //Si el
usuario ha pulsado la tecla asociada al número “6”,y el número
es diferente al enviado con anterioridad.
luz1 = true; //Asignación de la marca para la invalidación
de los sensores de presencia.
luz2 = true; //Asignación de la marca para la invalidación
de los sensores de presencia.
digitalWrite(A1, LOW); //Cierre del circuito de potencia
del relé nº6 (Encendido de las luces).
estadoanterior = estado ; //Actualización del valor del
estado.
lcd.clear(); //Se borra cualquier carácter en pantalla.
lcd.setCursor(0,0); //Sitúa el cursor en posición.
lcd.print("Abriendo focos"); //Imprime texto.
delay(1000); //Espera 1 segundo.
lcd.clear(); //Se borra cualquier carácter en pantalla.
if((estado== '7')&&(estadoanterior != estado)) //Si el
usuario ha pulsado la tecla asociada al número “7”,y el número
es diferente al enviado con anterioridad.
luz1 = false; //Asignación de la marca para la validación
de los sensores de presencia.
luz2 = false ; //Asignación de la marca para la validación
de los sensores de presencia.
Sistema de control automático en una explotación agrícola 127
digitalWrite(A1,HIGH); //Apertura del circuito de potencia
del relé nº6 (Apagado de las luces).
estadoanterior = estado; //Actualización del valor del
estado.
lcd.clear(); //Se borra cualquier carácter en pantalla.
lcd.setCursor(0,0); //Sitúa el cursor en posición.
lcd.print("Cerrando focos"); //Imprime texto.
delay(1000); //Espera 1 segundo.
lcd.clear();//Se borra cualquier carácter en pantalla.
delay (25); //Espera 25 microsegundos segundo para volver a
ejecutar el void loop.
//Fin void loop.
Sistema de control automático en una explotación agrícola 128
7 ESQUEMAS
UNIVERSIDAD ROVIRA I VIRGILI
HUERTO
ZONA ACCESO
ZONA EXPLOTACIÓN
AGRÍCOLA
1:100
Pozo
Depósito agua
Vivienda
Construcciones varias
136
83
84
84
Puerta acceso.
Cuadro eléctrico
Nº1
Francesc Miralles Benet
Trabajo fin de grado
Sistema de control automático en una explotación agrícola.
7.1.1 Registro catastro finca
Nº2
UNIVERSIDAD ROVIRA I VIRGILI
1:100
Pozo
Deposito agua
Vivienda
Construcciones varias
136
83
84
84
7.1.2.1 Sistema de riego en
la explotación agrícola
Canalización riego
Canalización riego
Puerta acceso
Cuadro eléctrico
M
Alim. motor
3 X 2.5 mm2
Francesc Miralles Benet
Trabajo fin de grado
Sistema de control automático en una explotación agrícola.
Nº3
UNIVERSIDAD ROVIRA I VIRGILI
1:25
Pozo
Deposito agua
Vivienda
Construcciones varias
7.1.2.2 Sistema llenado
Canalización
M
Alim. motor
3 X 2.5 mm2
M
Motor suministro agua
vivienda
Cuadro eléctrico
depósito
Francesc Miralles Benet
Trabajo fin de grado
Sistema de control automático en una explotación agrícola.
Nº4
UNIVERSIDAD ROVIRA I VIRGILI
1:25
Pozo
Deposito agua
Vivienda
Construcciones varias
7.1.2.3 Instalaciones
M
Motor suministro agua
vivienda
Cuadro eléctrico
Punto de luz y zona
detección sensor PIR
Zona detección sensor
PIR puerta acceso.
alumbrado exterior
Francesc Miralles Benet
Trabajo fin de grado
Sistema de control automático en una explotación agrícola.
LCD + I2C
I2C MODULO
PIC HC-SR501
RTC DS 1302
HC-06
HC-SR04
DHT11
4
1 2 3
56
7 89
* 0 #
KEYPAD
Nº5
UNIVERSIDAD ROVIRA I VIRGILI
GN
D
IN
1
IN
2
IN
3
IN
4
IN
5
IN
6
IN
7
IN
8
VC
C
K1K2K3K4K5K6K7K8
A5
A4
A3
A2
A1
A0
VIN
GND
GND
5V
3.3V
RES
5V
PO
WE
R
0-RX
1-TX
2
3'
4
5'
6'
7
8
9'
10'
11'
12
13
GND
AREF
SDA
SCL
AN
AL
OG
IN
DIG
IT
AL
P
MW
(`)
DAT
CLK
GND
VCC
RST
4
1 2 3
56
78
9
* 0 #
RT
X
TX
D
GN
D
VC
C
GND
IN1
VCC
GN
D
Trig
Ec
ho
VC
C
OU
T
GN
D
IN
1
VC
C
GN
D
IN
1
VC
C
Sensores distribuidos en la explotación
Parte frontal del encapsulado
Entradas líneas de variadores
Salidas líneasde variadores
Entrada líneade luz 220 V 50H
z
Salidas líneade luz 220 V 50Hz
Alimentación HUB USB 2.0 X3 500mA /5V HUB USB 2.0 x3
Alimentación Connectores
Alimentación Arduino
GN
D
IN
1
VC
C
COM
NO
COM
NO
Interruptor
final de carrera
Trabajo fin de grado
Sistema de control automático en una explotación agrícola. Francesc Miralles Benet
7.2.1 Esquema
encapsulado nº1
Nº6
UNIVERSIDAD ROVIRA I VIRGILI
Trabajo fin de grado
Sistema de control automático en una explotación agrícola. Francesc Miralles Benet
7.2.2 Esquema
encapsulado nº2
CONECTOR
A5
A4
A3
A2
A1
A0
VIN
GND
GND
5V
3.3V
RES
5V
PO
WE
R
0-RX
1-TX
2
3'
4
5'
6'
7
8
9'
10'
11'
12
13
GND
AREF
SDA
SCL
GN
D
IN
1
VC
C
GN
D
IN
1
VC
C
GND
IN1
VCC
GN
D
Trig
Ec
ho
VC
C
RT
X
TX
D
GN
D
VC
C
DAT
CLK
GND
VCC
GN
D
IN
1
IN
2
IN
3
IN
4
IN
5
IN
6
IN
7
IN
8
VC
C
K1
K2
K3
K4
4
1 2 3
56
78
9
* 0 #
IN
1
IN
2
IN
3
IN
4
IN
5
IN
6
IN
7
GN
D
VC
C
SD
A
SC
L
IN 10
IN 9
IN 8
IN 7
IN 6
IN 5
IN 4
IN 3
IN 2
IN 1
IN 16
IN 15
IN 14
IN 13
IN 12
IN 11
AN
AL
OG
IN
DIG
IT
AL
P
MW
(`)
RST
OU
T
K5
K1K2K3K4K5K6K7K8
LCD + I2C
I2C MODULO
PIC HC-SR501
RTC DS 1302
HC-06
HC-SR04
DHT11
4
1 2 3
56
7 89
* 0 #
KEYPAD
7.3 Esquema distribución
Nº7
UNIVERSIDAD ROVIRA I VIRGILI
GN
D
VC
C
SD
A
SC
L
GN
D
IN
1
VC
C
K6
COM
NO
Interruptor final de
carrera
Trabajo fin de grado
Sistema de control automático en una explotación agrícola.
Francesc Miralles Benet
pines de Arduino para los
controladores
GND
IN1
VCC
GND
IN1
VCC
GN
D
IN
1
IN
2
IN
3
IN
4
IN
5
IN
6
IN
7
IN
8
VC
C
4
12
3
56
78
9
*0
#
IN 1
IN 2
IN 3
IN 4
IN 5
IN 6
IN 7
GND
VCC
SDA
SCL
IN
10
IN
9
IN
8
IN
7
IN
6
IN
5
IN
4
IN
3
IN
2
IN
1
IN
16
IN
15
IN
14
IN
13
IN
12
IN
11
+15 Vdc
K1K2K3K4K5K6K7K8
LCD + I2C
I2C MODULO
PIC HC-SR501
RTC DS 1302
HC-06
HC-SR04
DHT11
4
1 2 3
56
7 89
* 0 #
KEYPAD
Nº8
UNIVERSIDAD ROVIRA I VIRGILI
GND
VCC
SDA
SCL
SDA SCL +5V GND GND +5V
GND
IN1
VCC
GND
Trig
Echo
VCC
RTX
TXD
GND
VCC
DAT
CLK
GND
VCC
RST
OUT
220V 50Hz
CONECTOR
Comunicación I2C
Alimentación Alimentación
GND
IN1
VCC
COM
NO
Interruptor final de
carrera
Trabajo fin de grado
Sistema de control automático en una explotación agrícola.
Francesc Miralles Benet
7.4 Esquema distribución
alimentación para los
controladores
M
3
L1
N
51
2 4
L1L2
U1V1
W1
-G
K6
-Q1
Puerta acceso.
Luz 1
Luz 2
Nº9
UNIVERSIDAD ROVIRA I VIRGILI
M
3
51
2 4
L1L2
-H
-Q2
M
3
51
2 4
L1L2
-K
-Q3
Depósito agua.Riego.
Trabajo fin de grado
Sistema de control automático en una explotación agrícola.
Francesc Miralles Benet
7.5 Esquema de fuerza
U1V1
W1
U1V1
W1
0V
+10V
AIN+
AIN-
DIN 1
DIN 2
DIN 3
15V
0V
RL1B
RL1C
PE
N
K4
K5
Puerta acceso.
0V
+10V
AIN+
AIN-
DIN 1
DIN 2
DIN 3
15V
0V
RL1B
RL1C
PE
L/L1,N/L2
or
L/L1,N/L2,L3
K1
0V
+10V
AIN+
AIN-
DIN 1
DIN 2
DIN 3
15V
0V
RL1B
RL1C
PE
L/L1,N/L2
or
L/L1,N/L2,L3
K3
-G -H -K
Riego Depósito agua
Nº10
UNIVERSIDAD ROVIRA I VIRGILI
L1
K2
L/L1,N/L2
U1V1
W1 U1V1
W1
U1V1
W1
Trabajo fin de grado
Sistema de control automático en una explotación agrícola.
Francesc Miralles Benet
7.6 Esquema de control
TemperaturaHumedad
Fecha
Notificaciones
Menú principal.
4 Seg. 4 Seg.
4 Seg. 4 Seg.
Menú nº1
Control de la bomba trifásica,riego.
UNIVERSIDAD ROVIRA I VIRGILI
Nº11
Trabajo fin de grado
Sistema de control automático en una explotación agrícola.
Francesc Miralles Benetnº1
7.7.1 Esquema interfaz local
4 Seg. 4 Seg.
Menú nº2
Control de la bomba trifásica,depósito.
Menú nº3
REGRESO AL MENÚ PRINCIPAL
Configuración tem
porizador riego.
UNIVERSIDAD ROVIRA I VIRGILI
Nº12
Trabajo fin de grado
Sistema de control automático en una explotación agrícola. Francesc Miralles Benet
nº2
7.7.2 Esquema interfaz local
REGRESO AL MENÚ PRINCIPAL
Menú nº4 Configuración tem
porizador parael llenado del depósito.
Menú nº5
Distancia introducidapreviamente.
Nivel agua depósitoConfiguración depósito
REGRESOAL MENÚPRINCIPAL
UNIVERSIDAD ROVIRA I VIRGILI
Nº13
Trabajo fin de grado
Sistema de control automático en una explotación agrícola.
Francesc Miralles Benet
nº3
7.7.3 Esquema interfaz local
2 Seg.
Menú nº6
REGRESOAL MENÚPRINCIPAL
Configuración tem
porizador iluminación.
Control puntos de luz.
2 Seg.
4 Seg.4 Seg.
Menú nº7
Control motor trifásico,acceso explotación.
UNIVERSITAT ROVIRA I VIRGILI
Nº14
Trabajo fin de grado
Sistema de control automático en una explotación agrícola.
Francesc Miralles Benet
nº4
7.7.4 Esquema interfaz local
Nº15
UNIVERSITAT ROVIRA I VIRGILI
1:25
Pozo
Deposito agua
Vivienda
Construcciones varias
7.7.5 Situación y alcance
M
Motor suministro agua
vivienda
Cuadro eléctrico
Punto de luz y zona
detección sensor PIR
de los sensores PIR
Zona detección sensor
PIR puerta acceso.
Francesc Miralles Benet
Trabajo fin de grado
Sistema de control automático en una explotación agrícola.
UNIVERSIDAD ROVIRA I VIRGILI
Nº16
Trabajo fin de grado
Sistema de control automático en una explotación agrícola.
Francesc Miralles Benet
7.8 Diagrama de flujo del
sistema automático
NO
SI
NO
SI
NO
SI
NO
NO
Activación del relé nº1
El usuario ha activado el
llenado del depósito ?
SI
NO
Activación del relé nº3
y nº4
SIEl usuario ha activado la
apertura de la puerta ?
SI
NO
El usuario ha activado el cierre
de la puerta ?
SI
NO
Se ha temporizado la
apertura y cierre de la
iluminación exterior ?
SI
NO
La hora actual esta dentro
de la franja de tiempo
establecida para la
temporización de las luces ?
Activación del relé nº6
SI
NO
El usuario ha activado la
iluminacíon ?
Activación del relé nº2
Se ha temporizado el riego ?
SI
NO
Bucle principal
El usuario ha activado el
llenado del depósito ?
El nivel de agua en el
depositó esta al próximo
al máximo ? Activación del relé nº3
Desactivación del relé nº2
SI
NO
El nivel de agua en el
depósito esta al
máximo ?
Desactivación del relé nº2
Desactivación del relé nº3
Espera hasta
apertura de puerta
(fin del conteo)
NO
SI
NO
Se detecta presencia en
la puerta de acceso ?
Activación del relé nº6
Interruptor final de
carrera activado ?
SI
NO
El usuario ha activado el
riego ?
Desactivación del relé nº6
Desactivación del relé nº4
Desactivación del relé nº6
El usuario ha activado el
cierre de las luces o la hora
actual esta fuera del horario
temporizádo ?
La hora actual esta
dentro de la franja de
tiempo establecida ?
Desactivación del relé nº6
Sistema de control automático en una explotación agrícola 147
8 R$%$1$-"( 2ɯ!(!+(.&1:%(" 2
Páginas web:
www.arduino.cc/en/Main/ArduinoBoardUnoSMD
Paradisetronic.com
www.panamahitek.com/sensor-ultrasonico-hc-sr04-arduino/
https://electronilab.co/tienda/sensor-de-movimiento-pir-hc-sr501/
https://geekytheory.com/sensor-de-ultrasonidos-hc-sr04-piezoelectrico-arduino
https://www.luisllamas.es/detector-de-movimiento-con-arduino-y-sensor-pir/
https://electronilab.co/tienda/sensor-de-temperatura-y-humedad-dht11/
http://domoticx.com/esp8266-wifi-dht-1122-module-arduinoide/
http://5hertz.com/tutoriales/?p=479 ,
https://arduino-info.wikispaces.com/LCD-Blue-I2C
http://www.instructables.com/id/LCD-Bluetooth-Arduino/
http://arduino.denivel.com/index.php/producto/modulo-i2c-pantalla-lcd/
http://librearduino.blogspot.com.es/2014/01/rtc-arduino-modulo-reloj-tiempo-
real-tutorial.html
https://electronilab.co/tienda/modulo-bluetooth-hc-06-serial-rs232ttl/
https://electronilab.co/tienda/modulo-bluetooth-hc-06-serial-rs232ttl/
http://www.electronicapty.com/teclados-para-arduino/teclado-de-12-teclas-
4x3-para-arduino-detail
https://www.edx.org/micromasters
www.satkit.com
https://www.prometec.net
https://www.arduino.cc/
https://www.luisllamas.es/tutoriales-de-arduino
http://tienda.bricogeek.com/
https://www.schneider-electric.es/es/.../2900-variadores-de-velocidad-y-
arrancadores/
www.leroymerlin.es
www.lasdosm.com
elcajondeardu.blogspot.com
https://playground.arduino.cc
Libros:
Arduino Práctico. Edición 2017 , Daniel Lozano Equisoain
Robotica y domotica básica con Aduino.Edición 2016 , Pedro Porcuna Lopez
Arduino Cookbook.Edición 2011 , Michael Margolis
Sistema de control automático en una explotación agrícola 148