Hoje vou falar de vários assuntos que são importantes e que têm relação com a questão da segurança, como o RFID e um display com uma mini fonte. Vamos, então, utilizar essa mini fonte para acionar uma aplicação com RFID e adicionar um display TFT_LED de 1,8” à uma aplicação RFID já desenvolvida em aulas anteriores. Confira!
RECURSOS USADOS
- 1x Fonte 127Vac para 5Vdc e 3,3Vdc.
- 1x DevKit baseado no ESP32-WROOM-32
- 1x kit RFID-RC522 (Módulo e cartões).
- 1x Display 1.8” 128x160 TFT_RGB
- 2x Resistores 220 ohms
- 2x Leds (um vermelho e um verde)
IDEIA: ESP01 COM RELÊ
Dentro da caixa de passagem
FUNCIONAMENTO
O que é o RFID?
Como funciona o RFID?
Organização da memória no RFID?
O Bloco 3 de cada setor é
denominado Trailer de Setor e contém informações chamadas Bits
de Acesso para conceder acesso de leitura e gravação aos blocos restantes
em um setor. Isso significa que apenas os 3 blocos inferiores (bloco 0, 1
e 2) de cada setor estão realmente disponíveis para armazenamento de dados, o
que significa que temos 48 bytes por setor de 64 bytes disponíveis para nosso
próprio uso.
Além disso, o Bloco 0 do setor
0 é conhecido como Bloco do Fabricante / Dados do Fabricante e contém
os dados do fabricante do chip e o Unique IDentifier (UID). O
bloco do fabricante é destacado em vermelho abaixo.
É muito arriscado substituir o
bloco do fabricante e pode bloquear o cartão permanentemente.
MONTAGEM
A fonte utilizada
Abaixo vemos mais detalhes
sobre a fonte utilizada. Esta fonte pode ser encontrada em duas versões: uma
com saída dupla de 12Vdc e 5Vdc e outra, como a utilizada neste exemplo, com
saída dupla de 3V3 e 5V.
BIBLIOTECAS
Para o RFID
Para o display
OPERAÇÃO
Tela inicial
Menu de opções
Realizando uma leitura com sucesso
Realizando uma leitura com falha
Gravando dados...
Gravação bem sucedida
Falha de autenticação na gravação
CÓDIGO-FONTE
Declarações
#include <MFRC522.h> //biblioteca responsável pela comunicação com o módulo RFID-RC522 #include <SPI.h> //biblioteca para comunicação do barramento SPI #include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_ST7735.h> // Hardware-specific library for ST7735 //Define os pinos do RF522 #define SS_PIN 21 #define RST_PIN 22 //Define os pinos para o display #define DISPLAY_CS 5 #define DISPLAY_DC 2 #define DISPLAY_SDA 17 #define DISPLAY_SCK 16 #define DISPLAY_RST 4 //Define os pinos dos LEDs #define pinVerde 12 #define pinVermelho 32 //Define tamanhos de blocos para manipular dados do RFID #define SIZE_BUFFER 18 #define MAX_SIZE_BLOCK 16 // For 1.44" and 1.8" TFT with ST7735 use: //Adafruit_ST7735 tft = Adafruit_ST7735(CS, DC, SDA, SCK, RST); Adafruit_ST7735 tft = Adafruit_ST7735(DISPLAY_CS, DISPLAY_DC, DISPLAY_SDA, DISPLAY_SCK, DISPLAY_RST); //esse objeto 'chave' é utilizado para autenticação MFRC522::MIFARE_Key key; //código de status de retorno da autenticação MFRC522::StatusCode status; // Definicoes pino modulo RC522 MFRC522 mfrc522(SS_PIN, RST_PIN); int LINHA_DO_DISPLAY = 0;
Setup()
void setup() { // Inicia a serial Serial.begin(115200); SPI.begin(); // Init SPI bus pinMode(pinVerde, OUTPUT); pinMode(pinVermelho, OUTPUT); // Use this initializer if using a 1.8" TFT screen: tft.initR(INITR_BLACKTAB); // Init ST7735S chip, black tab tft.setRotation(1); //Ajusta a direção do display Serial.println(F("Display iniciado.")); // Inicia MFRC522 mfrc522.PCD_Init(); mensagensIniciais(); }
Loop()
void loop() { // Aguarda a aproximacao do cartao if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Seleciona um dos cartoes if ( ! mfrc522.PICC_ReadCardSerial()) { return; } // Dump debug info about the card; PICC_HaltA() is automatically called // mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); //chama o menu e recupera a opção desejada int opcao = menu(); // verifica se ainda está com o cartão/tag // if ( ! mfrc522.PICC_IsNewCardPresent()) // { // return; // } if (opcao == 0) leituraDados(); else if (opcao == 1) gravarDados(); else { Serial.println(F("Opção Incorreta!")); displayPrint("Opcao incorreta!", ST77XX_WHITE); return; } // instrui o PICC quando no estado ACTIVE a ir para um estado de "parada" mfrc522.PICC_HaltA(); // "stop" a encriptação do PCD, deve ser chamado após a comunicação com autenticação, caso contrário novas comunicações não poderão ser iniciadas mfrc522.PCD_StopCrypto1(); }
Leitura de dados
//faz a leitura dos dados do cartão/tag void leituraDados() { //imprime os detalhes tecnicos do cartão/tag mfrc522.PICC_DumpDetailsToSerial(&(mfrc522.uid)); //Prepara a chave - todas as chaves estão configuradas para FFFFFFFFFFFFh (Padrão de fábrica). for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF; //buffer para colocar os dados ligos byte buffer[SIZE_BUFFER] = {0}; //bloco que faremos a operação byte bloco = 1; byte tamanho = SIZE_BUFFER; //faz a autenticação do bloco que vamos operar status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, bloco, &key, &(mfrc522.uid)); //line 834 of MFRC522.cpp file if (status != MFRC522::STATUS_OK) { Serial.print(F("Authentication failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); tft.fillScreen(ST77XX_RED); //Pinta a tela de VERMELHO LINHA_DO_DISPLAY = 5; displayPrint(" FALHA NA AUTENTICACAO!", ST77XX_WHITE); digitalWrite(pinVermelho, HIGH); delay(1000); digitalWrite(pinVermelho, LOW); delay(1000); mensagensIniciais(); return; } //faz a leitura dos dados do bloco status = mfrc522.MIFARE_Read(bloco, buffer, &tamanho); if (status != MFRC522::STATUS_OK) { Serial.print(F("Reading failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); tft.fillScreen(ST77XX_RED); //Pinta a tela de VERMELHO LINHA_DO_DISPLAY = 5; displayPrint(" FALHA NA LEITURA!", ST77XX_WHITE); digitalWrite(pinVermelho, HIGH); delay(1000); digitalWrite(pinVermelho, LOW); mensagensIniciais(); return; } else { tft.fillScreen(ST77XX_GREEN); //Pinta a tela de VERDE LINHA_DO_DISPLAY = 5; displayPrint(" SUCESSO NA LEITURA!", ST77XX_BLACK); digitalWrite(pinVerde, HIGH); delay(1000); digitalWrite(pinVerde, LOW); mensagensIniciais(); } Serial.print(F("\nDados bloco [")); Serial.print(bloco); Serial.print(F("]: ")); //imprime os dados lidos for (uint8_t i = 0; i < MAX_SIZE_BLOCK; i++) { Serial.write(buffer[i]); } Serial.println(" "); }
Gravando dados
//faz a gravação dos dados no cartão/tag void gravarDados() { //imprime os detalhes tecnicos do cartão/tag mfrc522.PICC_DumpDetailsToSerial(&(mfrc522.uid)); // aguarda 30 segundos para entrada de dados via Serial Serial.setTimeout(30000L) ; Serial.println(F("Insira os dados a serem gravados com o caractere '#' ao final\n[máximo de 16 caracteres]:")); tft.fillScreen(ST77XX_BLACK); //Pinta a tela de PRETO LINHA_DO_DISPLAY = 1; displayPrint("FERNANDO K TECNOLOGIA", ST77XX_WHITE); displayPrint("1 - Digite os dados.", ST77XX_WHITE); LINHA_DO_DISPLAY = 3; displayPrint("2 - Insira o caractere #.", ST77XX_WHITE); LINHA_DO_DISPLAY = 5; displayPrint("[maximo de 16 caracteres]", ST77XX_WHITE); //Prepara a chave - todas as chaves estão configuradas para FFFFFFFFFFFFh (Padrão de fábrica). for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF; //buffer para armazenamento dos dados que iremos gravar byte buffer[MAX_SIZE_BLOCK] = ""; byte bloco; //bloco que desejamos realizar a operação byte tamanhoDados; //tamanho dos dados que vamos operar (em bytes) //recupera no buffer os dados que o usuário inserir pela serial //serão todos os dados anteriores ao caractere '#' tamanhoDados = Serial.readBytesUntil('#', (char*)buffer, MAX_SIZE_BLOCK); //espaços que sobrarem do buffer são preenchidos com espaço em branco for (byte i = tamanhoDados; i < MAX_SIZE_BLOCK; i++) { buffer[i] = ' '; } bloco = 1; //bloco definido para operação String str = (char*)buffer; //transforma os dados em string para imprimir Serial.println(str); //Authenticate é um comando para autenticação para habilitar uma comuinicação segura status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, bloco, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); tft.fillScreen(ST77XX_RED); //Pinta a tela de VERMELHO LINHA_DO_DISPLAY = 5; displayPrint(" FALHA NA AUTENTICACAO!", ST77XX_WHITE); digitalWrite(pinVermelho, HIGH); delay(1000); digitalWrite(pinVermelho, LOW); mensagensIniciais(); return; } //else Serial.println(F("PCD_Authenticate() success: ")); //Grava no bloco status = mfrc522.MIFARE_Write(bloco, buffer, MAX_SIZE_BLOCK); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Write() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); tft.fillScreen(ST77XX_RED); //Pinta a tela de VERMELHO LINHA_DO_DISPLAY = 5; displayPrint(" FALHA NA GRAVACAO!", ST77XX_WHITE); digitalWrite(pinVermelho, HIGH); delay(1000); digitalWrite(pinVermelho, LOW); mensagensIniciais(); return; } else { Serial.println(F("MIFARE_Write() success: ")); tft.fillScreen(ST77XX_GREEN); //Pinta a tela de VERDE LINHA_DO_DISPLAY = 5; displayPrint(" GRAVADO COM SUCESSO!", ST77XX_BLACK); digitalWrite(pinVerde, HIGH); delay(1000); digitalWrite(pinVerde, LOW); } mensagensIniciais(); }
Menu
//menu para escolha da operação int menu() { Serial.println(F("\nEscolha uma opção:")); Serial.println(F("0 - Leitura de Dados")); Serial.println(F("1 - Gravação de Dados\n")); tft.fillScreen(ST77XX_BLACK); //Pinta a tela de preto LINHA_DO_DISPLAY = 1; displayPrint("FERNANDO K TECNOLOGIA", ST77XX_WHITE); LINHA_DO_DISPLAY = 3; displayPrint("Escolha uma opcao:", ST77XX_WHITE); displayPrint("0 - Leitura de Dados", ST77XX_WHITE); displayPrint("1 - Gravacao de Dados", ST77XX_WHITE); //fica aguardando enquanto o usuário nao enviar algum dado while (!Serial.available()) {}; //recupera a opção escolhida int op = (int)Serial.read(); //remove os proximos dados (como o 'enter ou \n' por exemplo) que vão por acidente while (Serial.available()) { if (Serial.read() == '\n') break; Serial.read(); } return (op - 48); //do valor lido, subtraimos o 48 que é o ZERO da tabela ascii }
Mensagens iniciais
void mensagensIniciais() { // Mensagens iniciais no serial monitor Serial.println("Aproxime o seu cartao do leitor..."); Serial.println(); // Mensagens iniciais no display tft.fillScreen(ST77XX_BLACK); //Pinta a tela de preto LINHA_DO_DISPLAY = 1; displayPrint("FERNANDO K TECNOLOGIA", ST77XX_WHITE); LINHA_DO_DISPLAY = 3; displayPrint("Aproxime seu cartao", ST77XX_WHITE); displayPrint("do leitor...", ST77XX_WHITE); delay(1000); }
Impressão no display
//função para controlar linhas e automatizar impressão no display void displayPrint(char *text, uint16_t color) { tft.setCursor(0, LINHA_DO_DISPLAY * 10); tft.setTextColor(color); tft.setTextWrap(true); tft.print(text); LINHA_DO_DISPLAY++; if (LINHA_DO_DISPLAY > 12) { tft.fillScreen(ST77XX_BLACK); //Pinta a tela de preto LINHA_DO_DISPLAY = 0; } }
1 Comentários
como eu posso trocar odisplay por um maior ? ex:Display Arduino Lcd Tft 3.5 Touch - 320x480 Spi - Cartao Sd ?
ResponderExcluir