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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
#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:
Muy bueno y sencillo parece. Me podrias decir el coste de los componentes? (Aproximado)
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 €
Ola quisiera saber si se puede cambiar el sensor de nivel, por uno de humedad? me serviria este codigo de programa ?
No. El sensor de nivel sólo detecta conectado/desconectado.
Hola, quisiera ver el video funcional y no sale 🙁
Ayudame por favor!!
Arreglado
Amigo, Disculpa Nesesito Saver Como Programaste Tu simulacion espero me eches la mano
Saludos ^^
hola Sludos tienes el diseño de casualidad en proteus
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.
Lo importante es ponerse, ya se irán resolviendo los problemas a medida que vayan apareciendo.
Pues a por ello voy, creo que me voy a divertir 🙂
me podrias dcir en que simulador lo isist esq tngo un proyecto igualito y me gustaria acerlo, m podrias ayudar?
No lo he hecho en ningún simulador, es totaltemte real.
oies me podris decir con que programa programas el pic
Con el PICkit 2 v2.61. http://ww1.microchip.com/downloads/en/DeviceDoc/PICkit%202%20v2.61.00%20Setup%20A.zip
amigo buenas tardes solo para preguntar eh… bueno
el PIC lo intente programar en el mpelab pero no se pud0. acaso es
En el MPLAB se compila el programa y con el pickit, winpic800, icprog u otros se programa el pic.
que no se pueda programar en este programa
?
intente acer el esquema en el proteus, pero no viene el pic16F628A, saves d otro simulador de circuitos que me pueda servir?
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.
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.
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
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…
em vez de pines y jumpers, podria cambiarlos por swith, como?….
Si, se puede hacer con switches.
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!!
oies puedo ocupar el pic16f84a envez de el que tu utilizastes?
viktor: Si, podrías usar el 16f84a, pero tendrás que retocar el código fuente para adaptarlo a las características del micro.
oies ya trate de compilar el progama en el mplap pero me dice k ay un error a que se deve
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.
Puedo usar el pic18f4550 en lugar del que uso?
Si, pero tendrías que modificar el programa para adaptarlo a ese modelo.
OIES DISCULPA SERA QUE PUEDAS PROGRAMAR EL PIC Y VENDERMELO ESK YA INTENTE Y NO PUEDO DIGO SI SE PUEDE
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!
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.
lo podrias crear en proteus y subirlopara guiarm mjor,ya qu apnas ando utilizando proteus.gracias!!…
No tengo el proteus. Lo siento.
porfa admin, asme ese favorsote con la simulacion en proteus..
hola disculpa, una pregunta, que funcion tiene el Un regulador 7805 y el Un relé de 12 voltios RA12W-K?
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? 🙂
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.
Gracias por tu respuesta!
Lo unico que no entiendo de todo es «Farragoso» xD
disculpe amigo, el sensor que usa es un sensor magnetico?
Tiene toda la información en el enlace al sensor que hay en el artículo.
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?
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.
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.
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?
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.
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!
si me puedes ayudar a mi estoy muy complicada con esto y es de suma urgaencia.
saluda Barbara
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
Te lo he compilado y lo puedes descargar en http://www.sistemasorp.es/blog/riego.hex
Hola, excelente proyecto felicitaciones…
unas dudas… se podrá programar, cosa que riegue 10min una vez cada 3 dias?
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.
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
Es mejor hacerlo por aquí ya que así otros que puedan tener las mismas duas las puedan ver resueltas.
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
Simplemente pincha en la imagen del esquema y lo podrás ver en su tamaño original.
la neta me parecio muy inportante tu proyecto y lo estoy realizando pero no le entiendo al circuito ,un favor si me podrias mandar de favor tu diseño por faz ,, muchas gracias
El diseño del circuito está en el mismo artículo.
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.
Buenas tardes amigo, gracias por este proyecto, es muy bueno, me podrías ayudar con el reelevador, quiero sustituirlo por otro.
Hola! es de sistema de lsao cerrado? otra se activa solo no?
De lazo abierto porque un timer salta y llena de agua del tiesto (salida) sin comprobar si lo necesita o si lo inunda.
Bien. Necesitaba una referencia para hacer un proyecto similar. Gracias por tu aporte.
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!.
Claro: http://www.sistemasorp.es/2012/05/24/los-vagos-2-0/
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…
Supongo que si. Nunca he trabajado con ese sensor por lo que desconozco cómo funciona.
a que te referís con supongo?
habría que cambiar toda la programación o solo en parte?
a esq quiero saber si funcionara con una bomba de un caballo de fuerza
¿Cuantos amperios consume?
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.
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.
seria posible que me enviaras lo que tu hisiste te lo agradeseria mucho. cualquier cosa mi correo es b.araya.g@gmail.com
saluda Barbara
Los esquemas de la electrónica y el código fuente está en el artículo para que lo puedas replicar.
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
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
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.
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
Lo hice para el compilador CSS.
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
Lo siento, no uso Proteus.
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
Es un diseño que hice con el software de CAD Eagle.
ooo muchisimas deveras muchisimas gracias un saludo y buenas vibras :DDDD
Sigo sin entender si el borne de 3 tomas es vital para el funcionamiento del circuito
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
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 🙂
please explain about frequency and duration programming.
In the source code you can change that in variables repeticiones and duraciones (frequency and duration)