Proyecto tarjetas y antena Rfid Mfrc522

Amigos buenas tardes, estoy desarrollando un proyecto en mi Universidad el cual Lee tarjetas de Rfid y necesito que una tarjeta me marque entrada y salida...paso la tarjeta una vez y es entrada, la vuelvo a pasar y es salida y así repetitivamente, es haciendo un contador pero no logro entender ni poder hacerlo, espero puedan ayudarle saludos !

Les dejo mi código como referencia, el código al detectar la tarjeta Rfid imprime en pantalla Osciloscopio itcv, necesito que al pasarlo una vez me imprima "entrada" y al volverla a pasar "salida"

//PROYECTO DE RESIDENCIAS ITCV
//RFID
#include <Wire.h>
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal_I2C.h>

#define SS_PIN 53
#define RST_PIN 5
#define LED_G 4 //define green LED pin
#define LED_R 2 //define red LED
#define BUZZER 7 //buzzer pin
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
LiquidCrystal_I2C lcd(0x3f,16,2);

void setup()
{
Serial.begin(9600); // Initiate a serial communication
lcd.backlight();
lcd.clear();
Serial.print("introduzca tarjeta");
SPI.begin(); // Initiate SPI bus
mfrc522.PCD_Init(); // Initiate MFRC522
pinMode(LED_G, OUTPUT);
pinMode(LED_R, OUTPUT);
pinMode(BUZZER, OUTPUT);
noTone(BUZZER);

Serial.println();

}
void loop()
{

{
// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent())
{
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}

//Show UID on serial monitor
Serial.print("UID tag :");
String content= "";
byte letter;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
Serial.println();
Serial.print("Message : ");
content.toUpperCase();
if (content.substring(1) == "50 FF 1F A4") //change here the UID of the card/cards that you want to give access

{
Serial.println("osciloscopio itcv N:0150 Entrada");
Serial.println();
delay(500);
digitalWrite(LED_G, LOW);
tone(BUZZER, 500);
delay(300);
noTone(BUZZER);
delay(5000);
digitalWrite(LED_G, HIGH);

}

}

}

This is the English section. Try again.

@angelrv00 Hola buenas, ha hecho un topico en el parte ingles, he traducido en ingles.
Qué modulo usa? Arduino UNO, ESP32, ESP8266...

Posted the question in spanish, so I´ve translated to english:

Hi friends good afternoon, I am developing a project at my University which reads Rfid cards and I need a card to mark me input and output...I pass the card once and it is input, I pass it again and it is output and so on repeatedly, it is making a counter but I can not understand or be able to do it, I hope you can help.
Greetings !
I leave my code as a reference, the code to detect the Rfid card prints on screen Oscilloscope itcv, I need to pass it once to print me "input" and to pass it back to "output".

His code is following:

//PROYECTO DE RESIDENCIAS ITCV
//RFID
#include <Wire.h>
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal_I2C.h>

#define SS_PIN 53
#define RST_PIN 5
#define LED_G 4                    //define green LED pin
#define LED_R 2                    //define red LED
#define BUZZER 7                   //buzzer pin
MFRC522 mfrc522(SS_PIN, RST_PIN);  // Create MFRC522 instance.
LiquidCrystal_I2C lcd(0x3f, 16, 2);

void setup() {
  Serial.begin(9600);  // Initiate a serial communication
  lcd.backlight();
  lcd.clear();
  Serial.print("introduzca tarjeta");
  SPI.begin();         // Initiate SPI bus
  mfrc522.PCD_Init();  // Initiate MFRC522
  pinMode(LED_G, OUTPUT);
  pinMode(LED_R, OUTPUT);
  pinMode(BUZZER, OUTPUT);
  noTone(BUZZER);

  Serial.println();
}
void loop() {

  {
    // Look for new cards
    if (!mfrc522.PICC_IsNewCardPresent()) {
      return;
    }
    // Select one of the cards
    if (!mfrc522.PICC_ReadCardSerial()) {
      return;
    }

    //Show UID on serial monitor
    Serial.print("UID tag :");
    String content = "";
    byte letter;
    for (byte i = 0; i < mfrc522.uid.size; i++) {
      Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
      Serial.print(mfrc522.uid.uidByte[i], HEX);
      content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
      content.concat(String(mfrc522.uid.uidByte[i], HEX));
    }
    Serial.println();
    Serial.print("Message : ");
    content.toUpperCase();
    if (content.substring(1) == "50 FF 1F A4")  //change here the UID of the card/cards that you want to give access

    {
      Serial.println("osciloscopio itcv N:0150 Entrada");
      Serial.println();
      delay(500);
      digitalWrite(LED_G, LOW);
      tone(BUZZER, 500);
      delay(300);
      noTone(BUZZER);
      delay(5000);
      digitalWrite(LED_G, HIGH);
    }
  }
}

Hi, i'm use Arduino Uno

@angelrv00 Hola buenas noches, y bienvenidos en el forum.
Puedo ver a su código mañana (hoy por la mañana) y probar a escribir una solución?
Qué es lo qué quieres? Con una tarjeta quieres cambiar cuando pasa la tarjeta una vez que puedes entrar y déspues cuando pasa la tarjeta qué puedes salir, no? O cuando pasa la tarjeta una vez es entrada en un pin y otra vez es salida en un pin? Si es la primera puedes hacer con un variable Bool.
Veo también qué usa un led verde y un rojo y otra cosas, puedes cargar una imagen o un esquema? Y qué vez en el monitor (Serial)?
Saludos, Dingsken.


Quiero que, al deslizar 1ra vez la tarjeta Rfid me imprima en pantalla "Osciloscopio salida" y al volver a deslizar esa misma tarjeta me imprima en pantalla "osciloscopio entrada" como si presté el instrumento y posteriormente me lo regresaron...salió el instrumento y volvió a entrar.
El código ya detecta las tarjetas y ya les asigné nombres...solo me falta eso que te comento arriba .

Si, es qué en su código no es nada qué cambia la entrada en salida sólo detecta la entrada pero nada cambia para detectar su salida.
Voy a ver mañana para escribir código que cambia el paso de tarjeta de entrada a salida déspues otra vez a entrada y así, vale?
Y necesitas también un cantador qué guarda los numeros de pasos, no?
No va a estar tan dificil, creo :wink:
Saludos, Rudy.

Si, es exactamente eso, tengo varios días batallando y no logro solucionarlo, sería muy grato si pudieras ayudarme, saludos y gracias!

1 Like

@angelrv00 de nada, hé visto a su código y con un bool que cambia la entrada en salida podemos solucionar y con un funcion podemos controlar la entrada o la salida y hacer un contador no es tan dificil.
Vamos a ver no tengo rfid pero es solamente cambiar poco de código y puedes probar.

1 Like

@angelrv00 Hola, buenos dias!
Ya hé cambiado su código así puedes cargar en su modulo para probar?

//PROYECTO DE RESIDENCIAS ITCV
//RFID
#include <Wire.h>
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal_I2C.h>
#define SS_PIN 53
#define RST_PIN 5
#define LED_G 4                    //define green LED pin
#define LED_R 2                    //define red LED
#define BUZZER 7                   //buzzer pin
MFRC522 mfrc522(SS_PIN, RST_PIN);  // Create MFRC522 instance.
LiquidCrystal_I2C lcd(0x3f, 16, 2);
bool userIn = false; // 1 bool por cada persona/tarjeta
int countUser1 = 0; // int para entrar por cada persona diferente
int countLeft1 = 0; // int de salir  por cada persona diferente
void setup() {
  Serial.begin(9600);  // Initiate a serial communication
  lcd.backlight();
  lcd.clear();
  Serial.print("introduzca tarjeta");
  SPI.begin();         // Initiate SPI bus
  mfrc522.PCD_Init();  // Initiate MFRC522
  pinMode(LED_G, OUTPUT);
  pinMode(LED_R, OUTPUT);
  pinMode(BUZZER, OUTPUT);
  noTone(BUZZER);
  Serial.println();
}
void loop() {

  {
    // Look for new cards
    if (!mfrc522.PICC_IsNewCardPresent()) {
      return;
    }
    // Select one of the cards
    if (!mfrc522.PICC_ReadCardSerial()) {
      return;
    }

    //Show UID on serial monitor
    Serial.print("UID tag :");
    String content = "";
    byte letter;
    for (byte i = 0; i < mfrc522.uid.size; i++) {
      Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
      Serial.print(mfrc522.uid.uidByte[i], HEX);
      content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
      content.concat(String(mfrc522.uid.uidByte[i], HEX));
    }
    Serial.println();
    Serial.print("Message : ");
    content.toUpperCase();
    if (content.substring(1) == "50 FF 1F A4")  //change here the UID of the card/cards that you want to give access
    {
      if (!userIn) {
        Serial.println("osciloscopio itcv N:0150 Entrada");
        entrada();
      } else {
        Serial.println("osciloscopio itcv N:0150 Salida");
        salida();
      }
    }
  }
}
void entrada() {
  delay(500);
  digitalWrite(LED_G, LOW);
  tone(BUZZER, 500);
  delay(300);
  noTone(BUZZER);
  delay(5000);
  digitalWrite(LED_G, HIGH);
  if (content.substring(1) == "50 FF 1F A4") {
    userIn = true;
    countUser1++;
    Serial.println("UserIn entra ");
    Serial.print(countUser1);
    Serial.println(" veces");
  }
}
void salida() {
  delay(500);
  digitalWrite(LED_G, LOW);
  tone(BUZZER, 500);
  delay(300);
  noTone(BUZZER);
  delay(5000);
  digitalWrite(LED_G, HIGH);
  if (content.substring(1) == "50 FF 1F A4") { // Si necesitas controlar más que 1 tarjeta puede cambiar con un estado switch/case también.
    userIn = false;
    countLeft1++;
    Serial.println("UserIn sale ");
    Serial.print(countLeft1);
    Serial.println(" veces");  // también puedes controlar con un RTC reloj y puedes controlar a qué hora sale y entra o con un modulo con WIFI como ESP32 DEV KIT o Arduino Uno con WIFI
  }
}

@angelrv00 Con un modulo RTC DS3231 puede estar así:

//PROYECTO DE RESIDENCIAS ITCV
//RFID
#include <Wire.h>
#include <SPI.h>
#include <uRTCLib.h>  // the uRTC library for real time clock functions by Naguissa has to be installed
/* Wiring     DS3231 to the       ESP32       UNO
*              SDA                 21         A4
*              SCL                 22         A5
*              VCC                 5V         5V
*              GND                 GND        GND
*              32K                  -
*              SQW                  -
*/
#include <MFRC522.h>
#include <LiquidCrystal_I2C.h>
#define SS_PIN 53
#define RST_PIN 5
#define LED_G 4                    //define green LED pin
#define LED_R 2                    //define red LED
#define BUZZER 7                   //buzzer pin
MFRC522 mfrc522(SS_PIN, RST_PIN);  // Create MFRC522 instance.
LiquidCrystal_I2C lcd(0x3f, 16, 2);
bool userIn = false;
int countUser1 = 0;
int countLeft1 = 0;
// uRTCLib rtc;
uRTCLib rtc(0x68);  // Más información en https://lastminuteengineers.com/ds3231-rtc-arduino-tutorial/
char daysOfTheWeek[7][12] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };

void setup() {
  Serial.begin(9600);  // Initiate a serial communication
  lcd.backlight();
  lcd.clear();
  Serial.print("introduzca tarjeta");
  SPI.begin();         // Initiate SPI bus
  mfrc522.PCD_Init();  // Initiate MFRC522
  pinMode(LED_G, OUTPUT);
  pinMode(LED_R, OUTPUT);
  pinMode(BUZZER, OUTPUT);
  noTone(BUZZER);
  Serial.println("Inicializar RTC");
  URTCLIB_WIRE.begin();
  // Comenta la siguiente línea una vez que hayas configurado la fecha y la hora.
  // La siguiente línea establece el RTC con una fecha y hora explícitas
  // por ejemplo para poner el 26 de Agosto de 2023 a las 10:56 deberias llamar:
  rtc.set(0, 56, 10, 7, 26, 8, 23);
  // rtc.set(segundos, minutos, hora, día de la semana, día del mes, mes, año)
  // establece el día de la semana (1=domingo, 7=sábado)
}
void loop() {
  Serial.println();
  {
    // Look for new cards
    if (!mfrc522.PICC_IsNewCardPresent()) {
      return;
    }
    // Select one of the cards
    if (!mfrc522.PICC_ReadCardSerial()) {
      return;
    }

    //Show UID on serial monitor
    Serial.print("UID tag :");
    String content = "";
    byte letter;
    for (byte i = 0; i < mfrc522.uid.size; i++) {
      Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
      Serial.print(mfrc522.uid.uidByte[i], HEX);
      content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
      content.concat(String(mfrc522.uid.uidByte[i], HEX));
    }
    Serial.println();
    Serial.print("Message : ");
    content.toUpperCase();
    if (content.substring(1) == "50 FF 1F A4")  //change here the UID of the card/cards that you want to give access
    {
      if (!userIn) {
        Serial.println("osciloscopio itcv N:0150 Entrada");
        entrada();
      } else {
        Serial.println("osciloscopio itcv N:0150 Salida");
        salida();
      }
      delay(2000);
    }
  }
}
void entrada() {
  delay(500);
  digitalWrite(LED_G, LOW);
  tone(BUZZER, 500);
  delay(300);
  noTone(BUZZER);
  delay(5000);
  digitalWrite(LED_G, HIGH);
  if (content.substring(1) == "50 FF 1F A4") {
    userIn = true;
    countUser1++;
    Serial.println("UserIn entra ");
    Serial.print(countUser1);
    Serial.println(" veces");
    Serial.print("Entrada: ");
    setTime();
  }
}
void salida() {
  delay(500);
  digitalWrite(LED_G, LOW);
  tone(BUZZER, 500);
  delay(300);
  noTone(BUZZER);
  delay(5000);
  digitalWrite(LED_G, HIGH);
  if (content.substring(1) == "50 FF 1F A4") {
    userIn = false;
    countLeft1++;
    Serial.println("UserIn sale ");
    Serial.print(countLeft1);
    Serial.println(" veces");  // también puedes controlar con un RTC reloj y puedes controlar a qué hora sale y entra o con un modulo con WIFI como ESP32 DEV KIT o Arduino Uno con WIFI
    Serial.print("Salida: ");
    setTime();
  }
}
void setTime() {
  rtc.refresh();
  Serial.print(rtc.day());
  Serial.print('/');
  Serial.print(rtc.month());
  Serial.print('/');
  Serial.print(rtc.year());
  Serial.print(" ");
  Serial.print(rtc.hour());
  Serial.print(':');
  Serial.print(rtc.minute());
  Serial.print(':');
  Serial.println(rtc.second());
}

Para instalar el DS3231 con una batería CR2032 hay qué quitar el smd resistor ve al:
https://lastminuteengineers.com/ds3231-rtc-arduino-tutorial/

Saludos!

Amigos buenas tardes, estoy desarrollando un proyecto en mi Universidad el cual Lee tarjetas de Rfid y necesito que una tarjeta me marque entrada y salida...paso la tarjeta una vez y es entrada, la vuelvo a pasar y es salida y así repetitivamente, es haciendo un contador pero no logro entender ni poder hacerlo, espero puedan ayudarle saludos !

Les dejo mi código como referencia, el código al detectar la tarjeta Rfid imprime en pantalla Osciloscopio itcv, necesito que al pasarlo una vez me imprima "entrada" y al volverla a pasar "salida"

//PROYECTO DE RESIDENCIAS ITCV
//RFID
#include <Wire.h>
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal_I2C.h>

#define SS_PIN 53
#define RST_PIN 5
#define LED_G 4 //define green LED pin
#define LED_R 2 //define red LED
#define BUZZER 7 //buzzer pin
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
LiquidCrystal_I2C lcd(0x3f,16,2);

void setup()
{
Serial.begin(9600); // Initiate a serial communication
lcd.backlight();
lcd.clear();
Serial.print("introduzca tarjeta");
SPI.begin(); // Initiate SPI bus
mfrc522.PCD_Init(); // Initiate MFRC522
pinMode(LED_G, OUTPUT);
pinMode(LED_R, OUTPUT);
pinMode(BUZZER, OUTPUT);
noTone(BUZZER);

Serial.println();

}
void loop()
{

{
// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent())
{
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}

//Show UID on serial monitor
Serial.print("UID tag :");
String content= "";
byte letter;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
Serial.println();
Serial.print("Message : ");
content.toUpperCase();
if (content.substring(1) == "50 FF 1F A4") //change here the UID of the card/cards that you want to give access

{
Serial.println("osciloscopio itcv N:0150 Entrada");
Serial.println();
delay(500);
digitalWrite(LED_G, LOW);
tone(BUZZER, 500);
delay(300);
noTone(BUZZER);
delay(5000);
digitalWrite(LED_G, HIGH);

}

}

}

Por favor edita tu post y adjunta el código de acuerdo a las Normas del Foro en Español, punto 7. También usa la opción "Autoformato" del menú "Herramientas" de la IDE antes de copiar el código así nos facilitas su lectura. Es para tu beneficio.


Moderador
Hay un doble posteo con este otro hilo.

https://forum.arduino.cc/t/etiquetas-y-antena-rfid/1162031

Primera y ultima advertencia.
La próxima vez será baneo por no respetar las normas del foro.
Ademas del doble posteo.
No has posteado el código como corresponde y por si faltaba algo, lo has hecho en el foro en inglés usando español.
Edita los posteos que tengan código sin etiquetas. Todos.
Gracias.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.