..
..
Cartão de aproximação que possui um chip com número de série de 32 bits, utilizado para armazenar as informações que são lidas pelo sistema de RFID.
Display modulo matriz de LED 8x32 com chip Max7219, utilizado para transmitir palavras, números e frases por meio da luminosidade. Será usado no projeto para escrever "CHEIO".
Leito RFID Rc522 utilizado para ler e detectar os cartões, o qual vai realizar a contagem de pessoas no ônibus.
Matriz de pontos de contato, facilita a conexão dos componentes eletrônicos fazendo a prototipagem rápida dos circuitos.
Placa eletrônica programável utilizada para interligar todo o circuito, usada no projeto para ligar o sistema RFID, LED e micro servo motor.
Micro controlador com processador de alto desempenho com conectividade Wi-Fi e Bluetooth, o qual permite a execução simultânea de várias tarefas, e ele oferece uma variedade de interfaces e periféricos.
componente eletrônico que armazena e libera carga elétrica temporariamente. É usado para filtrar ruídos, estabilizar tensões e permitir a passagem de corrente alternada em circuitos eletrônicos.
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4 // Define a conexão dos pinos SPI
#define CLK_PIN 13
#define DATA_PIN 11
#define CS_PIN 10
int cartao = 0; // Cria uma instância da classe MD_Parola para manipular as matrizes de LED
MD_Parola myDisplay = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES); // Define o texto a ser exibido
char *displayText = "CHEIO";
void setup() { // Inicializa a comunicação com as matrizes de LED
myDisplay.begin(); // Define a velocidade de rolagem do texto (valores menores são mais rápidos)
myDisplay.setSpeed(50); // Define a intensidade de brilho das matrizes de LED (valores válidos: 0 a 15)
myDisplay.setIntensity(7)// Ativa todas as matrizes de LED
myDisplay.displayClear(); // Atualiza a animação das matrizes de LED
myDisplay.displayClear();
Serial.begin (9600);
}
void loop() {
if (Serial.available()) {
String receivedData = Serial.readStringUntil('\n');
int cartao = receivedData.toInt();
Serial.print("Valor recebido: ");
Serial.println(cartao);
if (cartao == 10) {
myDisplay.displayClear(); // Limpa a exibição anterior
// Define a animação de rolagem do texto "LOTADO" da direita para a esquerda
myDisplay.displayText(displayText, PA_CENTER, 0, 0, PA_PRINT, PA_NO_EFFECT); // Atualiza a animação das matrizes de LED
myDisplay.displayAnimate();
}
if (cartao < 10) {
myDisplay.displayReset();
myDisplay.displayClear();
}
}
Programação do RFID com o ESP-32
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 21
#define RST_PIN 22
#define TEMPO_ESPERA 3000 // Tempo de espera em milissegundos (3 segundos)
#define MAX_CARTOES 10 // Número máximo de cartões diferentes a serem armazenados
MFRC522 rfid(SS_PIN, RST_PIN);
int contadorCartoes = 0;
int cartao;
String cartoesDiferentes[MAX_CARTOES]; //para armazenar os cartões diferentes
unsigned long tempoAnterior = 0;
void setup() {
Serial.begin(9600); // Inicia a comunicação serial para depuração
Serial2.begin(9600); // Inicia a comunicação serial com a placa Arduino
SPI.begin(); // Inicia a comunicação SPI
rfid.PCD_Init(); // Inicia o leitor RFID
}
void loop() {
if (!rfid.PICC_IsNewCardPresent()) // Verifica se um novo cartão está presente
return;
if (!rfid.PICC_ReadCardSerial()) // Lê o serial do cartão RFID
return;
String strID = "";
for (byte i = 0; i < 4; i++) {
strID += (rfid.uid.uidByte[i] < 0x10 ? "0" : "") + String(rfid.uid.uidByte[i], HEX) + (i != 3 ? ":" : ""); // Converte o UID do cartão RFID em uma string hexadecimal
}
strID.toUpperCase(); // Converte a string em letras maiúsculas
unsigned long tempoAtual = millis(); // Obtém o tempo atual em milissegundos
bool cartaoRegistrado = false; // Verificar se o cartão já está registrado
for (int i = 0; i < contadorCartoes; i++) {
if (strID == cartoesDiferentes[i]) {
cartaoRegistrado = true; // Define a variável como verdadeira se o cartão já estiver registrado
break;
}
}
if (!cartaoRegistrado) { // Cartão novo lido
if (contadorCartoes < MAX_CARTOES) {
contadorCartoes++; // Incrementa o contador de cartões
cartoesDiferentes[contadorCartoes - 1] = strID; // Armazena o novo cartão diferente no array
tempoAnterior = tempoAtual; // Reinicia a contagem de tempo
}
} else { // Cartão já registrado lido novamente após o tempo de espera
if ((tempoAtual - tempoAnterior) >= TEMPO_ESPERA) {
for (int i = 0; i < contadorCartoes; i++) {
if (strID == cartoesDiferentes[i]) { // Remover o cartão registrado
delay(2000);
for (int j = i; j < contadorCartoes - 1; j++) {
cartoesDiferentes[j] = cartoesDiferentes[j + 1]; // Desloca os elementos à esquerda no array
}
contadorCartoes--; // Decrementa o contador de cartões
break;
}
}
tempoAnterior = tempoAtual; // Reinicia a contagem de tempo
}
}
Serial.print("Tag: ");
Serial.print(strID);
Serial.print(" | Total de cartões lidos: ");
Serial.println(contadorCartoes); // Enviar o número de cartões lidos para a placa Arduino
Serial2.println(contadorCartoes); // Imprimir informações dos cartões diferentes
Serial.println("Cartões diferentes:");
for (int i = 0; i < contadorCartoes; i++) {
Serial.print(i + 1);
Serial.print(": ");
Serial.println(cartoesDiferentes[i]);
}
}