#include <16f877A.h> //el pic a utilizar es por que solo requiero de pocos recursos para la alarma
#use delay(clock=4000000) //tiempo del cristal 4 MG
#fuses xt //utiliza cristal
#fuses NOWDT //proteccion perro guardian of
#fuses PUT //proteccion para esperar que se estabilise la alimentacion del pic
#use FAST_IO(B) //utilizo el puerto B
#use FAST_IO(D) //utilizo el puerto D
#define E_ON_OF PIN_B0 //se define que E-ON-OF es el PIN_B0 y (E-ON-OF) significa Entrada Ensendido Apagad)
#define S_MOV_PAD PIN_B1 //se define que S-MOV-PAD es el PIN_B1 y (S-MOV-PAD) significa sensor de movimiento patio delantero)
#define S_MOV_PAT PIN_B2 //se define que S-MOV-PAT es el PIN_B2 y (S-MOV-PAT) significa sensor de movimiento patio trasero)
#define S_MOV_PUD PIN_B3 //se define que S-MOV-PUD es el PIN_B3 y (S-MOV-PUD) significa sensor de movimiento puerta delantera)
#define S_MOV_PUT PIN_B4 //se define que S-MOV-PUT es el PIN_B4 y (S-MOV-PUT) significa sensor de movimiento puerta trasera)
#define S_MAG_PUD PIN_B5 //se define que S-MAG-PD es el PIN_B5 y (S-MAG-PD) significa sensor magnetico puerta delantera)
#define S_MAG_PUT PIN_B6 //se define que S-MAG-PT es el PIN_B6 y (S-MAG-PT) significa sensor magnetico puerta trasera)
#define LUZ_PAD PIN_D0 //se define que LUZ-PAD es el PIN_D0 y (LUZ-PAD) significa luz patio delantero
#define LUZ_PAT PIN_D1 //se define que LUZ-PAT es el PIN_D1 y (LUZ-PAD) significa luz patio trasero
#define SIRENA PIN_D2 //se define que SIRENA es el pin_D2 y (SIRENA) es la bocina la bulla
#define LLAMAR PIN_D3 //se define que LLAMAR es el pin_D3 y (LLAMAR) es una salida para realisar una llamada a un cel
#define COLGAR PIN_D4 //se define que COLGAN es el pin_D4 y (COLGAR) es una salida para colgar la llamada
#define LED_ON_OF PIN_D5 //se define que LED-ON-OF PIN_D5 y (LED-ON-OF)significa led ensendido apagado
unsigned int8 ContadorLuz = 0;
unsigned int8 ContadorLlamada = 0;
unsigned int16 ContadorParaReset = 0;
volatile int1 LuzActiva = 0;
volatile int1 LLamadaActiva = 0;
volatile int1 SirenaActiva = 0;
volatile int1 ContadorVecesLLamada = 0;
#int_timer1
void time_1(void)
{
set_timer1(3036);
// Contador que maneja el Timer de la luz
if(LuzActiva == 1)
{
output_high(LUZ_PAD);
ContadorLuz++;
if(ContadorLuz == 60) // 30 seg = 60 entradas
{
output_low(LUZ_PAD); // Corregi aca
ContadorLuz = 0;
LuzActiva = 0;
}
}
else
{
output_low(LUZ_PAD);
ContadorLuz = 0;
}
// Contador que maneja el timer de las llamadas
if(LLamadaActiva == 1)
{
if(ContadorLLamada < 44 )
{
ContadorLLamada++;
if( (ContadorLLamada <= 1) || (ContadorLLamada == 3) || (ContadorLLamada == 23) ||(ContadorLLamada == 43) ) // Primera entrada presiona LLAMAR por 0.5s
{ // Espera 0.5s y presiona LLAMAR de nuevo por 0.5s
output_high(LLAMAR);
}
else if ( ContadorLLamada == 23) // Pasan 10 segundos desde que se llamo y se corta estaba en 43
{
output_high(COLGAR);
if(ContadorVecesLLamada < 3)
{
ContadorLLamada = 0;
}
ContadorVecesLLamada++;
}
else // En cualqier otro momento de tiempo que esten en 0 las salidas
{
output_low(COLGAR);
output_low(LLAMAR);
}
// ContadorLLamada++;
}
}
else
{
if(ContadorLLamada != 0)
{
// Si por alguna casualidad se desactiva la alarma mientras esta llamando esto va a colgar el celular aunque sea 1 ves
output_low(LLAMAR);
output_high(COLGAR);
ContadorLLamada = 0;
ContadorVecesLLamada = 0;
}
else
{
// Caso que no se presione nada, entonces me aseguro que ambos esten en 0
output_low(LLAMAR);
output_low(COLGAR);
}
}
// Contador que maneja el timer de la sirena y su reset a los 30minutos
if( SirenaActiva == 1 )
{
output_high(SIRENA);
ContadorParaReset++;
if ( ContadorParaReset >= 240 ) // 30 Minutos = 1800 segundos = 3600 entradas de 0.5s OJO OJO cambia 3600 por 240 para 2 min y pueda ver si recetea
{
output_low(SIRENA);
SirenaActiva = 0;
LLamadaActiva = 0;
ContadorParaReset = 0;
}
}
else
{
output_low(SIRENA);
ContadorParaReset = 0; // OJO OJO esto lo puse yo segun yo vi que le asia falta
}
}
void main(void)
{
// Aca el setup de pines/modulos/etc
set_tris_B(0b11111111); //asigno todo el puerto B como entradas y lo puse en binario para que lo tenga presente
set_tris_D(0b00000000); // asigno todo el puerto D como salidas
output_D(0b00000000);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
set_timer1 (3036);
enable_interrupts(int_timer1);
enable_interrupts(global);
// Comienzo del programa principal
while(true)
{
if(input(E_ON_OF)==1) // Pregunto si la entrada del pin B0 es igual a 0
{
delay_ms(10); // Espero 10ms por si la llave esta rebotando (variando entre 1 y 0 )
while(input(E_ON_OF)==1); // Espero que suelte el boton, observa el ; al final, es decir un while(){}
output_toggle(LED_ON_OF); // Cambio el valor del pin
}
if(input(LED_ON_OF)==1)
{
if((input(S_MOV_PAD)==1)||(input(S_MOV_PUD)==1)||(input(S_MAG_PUD)==1)) //OJO OJO lo puse yo estaba asi if((input(S_MOV_PAD)==1))
{
LuzActiva = 1;
ContadorLuz = 0; //Asi no se apaga
}
if((input_b() & 0b01111110) != 0) // Es decir se activo algun sensor interno, entonces active la sirena y la llamada. OJO OJO tenia 0b01111000)
{
SirenaActiva = 1;
LLamadaActiva = 1;
ContadorVecesLLamada =1;
}
}
else
{
LuzActiva=0;
SirenaActiva = 0;
LLamadaActiva = 0;
ContadorParaReset = 0;
ContadorVecesLLamada =0;
}
}
}