proyecto 2 : Cerradura electrónica inteligente

Cerradura electrónica inteligente


Objetivo general

  • Programar un PIC de manera que este nos ayude a tener un control en finanzas junto con una bandeja donde depositemos el dinero. .

Objetivos Específicos

  • Mediante el uso de "maquina de estados" elaboraremos 2 estados que serán de ejecución y programación.
  • Utilizaremos un programa usando operaciones matemáticas básicas de suma y resta para variar los datos.

Justificación

-Esta investigación, tiene como objetivo ayudar a las personas, las cuales, muchas tiene problemas financieros, de orden con el dinero o para administrarlo.Este proyecto beneficiara no solo a la economía de las personas, sino que provocaría una mejor administración en el aspecto económico .

Diagrama de bloques


Simulación en Proteus


Código hecho en PIC C Compiler 

#include <16f877a.h>
#USE DELAY(CLOCK=4M)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,NOPUT,NOLVP
//#DEFINE USE_PORTD_LCD TRUE
#define LCD_DB4   PIN_D4 
#define LCD_DB5   PIN_D5
#define LCD_DB6   PIN_D6
#define LCD_DB7   PIN_D7
#define LCD_RS    PIN_D2
#define LCD_E     PIN_D3
#DEFINE USE_PORTB_KBD //se esta usando el puerto B.*/
#INCLUDE<KBD4x4_1.c> //Incluir en el encabezado el driver para
#INCLUDE<lcd1.c>
#BYTE PORTC= 7
#rom 0x2100={'0','0','0','0','0','0'}
//#BYTE PORTD= 5
#BYTE PORTB= 6
//#DEFINE LED1 PORTD,0
//#DEFINE LED2 PORTD,1
#DEFINE LED3 PORTC,0
#DEFINE LED4 PORTC,1
#BYTE WPUB= 0X95 // declarar registro option
#BYTE OPTION_REG = 0X81
//INT CONT;
//BYTE J=16;
CHAR K;
int estado;
INT MIL,CEN,DEC,UNI,VAL;
long int cuenta=0100;
int sinal;
VOID TECLADO()
{
   k=kbd_getc(); //Llamar la función del teclado y almacenar
   //el valor digitado en una variable tipo
   //carácter. Si no se oprime ninguna tecla el
   //teclado retornara el carácter nulo.*/
   WHILE(k=='\0') //si no se oprime ninguna tecla sigue llamando al teclado.
   {
      k=kbd_getc();
   }
   IF( (k!='\0'))
   {
      IF(K=='0')//Si K es igual a cero
         VAL=0;//Val es igual a cero
      IF(K=='1')
         VAL=1;
      IF(K=='2')
         VAL=2;
      IF(K=='3')
         VAL=3;
      IF(K=='4')
         VAL=4;
      IF(K=='5')
         VAL=5;
      IF(K=='6')
         VAL=6;
      IF(K=='7')
         VAL=7;
      IF(K=='8')
         VAL=8;
      IF(K=='9')
         VAL=9;
   }
}

VOID monto()
{

   float cuenta=0000;
     printf(lcd_putc,"\f");
                    lcd_gotoxy(1,1);
                    printf(lcd_putc,"Saldo Total");
                    lcd_gotoxy(1,2);
                    printf(lcd_putc,"S/");
                    lcd_gotoxy(3,2);
                    printf(lcd_putc,"%.2f",cuenta);
                    TECLADO();        

      TECLADO();
      WHILE((k!='#'))
      {
         TECLADO();
      }
}

VOID cambio_monto()
{
     // int bandera=0;
      long nuevo=0,m,c,d,u;
      LCD_PUTC("\f");
      LCD_GOTOXY(1,1);
      LCD_PUTC("Cuenta Actual");
      LCD_GOTOXY(1,2);      
      //pedir_clave(); //Llama la funcion de pedir la clave
      //bandera=validar_clave(); //Compruebo si la clave actual es correcta
      //if(bandera==1)
      
      {
         LCD_PUTC("\f");
         LCD_GOTOXY(1,1);
         LCD_PUTC("nuevo monto");
         LCD_GOTOXY(1,2);
         printf(lcd_putc,"S/");
         lcd_gotoxy(3,2); 
         TECLADO();
         IF((k!='#')&&(k!='*'))
         {
            lcd_putc(k);
            MIL=VAL;
         }
        
         TECLADO();
         IF((k!='#')&&(k!='*'))
         {
            lcd_putc(k);
            CEN=VAL;
         }
         
         TECLADO();
         IF((k!='#')&&(k!='*'))
         {
            lcd_putc(k);
            DEC=VAL;
         }
         
         TECLADO();
         IF((k!='#')&&(k!='*'))
         {
            lcd_putc(k);
            UNI=VAL;
         } 
         TECLADO();
         WHILE((k!='#'))
         {
            TECLADO();
         }
         
         m=MIL*1000; //Convierto miles a numero
         c=CEN*10; //Convierto centemas a numero y lo sumo al anterior
         c=c*10;
         d=DEC*10; //Convierto decenas a numero y lo sumo al anterior
         u=UNI; //Convierto unidades a numero y lo sumo al anterior
         
         nuevo=m+c+d+u;
         
         cuenta=nuevo;
         WRITE_EEPROM(0,MIL); //Guarda en la eemprom posicion cero la nueva contraseña
         WRITE_EEPROM(1,CEN);
         WRITE_EEPROM(2,DEC);
         WRITE_EEPROM(3,UNI);
         WRITE_EEPROM(4,12); //Guardo un 12 en la posicion 1 de la EEPROM, para decir que tengo
                              //una contraseña guardada
         
      }
}

VOID MAIN()
{
   long m,c,d,u;
   OPTION_REG = 0; //en el MAIN desactivas el registro OPTION
   WPUB= 0B11111111;// y seleccionas los pullups q vas a utilizar
   SET_TRIS_B(0);
   SET_TRIS_C(0B00000000);
   KBD_INIT(); //Inicializar el driver del teclado en el //programa
   //ppal
   LCD_INIT();
   PORTC=0;
   sinal=READ_EEPROM(4); //Averiguo si tengo una contraseña guardada o no
   if(sinal!=12)
      cuenta=0000;
   else
   {
      m=READ_EEPROM(0); //Convierto miles a numero
      c=READ_EEPROM(1); //Convierto centemas a numero y lo sumo al anterior
      d=READ_EEPROM(2); //Convierto decenas a numero y lo sumo al anterior
      u=READ_EEPROM(3); //Convierto unidades a numero y lo sumo al anterior
      
      m=m*1000; //Convierto miles a numero
      c=c*10; //Convierto centemas a numero y lo sumo al anterior
      c=c*10;
      d=d*10; //Convierto decenas a numero y lo sumo al anterior
      
      cuenta=m+c+d+u;
   }
   WHILE(estado == 0)
   {
      lcd_putc("\f   BIENVENIDO ");  //
      lcd_putc("\n caja de ahorros  ");
      delay_ms(1000);
      lcd_putc("\fINGRESE SU CLAVE  ");
      DELAY_MS(1000);
      TECLADO();
      //LCD_PUTC("\f");
      LCD_GOTOXY(1,2);
      IF((k!='#')&&(k!='*'))
      {
         lcd_putc('*');
         UNI=VAL;
      }
      TECLADO();
      IF((k!='#')&&(k!='*'))
      {
         lcd_putc('*');
         DEC=VAL;
      }
      TECLADO();
      IF((k!='#')&&(k!='*'))
      {
         lcd_putc('*');
         CEN=VAL;
      }
      TECLADO();
      IF((k!='#')&&(k!='*'))
      {
         lcd_putc('*');
         MIL=VAL;
      }
      TECLADO();
      WHILE((k!='#'))
      {
         TECLADO();
      }
      IF((UNI==1)&&(DEC==2)&&(CEN==3)&&(MIL==4)) //Aquí se compara si
      //los números digitados
      //están correctos.*/
      {
         LCD_PUTC("\f"); //Se borra LCD
         LCD_GOTOXY(1,1);//Se ubica en la posición 1,1
         LCD_PUTC(" CLAVE CORRECTA ");
         lcd_putc ("\nAdelante!! ");
         output_high (PIN_D0);
         DELAY_MS(2000);
         output_low (PIN_D0); 
         estado = 1;
      }
      ELSE
      {
         LCD_PUTC("\f");
         LCD_GOTOXY(1,2);
         LCD_PUTC(" CLAVE INVALIDA ");
         output_high (PIN_D1);
         DELAY_MS(2000);
         output_low (PIN_D1); 
      }
   }
   
   WHILE(estado == 1)
   {
   float cuenta;
      //printf(lcd_putc,"%.2f",cuenta);  //Muestra el dinero depositado
      //delay_ms(500);
      printf(lcd_putc,"\f");
                    lcd_gotoxy(1,1);
                    printf(lcd_putc,"Saldo Total");
                    lcd_gotoxy(1,2);
                    printf(lcd_putc,"S/");
                    lcd_gotoxy(3,2);
                    printf(lcd_putc,"%.2f",cuenta);
                    TECLADO();        
      if(k=='*')
        { 
        lcd_putc("\f   Ingrese nuevo ");  //
        lcd_putc("\n   monto  ");
        delay_ms(1000);  
      estado=0;
while{
k=kbd_getc(); // leer la tecla presiono 
if(k!=0){
      dato[estado]=k; 
      
      lcd_gotoxy(i,2); // posicion i de la segunda linea 
      lcd_putc('*');
         }
         }
         for()
         clave[estado]=read_eeprom(i); //guarda la constraseña  en el vector clave 
   
   {
      lcd_putc("\fSaldo guardado! ");
      lcd_putc("\nAdelante!!  ");
     
      delay_ms(2000);
      lcd_putc("\f   Monto total ");  //
        printf(lcd_putc,"%.2f",cuenta);
        delay_ms(1000);  
estado=0;
        }
        
      else
      {
         WHILE((k!='#'))
         {
         TECLADO();
         //if(k=='*')
       // cambio_monto();
         }
      } 
   }
}


Presentación fisica 



Para conocer el proyecto con mayor cantidad de detalles se le invita a revisar el  documento adjunto ( PAPER )


Comentarios