Error con sensor RFID y pantalla LCD I2C

Buenas noches, les pido ayuda para resolver un problema, mi situación es que tengo un proyecto de una casa domotica la cual (aquí viene el problema) quiero que tenga una puerta la cual se abra con un sensor rfid y lo muestre en una pantalla LCD de 4 pines si se abre o no y que la abra con un servo motor.
El problema viene que cuando ya esta el código con el número de la tarjeta muestra "la tarjeta no es la correcta" espero que alguien me ayude por favor.
Alguien que me ayude con el código por favor.
Este código es para sacar el código de la tarjeta

/*RFID tag scan code
 * https://srituhobby.com
 */
 
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN 9
#define SS_PIN  10
byte readCard[4];
byte a = 0;

LiquidCrystal_I2C lcd(0x27, 16, 2);
MFRC522 mfrc522(SS_PIN, RST_PIN);

void setup() {
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
  while (!Serial);
  SPI.begin();
  mfrc522.PCD_Init();
  delay(4);
  mfrc522.PCD_DumpVersionToSerial();
  lcd.setCursor(2, 0);
  lcd.print("Put your card");
}

void loop() {
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return 0;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return 0;
  }

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Scanned UID");
  a = 0;
  Serial.println(F("Scanned PICC's UID:"));
  for ( uint8_t i = 0; i < 4; i++) {  //
    readCard[i] = mfrc522.uid.uidByte[i];
    Serial.print(readCard[i], HEX);
    Serial.print(" ");
    lcd.setCursor(a, 1);
    lcd.print(readCard[i], HEX);
    lcd.print(" ");
    delay(500);
    a += 3;
  }
  Serial.println("");
  mfrc522.PICC_HaltA();
  return 1;
}

Y este es ya para abrir la puerta ya con el código de la tarjeta

/*Door lock system code
 * https://srituhobby.com
 */
 
#include <Servo.h>
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9
String UID = "";
byte lock = 0;

Servo servo;
LiquidCrystal_I2C lcd(0x27, 16, 2);
MFRC522 rfid(SS_PIN, RST_PIN);


void setup() {
  Serial.begin(9600);
  servo.write(70);
  lcd.init();
  lcd.backlight();
  servo.attach(3);
  SPI.begin();
  rfid.PCD_Init();
}

void loop() {
  lcd.setCursor(4, 0);
  lcd.print("Welcome!");
  lcd.setCursor(1, 1);
  lcd.print("Put your card");

  if ( ! rfid.PICC_IsNewCardPresent())
    return;
  if ( ! rfid.PICC_ReadCardSerial())
    return;

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Scanning");
  Serial.print("NUID tag is :");
  String ID = "";
  for (byte i = 0; i < rfid.uid.size; i++) {
    lcd.print(".");
    ID.concat(String(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "));
    ID.concat(String(rfid.uid.uidByte[i], HEX));
    delay(300);
  }
  ID.toUpperCase();

  if (ID.substring(1) == UID && lock == 0 ) {
    servo.write(70);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Door is locked");
    delay(1500);
    lcd.clear();
    lock = 1;
  } else if (ID.substring(1) == UID && lock == 1 ) {
    servo.write(160);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Door is open");
    delay(1500);
    lcd.clear();
    lock = 0;
  } else {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Wrong card!");
    delay(1500);
    lcd.clear();
  }
}

He trasladado su tema de una categoría de idioma inglés del foro a la categoría International > Español @sotocade11 .

En adelante por favor usar la categoría apropiada a la lengua en que queráis publicar. Esto es importante para el uso responsable del foro, y esta explicado aquí la guía "How to get the best out of this forum".
Este guía contiene mucha información útil. Por favor leer.

De antemano, muchas gracias por cooperar.

Una disculpa, soy nuevo en esto de los foros

1 Like

¿Qué código está en su tarjeta RFID y qué código RFID quiere la casa? Verifique que está programando la tarjeta RFID correctamente.

Si adjuntas tu código (de acuerdo a las Normas del Foro en Español, punto 7) sería mucho más sencillo ayudarte.

Y edita el título del tema, no hay nada más inútil que ese título que pusiste.

Gracias a los compañeros del foro por mantener organizado el mismo.

Moderador:
Por favor, lee las Normas del foro
Edita tu título, usa uno que no tenga justamente lo que se considera un título inútil.
Ver en las normas punto 5.
5. Piensa un título y descriptivo
Trata de resumir tu problema con un título inteligente, útil e informativo.
Un título útil salta a la vista de las personas que podrían conocer la respuesta. Los títulos inútiles son los que deberías evitar.
Ejemplos de títulos inútiles que deberías evitar:
• ERROR EN CODIGO, AYUDA URGENTE
• Problema al programar
• Tengo un error
• Error
• Tendré problemas?
• Novato en apuros
• POR FAVOR NECESITO AYUDA RAPIDO!!!!

Gracias por la aclaracion

Gracias por decirlo, ya lo edito.

Peor que antes... :man_facepalming:t2:

Okey... Supongo.

Moderador
No leiste lo que te puse en el post#6?

Si ya lo leí, no lo había leído una disculpa

Separa las cosas, primero prueba tu RFID y asegúrate que funciona bien.
Ejemplo básico de la librería.
Pones la tarjeta y te debe decir, tarjeta OK o Hola Sotocade!
Asi que vamos por ahi primero!!

Luego de evaluar tu código me di cuenta que el código tiene muchos errores y delay(), tanto que te sugiero que pruebes este.

#include <Servo.h>
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9

const String MASTER_UID = "043A29B7"; // UID de tu tarjeta
byte lock = 0;                                                 // Estado de la cerradura (0: cerrada, 1: abierta)
unsigned long previousMillis = 0;              // Para manejar el temporizador
const unsigned long lockDelay = 1500;    // Tiempo de espera en milisegundos

Servo servo;
LiquidCrystal_I2C lcd(0x27, 16, 2);
MFRC522 rfid(SS_PIN, RST_PIN);

void setup() {
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
  servo.attach(3);
  servo.write(70); // Posición inicial del servo para mantener la puerta cerrada
  SPI.begin();
  rfid.PCD_Init();
}

void loop() {
  lcd.setCursor(4, 0);
  lcd.print("Welcome!");
  lcd.setCursor(1, 1);
  lcd.print("Put your card");

  // Verificar si hay una tarjeta nueva presente
  if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Scanning...");
    Serial.print("UID detectado: ");
    
    // Leer el UID de la tarjeta y almacenarlo en una cadena
    String detectedUID = "";
    for (byte i = 0; i < rfid.uid.size; i++) {
      detectedUID += String(rfid.uid.uidByte[i], HEX);
    }
    detectedUID.toUpperCase(); // Convertir a mayúsculas para una comparación precisa
    Serial.println(detectedUID);

    // Verificar si el UID coincide con la tarjeta maestra
    if (detectedUID == MASTER_UID) {
      // Alternar el estado de la cerradura
      if (lock == 0) {
        servo.write(160); // Abrir puerta
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Puerta abierta");
        lock = 1;
      } else {
        servo.write(70); // Cerrar puerta
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Puerta cerrada");
        lock = 0;
      }
      // Registrar el tiempo en que se hizo la última acción
      previousMillis = millis();
    } else {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Tarjeta desconocida!");
      previousMillis = millis(); // Actualizar el tiempo para el mensaje de error
    }

    // Detener la lectura de la tarjeta hasta la próxima vez
    rfid.PICC_HaltA();
  }

  // Limpiar el mensaje en la pantalla después de lockDelay milisegundos
  if (millis() - previousMillis >= lockDelay) {
    lcd.clear();
  }
}

Gracias lo voy a probar