Central de alarma realizada con dos microcontroladores PIC 18F4550, montados, uno en placa maestro y otro en placa esclavo.
Placa Maestro
El circuito de accionamiento para la sirena está constituido por un relé de 5v, un transistor 2N3904, un diodo de protección que evitará sobretensiones cuando la bobina se desconecte además de que posee una resistencia de 1k conectada entre el microcontrolador y la base del transistor. El microcontrolador envía una señal por el pin D6, finalmente la señal enviada es recibida por el relé para activar o desactivar la sirena.
La conexión del módulo GSM SIM900 para el envío y recepción de mensajes de texto. Este equipo presenta un módulo SIM900 inalámbrica ultra compacta y confiable.
Las conexiones necesarias son la alimentación de 5v, Tx, Rx conectadas a C6 Y C7 del microcontrolador respectivamente y la señal para encender el módulo es el terminal 23 del módulo al pin D4 del microcontrolador, este pin tiene una resistencia PULL-UP para que se encienda junto a la central de alarma, pero también está conectado al pic para que este pueda encender en cualquier momento el módulo. Se colocaron capacitores de 470uF/16v alrededor de la alimentación del módulo para que estos puedan entregarle energía en el caso de que el módulo GSM requiera mayor potencia al momento de enviar o recibir un mensaje.
Placa Esclavo
El módulo esclavo es el encargado de enviar y recibir datos solo cuando el pic maestro lo solicita, habiendo comunicación maestro-esclavo y viceversa constantemente. La comunicación constante entre placa maestro y placa esclavo se la realiza mediante la comunicación serial RS232, permitiendo enviar y recibir los bytes de información con el pic maestro. Las líneas necesarias para realizar la comunicación serial son tres: Rx, Tx y Gnd.
Para el ingreso de información como meter la clave, activación/desactivación de sensores, cambio de contraseña y cambio de número telefónico, utilizamos un teclado matricial 4x4.
Se conecta el teclado usando 8 pines conectados a nuestro microcontrolador. Las columnas (vertical) se conectan a los bits más significativos que funcionan como salidas, mientras que las filas (horizontal) del teclado se conectan a los bits menos significativos que funcionan como entradas con resistencias pull-down. Cualquier tecla que se oprima en una fila causará que uno de los bits menos significativos del puerto cambie de un estado lógico bajo a un estado alto.
Para la visualización del menú del sistema de alarma se utiliza un LCD gráfico de 128x64.
Las líneas de datos del GLCD (DB0-DB7) se conectan directamente al puerto D del microprocesador y las líneas de control D/I, R/W, E, CS1 y CS2 se conectan al puerto B a lo terminales 4, 5,6,15,16 respectivamente, la línea RST del GLCD va al reset del microcontrolador.
Se controla la iluminación trasera o retroiluminación con el terminal 19 de la GLCD al pin17 del microcontrolador a través del transistor 2N3904 que es controlado por el controlador. Este control es con PWM (Modulación por ancho de pulso) para poder tener un rango de iluminación de 0 a 100% para que las imágenes sean visibles.
Programación del microcontrolador de la placa maestro
Programación del microcontrolador esclavo
Placa Maestro
El circuito de accionamiento para la sirena está constituido por un relé de 5v, un transistor 2N3904, un diodo de protección que evitará sobretensiones cuando la bobina se desconecte además de que posee una resistencia de 1k conectada entre el microcontrolador y la base del transistor. El microcontrolador envía una señal por el pin D6, finalmente la señal enviada es recibida por el relé para activar o desactivar la sirena.
La conexión del módulo GSM SIM900 para el envío y recepción de mensajes de texto. Este equipo presenta un módulo SIM900 inalámbrica ultra compacta y confiable.
Las conexiones necesarias son la alimentación de 5v, Tx, Rx conectadas a C6 Y C7 del microcontrolador respectivamente y la señal para encender el módulo es el terminal 23 del módulo al pin D4 del microcontrolador, este pin tiene una resistencia PULL-UP para que se encienda junto a la central de alarma, pero también está conectado al pic para que este pueda encender en cualquier momento el módulo. Se colocaron capacitores de 470uF/16v alrededor de la alimentación del módulo para que estos puedan entregarle energía en el caso de que el módulo GSM requiera mayor potencia al momento de enviar o recibir un mensaje.
Placa Esclavo
El módulo esclavo es el encargado de enviar y recibir datos solo cuando el pic maestro lo solicita, habiendo comunicación maestro-esclavo y viceversa constantemente. La comunicación constante entre placa maestro y placa esclavo se la realiza mediante la comunicación serial RS232, permitiendo enviar y recibir los bytes de información con el pic maestro. Las líneas necesarias para realizar la comunicación serial son tres: Rx, Tx y Gnd.
Para el ingreso de información como meter la clave, activación/desactivación de sensores, cambio de contraseña y cambio de número telefónico, utilizamos un teclado matricial 4x4.
Se conecta el teclado usando 8 pines conectados a nuestro microcontrolador. Las columnas (vertical) se conectan a los bits más significativos que funcionan como salidas, mientras que las filas (horizontal) del teclado se conectan a los bits menos significativos que funcionan como entradas con resistencias pull-down. Cualquier tecla que se oprima en una fila causará que uno de los bits menos significativos del puerto cambie de un estado lógico bajo a un estado alto.
Para la visualización del menú del sistema de alarma se utiliza un LCD gráfico de 128x64.
Las líneas de datos del GLCD (DB0-DB7) se conectan directamente al puerto D del microprocesador y las líneas de control D/I, R/W, E, CS1 y CS2 se conectan al puerto B a lo terminales 4, 5,6,15,16 respectivamente, la línea RST del GLCD va al reset del microcontrolador.
Se controla la iluminación trasera o retroiluminación con el terminal 19 de la GLCD al pin17 del microcontrolador a través del transistor 2N3904 que es controlado por el controlador. Este control es con PWM (Modulación por ancho de pulso) para poder tener un rango de iluminación de 0 a 100% para que las imágenes sean visibles.
Programación del microcontrolador de la placa maestro
Código:
#include <main.h> #users232(stream=GSM,baud=9600,xmit=PIN_C6,rcv=PIN_C7,PARITY=N,BITS
=8,TIMEOUT=10)
#users232(stream=PAD,baud=9600,xmit=PIN_C1,rcv=PIN_C2,PARITY=N,BITS
=8,TIMEOUT=10)
#include <stdlib.h>
#include "PIC18F4550_registers.h"
#bit ON=_PORTD.4
#bit princ=_PORTB.0 #bit S1=_PORTB.1 #bit S2=_PORTB.2 #bit S3=_PORTB.3 #bit S4=_PORTB.4 #bit S5=_PORTB.5
#bit mov=_PORTD.7 #bit RELE=_PORTD.6
#bit tON=_TRISD.4 #bit tPrinc=_TRISB.0 #bit tS1=_TRISB.1 #bit tS2=_TRISB.2 #bit tS3=_TRISB.3 #bit tS4=_TRISB.4 #bit tS5=_TRISB.5 #bit tMov=_TRISD.7 #bit tRele=_TRISD.6
char clave[15]={0}; char telefono[15]={0}; char telefono2[15]={0};
char sensActivo[10]={0}; char sensActual[10]={0};
char sensHaSidoActivado[10]={0}; char claveRecibida=0;
char recibido[50]; char mensaje[200]; char hab;
char SensMovimientoAct=0; char SensIngresoAct=0;
char pedirClave(); char pedirTelefono(); char pedirTelefono2(); char pedirSenActivo();
char enviarSenActual(); void fn();
void llamar();
void enviarMensaje(char queTelefono); void encender();
void configurar(); void ActSensActual();
char ComprobarAlarma();
#define SEGUNDOS_PARA_QUE_ACTIVE_ALARMA 80
char contadorSeg2=0; char contadorSeg3=0; char numeroSMS[20];
char numeroSMScomprobado=0;
char Comprobar(char *texto)
{
char i,len; len=strlen(texto); for(i=0;i<len;i++)
{
if(getc(GSM)!=texto) return 0;
}
return 1;
}
int notificarON=0,notificarOFF=0; #INT_RDA
void RDA_isr()
{
char t[]="+CMT: \"+593";
char i; if(contadorSeg2>1)
{
numeroSMScomprobado=0;
}
contadorSeg2=0; if(numeroSMScomprobado==0)
{
if(Comprobar(t)==1)
{
numeroSMS[0]='0'; i=1;
do{ numeroSMS=getc(GSM); i++;
}while(i<19 && numeroSMS[i-1]!='\"'); numeroSMS[i-1]='\0'; if(strcmp(numeroSMS,telefono+1)==0)
{
numeroSMScomprobado = 1;
}
else if(strcmp(numeroSMS,telefono2+1)==0)
{
numeroSMScomprobado = 1;
}
}
}
else
{
Recibido [ 0 ] = getc ( GSM ); If ( recibido [ 0 ] == ' # ' )
{
char len;
fgets ( recibido+1,GSM ); len=strlen(recibido+1);
for ( i=len+1;i<50;i++ ) recibido = ' \0 ' ; recibido[len]='\0';
recibido[45]='\0'; notificarOFF=0; notificarON=0; if(recibido[len-1]=='f')
{
if(recibido[len-2]=='f')
{
if(recibido[len-3]=='o')
{
notificarOFF=10; recibido[len-3]='\0';
}
}
}
else if(recibido[len-1]=='n')
{
if(recibido[len-2]=='o')
{
notificarON=10; recibido[len-2]='\0';
}
}
if(strcmp(clave+1,recibido+1)==0)
{
claveRecibida=1;
}
else
{
notificarON=0; notificarOFF=0;
}
numeroSMScomprobado=0;
}
}
}
int16 contadorSeg=0;
char contadorCuartoSeg=0; #INT_TIMER1
void ISR_TIMER1()
{ SET_TIMER1(3036);
contadorCuartoSeg++; if(contadorCuartoSeg>=4)
{
contadorSeg++; contadorCuartoSeg=0; contadorSeg2++;
contadorSeg3++;
}
}
void main()
{
char text[10],i,j,k,est,alarma; int16 cont;
SETUP_CCP1(CCP_OFF);
SETUP_CCP2(CCP_OFF);
_PORTA=0;
_PORTB=0;
_PORTD=0
ON=1;
rele=0; tON=1;
tPrinc=1; tS1=1; tS2=1; tS3=1; tS4=1; tS5=1;
tMov=1; tRele=0; encender(); configurar();
pedirTelefono ( ); pedirTelefono2 ( ); pedirClave(); pedirSenActivo ( );
mensaje [0]= '\0';
alarma =0; claveRecibida=0;
SET_TIMER1 (0);
SETUP_TIMER_1 (T1_INTERNAL|T1_DIV_BY_8);
ENABLE_INTERRUPTS(GLOBAL); ENABLE_INTERRUPTS(PERIPH); ENABLE_INTERRUPTS(INT_RDA); ENABLE_INTERRUPTS(INT_TIMER1);
notificarON=0; notificarOFF=0;
putc('D',PAD);
while(1)
{
for(j=0;j<5;j++)
{
for(cont=0;cont<100;cont++)
{
if(notificarOFF>0)
{ putc('K',PAD);
if(getc(PAD)=='k')
{
notificarOFF=0;
sprintf(mensaje, "Sistema Desactivado"); enviarMensaje (1);
enviarMensaje (2); pedirSenActivo ( );
}
}
if(notificarON>0)
{ putc('Q',PAD);
if(getc(PAD)=='q')
{
notificarON=0; sprintf(mensaje,"Sistema Activado"); enviarMensaje (1);
enviarMensaje (2); pedirSenActivo ();
}
}
ActSensActual ( ); est=ComprobarAlarma ( ); if(est>0)
{
alarma=1;
}
if(alarma==1)
{
rele=1; pedirClave ( ); for(i=0;i<10;i++)
sensHaSidoActivado=0; claveRecibida=0; enviarMensaje (1);
enviarMensaje (2); mensaje[0]='\0';
putc('A',PAD);
if(getc(PAD)=='a')
{
do{ delay_ms(100); putc('B',PAD);
i=getc(PAD);
}
while((claveRecibida==0) && (i!='s')); delay_ms(100);
putc('D',PAD);
delay_ms (100); pedirSenActivo ();
rele=0; alarma=0;
SensMovimientoAct=0; SensIngresoAct=0; if(notificarOFF==0)
{
sprintf(mensaje,"Alarma Desactivada"); enviarMensaje(1);
enviarMensaje(2);
}
}
}
delay_ms(1);
}
switch(j)
{
case 0: pedirTelefono ( ); break;
case 1: pedirTelefono2( ); break;
case 2: pedirSenActivo (); break;
case 3: pedirClave ( ); break;
case 4: ActSensActual ( ); enviarSenActual ( ); break;
}
}
};
}
char pedirClave z( ) char i; putc('R',PAD);
if(getc(PAD)=='r')
{ putc('C',PAD);
clave[0]=getc(PAD); if(clave[0]<15)
{
for(i=1;i<=clave[0];i++) clave=getc(PAD); clave[clave[0]+1]='\0'; return 1;
}
}
return 0;
}
char pedirTelefono ( )
{
char i; putc('R',PAD);
if(getc(PAD)=='r')
{ putc('T',PAD);
telefono[0]=getc(PAD); if(telefono[0]<15)
{
for(i=1;i<=telefono[0];i++) telefono=getc(PAD); telefono[telefono[0]+1]='\0';
}
}
}
char pedirTelefono2 ( )
{
char i; putc('R',PAD);
if(getc(PAD)=='r')
{ putc('V',PAD);
telefono2[0]=getc(PAD); if(telefono2[0]<15)
{
for(i=1;i<=telefono2[0];i++) telefono2=getc(PAD); telefono2[telefono2[0]+1]='\0';
}
}
}
char pedirSenActivo()
{ putc('R',PAD);
if(getc(PAD)=='r')
{
char i; putc('S',PAD);
for(i=0;i<10;i++) sensActivo=getc(PAD);
}
char enviarSenActual()
{
char i;// putc('R',PAD);// if(getc(PAD)=='r')//
{ putc('U',PAD);
delay_us(10); for(i=0;i<10;i++) putc(sensActual,PAD);
}
}
void fn()
{
fprintf(GSM,"%c%c",13,10);
void enviarMensaje(char queTelefono)
{
if(queTelefono==1 && telefono[0]==0) return;
if(queTelefono==2 && telefono2[0]==0) return;
fprintf(GSM,"AT+CMGF=1\r"); delay_ms(200); if(queTelefono==1)
{
fprintf(GSM,"AT+CMGS=\"%s\"",telefono+1);fn();
}
else if(queTelefono==2)
{
fprintf(GSM,"AT+CMGS=\"%s\"",telefono2+1);fn();
}
delay_ms(500); fprintf(GSM,mensaje); fn();
delay_ms(100); putc(26,GSM);fn(); delay_ms (100); fn();
delay_ms (5000);
}
void encender ( )
{
delay_ms (1000); ON=1;
delay_ms (1000); ON=0;
delay_ms(10000);
}
void configurar()
{
fprintf(GSM,"AT+CMGF=1\r");fn ( ); delay_ms(100); fprintf(GSM,"AT+CNMI=2,2,0,0,0\r");fn ( );
delay_ms (100);
}
void ActSensActual ( )
{
sensActual[0]=princ+'0'; sensActual[1]=S1+'0'; sensActual[2]=S2+'0'; sensActual[3]=S3+'0'; sensActual[4]=S4+'0'; sensActual[5]=S5+'0'; sensActual[6]=mov+'0';
}
char OK[5];
char ComprobarAlarma ( )
{
char buff[150]={0}; char i;
i=0;
if(sensActivo[7]=='1')
{
sprintf(mensaje,"Se ha activado:\n");
if(sensActivo[0]=='1' && sensActual[0]=='0' && sensHaSidoActivado[0]==0)
{
sensHaSidoActivado[0]=1; i++;
sprintf(buff,"%sP. Principal\n",mensaje); strcpy(mensaje,buff);
}
if(sensActivo[1]=='1' && sensActual[1]=='0' )
{
SensIngresoAct=1;
}
if(SensIngresoAct==1 && sensHaSidoActivado[1]==0)
{
if(OK[1]==0)
{
char c; putc('A',PAD);
c=getc(PAD); if(c=='a')
OK[1]=1;
}
if(contadorSeg3>SEGUNDOS_PARA_QUE_ACTIVE_ALARMA)//mayor que 1 minutos
{ i++;
sprintf(buff,"%sP. Ingreso\n",mensaje); strcpy(mensaje,buff); sensHaSidoActivado[1] = 1;
OK[1]=0;
}
}
else
{
OK[1] = 0;
contadorSeg3 = 0;
}
if(sensActivo[2]=='1' && sensActual[2]=='0' && sensHaSidoActivado[2]==0)
{
sensHaSidoActivado[2]=1; i++;
sprintf(buff,"%sP. Patio trasero\n",mensaje); strcpy(mensaje,buff);
}
if(sensActivo[3]=='1' && sensActual[3]=='0' && sensHaSidoActivado[3]==0)
{
sensHaSidoActivado[3]=1; i++;
sprintf(buff,"%sP. Posterior\n",mensaje); strcpy(mensaje,buff);
}
if(sensActivo[4]=='1' && sensActual[4]=='0' && sensHaSidoActivado[4]==0)
{
sensHaSidoActivado[4]=1; i++;
sprintf(buff,"%sP. Corrediza 1\n",mensaje); strcpy(mensaje,buff);
}
if(sensActivo[5]=='1' && sensActual[5]=='0' && sensHaSidoActivado[5]==0)
{
sensHaSidoActivado[5]=1; i++;
sprintf(buff,"%sP. Corrediza 2\n",mensaje); strcpy(mensaje,buff);
}
if(sensActivo[6]=='1' && sensActual[6]=='0' )
{
SensMovimientoAct = 1;
}
if(SensMovimientoAct==1 && sensHaSidoActivado[6]==0)
{
if(OK[0]==0)
{
char c; putc('A',PAD);
c=getc(PAD); if(c=='a')
OK[0]=1;
}
if(contadorSeg>SEGUNDOS_PARA_QUE_ACTIVE_ALARMA)
{ i++;
sprintf(buff,"%sS. Movimiento\n",mensaje); strcpy(mensaje,buff); sensHaSidoActivado[6] = 1;
OK[0]=0;
}
}
else
{ OK[0]=0;
contadorSeg = 0;
}
else
{
sprintf(buff,"%s\nEnvie codigo para detener alarma",mensaje); strcpy(mensaje,buff);
return i;
}
SensMovimientoAct = 0;
SensIngresoAct = 0;
contadorSeg3 = 0;
contadorSeg = 0;
OK[0] = 0;
OK[1] = 0;
}
return 0;
}
Programación del microcontrolador esclavo
Código:
#include <main.h>
#use rs232(stream=PAD,baud=9600,xmit=PIN_C6,rcv=PIN_C7,PARITY=N,BITS
=8,TIMEOUT=10)
#include "PIC18F4550_registers.h" #define FAST_GLCD
#include "HDM64GS12.c" #include "graphics.c" #include <stdlib.h>
#define pad_C0 PIN_E2 #define pad_C1 PIN_E1 #define pad_C2 PIN_E0 #define pad_C3 PIN_A5 #define pad_F0 PIN_A3 #define pad_F1 PIN_A2 #define pad_F2 PIN_A1 #define pad_F3 PIN_A0
#define cargaTMR0 64286
#define dirClave 2
#define dirTelefono 17
#define dirTelefono2 54
#define dirActivos 35
#bit Blight=_PORTC.2 #bit tBlight=_TRISC.2
const char teclado[4][4]={
{ ' 1 ',' 2 ',' 3 ',' A '},
{' 4 ',' 5 ',' 6 ',' B '},
{' 7 ',' 8 ',' 9 ',' C '},
{' * ',' 0 ',' # ',' D '}};
char posX=0,posY=0; char tecla;
char mSeg,Seg,Seg2,Min;
char clave[20]={0}; char telefono[20]={0}; char telefono2[20]={0};
char sensActivo[10]={0}; char sensActual[10]={0};
char alarmaActiva=0;
char alarmaRespondida=0;
const int16 tiempoMax=80; void putc ( char c );
char getDown ( );
char getEntero(char *Titulo,char len,char *resultado,char segMax,char minMax,char habExit); void imprimirLogo ( );
void actPantalla ( ); void dibujarMarco ( );
void modLuz(char delay,char final);
void menú ( char segMax, char minMax); char medio ( char len);
void guardarEepromClave ( ); void guardarEepromNumero ( ); void guardarEepromNumero2 ( );
void guardarEepromSensActivo ( ); void apagarPantalla ( );
void mostrarContrasenaIncorrecta ( ); void leerEepromClave ( );
void leerEepromNumero ( ); void leerEepromNumero2 ( ); void leerEepromSensActivo();
#INT_TIMER0
void timer0_isr()
{ SET_TIMER0(cargaTMR0);
mSeg++; if(mSeg>=100)
{
mSeg=0; Seg++; Seg2++;
if(Seg>=60)
{
Seg=0; Min++;
}
}
}
#INT_RDA
void RX_isr ( )
{
char buffer [ 10 ],i; buffer[0]=getc ( PAD ); switch(buffer [ 0 ] )
{
case 'A':
putc ( 'a',PAD ); alarmaActiva=1; alarmaRespondida=0; break;
case 'D':
putc ( 'd',PAD ); alarmaActiva=0; break;
case 'B':
if ( alarmaRespondida==1)
{
putc ( 's',PAD ); alarmaRespondida=0;
}
else
{
putc ( 'n',PAD );
}
break; case 'T':
putc ( teléfono [ 0 ], PAD ); delay_us ( 50 ); for(i=1;i<=telefono[0];i++)
{
putc ( telefono [ i ],PAD ); delay_us(10);
}
case 'V': putc(telefono2[0],PAD); delay_us(50); for(i=1;i<=telefono2[0];i++)
{
putc(telefono2,PAD); delay_us(10);
}
break; case 'S':
for(i=0;i<10;i++)
{
putc ( sensActivo [ i ], PAD ); delay_us (10);
}
break; case 'C':
putc(clave[0],PAD); delay_us (50);
for (i=1;i<=clave[0];i++)
{
putc (clave,PAD); delay_us (10);
}
break; case 'U':
for(i=0;i<10;i++) sensActual =getc (PAD); break;
case 'R':
putc ('r',PAD); break;
case 'K':
putc ( 'k',PAD ); sensActivo [7]='0'; break;
case 'Q':
putc ( 'q',PAD );
sensActivo[7]='1'; break;
}
}
void main()
{
char textos[5][20]={0}; char tecla,i,estado;
setup_comparator(NC_NC_NC_NC); SETUP_ADC_PORTS(NO_ANALOGS);
SETUP_TIMER_0(T0_INTERNAL|T0_DIV_16); SET_TIMER0(cargaTMR0);
SETUP_TIMER_2( T2_DIV_BY_16,255,1); SETUP_CCP1(CCP_PWM); SET_PWM1_DUTY(0);
tBlight=0; mSeg=0; Seg=0; Min=0; Blight=0;
alarmaActiva=0; alarmaRespondida=0;
strcpy(sensActual,"1111111");
_TRISB=0xFF;
_RBPU=0;
if((read_eeprom(0)!=0xAA && read_eeprom(1)!=0x55) || ((_PORTB&0x40)==0) )
{
write_eeprom(0,0xAA); write_eeprom(1,0x55);
clave[0]=5; strcpy(clave+1,"12345");
telefono[0]=10; strcpy(telefono+1,"0983918659");
telefono2[0]=10; strcpy(telefono2+1,"0959210710");
strcpy(sensActivo,"111111111");
guardarEepromClave (); guardarEepromNumero (); guardarEepromNumero2 (); guardarEepromSensActivo ();
}
else
{
leerEepromClave(); leerEepromNumero(); leerEepromNumero2(); leerEepromSensActivo();
}
_RBPU=1;
ENABLE_INTERRUPTS(GLOBAL); ENABLE_INTERRUPTS(PERIPH); ENABLE_INTERRUPTS(INT_RDA); ENABLE_INTERRUPTS(INT_TIMER0);
glcd_init(1);
modLuz(1,255); imprimirLogo(); actPantalla(); delay_ms(500);
while(1)
{
modLuz (1,255); sprintf(textos[0],"Ingrese contrase%ca\n" " para ir a opciones",131);
estado=getEntero(textos[0],20,textos[1],10,0,1); if(estado==1)
{
if(strcmp(textos[1],clave+1)==0)
{
menu(20,0); apagarPantalla();
}
else
{
mostrarContrasenaIncorrecta();
}
}
else if(estado==0)
{
apagarPantalla();
}
if(alarmaActiva==1) while(AlarmaActiva==1)
{
modLuz(1,255); sprintf(textos[0],"Ingrese contrase%ca\n" " para apagar alarma",131);
estado=getEntero(textos[0],20,textos[1],10,0,0);
if(estado==1)
{
if(strcmp(textos[1],clave+1)==0)
{
alarmaActiva=0; alarmaRespondida=1; sensActivo[7]='0'; glcd_fillscreen(0); posY=15; posX=medio(6);
printf(putc,"ALARMA\n\n"); posX=medio(7); printf(putc,"APAGADA"); dibujarMarco(); actPantalla(); delay_ms(1000);
}
else
{
mostrarContrasenaIncorrecta();
}
}
}
}
}
void imprimirLogo()
{
int16 i,j; for(i=0;i<8;i++) for(j=0;j<64;j++)
{
displayData.left[j+i*64]=logo1[128*i+j]; displayData.right[j+i*64]=logo1[128*i+j+64];
}
posX=110;posY=56; printf(putc,"1.0");
}
void putc(char c)
{
char buff[]={'\0','\0'};/ if(posY>=57)
return; buff[0]=c;
if(posX >=128)
{
posX=0; posY+=8;
}
glcd_text57(posX,posY,buff,1,1); posX+=6;
if(c=='\n')
{
if(posy<55)posY+=8; posX=0;
}
}
char getDown()
{
const int16 COLUMNAS[]={pad_C0,pad_C1,pad_C2,pad_C3}; char i;
_TRISA=0x0F;
_TRISE=0x00;
output_low(pad_C0); output_low(pad_C1); output_low(pad_C2); output_low(pad_C3);
for(i=0;i<4;i++)
{
output_high(COLUMNAS); if(input(pad_F0))
return teclado[0]; if(input(pad_F1)) return teclado[1]; if(input(pad_F2)) return teclado[2]; if(input(pad_F3)) return teclado[3];
output_low(COLUMNAS);
}
return 0;
}
char getEntero(char *Titulo,char len,char *resultado,char segMax,char minMax,char habExit)
{
char text[15]={0}; char i,tecla=0; if(len==0) len=strlen(Titulo); i=0;
Seg=0; Min=0; do
{
tecla=getDown(); if(tecla)
{
Seg=0; Min=0;
if(tecla>='0' && tecla <='9' && i<10)
{
text[i++]=tecla; text='\0';
}
else if(tecla=='*' && i>0)
{
text[--i]='\0';
}
}
glcd_fillscreen(0);
//glcd_text57(63-(len+1)*5/2,10,Titulo,1,1); posX=(63-(len+1)*5/2);
posY=10; printf(putc,Titulo);
posX=63-(i+1)*5/2; posY+=15; printf(putc,"%s",text);
dibujarMarco();
actPantalla(); if(tecla)
{
delay_ms(250); while(getDown());
}
if(segMax>0 || minMax>0)
{
if(min>=minMax)
{
if(seg>=segMax) return 0;
}
}
if(habExit)
{
if(alarmaActiva==1) return 2;
}
}while(tecla!='D'); while(getDown()); strcpy(resultado,text); return 1;
}
void actPantalla()
{
#ifdef FAST_GLCD glcd_update(); #endif
}
void dibujarMarco()
{
glcd_line(0,1,127,1,1);
glcd_line(0,3,127,3,1); glcd_line(0,62,127,62,1); glcd_line(0,60,127,60,1);
glcd_line(1,0,1,63,1);
glcd_line(3,0,3,63,1); glcd_line(126,0,126,63,1); glcd_line(124,0,124,63,1);
}
void modLuz (char delay,char final)
{
char i;
if(final>(unsigned char)CCP_1) for(i=(unsigned char)CCP_1;i<final;i++)
{ SET_PWM1_DUTY(i);
delay_ms(delay);
}
else if(final<CCP_1)
for(i=(unsigned char)CCP_1;i>final;i--)
{ SET_PWM1_DUTY(i);
delay_ms(delay);
}
}
void imprActivo(char est)
{
If (est=='1')
printf (putc," Activada "); else
printf (putc,"Desactivada"); break;
}
void imprAbierto(char est)
{
if(est=='0') printf(putc,"Abierta"); else
printf (putc,"Cerrada"); break;
}
char NegChar(char val)
{
if(val=='1') return '0'; else
return '1';
char medio(char len)
{
return 63-(len+1)*5/2;
}
void mostrarMenuPuertas(char *nombrePuerta,char senActivo,char senActual)
{
glcd_fillscreen(0); posY=5;
posX=5;
printf ( putc,"%s\n",nombrePuerta); posX=medio(11);
imprActivo ( senActivo ); posY+=13; posX=medio(13);
printf(putc,"Estado actual\n"); posX=medio(12); printf(putc,"del sensor\n"); posX=medio(7); imprAbierto(senActual); dibujarMarco();
}
char mostrarCuentaRegresiva()
{
Seg2=0;
while(getDown()); while(seg2<tiempoMax)
{
if(getDown())
{
while(getDown()); return 0;
}
glcd_fillscreen(0); posY=6; posX=medio(13);
printf(putc,"Tiene %d seg",tiempoMax); posY+=12;
posX=medio(19); printf(putc,"para que se active"); posY+=12;
posX=medio(9); printf(putc,"la alarma"); posX=medio(7); posY=40;
printf(putc,"%3d seg",(int)tiempoMax-Seg2); dibujarMarco();
actPantalla(); delay_ms(200);
}
return 1;
void menu(char segMax,char minMax)
{
char sel,tecla,salir,resp; char strings[50];
sel=0; salir=0; do{ min=0; seg=0;
if(tecla=='A')
{
if(sel>0)sel--;
}
else if(tecla=='B')
{
if(sel<10) sel++;
}
switch(sel)
{
case 0:
if(tecla=='C')
{
resp=negChar(sensActivo[7]); if(resp=='1')
{
mostrarCuentaRegresiva(); salir=1;
}
sensActivo[7]=resp; guardarEepromSensActivo();
}
glcd_fillscreen(0); posY=12; posX=medio(19);
printf(putc,"ACTIVACION GENERAL\n"); posX=medio(12);
printf(putc,"DE LA ALARMA\n\n"); posX=medio(11); imprActivo(sensActivo[7]); dibujarMarco();
break; case 1:
if(tecla=='C')
{
sensActivo[0]=negChar(sensActivo[0]); guardarEepromSensActivo();
}
strcpy(strings," K1: Puerta\n" " Principal");
mostrarMenuPuertas(strings,sensActivo[0],sensActual[0]); break;
case 2:
if(tecla=='C')
{
sensActivo[1]=negChar(sensActivo[1]); guardarEepromSensActivo();
}
strcpy(strings," K2: Puerta de\n" " Ingreso");
mostrarMenuPuertas(strings,sensActivo[1],sensActual[1]); break;
case 3:
if(tecla=='C')
{
sensActivo[2]=negChar(sensActivo[2]); guardarEepromSensActivo();
}
strcpy(strings," K3: Puerta acceso \n" " de patio trasero");
mostrarMenuPuertas(strings,sensActivo[2],sensActual[2]); break;
case 4:
if(tecla=='C')
{
sensActivo[3]=negChar(sensActivo[3]); guardarEepromSensActivo();
}
strcpy(strings," K4: Puerta \n" " posterior");
mostrarMenuPuertas(strings,sensActivo[3],sensActual[3]); break;
case 5:
if(tecla=='C')
{
sensActivo[4]=negChar(sensActivo[4]); guardarEepromSensActivo();
}
strcpy(strings,"K5: Puerta corrediza\n" " posterior 1");
mostrarMenuPuertas(strings,sensActivo[4],sensActual[4]); break;
case 6:
if(tecla=='C')
{
sensActivo[5]=negChar(sensActivo[5]); guardarEepromSensActivo();
}
strcpy(strings,"K6: Puerta corrediza\n" " posterior 2");
mostrarMenuPuertas(strings,sensActivo[5],sensActual[5]); break;
case 7:
if(tecla=='C')
{
sensActivo[6]=negChar(sensActivo[6]);
guardarEepromSensActivo();
}
strcpy(strings," Sensor de\n" " movimiento");
mostrarMenuPuertas(strings,sensActivo[6],sensActual[6]); break;
case 8:
if(tecla=='C')
{
strcpy(strings,"Nuevo telefono 1"); if(getEntero(strings,0,strings,0,1,0))
{
strcpy(telefono+1,strings); telefono[0]=strlen(telefono+1); guardarEepromNumero();
}
}
glcd_fillscreen(0); posY=12; posX=medio(14);
printf(putc,"Cambiar numero\n"); posX=medio(11);
printf(putc,"de telefono 1\n\n"); posX=medio(telefono[0]); printf(putc,"%s",telefono+1); dibujarMarco();
break; case 9:
if(tecla=='C')
{
strcpy(strings,"Nuevo telefono 2"); if(getEntero(strings,0,strings,0,1,0))
{
strcpy(telefono2+1,strings); telefono2[0]=strlen(telefono2+1); guardarEepromNumero2();
}
}
glcd_fillscreen(0); posY=12; posX=medio(14);
printf(putc,"Cambiar numero\n"); posX=medio(11);
printf(putc,"de telefono 2\n\n"); posX=medio(telefono[0]); printf(putc,"%s",telefono2+1); dibujarMarco();
break; case 10:
if(tecla=='C')
{
sprintf(strings,"Nueva contrase%ca",131); if(getEntero(strings,0,strings,0,1,0))
{
strcpy(clave+1,strings); clave[0]=strlen(clave+1); guardarEepromClave();
}
}
glcd_fillscreen(0); posY=12; posX=medio(7); printf(putc,"Cambiar\n"); posX=medio(10);
printf(putc,"contrase%ca\n\n",131); posX=medio(clave[0]); printf(putc,"%s",clave+1); dibujarMarco();
break; break;
}
actPantalla(); delay_ms(100); tecla=getDown(); if(segMax>0 || minMax>0)
{
if(min>=minMax)
{
if(seg>=segMax) return ;
}
}
if(alarmaActiva==1)
{
return ;
}
}while(tecla!='D' && salir==0); delay_ms(250); while(getDown());
glcd_fillscreen(0); posY=15; posX=medio(7);
printf(putc,"CAMBIOS\n\n"); posX=medio(9); printf(putc,"GUARDADOS"); dibujarMarco();
actPantalla(); delay_ms(1000);
}
void guardarEepromClave()
{
char i;
if(clave[0]<15) for(i=0;i<=clave[0];i++) write_eeprom(dirClave+i,clave);
}
void guardarEepromNumero ( )
{
char i; if(telefono[0]<15)
for(i=0;i<=telefono[0];i++) write_eeprom(dirTelefono+i,Telefono);
}
void guardarEepromNumero2 ( )
{
char i; if(telefono2[0]<15)
for(i=0;i<=telefono2[0];i++) write_eeprom(dirTelefono2+i,Telefono2);
}
void guardarEepromSensActivo()
{
char i; for(i=0;i<10;i++)
write_eeprom(dirActivos+i,sensActivo);
}
void leerEepromClave()
{
char i; clave[0]=read_eeprom(dirClave); if(clave[0]<15)
{
for(i=1;i<=clave[0];i++) clave=read_eeprom(dirClave+i); clave[clave[0]+1]='\0';
}
}
void leerEepromNumero()
{
char i; telefono[0]=read_eeprom(dirTelefono); if(telefono[0]<15)
{
for(i=1;i<=telefono[0];i++) telefono=read_eeprom(dirTelefono+i); telefono[telefono[0]+1]='\0';
}
}
void leerEepromNumero2()
{
char i; telefono2[0]=read_eeprom(dirTelefono2); if(telefono2[0]<15)
{
for(i=1;i<=telefono2[0];i++) telefono2=read_eeprom(dirTelefono2+i); telefono2[telefono2[0]+1]='\0';
}
}
void leerEepromSensActivo()
{
char i; for(i=0;i<10;i++)
sensActivo=read_eeprom(dirActivos+i);
}
void apagarPantalla()
{
glcd_fillscreen(0); actPantalla(); modLuz(1,0);
SETUP_TIMER_2(T2_DISABLED,255,1);
while(!getDown ( )); delay_ms (250); while(getDown ( ) ) ;
SETUP_TIMER_2( T2_DIV_BY_16,255,1);
}
void mostrarContrasenaIncorrecta()
{
glcd_fillscreen(0); posX=20; posY=20;
printf(putc,"Contrase%ca\n Incorrecta",131); dibujarMarco();
actPantalla(); delay_ms(5000);
}