Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: MFRC522 eeprom mbed
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 }
Generated on Fri Jul 29 2022 08:04:16 by
1.7.2