aaa

Dependencies:   MFRC522 eeprom mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers teste.cpp Source File

teste.cpp

00001 #include "mbed.h"
00002 #include "eeprom.h"
00003 #include "MFRC522.h"
00004 #include "stdlib.h"
00005 
00006 //interrupcao botao
00007 InterruptIn button1(PTA13);
00008 InterruptIn button2(PTA17);
00009 InterruptIn button3(PTA16);
00010 DigitalOut led1(LED1);
00011 DigitalOut led2(LED2);       
00012 DigitalOut flash(LED4);
00013 //Timer debounce;
00014 
00015 //LCD
00016 #define tuss 2
00017 #define tusl 20
00018 #define tms 2
00019 
00020 SPI lcd(PTE3, PTE1, PTE2);
00021 DigitalOut cs(PTE4);
00022 DigitalOut res(PTD5);
00023 DigitalOut dc(PTC12);
00024 
00025 //KL25Z Pins for MFRC522 SPI interface
00026  #define SPI_MOSI    PTC6
00027  #define SPI_MISO    PTC7
00028  #define SPI_SCLK    PTC5
00029  #define SPI_CS      PTC4
00030 // KL25Z Pin for MFRC522 reset
00031  #define MF_RESET    PTC3
00032   
00033 //Pinos EEPROM
00034 #define SDA PTC2            // I2C SDA pin
00035 #define SCL PTC1           // I2C SCL pin 
00036 #define EEPROM_CONTROL_BYTE 0xA0
00037 #define I2C_READ 0x01
00038 
00039 #define OFF 1
00040 #define ON 0
00041 
00042 DigitalOut LedRed   (LED_RED);
00043 DigitalOut LedGreen (LED_GREEN); 
00044  
00045 EEPROM i2c(SDA, SCL, 0, EEPROM::T24C16);      // T24C01 should work for the 24AA02E48 eeprom
00046 MFRC522    RfChip   (SPI_MOSI, SPI_MISO, SPI_SCLK, SPI_CS, MF_RESET); 
00047  
00048 //I2C i2c(PTE0, PTE1); // sda, scl on KL25Z
00049 Serial pc(USBTX, USBRX); // tx, rx 
00050 
00051 int flag_identificacao=1,flag_cadastro=0,flag_descadastro=0,flag_mudamodo=0;
00052 
00053 void init_LCD(){
00054     res = 0;
00055     dc = 0;
00056     cs = 1;
00057     wait(0.1);
00058     res = 1;
00059    // k = 0;
00060     cs = 0;
00061     lcd.write(0x3C);
00062     wait_us(tuss);
00063     cs = 1;
00064     wait_ms(tms);
00065     cs = 0;
00066     lcd.write(0x0C);
00067     wait_us(tuss);
00068     cs = 1;
00069     wait_us(tusl);
00070     cs = 0;
00071     lcd.write(0x01);
00072     wait_us(tuss);
00073     cs = 1;
00074     wait_ms(tms);
00075     cs = 0;
00076     lcd.write(0x06);
00077     wait_us(tuss);
00078     cs = 1;
00079     wait_ms(tms);    
00080     dc = 1;
00081     wait_ms(tms);
00082     
00083     return;        
00084 }
00085 
00086 /* Função "pula_linha" vai para a linha de baixo do LCD para escrita */
00087 void pula_linha(){    
00088     dc = 0;
00089     wait_ms(tms);
00090     cs = 0;
00091     lcd.write(0xC0);
00092     wait_us(tuss);
00093     cs = 1;
00094     wait_ms(tms);    
00095     dc = 1;
00096     wait_ms(tms);
00097     
00098     return;
00099 }    
00100 
00101 /* Função "limpa_lcd" limpa a tela do LCD */
00102 void limpa_lcd(void){
00103     
00104     dc = 0;
00105     wait_ms(tms);
00106     cs = 0;
00107     lcd.write(0x01);
00108     wait_us(tuss);
00109     cs = 1;
00110     wait_ms(tms);    
00111     dc = 1;
00112     wait_ms(tms);
00113     
00114     return;
00115 }
00116 
00117 /* Função "escreve_lcd" escreve a string passada na linha do LCD */
00118 void escreve_lcd (char *s){       
00119      
00120     while(*s){       
00121         cs = 0;
00122         lcd.write(*s);
00123         wait_us(tuss);
00124         cs = 1;
00125         wait_ms(tms);
00126         s++;
00127     }    
00128     return ;
00129 }
00130 
00131 /* Função "escreve_mem" colaca o dado passado na posição passada */
00132 void escreve_mem(int8_t dado, uint8_t i){
00133     int8_t buf, elementos;
00134     
00135     LedGreen = 0;
00136     i2c.read(0, elementos); wait_ms(1);
00137     buf=dado;
00138     i2c.write(5*elementos+1+i, buf); wait_ms(1); //escreve na memoria o dado passado por referência    
00139 }
00140 
00141 /* Função "read_mem" lê a posição requisitada e retorna o seu valor */
00142 char read_mem(uint8_t posicao, uint8_t i){
00143     char x;
00144     int8_t buf, elementos;
00145     
00146     i2c.read(0, elementos);
00147     wait_ms(1);
00148     if (elementos < posicao){
00149         printf("A posicao requisitada excede o numero de elementos registrados na memoria\n\r");
00150         return -1;
00151     }else{
00152         i2c.read(5*(posicao-1)+1+i, buf); wait_ms(1);  // Lê a posição requisitada e coloca na variável "buf"
00153         x=buf;
00154         return x;
00155     }
00156 }
00157 
00158 /* Função "pega_id" pega o ID do cartão aproximado
00159    copia na string passada  */
00160 void pega_id (char *s){
00161  
00162     int i=0;
00163     int8_t buf=0;
00164     
00165     while(true){
00166 
00167         inicio:
00168         
00169         if(flag_mudamodo==1)   // Caso o usuário aperte algum botão, sai da função
00170             return;
00171         
00172         if ( ! RfChip.PICC_IsNewCardPresent()){     // Look for new cards
00173             wait_ms(500);
00174             goto inicio;  
00175         }
00176         if ( ! RfChip.PICC_ReadCardSerial()){     // Select one of the cards
00177 
00178         }
00179         LedGreen = 0;
00180         wait(0.3);
00181         LedGreen = 1;  
00182         for (i=0; i < RfChip.uid.size; i++){    // Copia o ID do cartão na string passada de parâmetro
00183             buf=RfChip.uid.uidByte[i];
00184             *(s+i)=buf;
00185         }
00186    
00187         break ;
00188     }
00189     return ;
00190 }    
00191 
00192 /* Verifica se o ID passado ja esta na memoria
00193    Caso ja esteja, o programa retorna k+1. Caso contrario, retorna 0 */
00194 int jaexiste (char *idcartao){
00195     
00196     int k,i;
00197     int8_t buf,elementos;
00198     char compara[4];
00199 
00200     i2c.read(0, elementos); wait_ms(1);   
00201     
00202     for (k=0;k<elementos;k++){ // Laço para andar na memória nos diversos cartões salvos
00203         for (i=0; i < 4; i++){   // Salva o ID da memória na string auxiliar "compara"
00204                 i2c.read(5*k+1+i, buf); wait_ms(1);
00205                 compara[i]=buf;
00206         }
00207         
00208         // Compara o ID do cartão aproximado com o ID da memória
00209         if((compara[0] == *(idcartao))   &&
00210            (compara[1] == *(idcartao+1)) &&
00211            (compara[2] == *(idcartao+2)) &&
00212            (compara[3] == *(idcartao+3)))
00213             return k+1;
00214         
00215     }
00216     return 0;
00217 
00218 }
00219 
00220 /* Função "printa_id" printa o ID passado por referência */
00221 void printa_id (char *id){
00222 
00223     int i;
00224      
00225     for (i=0; i<4 ; i++){
00226         printf("%d ",*(id+i));   
00227     }
00228     return;
00229 }
00230 
00231 /* Função "colocamemoria" insere as informações do cartão 
00232     aproximado (ID e senha inserida) na memória */
00233 void colocamemoria(char *idcartao){
00234     
00235     int8_t elementos,i,buf,senha;
00236     
00237     // Escreve na última posição da memória o ID do novo cartão cadastrado
00238     for (i=0; i < 4; i++){ 
00239         escreve_mem( *(idcartao+i), i);
00240     }
00241     
00242     printf("Digite a senha: ");
00243     scanf("%d", &senha);
00244     buf=senha;
00245     
00246     i2c.read(0, elementos); wait_ms(1);  
00247     elementos++;
00248     i2c.write(5*elementos, buf); wait_ms(1);  //Escreve a senha inserida pela usuário na memória
00249     
00250     printf("\n\n\rCartao de ID ");
00251     printa_id(idcartao);
00252     printf("com SENHA %d cadastrado com sucesso.\n\r",senha);
00253     
00254 
00255     i2c.write(0, elementos); wait_ms(1);
00256     
00257     return;
00258 }
00259 
00260 /* A função modo_cadastro faz o cadastro dos novos cartões solicitando que o usuário 
00261     insera uma senha relacionado ao ID cadastrado    */
00262 void modo_cadastro (){
00263        
00264     char id_cartao[4];
00265     int8_t elementos;
00266     
00267     i2c.read(0, elementos); wait_ms(1);  
00268     printf("\n\rMODO CADASTRO ATIVADO.\n\r");
00269     printf("Aproxime Cartao do Leitor. \n\r");
00270     
00271     pega_id(id_cartao);    // Detecta o ID do cartao aproximado e coloca no vetor id_cartao
00272     // Trecho abaixo faz com que o modo seja trocado caso o usuário tenha solicitado um modo diferente
00273     if(flag_mudamodo==1){
00274         flag_mudamodo=0; 
00275         return;
00276     }
00277     wait_ms(10);
00278     
00279     if( jaexiste(id_cartao)!=0 ){      // Caso o cartão já esteja cadastrado
00280         printf("O cartao de ID "); 
00281         printa_id(id_cartao);       
00282         printf("ja esta cadastrado.\n\r");
00283     }
00284     else // Caso o cartão não esteja cadastrado
00285         colocamemoria(id_cartao);    // Função "colocamemoria" cadastra o novo cartão
00286     
00287     wait_ms(50);
00288 
00289     return ;
00290 }
00291 
00292 /* A função "modo_descadastro" pega o ID do cartão aproximado e descadastra 
00293     caso o cartão seja encontrado na memória */
00294 void modo_descadastro (){
00295     
00296     char id_cartao[4],aux[5];
00297     int8_t elementos,k,i,buf;
00298     
00299     i2c.read(0, elementos); wait_ms(1);  // Variável "elementos" recebe a quantidade de cartões cadastrados
00300 
00301     printf("\n\rMODO DESCADASTRO ATIVADO.\n\r");
00302     printf("Aproxime Cartao do Leitor. \n\r");
00303     
00304     pega_id(id_cartao);    // Detecta o ID do cartao aproximado e coloca no vetor id_cartao
00305     // Trecho abaixo faz com que o modo seja trocado caso o usuário tenha solicitado um modo diferente
00306     if(flag_mudamodo==1){
00307         flag_mudamodo=0; 
00308         return;
00309     }
00310     
00311     k=jaexiste(id_cartao);
00312     if( k!=0 ){ // Entra caso o ID do cartão aproximado seja encontrado na memória
00313         //Caso haja apenas um elemento, esse elemento é apagado e muda-se automaticamente para o Modo Cadastro
00314         if(elementos==1){ 
00315             printf("Cartao de ID ");
00316             printa_id(id_cartao);
00317             printf("descadastrado com sucesso.\n\r");
00318             elementos--;
00319             i2c.write(0,elementos); wait_ms(1);
00320             printf("Nao Ha Cartao Cadastrado, Ativando Modo Cadastro...\n\r");
00321             flag_identificacao=0;
00322             flag_cadastro=1;
00323             flag_descadastro=0;
00324             return;
00325         }
00326         /* Caso haja mais de um cartão cadastrado, copia-se o último elemento na string "aux"
00327              e coloca na posição do cartão encontrado */
00328         else{ 
00329             for (i=0; i < 5; i++){
00330                 i2c.read(5*(elementos-1)+1+i, buf); wait_ms(1);
00331                 aux[i]=buf;
00332             }
00333             for (i=0; i < 5; i++){
00334                 i2c.write(5*(k-1)+1+i, aux[i]); wait_ms(1); //Escreve na posição descadastrada o último elemento
00335             }           
00336             printf("Elemento %d desregistrado com sucesso.\n\r",k);
00337             elementos--;
00338             i2c.write(0,elementos); wait_ms(1);
00339             return; 
00340         }
00341     }
00342     else{ //Entra se k=0 (quando não o cartão não é encontrado na memória)
00343         printf("Cartao nao esta registrado.\n\r");
00344     }
00345     
00346 
00347     return ;
00348 }
00349 
00350 /* A função "modo_identificacao" corresponde ao modo de leitura de cartões 
00351     para permitir o acesso do usuario */
00352 void modo_identificacao (){
00353 
00354     int k;
00355     char id_cartao[4];
00356     int8_t elementos,senha,buf;
00357     
00358     i2c.read(0, elementos); wait_ms(1);    // Coloca em "elementos" o numero de cartões cadastrados na memória 
00359     printf("\n\rMODO IDENTIFICACAO ATIVADO\n\r");
00360     printf("Aproxime Cartao do Leitor. \n\r");
00361     
00362     pega_id(id_cartao);    // Detecta o ID do cartao aproximado e coloca no vetor id_cartao
00363     // Trecho abaixo faz com que o modo seja trocado caso o usuário tenha solicitado um modo diferente
00364     if(flag_mudamodo==1){
00365         flag_mudamodo=0; 
00366         return;
00367     }
00368     /* Variável "k" recebe a posição na memória do cartão aproximado. Caso o cartão aproximado não seja encontrado, k recebe 0 */
00369     k=jaexiste(id_cartao);  
00370     if(k!=0){  // Entra caso o cartão seja encontrado na memória
00371         printf("Digite a senha: \n\r");
00372         scanf("%d",&senha);
00373         printf("Senha inserida: %d\n\r",senha);
00374         i2c.read(5*k, buf); wait_ms(1); //Variável "buf" recebe a senha cadastrada na memória
00375         //Comparações da senha digitada com a senha cadastrada
00376         if (senha==buf) printf("Senha Correta - Acesso Permitido.\n\r"); 
00377         else printf("Senha Incorreta - Acesso Negado.\n\r");      
00378     }
00379     else //Entra caso k seja 0
00380         printf("Cartao Nao Esta Cadastrado.\n\r\n\r");
00381 
00382     return;
00383         
00384 }
00385 
00386 //  As 3 funções abaixo setam as flags necessárias para que a função correta
00387 //     seja ativada quando a tecla correspondente é pressionada.
00388 //  A condição no início muda "flag_mudamodo" para indicar que haverá
00389 //     uma mudança no modo ativo do programa. 
00390 void isr1() {
00391     
00392     if(flag_identificacao==0)
00393         flag_mudamodo=1;
00394         
00395     flag_identificacao=1;
00396     flag_cadastro=0;
00397     flag_descadastro=0;
00398 }
00399 void isr2() {
00400     
00401     if(flag_descadastro==0)
00402         flag_mudamodo=1;
00403     
00404     flag_identificacao=0;
00405     flag_cadastro=0;
00406     flag_descadastro=1;   
00407 }
00408 void isr3() {
00409 
00410     if(flag_cadastro==0)
00411         flag_mudamodo=1;
00412 
00413     flag_identificacao=0;
00414     flag_cadastro=1;
00415     flag_descadastro=0;
00416 }
00417 
00418 
00419 int main(void) {
00420 
00421     int8_t elementos=0;    
00422     
00423     pc.baud(9600);
00424    //debounce.start();
00425 
00426     
00427     //Init. RC522 Chip
00428     RfChip.PCD_Init();
00429     
00430     //init LCD
00431     init_LCD();
00432     
00433     i2c.write(0, 0); wait_ms(1);//escreve 0 elementos na memoria
00434     
00435     i2c.read(0,elementos); wait_ms(1);
00436     
00437     button1.rise(&isr1); // Ativa quando a tecla "*" é pressionada
00438     button2.fall(&isr2); // Ativa quando a tecla "0" é pressionada
00439     button3.fall(&isr3); // Ativa quando a tecla "#" é pressionada
00440     
00441     while (true){     
00442 
00443         if(flag_identificacao==1){      // Entra caso o botão correspondente seja pressionado
00444             limpa_lcd(); 
00445             escreve_lcd ("IDENTICACAO");
00446             pula_linha();
00447             escreve_lcd ("PASSE CARTAO");
00448             modo_identificacao();   // Ativa o modo identificação
00449         }
00450         if(flag_cadastro==1){     // Entra caso o botão correspondente seja pressionado
00451             limpa_lcd();
00452             escreve_lcd ("CADASTRO");
00453             pula_linha();
00454             escreve_lcd ("PASSE CARTAO");
00455             modo_cadastro();        // Ativa o modo cadastro
00456         }
00457         if(flag_descadastro==1){        // Entra caso o botão correspondente seja pressionado
00458             limpa_lcd();
00459             escreve_lcd ("DESCADASTRO");
00460             pula_linha();
00461             escreve_lcd ("PASSE CARTAO");
00462             modo_descadastro();         // Ativa o modo descadastro
00463         }        
00464 
00465     }
00466     
00467 }