#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <MFRC522.h>
// Pines para el RFID
#define SS_PIN 5
#define RST_PIN 2
// Pines de los botones de colores
#define BTN_RED 13
#define BTN_GREEN 14
#define BTN_BLUE 15
// Pines de los botones de tamaño
#define BTN_GRANDE 25
#define BTN_PEQUENO 26
MFRC522 mfrc522(SS_PIN, RST_PIN); // Crear una instancia del lector RFID
LiquidCrystal_I2C lcd(0x27, 16, 2); // Configuración del LCD
bool sizeSelected = false; // Variable para manejar el estado del botón de tamaño
bool tagDetected = false; // Variable para manejar el estado del tag
String detectedUID = ""; // Almacena el UID detectado
String size = ""; // Almacena el tamaño seleccionado
void setup() {
// Inicialización de componentes
SPI.begin(); // Iniciar el bus SPI
mfrc522.PCD_Init(); // Inicializar el lector RFID
lcd.init(); // Inicializar la pantalla LCD
lcd.backlight(); // Encender la luz de fondo
lcd.setCursor(0, 0); // Posicionar el cursor
lcd.print("Seleccione tamano"); // Mensaje inicial
// Configurar el monitor serial
Serial.begin(115200);
// Configurar los pines de los botones como entrada con pull-up
pinMode(BTN_RED, INPUT_PULLUP);
pinMode(BTN_GREEN, INPUT_PULLUP);
pinMode(BTN_BLUE, INPUT_PULLUP);
pinMode(BTN_GRANDE, INPUT_PULLUP);
pinMode(BTN_PEQUENO, INPUT_PULLUP);
}
void loop() {
// Verificar si se seleccionó un tamaño
verificarTamano();
// SIMULACIÓN: Detectar UID desde el monitor serial si se seleccionó un tamaño
if (sizeSelected && Serial.available()) {
detectedUID = Serial.readStringUntil('\n'); // Leer UID simulado
tagDetected = true;
}
// ESQUEMA REAL:
// if (sizeSelected && mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
// detectedUID = "";
// for (byte i = 0; i < mfrc522.uid.size; i++) {
// detectedUID += String(mfrc522.uid.uidByte[i], HEX); // Convertir UID a string
// }
// tagDetected = true;
// mfrc522.PICC_HaltA(); // Detener la comunicación con el tag
// }
// Si se detecta un tag, mostrar el mensaje en el LCD
if (tagDetected) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("UID detectado:");
lcd.setCursor(0, 1);
lcd.print(detectedUID);
delay(2000); // Mostrar el mensaje durante 2 segundos
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Se concede");
lcd.setCursor(0, 1);
lcd.print("ingreso");
delay(2000); // Mostrar el mensaje durante 2 segundos
// Mostrar que los botones están listos
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Presione boton");
lcd.setCursor(0, 1);
lcd.print("Rojo/Verde/Azul");
// Esperar a que se presione un botón de color
String colorPresionado = esperarBoton();
// Mostrar mensaje con el tamaño y el color seleccionados
mostrarMensaje(colorPresionado, size);
// Restablecer el mensaje inicial
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Seleccione tamano");
tagDetected = false; // Resetear el estado del tag
sizeSelected = false; // Resetear el estado del tamaño
}
}
// Función para verificar el tamaño seleccionado
void verificarTamano() {
if (digitalRead(BTN_GRANDE) == LOW) {
size = "Grande";
sizeSelected = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tamano: Grande");
delay(1000); // Dar tiempo para leer el mensaje
} else if (digitalRead(BTN_PEQUENO) == LOW) {
size = "Pequeno";
sizeSelected = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tamano: Pequeno");
delay(1000); // Dar tiempo para leer el mensaje
}
}
// Función para esperar hasta que se presione un botón de color
String esperarBoton() {
while (true) {
if (digitalRead(BTN_RED) == LOW) {
return "Rojo";
} else if (digitalRead(BTN_GREEN) == LOW) {
return "Verde";
} else if (digitalRead(BTN_BLUE) == LOW) {
return "Azul";
}
}
}
// Función para mostrar el mensaje al presionar un botón de color
void mostrarMensaje(String color, String tamano) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("UID: " + detectedUID);
lcd.setCursor(0, 1);
lcd.print("Color: " + color);
delay(2000); // Mostrar el mensaje inicial durante 2 segundos
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tamano: " + tamano);
lcd.setCursor(0, 1);
lcd.print("Color: " + color);
// Tiempo basado en el tamaño seleccionado
if (tamano == "Grande") {
delay(10000); // 10 segundos
} else if (tamano == "Pequeno") {
delay(5000); // 5 segundos
}
}