#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <SD.h>
#define SS_PIN 10 // Pino SS do MFRC522
#define RST_PIN 9 // Pino RST do MFRC522
#define GREEN_LED 6 // Pino do LED RGB (verde)
#define BUZZER 7 // Pino do buzzer
#define BUTTON_BLUE 3 // Pino do botão azul
#define BUTTON_RED 2 // Pino do botão vermelho
#define SD_CS_PIN 4 // Pino CS do módulo SD
#define BUTTON_SIMULATE_RFID 5 // Pino do botão para simular o RFID
LiquidCrystal_I2C lcd(0x27, 16, 2);
File myFile;
int menuOption = 0;
int currentNumber = 1;
bool isWritingMode = false;
char name[17] = ""; // Buffer para o nome (máximo 16 caracteres)
int nameIndex = 0;
char currentLetter = 'A';
bool enteringName = false;
unsigned long lastButtonPressTime = 0;
const unsigned long NAME_ENTRY_TIMEOUT = 10000; // 10 segundos
void setup() {
pinMode(GREEN_LED, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(BUTTON_BLUE, INPUT_PULLUP);
pinMode(BUTTON_RED, INPUT_PULLUP);
pinMode(BUTTON_SIMULATE_RFID, INPUT_PULLUP);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Inicializando...");
Serial.begin(9600); // Inicializa a comunicação serial
tone(BUZZER, 1000, 200); // Emitir um bipe ao iniciar
SPI.begin();
if (!SD.begin(SD_CS_PIN)) {
lcd.setCursor(0, 1);
lcd.print("Falha no SD!");
Serial.println("Falha na inicializacao do SD!");
while (1);
}
lcd.setCursor(0, 1);
lcd.print("Pronto");
Serial.println("Sistema pronto");
delay(2000);
lcd.clear();
}
void loop() {
if (!isWritingMode) {
showMenu();
handleMenuNavigation();
} else if (enteringName) {
handleNameEntry();
} else {
writeRFIDCard();
}
}
void showMenu() {
lcd.setCursor(0, 0);
lcd.print("Menu:");
lcd.setCursor(0, 1);
if (menuOption == 0) {
lcd.print("> Gravar Cartao ");
} else {
lcd.print(" Gravar Cartao ");
}
}
void handleMenuNavigation() {
if (digitalRead(BUTTON_BLUE) == LOW) {
tone(BUZZER, 1000, 50); // Emitir um bipe curto ao pressionar o botão
menuOption = (menuOption + 1) % 1;
delay(300); // Debounce
}
if (digitalRead(BUTTON_RED) == LOW) {
tone(BUZZER, 1000, 100); // Emitir um bipe curto ao pressionar o botão
if (menuOption == 0) {
isWritingMode = true;
lcd.clear();
lcd.print("Aproxime o cartao");
}
delay(300); // Debounce
}
}
void writeRFIDCard() {
if (digitalRead(BUTTON_SIMULATE_RFID) == LOW) {
tone(BUZZER, 1000, 100); // Emitir um bipe curto ao pressionar o botão
char uidString[] = "DEMO1234";
lcd.clear();
lcd.print("ID: ");
lcd.print(uidString);
delay(1000);
lcd.clear();
lcd.print("Num: ");
lcd.setCursor(0, 1);
lcd.print(currentNumber);
delay(1000);
// Iniciar entrada do nome
enteringName = true;
memset(name, 0, sizeof(name));
nameIndex = 0;
currentLetter = 'A';
lcd.clear();
lcd.print("Nome: ");
lcd.setCursor(0, 1);
lcd.print(currentLetter);
lcd.blink();
lastButtonPressTime = millis();
}
}
void handleNameEntry() {
unsigned long currentTime = millis();
if (digitalRead(BUTTON_BLUE) == LOW) {
// Confirma a letra atual e move para o próximo caractere
if (nameIndex < 16) {
name[nameIndex] = currentLetter;
nameIndex++;
if (nameIndex < 16) {
lcd.setCursor(nameIndex, 1);
lcd.print(currentLetter);
lcd.blink();
} else {
lcd.setCursor(nameIndex - 1, 1);
lcd.print('_');
}
}
lastButtonPressTime = currentTime;
delay(300); // Debounce
}
if (digitalRead(BUTTON_RED) == LOW) {
// Avança para a próxima letra do alfabeto
currentLetter++;
if (currentLetter > 'Z') {
currentLetter = 'A';
}
lcd.setCursor(nameIndex, 1);
lcd.print(currentLetter);
lcd.blink();
if (currentLetter > 'Z') {
currentLetter = 'A';
}
lcd.setCursor(nameIndex, 1);
lcd.print(currentLetter);
lastButtonPressTime = currentTime;
delay(300); // Debounce
}
// Finaliza a entrada do nome se não houver atividade por 10 segundos
if (currentTime - lastButtonPressTime > NAME_ENTRY_TIMEOUT) {
lcd.noBlink();
enteringName = false;
finalizeWriting();
}
}
void finalizeWriting() {
tone(BUZZER, 1000, 500); // Emitir um bipe ao iniciar a gravação
digitalWrite(GREEN_LED, HIGH); // Acender o LED verde
myFile = SD.open("data.txt", FILE_WRITE);
if (myFile) {
char uidString[] = "DEMO1234";
myFile.print("ID: ");
myFile.print(uidString);
myFile.print(", Num: ");
myFile.print(currentNumber);
myFile.print(", Nome: ");
myFile.println(name);
myFile.close();
Serial.print("ID: ");
Serial.print(uidString);
Serial.print(", Num: ");
Serial.print(currentNumber);
Serial.print(", Nome: ");
Serial.println(name);
lcd.clear();
lcd.print("Gravacao OK");
digitalWrite(GREEN_LED, HIGH);
tone(BUZZER, 1000, 500);
delay(2000);
digitalWrite(GREEN_LED, LOW);
tone(BUZZER, 1000, 500); // Emitir um bipe ao finalizar a gravação
isWritingMode = false;
lcd.clear();
currentNumber++;
if (currentNumber > 1000) {
currentNumber = 1;
}
} else {
lcd.clear();
lcd.print("Erro ao gravar!");
Serial.println("Erro ao abrir o arquivo para gravacao!");
delay(2000);
isWritingMode = false;
lcd.clear();
}
}