Sistema de riego automático

Muchas veces me ha surgido la necesidad de regar las plantas que tenía en casa mientras estaba fuera unos días. Por desgracia algunas de ellas han perecido por no ser regadas cada poco tiempo.

De esa necesidad surge este proyecto y para llevarlo a cabo he usado una bomba de agua, un bidón, un detector de nivel y una placa basada en un pic 16f628 con un relé.

La bomba de agua puede ser la que se usa para renovar el agua de una pecera o para mantener el chorro de una pequeña fuente. Sólo hay que conectarla a la alimentación de la casa para que empiece a bombear agua. Es muy importante que cuando esté enchufada tenga siempre agua, porque si no el motor se puede llegar a quemar. Por otro lado la altura de la manguera que va desde la bomba hasta el tiesto no puede ser mayor de un metro, ya que estos motores van perdiendo fuerza de bombeo a medida que crece la altura por donde tienen que enviar el agua.

El bidón que he usado en el proyecto es uno de los de agua mineral de 5 litros de cualquier marca. Al ser de plástico es fácilmente manejable para poder hacer un agujero y meter el detector de nivel.

El detector de nivel es necesario para evitar que la bomba siga extrayendo agua y se queme el motor por no tener agua que bombear. Yo he usado el de sure electronics.

La placa gobernada por un pic 16f628a es la que activará o desactivará la bomba de agua mediante un relé. Puede ser configurado mediante jumpers tanto el tiempo de riego como el intervalo. También se puede activar el riego manualmente mediante un botón.

Los componentes de la placa que he usado son:

  • Microcontrolador PIC 16F628A
  • 2 diodos led
  • 2 resistencias de 220 ohm.
  • 1 resistencia de 68K ohm.
  • 1 transistor BC237
  • 1 diodo 1N4148
  • Un relé de 12 voltios RA12W-K
  • Un botón
  • Un regulador 7805
  • Un condensador de 1000 uf
  • Un condensador de 100 uf
  • 2 bornes de 2 tomas y uno de 3 tomas.
  • Pines y jumpers
  • Fuente de alimentación de 12 V. y 0,5A.

Es importante que las pistas (o los cables de una placa de topos) que van a los contactos del relé sean más anchos para soportar la intensidad de la corriente.

Para no tener que pelar el cable de la bomba de agua, he usado un alargador que será al que se enchufe la bomba, pero que está cortado por uno de sus cables para poder engancharlo al relé:

El código fuente del PIC:

main.h

#include <16F628A.h>
 
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
 
#use delay(clock=4000000)
#use fast_io(A)
#use fast_io(B)
 
#define CUANTAS 15

main.c

#include "main.h"
 
int inicio = -1;
int32 segundos = 0;
int interrupciones = CUANTAS;
int32 repeticiones[] = {7 * 24 * 3600, 6 * 24 * 3600, 5 * 24 * 3600, 4 * 24 * 3600, 3 * 24 * 3600, 2 * 24 * 3600, 24 * 3600, 12 * 3600};
int16 duraciones[] = {16000, 14000, 12000, 10000, 8000, 6000, 4000, 2000};
 
// Cuenta los segundos que van pasando para la activación automática del
// riego
#INT_RTCC
void cronometro()
{
    if(--interrupciones == 0) 
    {
      ++segundos;
      interrupciones=CUANTAS;
    }
}
 
// La interrupción es lanzada cuando el nivel del agua detectado por
// el sensor está por debajo de este y activamos el led de alarma
#INT_RB
void nivel()
{
   delay_ms(20);
   if(input(PIN_B4) == 1)
   {
      output_high(PIN_A0);
      output_low(PIN_A3);
   }
   else
   {
      output_low(PIN_A0);
   }
}
 
// La interrupción es lanzada cuando se pulsa el botón
#INT_EXT
void empiece()
{
   delay_ms(20);
   if(inicio == 0)
   {
      inicio = 1;
   }
}
 
void main()
{
   int contador;
 
   set_timer0(0);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   port_b_pullups(TRUE);
   set_tris_a(0);
   output_low(PIN_A0);
   output_low(PIN_A1);
   output_low(PIN_A3);
   enable_interrupts(INT_RTCC);
   enable_interrupts(INT_RB);
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
   delay_ms(1000);
   inicio = 0;
 
   for(;;)
   {
      if(inicio == 1)
      {
         // No dejamos que se pulse de nuevo el botón mientras dure el proceso
         disable_interrupts(INT_EXT);
         // Parpadeamos durante 4 segundos el led de trabajo
         for(contador = 0; contador < 8; contador++)
         {
            if(contador % 2 == 0)
            {
               output_high(PIN_A1);
            }
            else
            {
               output_low(PIN_A1);
            }
            delay_ms(1000);
         }
 
         // Si el nivel del agua está por encima del sensor activamos la bomba
         if(input(PIN_B4) == 0)
         {
            output_high(PIN_A1);
            output_high(PIN_A3);
            delay_ms(duraciones[input_b() >> 5]);
         }
         output_low(PIN_A1);
         output_low(PIN_A3);
         enable_interrupts(INT_EXT);
         delay_ms(1000);
         interrupciones = CUANTAS;
         segundos = 0;
         inicio = 0;
 
      }
      // Si el contador de segundos ha llegado a 0 es que hay que empezar 
      // el proceso de riego
      else if(segundos >= repeticiones[(input_b() & 0x0F) >> 1])
      {
         inicio = 1;
      }
   }
}

En el array repeticiones se ponen los milisegundos que dura el intervalo entre riegos, para poder seleccionarlo luego con los jumpers. En el array duraciones se ponen los milisegundos que dura el riego, para poder seleccionarlo luego con los jumpers.

Nada más arrancar el sistema empieza a contar los segundos que quedan para el siguiente riego, según esté configurado en los jumpers. Cuando llega ese momento o se pulsa el botón, el led de trabajo parpadea 4 segundos, permaneciendo encendido al igual que el relé para que funcione la bomba de agua mientras dure el tiempo de riego, según este configurado en los jumpers. Después el led se apaga, se desactiva el relé (y por consiguiente la bomba) y se espera de nuevo al evento de activación (por tiempo o hasta que se pulse de nuevo el botón).

Si el nivel del agua cae por debajo del sensor mientras se está regando se para automáticamente el riego desactivando el relé y encendiendo el led de alarma, que no se apagará hasta que el nivel esté otra vez por encima del sensor. Las siguientes veces que salte el evento por tiempo o por el botón, no activará el relé, protegiendo así a la bomba de estropearse.

Finalmente un video de cómo funciona el conjunto:

Licencia Creative Commons
Sistema de riego automático por SISTEMAS O.R.P, a excepción del contenido de terceros y de que se indique lo contrario, se encuentra bajo una Licencia Creative Commons Attribution 4.0 International Licencia.

82 pensamientos en “Sistema de riego automático

    1. admin Autor

      Bueno, te voy a dar el precio de los componentes que cuestan más de 1 €, aunque no son precios exactos:

      * Microcontrolador PIC 16F628A: 3 €
      * Relé de 12 voltios RA12W-K: 2€
      * Sensor de nivel: 2€
      * Fuente de alimentación de 12 V. y 0,5A.: 6€
      * Bomba de agua: 15 €
      * Resto de componentes: 5 €

      Responder
  1. aitorpc

    Lo primero: muchas gracias por estos casos practicos. Me ha parecido muy interesante este de riego automatico, algo que es muy comun (el necesitarlo) en muchos hogares.

    Por mi parte voy a intentar llevarlo a cabo, eso si, no tengo mucha idea de nada, solo base para poder investigarlo ¿lo ves complicado para un principiante? Tengo conocimientos basicos de programacion, electricidad y electronica, pero nunca he hecho nada practico y esta practica tan sencilla me supera, pero creo que podre llevarlo a cabo investigando un poco.

    Gracias de nuevo.

    Responder
  2. licho

    me podrias dcir en que simulador lo isist esq tngo un proyecto igualito y me gustaria acerlo, m podrias ayudar?

    Responder
  3. juan jose

    amigo buenas tardes solo para preguntar eh… bueno
    el PIC lo intente programar en el mpelab pero no se pud0. acaso es

    Responder
  4. licho

    intente acer el esquema en el proteus, pero no viene el pic16F628A, saves d otro simulador de circuitos que me pueda servir?

    Responder
  5. Daniel

    Muchas gracias por subir este tutorial.

    Una pregunta, ya que apenas me estoy iniciando en los microcontroladores y uso otro tipo de instrucciones para programar y guardarlas directamente en assembler (creo que utilizaste C si no me equivoco) intenté lo mismo con este y no me funcionó. Tengo que exportar ese archivo a HEX y tomar ese con el icprog para programar el PIC? O tengo que hacer otro procedimiento? Mil disculpas si es mala mi pregunta.

    Responder
    1. admin Autor

      Haces el programa en ensamblador, C, BASIC, etc. Después lo compilas y se genera un fichero hex, este fichero es el que debes subir al micro con el icprog, winpic800, pickit 2, etc.

      Responder
  6. licho

    disculpa de que manera puedo encontar las resistencias d 220 ohm, xq en el programa “proteus”, encontre una parecida que dice, mineres220k 0.6w, no se si esa sea

    Responder
  7. licho

    pues no encuentro un simulador que contenga todos los componentes que se necesitan, ya use el proteus, isis y el eagle, y no estan esas herramientas, sabran de uno que si los traiga todos. gracias…

    Responder
  8. charly

    admin, tengo una pracatica parecida a esta y me stoy basando de tu diseño, me podrias ayudar con esto??,noc si tngas correo electronico para ponernos en contacto….saludos!!

    Responder
    1. admin Autor

      viktor: Si, podrías usar el 16f84a, pero tendrás que retocar el código fuente para adaptarlo a las características del micro.

      Responder
    1. admin Autor

      viktor: El código fuente está en lenguaje C y es para el compilador CCS, en el MPLAB sólo se puede compilar lenguaje ensamblador.

      Responder
  9. Luisete

    Mi pregunta es que me parecio un poco extraño que el pic no lleve el cristal de clk ni los condensadores aunque por lo que llevo entendido algunos no deben necesitar y este? y la otra pregunta es como modificar los tiempos de encendidos del rele desde la propia programacion del pic se manipula no?
    Saludos y gracias de antemano!

    Responder
    1. admin Autor

      Luisete: Hay microcontroladores que ya tienen internamente un cristal. Como comentaba en el artículo el array repeticiones indica cada cuantos milisegundos se debe empezar el proceso de riego y el array de duraciones indica cuantos milisegundos dura el proceso de riego, puedes modificar ambos a los valores que mejor se adapten a tus necesidades.

      Responder
  10. Eck0

    Estoy empezando hoy a adentrarme a la electronica. Se que usastes C y por otro lado estoy leyendo sobre assambler.

    Que otros lenguajes deberia aprender para adentrarme como tal a la electronica? :)

    Responder
    1. admin Autor

      Con esos dos es más que suficiente. A lo mejor te sientes más cómodo con PIC BASIC, pero el C es el más usado para los proyectos con microcontroladores, ya que el ensamblador para proyectos medianos o grandes es bastante farragoso.

      Responder
  11. CaroC20

    Hola! el sensor que usted usa es uno por flotacion verdad? ya revise el enlace del sensor que usted pone… Estoy haciendo un sistema automatizado de riego como el suyo como proyecto de ciencias en mi colegio y si es tan amable me gustaria que me ayudara ya que no encuentro aqui en mi ciudad (Maturin-Venezuela) ese tipo de flotador que usted usa, para un proyecto como el suyo, usted tambien hubiese podido usar un sensor magnetico? o hubiese tenido que cambiar otras cosas del circuito?

    Responder
    1. admin Autor

      Si, es de flotación. Yo tampoco lo encontré es España por lo que lo tuve que comprar en la tienda china donde está el enlace. Puede usar cualquier interruptor pero el del proyecto es ideal porque flota en el agua.

      Responder
  12. Jose

    Hola, he estado averiguando como hago para grabar el programa dentro del pic, y consegui que necesito una tarjeta especial, si me podrias explicar mas o menos como es el procedimiento para grabar el pic.

    Responder
  13. Jose

    Disculpa amigo, estoy intentando hacer la simulacion en el proteus, y hay algo que no concuerda, el microprocesador que aparece en el esquema PIC16F628P cosa que el PIC16F628A no posee el pin #14 como se puede solucionar eso?

    Responder
    1. admin Autor

      Tiene multitud de tutoriales en Internet sobre cómo grabar un PIC. Sólo hay que buscarlos.

      En cuanto al proteus, no lo uso, por tanto no sé como solucionar el problema.

      Responder
  14. Luisete

    Ya tengo el proyecto hecho y aparentemente la tarjeta a quedado muy bien incluso con el Ares (Proteus) consegui hacer alguna mejora y que fuera de pequeñisimo tamaño, ya solo me falta el .hex intente compilarlo en el CCS mediante el main.c y main.h con un grabador JDM Serie y el ICProg e conseguido grabarlo pero no es correcto el funcionamiento, si me podriais pasar el .Hex colgandolo en alguna pagina de descargas lo agradeceria, si alguien necesita el layout o ayuda aqui estoy. Un saludo!

    Responder
  15. Luisete

    Saludos imagino que estais de vacaciones o ocupados, bueno cuando podais espero que alguien pueda subir o pasarme el archivo .hex, Lo Agradeceria mucho! Bye

    Responder
  16. Manuel

    Hola, excelente proyecto felicitaciones…
    unas dudas… se podrá programar, cosa que riegue 10min una vez cada 3 dias?

    Responder
    1. admin Autor

      Gracias. Si, puede añadir a la línea delay_ms(duraciones[input_b() >> 5]); un bucle que se repita 60 veces y seleccionar con los jumper la duración de 10000 ms.

      Responder
  17. Katherin

    Hola amigo me parece interesante tu proyecto, voy a intentar hacerlo, me gustaria saber si tengo alguna duda o de que no me salga habra algun email donde puedo contactar contigo directamente? si no es mucha molestia para ti

    Responder
  18. angel

    oie un favorsote la verdad me intereso tu proyecto pero el diagrama no se ve muy bien me lo podrias proporcionar me harias un gran favor y te lo agredeceria mucho

    Responder
  19. bastii

    amigo porfavor me gustaria hacer este proycto pero lo unico que me falta son los caminos de la placa y me gustaria conseguirlos. Porfavor si puedes mandarlos te lo agradeceria.

    Responder
  20. JORGE LUIS

    Buenas tardes amigo, gracias por este proyecto, es muy bueno, me podrías ayudar con el reelevador, quiero sustituirlo por otro.

    Responder
  21. Jucka

    Una Duda
    Estoy haciendo un proyecto similar para la escuela pero es obligatorio programar el pic en PIC BASIC
    No hay manera qe me puedas pasar el programacion en un comentario Gracias!.

    Responder
  22. hectorcris

    hola disculpa q moleste pero tengo una duda… estoy comenzando con el tema de programacion y todo eso… y queria preguntarte si se podria anexar al circuito un sensor de humedad HS1101 porque lo necesito para mi proyecto de clases… esque me piden un sistema de riego con un sensor de humedad de ambiente.. y no tengo idea alguna de como hacerlo… de mil favores te pido q me ayudes…

    Responder
  23. Angel B

    Hola Sr, un amigo y yo estamos realizando este proyecto para nuestro proyecto final de Electronica 6º Año, ya tenemos todo listo plano,circuito impreso, programacion del pic( copiar y pegar la misma que esta aqui… y sirvioo!!!)

    Solo hay una parte que yo no entiendo, como encaja el borne de 3 tomas en el circuito, el profesor nos dijo que no era necesario, pero como fue Ud. quien lo hizo quiero saber mas,especialmente porque soy yo quien tiene que hacer el informe y no tengo mucha informacion que digamos.

    Responder
    1. admin Autor

      Es cierto que se puede poner una terminal de 2 contactos en vez de la de 3. Es habitual en circuitos genéricos con relés de 5 pines poner una terminal de 3 contactos para poder elegir si el circuito está activado cuando el relé está apagado o cuando el relé está encendido. Por eso mismo estandar puse el terminal de 3 contactos.

      Responder
  24. Angel B

    Basandome en su comentario y en la imagen del circuito este borne va conectado al rele. Es decir que el borne de 3 tomas no es vital para el funcionamiento del circuito? Porque ya lo tenemos asi sin borne al rele.

    PD: me atrevo a decir que nuestro circuito nos quedo mas chido que el original xD

    Responder
  25. Dante Shamed

    Disculpa la bomba de agua cual usaste es alguna en especifica???? y ammm como usas los pines y los jumpers fue lo unico que no comprendi para la seleccion de tiempos o intervalos de antemano gracias por compartir esta informacion

    Responder
    1. admin Autor

      Una bomba cualquiera para acuario o fuente pequeños. Los pines de los jumpers son leídos por el programa y según los que estén activos o no coge su correspondiente posición del array tanto de los intervalos como de las duraciones.

      Responder
  26. Dann

    Disculpa podrias decirme en que programa compilaste los codigos?? o como lo hiciste? o colgarme el archivo .hex porfavor lo eh intentado en mplab en pic c en dev c++ y no he podido dar

    Responder
  27. Dann

    ya logre compilar y todo asi sin errores pero salio algo mas cuando lo quiero simular en proteus para obtener el layout hay muchos componentes que no me aparecen serias tan amable de subirlos???? como buscaste los componentes para ponerlos en el virtual o subir el archivo layout??? :S

    Responder
  28. Dann

    entonces como hiciste la placa??? o de donde sacaste ese esquema del circuito virtual??? es a lo que me refiero tienes algun archivo layout en que te basaste donde y como hiciste la placa???

    una disculpa de antemano por la molestia pero no logor entenderlo yes lo unico que me falta para ponerme manos a la obra en lo fisico

    Responder
    1. admin Autor

      Puedes sustituirlo por un borne de 2 tomas, pero sigue siendo necesario:
      un borne de 2 tomas para la alimentación
      otro borne de 2 tomas para el comprobador de nivel de agua
      un borne de 2/3 tomas para el cable del motor de agua

      Responder
  29. Dann

    No angel B no es necesario si miras el video del proyecto ya funcionando el detector de nivel es el que esta conectado y solo utiliza 2 bornes entonces puede ser reemplazado y asi o bueno asi le entendi yo :)

    Responder

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>