Llave electrónica con PIC

hola wilfretronic mira que a la hora de compilar este programa en el ccs me salen demasiados errores ati te funciono porque a mi en realidad nooo espero tu pronta respuesta! gracias
 
Cuando coloqué el codigo si te das cuenta esto es en dos partes uno es una libreria del teclado modificado el cual lo tienes que guardar para ello hacer uso del software PIC C compiler el su libreria que esta donde instalaste el software y de ahí viene el código fuente de la cerradura, ahi si podras compilarlo y hacer, pero creo que esta bien claro y explicado en el principio del mismo.
 
Hola, me gusto tu proyecto y quisiera implementarlo pero cuando le pongo la clave de administrador 123 no hace nada ni tampoco me funcionan las teclas c y d. Espero tu respuesta sino alguien me podria responder, me urge demasiado
 
si esta explicado pero a la hora de compilar la parte del teclado para guardarlo en driver del pic compiler, a la hora de compilar me sale un error! que es esta parte
////////////////////////////////////////////////////////////////////////////////////////

// Caracteres ASCII asociados a cada tecla:
char const KEYS[4][4] = {{'1','2','3','A'} ,
{'4','5','6','B'} ,
{'7','8','9','C'} ,
{'*','0','#','D'} };
////////////////////////////////////////////////////////////
que dice lo siguiente :
A #DEVICE required before this line

The compiler requires a #device before it encounters any statement or compiler directive that may cause it to generate code. In general #defines may appear before a #device but not much more.

y traducido dice esto :
# Un dispositivo necesario antes de esta línea

El compilador requiere un dispositivo # antes de que encuentre cualquier declaración o directiva de compilación que puede causar para generar código. En general # define puede aparecer antes de un dispositivo # pero no mucho más.
es que estoy empezando en el mundo de los pics gracias :p
 
Hola a todos... soy nuevo en este foro... estaba mirando el programa que hizo Wilfretronic y es muy interesante lo que hizo... resulta que tengo que controlar la posicion de un servomotor digitando el angulo por teclado y visualizarlo en la LCD, pero resulta que digito un determinado angulo pero el servomotor muestra otro... sera que alguien me puede colaborar con esto... es que ya no se que hacerle al programa para que funcione correctamente... Gracias...

adjunto el codigo que estoy usando junto con las librerias q estoy usando...
 

Adjuntos

  • CONTROL DE POSICION SERVOMOTOR.rar
    86.4 KB · Visitas: 243
Ayuda proyecto PIC para activar relé
Buenos días, soy nuevo en el foro y en general en la electrónica, pero aprovecho para agradecer al foro y a los participantes por que es mucha la ayuda que he recibido de parte de ustedes.

En esta ocasión quiero solicitar ayuda para enfocar un proyecto con PIC que pretende activar un relé durante varios minutos (2 ó 3 minutos aprox.) partiendo de dos señales en milivoltios que son entregadas por unos sensores de gases.

El relé se debe activar si la primera señal esta entre 0.0 y 0.1 milivoltios y si la segunda señal esta entre 500 y 2000 milivoltios.

Agradezco sugerencias para iniciar el proyecto y seleccionar el mejor PIC e iniciar la programación ojalá en lenguaje Basic que es el único que hasta ahora medio manejo.
 
Que paso colega, observe tus intenciones de agregar un sistema de alarma al proyecto de la cerradura y me parecio verdaderamente genial. Asi es que me dispuse a hacer lo mismo, solo que no encuentro la forma de obtener una alarma al recibir 3 claves erroneas, me podrias ayudar por favor colega?;);

Ayuda sistema de Alarma
Que paso colega, observe tus intenciones de agregar un sistema de alarma al proyecto de la cerradura y me parecio verdaderamente genial. Asi es que me dispuse a hacer lo mismo, solo que no encuentro la forma de obtener una alarma al recibir 3 claves erroneas, me podrias ayudar por favor colega?;
 
Última edición:
e implementado el codigo pero cuando digito 123 no hace nada y ademas lo implemente con un pic18f452 y no me funciona que debo hacer porfa es urgent...........GRACIAS
 
ke tal compañero... oie diskulpa pero tengo problemas para grabar el pic, no se si el proyecto este protegido o tengo ke konfigurar algo... por tu atencion gracias... espero pronta respuesta
 
El PIC C compiler mas conocido como ccs.



Bueno amigo loq ue tienes que hacer es hacer un cambio en el codigo que la clave se guarde en la memori eprom del PIC y al leerlo darle la dirección de dodne lo guardaste y ahi si se guarda la última contraseña que cambiaste, bueno el programa que hice no utilizo el eprom, suerte.


Que paso amigo oie me podrias hechar la mano para agregar ese sistema de alarma del q hablas que tiene que sonar cada que se tecleen 3 claves incorrectas. En verdad te lo agradeceria demasiado.;)
 
si esta explicado pero a la hora de compilar la parte del teclado para guardarlo en driver del pic compiler, a la hora de compilar me sale un error! que es esta parte
////////////////////////////////////////////////////////////////////////////////////////

// Caracteres ASCII asociados a cada tecla:
char const KEYS[4][4] = {{'1','2','3','A'} ,
{'4','5','6','B'} ,
{'7','8','9','C'} ,
{'*','0','#','D'} };
////////////////////////////////////////////////////////////

El compilador requiere un dispositivo # antes de que encuentre cualquier declaración o directiva de compilación que puede causar para generar código. En general # define puede aparecer antes de un dispositivo # pero no mucho más.
es que estoy empezando en el mundo de los pics gracias :p

si n o me equivoco el compilador te esta pidiendo que definas el micro con el que estas trabajando si es el 16f877 tendrias que colocar algo como esto en el emcabezado del programa
#device pic16f877, aunque yo uso el wizard del compiler y solo selecciono el pic y los recursos que voy a usar y el me incluye la libreria del pic en el encabezado del programa te doy un ejemplo.


#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 BROWNOUT //Reset when brownout detected
#FUSES MCLR //Master Clear pin enabled
#FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOCPD //No EE protection

#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8)



void main()
{
 
saludos amigo tengo un problema resulta que copie su programa y funciono de maravilla la verdad te la comiste gracias inclusive lo monte y trabaja bien le cambio la clave y lo hace todo bien pero cuando se queda el pic sin tension hay q meterle la clave (123) de nuevo y volver a configurarlo como hago para q cuando cambie la clave y se quede sin tension el circuito no halla necesidad de volver a cambiar la clave sino q conserve la q yo le meta gracias seria bueno q resolvamos ese asuntico no le parece


ya arreglaron este problema de la memoria eeprom porque si no este proyecto no sirve para nada cada ves que se vaya la energia electrica toca volver a cambiar la clave..! :cry:
 
Hola colegas, acabo de terminar un proyecto que se llama "llave electrónica", para esto e utilizado el PIC 16f877, un LCD LM016 16x2, 15 pulsadores como teclado matricial.
Explicación:
-->An iniciar el programa te pide que digites A(administrador) ó B(Ingreso), necesariamente se tiene que entrar por primera vez al menu del administrador que su clave por defecto es "123" una vez dentro puedes cambiar las claves de cualqueira de los dos.
-->Cuando ayas colocado la clave del usuario recien podras ingresar.
-->Cada vez que digites mal la clave de acceso no te permitira el ingreso o mejor dicho no se acitvará la señal por el PIN RA0, cada ves que presiones una tecla se activará un pequeño pitido.
-->cuando no se utilice el sistema se apaga asta apretar cualquier tecla.
--> El circuito es el se encuentra en adjuntos:


--> Ahora muchos se preguntaran el programa?, lo hice el el lenguaje CCS, para controlar el teclado 4x4, tuve que hacerle unas modificaciones que tambien se lo publicaré aca abajo:

Código:
// Funciones para la gestión del teclado de la Trainer PLUS.

// char kbd_getc( )	Devuelve el código ASCII de la tecla pulsada.
//			Si no se pulsó ninguna, devuelve 0.


// Conexiones del teclado.
/*
            RB0 RB1 RB2 RB3
             ^   ^   ^   ^
             |   |   |   |
           |---|---|---|---|
  RB4 ---> | 1 | 2 | 3 | F |
           |---|---|---|---|
  RB5 ---> | 4 | 5 | 6 | E |
           |---|---|---|---|
  RB6 ---> | 7 | 8 | 9 | D |
           |---|---|---|---|
  RB7 ---> | A | 0 | B | C |
           |---|---|---|---|
*/

// Caracteres ASCII asociados a cada tecla:
char const KEYS[4][4] = {{'1','2','3','A'} ,
                         {'4','5','6','B'} ,
                         {'7','8','9','C'} ,
                         {'*','0','#','D'} };

#byte kbd_port_b = 6


char kbd_getc( )
{
  char tecla=0;
  int f,c,t,i,j;

  port_b_pullups(true);
  set_tris_b(0b00001111); // RB7-RB4 salidas, RB3-RB0 entradas

  for(f=0x10, i=0; i<4; f<<=1, i++)
  {
    for(c=0x01, j=0; j<4; c<<=1, j++)
    {
      kbd_port_b = ~f;
      delay_cycles(1);
      t = kbd_port_b & 0x0F;
      t = ~(t | 0xF0 );
      if(t == c)
      {
        delay_ms(20);
        tecla=KEYS[i ][j ];
        while(t==c)
        {
          restart_wdt( );
          t = kbd_port_b & 0x0F;
          t = ~(t | 0xF0) ;
        }
        break;
      }
    }
    if(tecla)
      break;
  }

  port_b_pullups(false);
  return tecla;
}

--> este archivo lo tienen que guardar con el nombre de kbd4x4.c  en el archivo DRIVES delprograma PICCCompiler.

-->Ahora si se puede compilar el programa que les muestro aca abajo:

#include <16f877.h>                                 //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT      //ordenes para el programador
#use delay (clock=4000000)                          //Fosc=4Mhz
#include<kbd4x4.c>                                  //libreria manejo keypad
#include<lcd.c>                                     //libreria manejo lcd 8bits
#byte porta=0x05
#use fast_io(b)
#use fast_io(d)

void menu_inicial(void);
void admin(void);
void menu_admin(void);
void usuario(void);
void cambio_admin(void);
void cambio_usuario(void);
char clave[16],a,limit;
char clavea[16]={'1','2','3'};
char limita=3;

signed char i, e;
boolean var=0;                  // variable donde se almacena la tecla precionada

void main(void)
 {
  inicio:
  lcd_init();
  set_tris_a( 0x00 );
  bit_clear(porta,2);            // Apaga el LCD.
  for(;;)
  {
   do{a=kbd_getc();             // hasta precionar una tecla.
     }while(a==0);
   bit_set(porta,1);            // Accionará un pitido
   delay_ms(500);
   bit_clear(porta,1);
   bit_set(porta,2);            // Prende el LCD.
   menu_inicial();              // Salto a menú principal.
   goto inicio;
  }
 }

//==============================================================================
//Saludo inicial.
//==============================================================================

void menu_inicial (void)
 {
  lcd_init();                   //inicializa lcd
  lcd_putc("   BIENVENIDO\n");  // Escribe en el lcd
  delay_ms(1000);               //Espero dos segundos
  lcd_putc("    WELCOME");      //Escribo en la segunda fila
  delay_ms(3000);               //Espero tres segundos
  uno:                          //Etiqueta UNO.
  lcd_putc("\fAdmin. -> A \nIngreso -> B"); //solicitud de clave.
  for(;;)
  {
   do{a=kbd_getc();
     }while(a==0);              //Hasta pulsar una tecla.

   bit_set(porta,1);            // Accionará un pitido
   delay_ms(100);
   bit_clear(porta,1);

   if(a=='A')
    {
     admin();
     delay_ms(1000);
     break;
    }
   if(a=='B')
    {
     usuario();
     delay_ms(1000);
     break;
    }
   if(a!= 'A' && 'B')
    {
     lcd_putc("\fTecla incorrecta\ncorrija x favor.");
     delay_ms(2000);
     goto uno;
    }
   }
 }

//==============================================================================
// Colocar clave
//==============================================================================

void usuario(void)
 {
  //dos:
  lcd_putc("\fINGRESE SU CLAVE\n");
  for(i=0; ;i++)
   {                                //bucle no sale...
    do{a=kbd_getc();
      }while(a==0);                 //...pulsar una tecla

    bit_set(porta,1);               // Accionará un pitido
    delay_ms(100);
    bit_clear(porta,1);

    lcd_putc("*");
    if(a=='C' || a=='D')            //si se pulsa C o D se sale de la funcion
     {
      if(i==0)                      //no se sale...
       {
        lcd_putc("\nEscribe una!");
        delay_ms(1000);
        lcd_putc("\n");
        lcd_gotoxy(1,2);
        i=-1;
        continue;
       }                             //...poner una clave valida
      if(i!=limit)                   //para ser correcto debe tener tb longitud correcta
      var=1;
      break;                         //salimos si se pulsa tecla * o #
     }
    if(a!=clave[i])                  //comprobacion de caracteres correctos
     var=1;                           //No es correcto->clave incorrecta
   }                                 //...hasta pulsar * o #
  if(var>0)
   {                                 //Clave incorrecta
    lcd_putc("\fAcceso denegado\n   Reintente!" );
    delay_ms(2000);
    break;
   }
  else
   {                                 //Clave correcta
    lcd_putc("\fAcceso permitido\n   Adelante!");
    delay_ms(1000);
    lcd_putc("\fNo olvide cerrar\n la puerta ...");
    bit_set(porta,0);                //Abre la puerta,
    delay_ms(2000);                  //Tiempo que se activará la chapa electrica.
    porta = 0x00;                    //Se desactiva la chapa electrica.
   }
  var=0;                             //reset var
 }

//==============================================================================
// Pedir la clave del administrador
//==============================================================================

void admin(void)
{
  //dos:
  lcd_putc("\fINGRESE SU CLAVE\n");
  for(e=0; ;e++)
   {                                  //bucle no sale...
    do{a=kbd_getc();
      }while(a==0);                   //...pulsar una tecla

    bit_set(porta,1);            // Accionará un pitido
    delay_ms(100);
    bit_clear(porta,1);

    lcd_putc("*");
    if(a=='C' || a=='D')              //si se pulsa C o D se sale de la funcion
     {
      if(e==0)                        //no se sale...
       {
        lcd_putc("\nEscribe una!");
        delay_ms(1000);
        lcd_putc("\n");
        lcd_gotoxy(1,2);
        e=-1;
        continue;
       }                              //...poner una clave valida
      if(e!=limita)                   //para ser correcto debe tener tb longitud correcta
      var=1;
      break;                          //salimos si se pulsa tecla * o #
     }
    if(a!=clavea[e])                  //comprobacion de caracteres correctos
     var=1;                           //No es correcto->clave incorrecta
   }                                  //...hasta pulsar * o #
  if(var>0)
   {                                  //Clave incorrecta
    lcd_putc("\f     Clave\n  Incorrecta!" );
    delay_ms(2000);
    break;
   }
  else
   {                                  //Clave correcta
    lcd_putc("\f     Clave\n   Correcta!");
    delay_ms(1000);
    menu_admin();
   }
  var=0;                              //reset var
 }

//==============================================================================
// Menú del administrador
//==============================================================================

void menu_admin(void)
 {
  tres:
  lcd_putc("\f Puede cambiar\n  claves de...");
  delay_ms(2000);
  lcd_putc("\fAdmin. -> A\nUsuario -> B");
  for(;;)
   {
    do{a=kbd_getc();
      }while(a==0);

   bit_set(porta,1);            // Accionará un pitido
   delay_ms(100);
   bit_clear(porta,1);

    if(a=='A')
     {
      cambio_admin();
      break;
     }
    if(a=='B')
     {
      cambio_usuario();
      break;
     }
    if(a!= 'A' && 'B')
     {
      lcd_putc("\fTecla incorrecta\ncorrija x favor.");
      delay_ms(2000);
      goto tres;
     }
   }
 }

//==============================================================================
// Cambio de clave al administrdor
//==============================================================================

void cambio_admin(void)
 {
  lcd_putc("\fNueva clave:\n");           //presentacion
  for(e=0;e<16;e++)
   {
    do{a=kbd_getc();                      //espera hasta...
     }while(a==0);                        //...pulsar una tecla

    bit_set(porta,1);                     // Accionará un pitido
    delay_ms(100);
    bit_clear(porta,1);
    if(a=='C' || a=='D')                  //si se pulsa * o # se sale de la funcion
     {
      if(e==0)                            //no se sale...
       {
        lcd_putc("\nEscribe una!" );
        delay_ms(500);
        lcd_putc("\n " );
        lcd_gotoxy(1,2);
        e=-1;
        continue;                         //...hasta poner una clave valida
       }
      lcd_putc("\fGuardando clave\n   nueva ...");
      delay_ms(2000);
      lcd_putc("\f  Nueva clave\n  guardada ...");
      break;                              //salir de funcion nueva_clave
     }
    lcd_putc(a);
    limita=e+1;                            //longitud de la clave
    clavea[e]=a;                           //almacena clave(maximo 16 caracteres)
   }
 }

//==============================================================================
// Cambiar la clave al usuario.
//==============================================================================

void cambio_usuario(void)
 {
  lcd_putc("\fNueva clave:\n");           //presentacion
  for(i=0;i<16;i++)
   {
    do{a=kbd_getc();                      //espera hasta...
     }while(a==0);                        //...pulsar una tecla

    bit_set(porta,1);            // Accionará un pitido.
    delay_ms(100);
    bit_clear(porta,1);

    if(a=='C' || a=='D')                  //si se pulsa * o # se sale de la funcion
     {
      if(i==0)                            //no se sale...
       {
        lcd_putc("\nEscribe una!" );
        delay_ms(500);
        lcd_putc("\n " );
        lcd_gotoxy(1,2);
        i=-1;
        continue;                         //...hasta poner una clave valida
       }
      lcd_putc("\fGuardando clave\n   nueva ...");
      delay_ms(2000);
      lcd_putc("\f  Nueva clave\n  guardada ...");
      break;                              //salir de funcion nueva_clave
     }
    lcd_putc(a);
    limit=i+1;                            //longitud de la clave
    clave[i]=a;                           //almacena clave(maximo 16 caracteres)
   }
 }


--> Está un poco extenso, y me gustaria que elguien con mejor idea lo pueda modificar, no s epreocupen lo dejo para el uso libre :), espero sus comentarios.

-->Se me olvidaba se puede simular en el Proteus, aca les dejo el archivo para descargar del proteus
--> ESPERO COMENTARIOS:


Yo hice una en lenguaje PicBasic con grabado de clave en la EEPROM, a queda bien y se la adapte a la puerta de mi cuarte :D funciona genial, el mecanismo para abrir la manilla de la puerta fue un motor servo trucado, pronto subire el video para que la vean.

Aqui les subo el ejemplo simulado en proteus con el archivo hex y el archivo PBP que es lenguaje picbasic, sin mas que decir dentro de la carpeta esta un documento texto que dice LEEME ahi explica algunos detalles del funcionamiento. :D
 

Adjuntos

  • LLave electronica PIC16F877A + EEPROM.zip
    31.8 KB · Visitas: 591
Última edición:
Yo hice una en lenguaje PicBasic con grabado de clave en la EEPROM, a queda bien y se la adapte a la puerta de mi cuarte :D funciona genial, el mecanismo para abrir la manilla de la puerta fue un motor servo trucado, pronto subire el video para que la vean.

Aqui les subo el ejemplo simulado en proteus con el archivo hex y el archivo PBP que es lenguaje picbasic, sin mas que decir dentro de la carpeta esta un documento texto que dice LEEME ahi explica algunos detalles del funcionamiento. :D


muy interesante tu proyecto y muy bueno esperare el video tambien seria agradable tenerlo en diferentes tipos de lenguaje en c con el pic compiler y otros lenguajes..! ( soy novato) :D espero que no me este equivocando..! :S
 
Última edición:
muy interesante tu proyecto y muy bueno esperare el video tambien seria agradable tenerlo en diferentes tipos de lenguaje en c con el pic compiler y otros lenguajes..! ( soy novato) :D espero que no me este equivocando..! :S

Bueno amigos aqui les traigo el video de la llave electronica programada con el pic16f877a, me perdonan la mala calidad de video de mi camara que no deja detallar con claridad las imagenes mostradas en la LCD pero creanme que se ve tal cual aparece en la simulacion del proteus, disculpen la habladera de mi prima y mi mama que se escuchan en el video :D otra cosa que les queria comentar es que en el vídeo, atras de mi puerta coloque un sensor receptor de luz con un LM324, tiene un diodo IR que es el emisor y con el potenciometro regulo la sensibilidad del receptor, eso es para abrir la puerta solo acercandole la mano, en cuanto a lo que me pide falcondj de si puedo subir el lenguaje en compiler o en C pues de verdad me disculpas pero solo se programar en lenguaje PicBasic que es lo mas facil de este mundo :oops: :LOL:


 
te qudo muy bueno rey felicitaciones!

nano me quede pensando... ya que la tenes clarinete en basic podrias darme una mano con mi cerradura? lo que quiero lograr es esto
 
Última edición:
Atrás
Arriba