Electroválvula Rain Bird 075-DV controlada por Internet con Arduino
Hace un tiempo estuve haciendo pruebas para controlar una electroválvula mediante una placa Arduino (ver entrada aquí), y hoy le vamos a dar una vuelva de tuerca más a aquel proyecto, conectando la electroválvula a Internet.
Antes de nada, voy a describir cual es la problemática que tengo en mi sistema domótico y como lo he intentado resolver. En el chalet tengo tres casetas para riego, por las que pasa una única tubería de agua (de la toma general de riego, la tubería va hacia la caseta 1, luego hacia la caseta 2 y finalmente a la caseta 3, de una a otra caseta). Además de la tubería de agua, también pasa una tubería con cables eléctricos, que llevan 220VAc (fase, neutro y tierra) que salen de un diferencial dedicado para esta tirada eléctrica, y otra tirada de 24VAc (dos hilos) que salen desde un transformador para electroválvulas (220VAc a 24Vac). Resumiendo: en casa caseta tenemos: agua, 220VAc y 24VAc en una caja estanca.
Queremos conectar cada caseta al nodo central domótico (JDomo), a través de una red Ethernet formada por PLCs y aprovechar dicha conexión para controlar las electroválvulas (máximo 3) en cada caseta. Además queremos controlar una situación de error relativamente típica en los sistemas de riego automático, y es que por algún fallo alguna electroválvula se quede abierta más tiempo del que le hayamos indicado en el sistema domótico y nos eche a perder nuestra plantación de hortalizas o frutales (por ejemplo, algún problema en el relé de control de la electroválvula, una pérdida de conexión con el nodo central a través de Ethernet, no recepción de la señal de apagado, …).
De forma bastante esquemática lo que vamos a montar en cada caseta es lo siguiente:
Una vez montado, el controlador queda más o menos así:
Los materiales que necesitaremos son lo siguientes:
Cantidad | Descripción | Coste (€) | Tienda |
---|---|---|---|
1 | Caja estanca del tamaño adecuado | 1,40 | Leroy Merlin |
1 | Arduino Nano + placa ENC28J60 Ethernet | 13,01 | Ebay |
1 | placa con rele 5v optoacoplador | 1,18 | Ebay |
1 | cable de red de 25cm | 2 | Ebay |
1 | placa sensor de corriente ACS712 5A | 1,50 | Ebay |
1 | Conector molex con pines macho y otro hembra | Reciclados | |
1 | Fuente de alimentación 6V | 2,42 | Ebay |
1 | Cables varios para puentear | Reciclados | |
1 | PLC TP-Link TL-PA411 | 15 | Amazon |
36,51 |
Lo primero que debemos hacer son los agujeros en la caja: para la conexión RJ45, la entrada de alimentación de arduino, la entrada/salida de uno de los hilos que lleva los 24VAc a la electroválvula y, por comodidad, la toma USB del Arduino Nano por si tenemos que reprogramar el nodo. En mi caso, y como tengo unos conectores molex de 4 pines procedentes de una fuente de alimentación desguazada, los he aprovechado.
En las siguientes imágenes se ven los agujeros con más detalle (no quedan 100% profesionales pero me valen). Están hechos con una broca de madera de 3mm, un cuchillo, y una lima:
![]() |
![]() |
![]() |
![]() |
Siguiendo este esquema procedemos a realizar las conexiones, teniendo en cuenta que los pines marcados como Gnd y Vcc hay que conectarlos a los pines correspondientes en la placa del relé y la del ACS712:
Además la alimentación de Arduino se hará a través de los pines Vin y GND (junto al Vin). El montaje final queda bien apretado dentro de la caja, aunque en mi caso, para que la placa del relé y la del medidor de corriente queden bien sujetas, ha sido necesario anclarlas a un pedazo de PCB que tenía de sobra de otro proyecto:
Para rematar la faena necesitamos cargar el software al Arduino y conectarlo a la red para comprobar el funcionamiento. El software lo podéis encontrar en aquí. Está preparado para compilar con la utilidad INO, con todas las librerías necesarias, y que yo he usado durante el desarrollo y las pruebas.
¿y ahora qué? ¿Como lo hacemos funcionar? Cuando accedemos a la web del aparato (en adelante jEV), nos muestra un listado con los datos actuales: el valor que lee del sensor de energía (powerADC) y su valor util (power), la conversión en amperios (current) y en vatios (watts), la temperatura (en grados centígrados) y el voltaje (en milivoltios) internos de Arduino (atemp y avcc), la temperatura en grados leída por la sonda DS18B20 (tempDS, que en nuestro caso no hemos montado), y los estados de los tres dispositivos que el software puede controlar (estado_dispositivo1, estado_dispositivo2 y estado_dispositivo3). Aunque el software puede controlar una sonda DS18B20 y tres dispositivos, en nuestro montaje no necesitábamos controlar tanto, y nos es suficiente con un relé y un sensor de corriente.
Un estado 1 equivale al dispositivo apagado, y un estado 0, equivale al dispositivo encendido. Para cambiar de estado basta con enviar un comando ev1_on, ev1_off, ev2_on, ev2_off, ev3_on, ev3_off, all_on, o all_off, como por ejemplo http://192.168.2.11/ev1_on, o http://192.168.2.11/ev1_on&ev2_off. Al activar una electroválvula veremos como los valores de powerADC y power van variando de acuerdo al consumo del dispositivo. El valor base de powerADC es 1023/2, por encima indica corrientes positivas hasta 5A y por debajo, corrientes negativas hasta -5A. De ahí el valor de power, que no es más que la diferencia, en valor absoluto, con el valor base (1023/2).
En el caso de que enviemos un comando para cerrar una electroválvula, y pasados unos instantes las lecturas de consumo de corriente no se acercan a ese valor base de 1023/2, tendremos un problema, porque la electroválvula continuará abierta.
En el código también se ha establecido un valor máximo para el tiempo de funcionamiento de una electroválvula (kMAX_WORKING_HOURS) en horas. De este modo si perdemos la conexión con el nodo central (por ejemplo, si falla el PLC que nos da la conexión Ethernet), pararemos de regar cuando pasen esas horas.
Otro sistema de control, es el uso del watchdog de Arduino, que se ha definido en 8 segundos. Al definirlo, nos aseguramos de que si hay un problema software y el sistema se bloquea, a los 8 segundos se reiniciará el programa en el nodo de control de la electroválvula. Para usar esta funcionalidad hay que instalarle el bootloader optiboot a nuestro Arduino (podéis encontrar mas información aquí).
Modificación 24/08/2014: Aprovechando que he montado el segundo nodo de control de las electroválvulas, aquí tenéis una galería de imágenes del montaje de un nodo paso a paso:
Actualización 7/9/2013: Integrando Electroválvula en openHAB aquí.
¿cual es el codigo que utilizas en arduino y como comunicas con openhab?
El código que le meto al arduino lo tienes aquí: https://github.com/jdiazbb/jEV
y para comunicarlo con openHab aprovecho que en las reglas (rules) puedes ejecutar peticiones http con sendHttpGetRequest(«url»).
Como ejemplo tengo un fichero caseta2.rules con el siguiente contenido:
rule «Caseta #2: Iniciar riego»
when
Item Zona2 changed to ON
then
sendHttpGetRequest(«http://192.168.2.12/?ev1_on»)
createTimer(now.plusMinutes(120)) [|
Zona2.sendCommand(OFF)
]
end
rule «Caseta #2: Parar riego»
when
Item Zona2 changed to OFF
then
sendHttpGetRequest(«http://192.168.2.12/?ev1_off»)
end
Con la primera regla activo el riego, y le lanzo un apagado programado a los 120 minutos, y con la segunda directamente apago la electroválvula.
Tienes mas informacion en otra entrada del blog, con todos los detalles (https://p1.trasteandoarduino.com/2014/09/07/electrovalvula-controlada-con-openhab/). Espero que te sea útil 🙂
gracias ya me quedo claro, ahora estoy peleandome con mosquitto ya que no soy capaz de instalarlo bien, al ejecutarlo me sale esto:
root@raspberrypi:/# sudo ./mosquitto-setup.sh
Generating a 2048 bit RSA private key
..+++………………………+++
writing new private key to ‘/etc/mosquitto/ca_certificates/ca.key’
/etc/mosquitto/ca_certificates/ca.key: No such file or directory
3069691088:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen(‘/etc/mosquitto/ca_certificates/ca.key’,’w’)
3069691088:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:
Parece que el problema viene porque no tienes creada la carpeta /etc/mosquitto/ca_certificates, ¿puede ser?
si eso parece pero el error creo que viene de antes siguiendo tu tutorial hay un paso en el que me da un fallo tambien
root@raspberrypi:/# curl -O http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 3137 100 3137 0 0 8580 0 –:–:– –:–:– –:–:– 30456
root@raspberrypi:/# sudo apt-key add mosquitto-repo.gpg.key
OK
root@raspberrypi:/# rm mosquitto-repo.gpg.key
root@raspberrypi:/# cd /etc/apt/sources.list.d/
root@raspberrypi:/etc/apt/sources.list.d# sudo curl -O http://repo.mosquitto.org/debian/mosquitto-repo.list
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 345 100 345 0 0 1840 0 –:–:– –:–:– –:–:– 2875
root@raspberrypi:/etc/apt/sources.list.d# sudo apt-get update
E: Type ‘<?xml' is not known on line 1 in source list /etc/apt/sources.list.d/mosquitto-repo.list
E: The list of sources could not be read.
root@raspberrypi:/etc/apt/sources.list.d#
borre el archivo mosquitto-repo.list y pude actualizar pero claro seguro que no es lo correcto, tambien hay otra parte en tu tutorial de instalacion de mosquitto parte 1 que no se hacer que es cuando dices
"Antes de ejecutar el script mosquitto-setup.sh tenemos que cambiar unas lineas para que nos deje todos los archivos en las rutas correspondientes a nuestra instalación en lugar de en la carpeta /tmp/mosquitto, y con los permisos correctos para el usuario mosquitto:
sed -i 's/MOSQHOME=\/tmp\/mosquitto/MOSQHOME=\/etc\/mosquitto/g' mosquitto-setup.sh
sed -i 's/cafile $MOSQHOME\/ca.crt/cafile $MOSQHOME\/ca_certificates\/ca.crt/g' mosquitto-setup.sh
sed -i 's/certfile $MOSQHOME\/server.crt/certfile $MOSQHOME\/certs\/server.crt/g' mosquitto-setup.sh
sed -i 's/keyfile $MOSQHOME\/server.key/keyfile $MOSQHOME\/certs\/server.key/g' mosquitto-setup.sh
sed -i 's/#listener 1883/listener 1883/g' mosquitto-setup.sh
sed -i 's/listener 1883 127.0.0.1/#listener 1883 127.0.0.1/g' mosquitto-setup.sh
sed -i 's/MOSQUITTOUSER=${MOSQUITTOUSER:=$USER}/MOSQUITTOUSER=mosquitto/g' mosquitto-setup.sh
sed -i 's/CACERT=${DIR}\/ca/CACERT=${DIR}\/ca_certificates\/ca/g' TLS/generate-CA.sh
sed -i 's/SERVER=\"${DIR}\/${host}\"/SERVER=\${DIR}\/certs\/server/g' TLS/generate-CA.sh
estas lineas de aqui arriba que hay que hacer ejecutarlas solo?
gracias por la ayuda
Parece que han cambiado el archivo mosquitto-repo.list, y ahora hay dos dependiendo de la ditribuccion que tengas instalada:
ahora se llama mosquitto-jessie.list o mosquitto-wheezy.list, si te bajas el que pone en mi manual, y miras el contenido, veras que es un error html 404, por eso no te funcion. Prueba con uno de los otros dos.
La segunda pregunta: Sí. al ejecutarlas te cambiara algunas lineas de texto dentro de los archivos que se le indican al comando sed (fijate al final del comando, que aparece el nombre del fichero que va a modificar). Por ejemplo:
sed -i ‘s/#listener 1883/listener 1883/g’ mosquitto-setup.sh
quiere decir que cambie la linea ‘#listener 1883’ por ‘listener 1883’ en el archivo mosquitto-setup.sh
que es lo mismo que si dijera: descomenta la linea #listener 1883, pero haciendolo por comandos los copias y los pegas de una vez en un terminal y lo hace instantaneo. 🙂
He cambiado la entrada sobre la instalación de mosquitto para hacer referencia al cambio de los nombres de los ficheros. Gracias por el apunte.
el codigo del arduino me valdria para un arduino ethernet? lo intetno compilar pero da errores, la parte de openhab la tengo hecho pero la de arduino no hay manera, he intentado buscar algun ejemplo simple de controlar un simple rele mediante openhab y arduino ethernet pero no hay manera.
El problema del codigo es que la parte de comunicaciones de red SOLO sirve para la placa ENC28j60 y no para la Arduino Ethernet oficial. Aunque es muy facil modificar el codigo para hacerla funcionar con ella. Lo unico que tienes que cambiar es:
1. La parte de inicializacion del servidor, para lo cual puedes basarte en el ejemplo de servidor web que viene de ejemplo con el IDE de Arduino.
2. LA parte en que se procesa el comando recibido y segun el que sea, se hace una cosa u otra.
3. La parte de envio de la respuesta HTTP, que es muchisimo mas facil de hacer para la placa Ethernet oficial.
Todo el codigo que necesitas esta en el ejemplo de servidor que viene de ejemplo en el IDE Arduino (al menos en el 1.0.5, se llama Ethernet/WebServer.ino)
Hola José! Ojala puedas leer esto luego.
Hace un tiempo estoy haciendo un arreglo automático con arduino para controlar una valvula rainbird 100dv (son de 24 volt, 0,3 amp).
Mi fuente de poder da 24 volt a 4 amps.
Lo unico que no tengo es el ACS712T. Cada vez que enciendo mi sistema la valvula funciona pero SE CALIENTA, mucho, y no hallo que hacer con eso.
Tendrá que ver con el ACS712T? Recien ví en tu pagina tu configuracion con el ACS712T y puede ser lo que me salve, que hace ese módulo? de alguna forma rebaja la corriente si se pasa de algun rango, sin cortarla o algo así?
Saludos, gracias por tu tiempo!
No creo que tenga que ver con el ACS712 (solo sirve para medir la corriente que pasa por el cable que le conectamos, lo uso como metodo para confirmar que la electroválvula esta funcionando (cuando esta en funcionamiento marca unos valores distintos a cuando esta parada)), yo me inclino mas que pueda ser por alguna mala conexión de algún cable, que esté haciendo contacto intermitentemente o que la fuente de alimentación no esté muy bien.
Lo que se calienta mucho, ¿es la electroválvula? Acabo de mirar la temperatura del sensor interno de los arduinos que tengo en las cajas estancas, a fecha de ayer, y marcan una máxima de casi 70ºC. Es normal que se calienten. Lo que no es tan normal es que la electroválvula se caliente.
Me ha pasado mas de una vez que algún aparato eléctrico se calentaba bastante y resultó ser por un mal contacto en el enchufe al que lo tenía conectado. Puede deberse a que la fuente de alimentación no esté bien, a algún cable medio suelto (o que sea demasiado fino), o incluso que el relé no esté bien (aunque esto me parece un poco más raro, ya que oirias un ‘clic-clac’ todo el rato en el relé).
Yo, personalmente, desconectaría todo, y volvería a conectar.
Buenas tardes
Se puede utilizar una electrovalvula de 12 V, Operation Mode: normally closed; Valve type: diaphragm (operated by servo).
O que especificaciones debe de tener la electrovalvula, para que sea compatible con la que usted utiliza.
De antemano gracias.
Hola andres! En principio se puede usar cualquier electrovalvula, ya que el rele lo unico que hace es actuar como una interruptor. Solo hay que tener la precaucion de no superar los valores maximos de corriente y tension del relé.
Hola, estoy montando tu proyecto. Me encanta.
Una pregunta: para alimentar la electroválvula que transformador has puesto? algun fusible?
Es que me lio con temas de amperaje, hercios y demás
Gracias
Hola Jordi, para alimentar las electroválvulas primero usaba un transformador que venden en el Leroy Merlin, de 24Vac (el único que venden), que va conectado a un enchufe normal, pero después lo cambié por uno para carril DIN que se puede poner mejor en una caja de diferenciales que es lo que yo tengo. Lo compre por ebay, busca ‘XBS klingeltrafo 8v 12v 24v transformador timbre transformador Bell Transformer’ y te saldrá el mismo que yo tengo. En la parte de abajo conectas los cables de 220Vac, y en la parte de arriba conectas en los bornes de los extremos (que dan 24Vac, da igual el orden, no hay positivo ni negativo porque es corriente alterna). Si lo que quieres es el modelo de enchufe normal, si busca en google ‘leroy merlin transformador 24vac’ es el que sale.
Espero que te sirva. Y gracias por animarte a montar el sistema de riego 🙂 Yo lo llevo usando ¡tres años ya! y ni un solo fallo… parece mentira que los arduinos estos sean tan fiables, y mira que estan en cajas estancas pegandoles el sol, sin refrigerar nunca, y no ha fallado ni uno de los 4 nodos que tengo con este sistema… ¡increible!
Muchas gracias Jose Maria.
Estoy intentando lo mismo pero en lugar de usar un NANO con ethershield lo estoy intentando con un NODEMCU con wifi pero con el tema de los buffers no me aclaro.
Si lo consigo te mando el código 😉
ok, que haya suerte! 🙂
Buenas tardes.
Aunque el post indica que va a ser controlado por Red. Es posible usar un RTC DS1307 AT24C32 Tiempo Real Módulo de Reloj para Arduino, para los casos en que no haya red?
Por supuesto que podria ser controlado usando un RTC. Incluso seria una buena idea ponerle un RTC, enviarle la programacion de riego por red, que se guardase en la memoria EEPROM del arduino y que si se pierde la conexion o pasa cualquier cosa, se activase la programacion si la fecha/hora coincide con alguna programacion almacenada. Es muy buena idea 🙂
Algun post que me recomiendes, mas que nada para ver como seria la conección fisica entre el arduino nano + relay + rtc? Apenas empiezo en Arduino, y lo electronico no se me da mucho.
Saludos.
Si lo que quieres es un ejemplo facil para controlar un rele, el de hacer parpadear un led te sirve perfectamente: solo tienes que conectarle a la placa la conexion VCC a 5v, GND a 0v, y la de señal al pin que quieras que controle el rele. Cuando le envies un 0 el tendra la conexion del pin central conectado a uno de los otros dos, y cuando le mandes un 1 conectara el pin central al otro pin. Lo normal es usar el pin central y uno de los otros dos (no los tres a la vez). Lo explica muy bien el compañero Luis LLamas en la entrada de su blog: https://www.luisllamas.es/arduino-salida-rele/
Para los relojes RTC tambien tiene una entrada bastante buena aqui: https://www.luisllamas.es/reloj-y-calendario-en-arduino-con-los-rtc-ds1307-y-ds3231/
Espero que te sean de utilidad 🙂
Muchas gracias.