aaa
Dependencies: MFRC522 eeprom mbed
teste.cpp
- Committer:
- thiagohuang
- Date:
- 2017-07-08
- Revision:
- 1:fd613df5ffd3
- Parent:
- 0:fa7c728bf941
File content as of revision 1:fd613df5ffd3:
#include "mbed.h" #include "eeprom.h" #include "MFRC522.h" #include "stdlib.h" //interrupcao botao InterruptIn button1(PTA13); InterruptIn button2(PTA17); InterruptIn button3(PTA16); DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut flash(LED4); //Timer debounce; //LCD #define tuss 2 #define tusl 20 #define tms 2 SPI lcd(PTE3, PTE1, PTE2); DigitalOut cs(PTE4); DigitalOut res(PTD5); DigitalOut dc(PTC12); //KL25Z Pins for MFRC522 SPI interface #define SPI_MOSI PTC6 #define SPI_MISO PTC7 #define SPI_SCLK PTC5 #define SPI_CS PTC4 // KL25Z Pin for MFRC522 reset #define MF_RESET PTC3 //Pinos EEPROM #define SDA PTC2 // I2C SDA pin #define SCL PTC1 // I2C SCL pin #define EEPROM_CONTROL_BYTE 0xA0 #define I2C_READ 0x01 #define OFF 1 #define ON 0 DigitalOut LedRed (LED_RED); DigitalOut LedGreen (LED_GREEN); EEPROM i2c(SDA, SCL, 0, EEPROM::T24C16); // T24C01 should work for the 24AA02E48 eeprom MFRC522 RfChip (SPI_MOSI, SPI_MISO, SPI_SCLK, SPI_CS, MF_RESET); //I2C i2c(PTE0, PTE1); // sda, scl on KL25Z Serial pc(USBTX, USBRX); // tx, rx int flag_identificacao=1,flag_cadastro=0,flag_descadastro=0,flag_mudamodo=0; void init_LCD(){ res = 0; dc = 0; cs = 1; wait(0.1); res = 1; // k = 0; cs = 0; lcd.write(0x3C); wait_us(tuss); cs = 1; wait_ms(tms); cs = 0; lcd.write(0x0C); wait_us(tuss); cs = 1; wait_us(tusl); cs = 0; lcd.write(0x01); wait_us(tuss); cs = 1; wait_ms(tms); cs = 0; lcd.write(0x06); wait_us(tuss); cs = 1; wait_ms(tms); dc = 1; wait_ms(tms); return; } /* Função "pula_linha" vai para a linha de baixo do LCD para escrita */ void pula_linha(){ dc = 0; wait_ms(tms); cs = 0; lcd.write(0xC0); wait_us(tuss); cs = 1; wait_ms(tms); dc = 1; wait_ms(tms); return; } /* Função "limpa_lcd" limpa a tela do LCD */ void limpa_lcd(void){ dc = 0; wait_ms(tms); cs = 0; lcd.write(0x01); wait_us(tuss); cs = 1; wait_ms(tms); dc = 1; wait_ms(tms); return; } /* Função "escreve_lcd" escreve a string passada na linha do LCD */ void escreve_lcd (char *s){ while(*s){ cs = 0; lcd.write(*s); wait_us(tuss); cs = 1; wait_ms(tms); s++; } return ; } /* Função "escreve_mem" colaca o dado passado na posição passada */ void escreve_mem(int8_t dado, uint8_t i){ int8_t buf, elementos; LedGreen = 0; i2c.read(0, elementos); wait_ms(1); buf=dado; i2c.write(5*elementos+1+i, buf); wait_ms(1); //escreve na memoria o dado passado por referência } /* Função "read_mem" lê a posição requisitada e retorna o seu valor */ char read_mem(uint8_t posicao, uint8_t i){ char x; int8_t buf, elementos; i2c.read(0, elementos); wait_ms(1); if (elementos < posicao){ printf("A posicao requisitada excede o numero de elementos registrados na memoria\n\r"); return -1; }else{ i2c.read(5*(posicao-1)+1+i, buf); wait_ms(1); // Lê a posição requisitada e coloca na variável "buf" x=buf; return x; } } /* Função "pega_id" pega o ID do cartão aproximado copia na string passada */ void pega_id (char *s){ int i=0; int8_t buf=0; while(true){ inicio: if(flag_mudamodo==1) // Caso o usuário aperte algum botão, sai da função return; if ( ! RfChip.PICC_IsNewCardPresent()){ // Look for new cards wait_ms(500); goto inicio; } if ( ! RfChip.PICC_ReadCardSerial()){ // Select one of the cards } LedGreen = 0; wait(0.3); LedGreen = 1; for (i=0; i < RfChip.uid.size; i++){ // Copia o ID do cartão na string passada de parâmetro buf=RfChip.uid.uidByte[i]; *(s+i)=buf; } break ; } return ; } /* Verifica se o ID passado ja esta na memoria Caso ja esteja, o programa retorna k+1. Caso contrario, retorna 0 */ int jaexiste (char *idcartao){ int k,i; int8_t buf,elementos; char compara[4]; i2c.read(0, elementos); wait_ms(1); for (k=0;k<elementos;k++){ // Laço para andar na memória nos diversos cartões salvos for (i=0; i < 4; i++){ // Salva o ID da memória na string auxiliar "compara" i2c.read(5*k+1+i, buf); wait_ms(1); compara[i]=buf; } // Compara o ID do cartão aproximado com o ID da memória if((compara[0] == *(idcartao)) && (compara[1] == *(idcartao+1)) && (compara[2] == *(idcartao+2)) && (compara[3] == *(idcartao+3))) return k+1; } return 0; } /* Função "printa_id" printa o ID passado por referência */ void printa_id (char *id){ int i; for (i=0; i<4 ; i++){ printf("%d ",*(id+i)); } return; } /* Função "colocamemoria" insere as informações do cartão aproximado (ID e senha inserida) na memória */ void colocamemoria(char *idcartao){ int8_t elementos,i,buf,senha; // Escreve na última posição da memória o ID do novo cartão cadastrado for (i=0; i < 4; i++){ escreve_mem( *(idcartao+i), i); } printf("Digite a senha: "); scanf("%d", &senha); buf=senha; i2c.read(0, elementos); wait_ms(1); elementos++; i2c.write(5*elementos, buf); wait_ms(1); //Escreve a senha inserida pela usuário na memória printf("\n\n\rCartao de ID "); printa_id(idcartao); printf("com SENHA %d cadastrado com sucesso.\n\r",senha); i2c.write(0, elementos); wait_ms(1); return; } /* A função modo_cadastro faz o cadastro dos novos cartões solicitando que o usuário insera uma senha relacionado ao ID cadastrado */ void modo_cadastro (){ char id_cartao[4]; int8_t elementos; i2c.read(0, elementos); wait_ms(1); printf("\n\rMODO CADASTRO ATIVADO.\n\r"); printf("Aproxime Cartao do Leitor. \n\r"); pega_id(id_cartao); // Detecta o ID do cartao aproximado e coloca no vetor id_cartao // Trecho abaixo faz com que o modo seja trocado caso o usuário tenha solicitado um modo diferente if(flag_mudamodo==1){ flag_mudamodo=0; return; } wait_ms(10); if( jaexiste(id_cartao)!=0 ){ // Caso o cartão já esteja cadastrado printf("O cartao de ID "); printa_id(id_cartao); printf("ja esta cadastrado.\n\r"); } else // Caso o cartão não esteja cadastrado colocamemoria(id_cartao); // Função "colocamemoria" cadastra o novo cartão wait_ms(50); return ; } /* A função "modo_descadastro" pega o ID do cartão aproximado e descadastra caso o cartão seja encontrado na memória */ void modo_descadastro (){ char id_cartao[4],aux[5]; int8_t elementos,k,i,buf; i2c.read(0, elementos); wait_ms(1); // Variável "elementos" recebe a quantidade de cartões cadastrados printf("\n\rMODO DESCADASTRO ATIVADO.\n\r"); printf("Aproxime Cartao do Leitor. \n\r"); pega_id(id_cartao); // Detecta o ID do cartao aproximado e coloca no vetor id_cartao // Trecho abaixo faz com que o modo seja trocado caso o usuário tenha solicitado um modo diferente if(flag_mudamodo==1){ flag_mudamodo=0; return; } k=jaexiste(id_cartao); if( k!=0 ){ // Entra caso o ID do cartão aproximado seja encontrado na memória //Caso haja apenas um elemento, esse elemento é apagado e muda-se automaticamente para o Modo Cadastro if(elementos==1){ printf("Cartao de ID "); printa_id(id_cartao); printf("descadastrado com sucesso.\n\r"); elementos--; i2c.write(0,elementos); wait_ms(1); printf("Nao Ha Cartao Cadastrado, Ativando Modo Cadastro...\n\r"); flag_identificacao=0; flag_cadastro=1; flag_descadastro=0; return; } /* Caso haja mais de um cartão cadastrado, copia-se o último elemento na string "aux" e coloca na posição do cartão encontrado */ else{ for (i=0; i < 5; i++){ i2c.read(5*(elementos-1)+1+i, buf); wait_ms(1); aux[i]=buf; } for (i=0; i < 5; i++){ i2c.write(5*(k-1)+1+i, aux[i]); wait_ms(1); //Escreve na posição descadastrada o último elemento } printf("Elemento %d desregistrado com sucesso.\n\r",k); elementos--; i2c.write(0,elementos); wait_ms(1); return; } } else{ //Entra se k=0 (quando não o cartão não é encontrado na memória) printf("Cartao nao esta registrado.\n\r"); } return ; } /* A função "modo_identificacao" corresponde ao modo de leitura de cartões para permitir o acesso do usuario */ void modo_identificacao (){ int k; char id_cartao[4]; int8_t elementos,senha,buf; i2c.read(0, elementos); wait_ms(1); // Coloca em "elementos" o numero de cartões cadastrados na memória printf("\n\rMODO IDENTIFICACAO ATIVADO\n\r"); printf("Aproxime Cartao do Leitor. \n\r"); pega_id(id_cartao); // Detecta o ID do cartao aproximado e coloca no vetor id_cartao // Trecho abaixo faz com que o modo seja trocado caso o usuário tenha solicitado um modo diferente if(flag_mudamodo==1){ flag_mudamodo=0; return; } /* 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 */ k=jaexiste(id_cartao); if(k!=0){ // Entra caso o cartão seja encontrado na memória printf("Digite a senha: \n\r"); scanf("%d",&senha); printf("Senha inserida: %d\n\r",senha); i2c.read(5*k, buf); wait_ms(1); //Variável "buf" recebe a senha cadastrada na memória //Comparações da senha digitada com a senha cadastrada if (senha==buf) printf("Senha Correta - Acesso Permitido.\n\r"); else printf("Senha Incorreta - Acesso Negado.\n\r"); } else //Entra caso k seja 0 printf("Cartao Nao Esta Cadastrado.\n\r\n\r"); return; } // As 3 funções abaixo setam as flags necessárias para que a função correta // seja ativada quando a tecla correspondente é pressionada. // A condição no início muda "flag_mudamodo" para indicar que haverá // uma mudança no modo ativo do programa. void isr1() { if(flag_identificacao==0) flag_mudamodo=1; flag_identificacao=1; flag_cadastro=0; flag_descadastro=0; } void isr2() { if(flag_descadastro==0) flag_mudamodo=1; flag_identificacao=0; flag_cadastro=0; flag_descadastro=1; } void isr3() { if(flag_cadastro==0) flag_mudamodo=1; flag_identificacao=0; flag_cadastro=1; flag_descadastro=0; } int main(void) { int8_t elementos=0; pc.baud(9600); //debounce.start(); //Init. RC522 Chip RfChip.PCD_Init(); //init LCD init_LCD(); i2c.write(0, 0); wait_ms(1);//escreve 0 elementos na memoria i2c.read(0,elementos); wait_ms(1); button1.rise(&isr1); // Ativa quando a tecla "*" é pressionada button2.fall(&isr2); // Ativa quando a tecla "0" é pressionada button3.fall(&isr3); // Ativa quando a tecla "#" é pressionada while (true){ if(flag_identificacao==1){ // Entra caso o botão correspondente seja pressionado limpa_lcd(); escreve_lcd ("IDENTICACAO"); pula_linha(); escreve_lcd ("PASSE CARTAO"); modo_identificacao(); // Ativa o modo identificação } if(flag_cadastro==1){ // Entra caso o botão correspondente seja pressionado limpa_lcd(); escreve_lcd ("CADASTRO"); pula_linha(); escreve_lcd ("PASSE CARTAO"); modo_cadastro(); // Ativa o modo cadastro } if(flag_descadastro==1){ // Entra caso o botão correspondente seja pressionado limpa_lcd(); escreve_lcd ("DESCADASTRO"); pula_linha(); escreve_lcd ("PASSE CARTAO"); modo_descadastro(); // Ativa o modo descadastro } } }