Los componentes son:
1 PIC 16F628A
2 led
2 220 ohmios. resistencia
1 68K ohmios. resistencia
1 transistor BC237
1 diodo 1N4148
1 relé de 12 voltios RA12W-K
1 pulsador
1 7805 regulador de dc-dc
1 condensador de 1000 uf
1 condensador de uf 100
2 terminales con 2 agujeros y 1 terminal con 3 agujeros.
2 doble tiras de puentes de tres pines y 6
1 alimentación 12 V. y 0, 5A.
1 sensor de nivel de agua
1 bomba de agua eléctrica
Con jumpers tira se puede cambiar el intervalo de riego y con los otros puentes de la tira te puede cambiar la duración riego. También puede probar el sistema con un botón. Cuando el nivel del agua es bajo, el sensor detecta que y el pic no encenderán la bomba de agua para protegerla.
El código está escrito en C para CCS:
Main.h
---------------------------------------------------------------------------------------------------------------------
#include < 16F628A.h >
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal Osc RC, sin CLKOUT
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code no protegido contra lectura
#FUSES NOBROWNOUT //No apagón reset
Pin claro de #FUSES NOMCLR //Master utilizado para la entrada-salida de
#FUSES NOLVP //No baja tensión prgming, B3(PIC16) o B5(PIC18) utilizado para la entrada-salida de
Protección de #FUSES NOCPD //No EE
#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};
#INT_RTCC
void cronometro()
{
Si (--interrupciones == 0)
{
++ segundos;
interrupciones = CUANTAS;
}
}
#INT_RB
void nivel()
{
delay_ms(20);
if(INPUT(PIN_B4) == 1)
{
output_high(PIN_A0);
output_low(PIN_A3);
}
otra cosa
{
output_low(PIN_A0);
}
}
#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)
{
disable_interrupts(INT_EXT);
para (contador = 0; contador < 8; contador ++)
{
Si (contador % 2 == 0)
{
output_high(PIN_A1);
}
otra cosa
{
output_low(PIN_A1);
}
delay_ms(1000);
}
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;
}
else if (segundos > = repeticiones[(input_b() & 0x0F) >> 1])
{
Inicio = 1;
}
}
}
---------------------------------------------------------------------------------------------------------------------
Se puede ver el código fuente mejor en http://www.sistemasorp.es/2011/02/07/sistema-de-riego-automatico/ (español)