×

基于RFID的学生出勤监控系统

消耗积分:0 | 格式:zip | 大小:0.05 MB | 2023-01-30

王强

分享资料个

电路板如下图:
pYYBAGPV_D2AZ07DAAA8M5r__sg755.jpg
poYBAGPV_ECASWVmAAA61qRWUv4046.jpg

组件

499
Adafruit 工业有限责任公司
x 1
ESP-WROOM-32 x 1

描述

基于 RFID 的学生出勤监控系统

在教室里,时间被浪费在点名上,因为它是手动完成的。在这个提议的系统中,被授权的学生被赋予一个 RFID 标签。通过将 RFID 标签放在阅读器上,学生或工作人员可以立即验证他们的出勤情况。因此,存储在该卡中的数据被称为该人的身份/出勤。一旦学生将卡片放在 RFID 读卡器前面,它就会读取数据并与存储的数据进行验证。蜂鸣器会在扫描 RFID 标签时发出蜂鸣声。如果数据匹配,则它会在 LCD 上显示一条消息,确认该学生的输入,否则会显示一条消息,拒绝出席。通过按下连接到微控制器的状态按钮,可以从该系统中检索学生的出勤状态。最后,他/她的日期和时间数据存储在谷歌表格中。这个特定的谷歌表格显示了日期、时间和 RFID 标签中存储的数据。因此,由于所有学生的出勤情况都直接存储在数据库中,因此节省了大量时间。它将产生一个实时考勤监控系统,供讲师、校园管理人员和家长等各方访问。

代码

RFID入口代码

阿杜诺

  #include
  #include
  //--------------------------------------------------
  //GPIO 0 --> D3
  //GPIO 2 --> D4
  const uint8_t RST_PIN = D3;
  const uint8_t SS_PIN = D4;
  int BUZZER = 2;
  //--------------------------------------------------
  MFRC522 mfrc522(SS_PIN, RST_PIN);
  MFRC522::MIFARE_Key key;
  //--------------------------------------------------
  /* Be aware of Sector Trailer Blocks */
  int blockNum = 4;
  byte block_data[16];
  /* Create array to read data from Block */
  /* Length of buffer should be 4 Bytes
  more than the size of Block (16 Bytes) */
  byte bufferLen = 18;
  byte readBlockData[18];
  //--------------------------------------------------
  MFRC522::StatusCode status;
  //--------------------------------------------------
   
   
   
  void setup()
  {
  //------------------------------------------------------
  //Initialize serial communications with PC
  Serial.begin(9600);
  //------------------------------------------------------
  //Initialize SPI bus
  SPI.begin();
  //------------------------------------------------------
  //Initialize MFRC522 Module
  mfrc522.PCD_Init();
  Serial.println("Scan a MIFARE 1K Tag to write data...");
  //------------------------------------------------------
  }
   
   
   
  /****************************************************************************************************
  * loop() function
  ****************************************************************************************************/
  void loop()
  {
  //------------------------------------------------------------------------------
  /* Prepare the ksy for authentication */
  /* All keys are set to FFFFFFFFFFFFh at chip delivery from the factory */
  for (byte i = 0; i < 6; i++){
  key.keyByte[i] = 0xFF;
  }
  //------------------------------------------------------------------------------
  /* Look for new cards */
  /* Reset the loop if no new card is present on RC522 Reader */
  if ( ! mfrc522.PICC_IsNewCardPresent()){return;}
  //------------------------------------------------------------------------------
  /* Select one of the cards */
  if ( ! mfrc522.PICC_ReadCardSerial()) {return;}
  //------------------------------------------------------------------------------
  Serial.print("\n");
  Serial.println("**Card Detected**");
  /* Print UID of the Card */
  Serial.print(F("Card UID:"));
  for (byte i = 0; i < mfrc522.uid.size; i++){
  Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
  Serial.print(mfrc522.uid.uidByte[i], HEX);
  }
  Serial.print("\n");
  /* Print type of card (for example, MIFARE 1K) */
  Serial.print(F("PICC type: "));
  MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
  Serial.println(mfrc522.PICC_GetTypeName(piccType));
   
  ------------------------------------------------------------------------------
  blockNum =4;
  toBlockDataArray("211EC206"); //ID
  WriteDataToBlock(blockNum, block_data);
  ReadDataFromBlock(blockNum, readBlockData);
  dumpSerial(blockNum, readBlockData);
   
  blockNum =5;
  toBlockDataArray("Madhumithra"); //First Name
  WriteDataToBlock(blockNum, block_data);
  ReadDataFromBlock(blockNum, readBlockData);
  dumpSerial(blockNum, readBlockData);
   
  blockNum =6;
  toBlockDataArray("S"); //Last Name
  WriteDataToBlock(blockNum, block_data);
  ReadDataFromBlock(blockNum, readBlockData);
  dumpSerial(blockNum, readBlockData);
   
  blockNum =8;
  toBlockDataArray("Shanmugavel.M"); //Father Name
  WriteDataToBlock(blockNum, block_data);
  ReadDataFromBlock(blockNum, readBlockData);
  dumpSerial(blockNum, readBlockData);
   
  blockNum =9;
  toBlockDataArray("24-09-2003"); //Date of Birth
  WriteDataToBlock(blockNum, block_data);
  ReadDataFromBlock(blockNum, readBlockData);
  dumpSerial(blockNum, readBlockData);
   
  blockNum =10;
  toBlockDataArray("8526267629"); //Phone Number
  WriteDataToBlock(blockNum, block_data);
  ReadDataFromBlock(blockNum, readBlockData);
  dumpSerial(blockNum, readBlockData);
   
  blockNum =12;
  toBlockDataArray("Pollachi"); //Address
  WriteDataToBlock(blockNum, block_data);
  ReadDataFromBlock(blockNum, readBlockData);
  dumpSerial(blockNum, readBlockData);
   
  //tone(BUZZER, 1000, 1000);
  }
   
   
   
  /****************************************************************************************************
  * Writ() function
  ****************************************************************************************************/
  void WriteDataToBlock(int blockNum, byte blockData[])
  {
  Serial.print("Writing data on block ");
  Serial.print(blockNum);
  //------------------------------------------------------------------------------
  /* Authenticating the desired data block for write access using Key A */
  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, blockNum, &key, &(mfrc522.uid));
  if (status != MFRC522::STATUS_OK){
  Serial.print("Authentication failed for Write: ");
  Serial.println(mfrc522.GetStatusCodeName(status));
  return;
  }
  //------------------------------------------------------------------------------
  else {
  Serial.println("Authentication success");
  }
  //------------------------------------------------------------------------------
  /* Write data to the block */
  status = mfrc522.MIFARE_Write(blockNum, blockData, 16);
  if (status != MFRC522::STATUS_OK) {
  Serial.print("Writing to Block failed: ");
  Serial.println(mfrc522.GetStatusCodeName(status));
  return;
  }
  else
  {Serial.println("Data was written into Block successfully");}
  //------------------------------------------------------------------------------
  }
   
   
   
   
   
  /****************************************************************************************************
  * ReadDataFromBlock() function
  ****************************************************************************************************/
  void ReadDataFromBlock(int blockNum, byte readBlockData[])
  {
  Serial.print("Reading data from block ");
  Serial.println(blockNum);
  //------------------------------------------------------------------------------
  /* Authenticating the desired data block for Read access using Key A */
  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, blockNum, &key, &(mfrc522.uid));
  //------------------------------------------------------------------------------
  if (status != MFRC522::STATUS_OK){
  Serial.print("Authentication failed for Read: ");
  Serial.println(mfrc522.GetStatusCodeName(status));
  return;
  }
  else {
  Serial.println("Authentication success");
  }
  //------------------------------------------------------------------------------
  /* Reading data from the Block */
  status = mfrc522.MIFARE_Read(blockNum, readBlockData, &bufferLen);
  if (status != MFRC522::STATUS_OK){
  Serial.print("Reading failed: ");
  Serial.println(mfrc522.GetStatusCodeName(status));
  return;
  }
  else {
  Serial.println("Block was read successfully");
  }
  //------------------------------------------------------------------------------
  }
   
   
   
  /****************************************************************************************************
  * dumpSerial() function
  ****************************************************************************************************/
  void dumpSerial(int blockNum, byte blockData[])
  {
  Serial.print("\n");
  Serial.print("Data in Block:");
  Serial.print(blockNum);
  Serial.print(" --> ");
  for (int j=0 ; j<16 ; j++){
  Serial.write(readBlockData[j]);
  }
  Serial.print("\n");Serial.print("\n");
  }
   
   
  /****************************************************************************************************
  * dumpSerial() function
  ****************************************************************************************************/
  void toBlockDataArray(String str)
  {
  byte len = str.length();
  if(len > 16) len = 16;
  for (byte i = 0; i < len; i++) block_data[i] = str[i];
  for (byte i = len; i < 16; i++) block_data[i] = ' ';
  }

RFID发布代码

阿杜诺

  #include
  #include
  #include
  #include
  #include
   
  #include
  #include
  LiquidCrystal_I2C lcd(0x27, 16, 2);
  //---------------------------------------------------------------------------------------------------------
  // Enter Google Script Deployment ID:
  const char *GScriptId = "AKfycbwTtq4rcL8zUaB8rjExY9KYo26q_n0hVqkiEdjS9YEBtfRg5C80OWvEVK2Hv5YUEj8ivw";
  //---------------------------------------------------------------------------------------------------------
  // Enter network credentials:
  const char* ssid = "ECE";
  const char* password = "62806280";
  //---------------------------------------------------------------------------------------------------------
  // Enter command (insert_row or append_row) and your Google Sheets sheet name (default is Sheet1):
  String payload_base ="{\"command\": \"insert_row\", \"sheet_name\": \"Sheet1\", \"values\": ";
  String payload = "";
  //---------------------------------------------------------------------------------------------------------
  // Google Sheets setup (do not edit)
  const char* host= "script.google.com";
  const int httpsPort = 443;
  const char* fingerprint = "";
  String url = String("/macros/s/") + GScriptId + "/exec";
  HTTPSRedirect* client = nullptr;
  //------------------------------------------------------------
  // Declare variables that will be published to Google Sheets
  String student_id;
  //------------------------------------------------------------
  int blocks[] = {4,5,6,8,9, 10, 12};
  #define total_blocks(sizeof(blocks) / sizeof(blocks[0]))
  //------------------------------------------------------------
  #define RST_PIN0//D3
  #define SS_PIN 2//D4
  #define BUZZER 4//D2
  //------------------------------------------------------------
  MFRC522 mfrc522(SS_PIN, RST_PIN);
  MFRC522::MIFARE_Key key;
  MFRC522::StatusCode status;
  //------------------------------------------------------------
  /* Be aware of Sector Trailer Blocks */
  int blockNum = 2;
  /* Create another array to read data from Block */
  /* Legthn of buffer should be 2 Bytes more than the size of Block (16 Bytes) */
  byte bufferLen = 18;
  byte readBlockData[18];
  //------------------------------------------------------------
   
  /****************************************************************************************************
  * setup Function
  ****************************************************************************************************/
  void setup() {
  //----------------------------------------------------------
  Serial.begin(9600);
  delay(10);
  Serial.println('\n');
  //----------------------------------------------------------
  SPI.begin();
  //----------------------------------------------------------
  //initialize lcd screen
  lcd.init();
  // turn on the backlight
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0,0); //col=0 row=0
  lcd.print("Connecting to");
  lcd.setCursor(0,1); //col=0 row=0
  lcd.print("WiFi...");
  //----------------------------------------------------------
  // Connect to WiFi
  WiFi.begin(ssid, password);
  Serial.print("Connecting to ");
  Serial.print(ssid); Serial.println(" ...");
   
  while (WiFi.status() != WL_CONNECTED) {
  delay(1000);
  Serial.print(".");
  }
  Serial.println('\n');
  Serial.println("Connection established!");
  Serial.print("IP address:\t");
  Serial.println(WiFi.localIP());
  //----------------------------------------------------------
  // Use HTTPSRedirect class to create a new TLS connection
  client = new HTTPSRedirect(httpsPort);
  client->setInsecure();
  client->setPrintResponseBody(true);
  client->setContentTypeHeader("application/json");
  //----------------------------------------------------------
  lcd.clear();
  lcd.setCursor(0,0); //col=0 row=0
  lcd.print("Connecting to");
  lcd.setCursor(0,1); //col=0 row=0
  lcd.print("Google ");
  delay(5000);
  //----------------------------------------------------------
  Serial.print("Connecting to ");
  Serial.println(host);
  //----------------------------------------------------------
  // Try to connect for a maximum of 5 times
  bool flag = false;
  for(int i=0; i<5; i++){
  int retval = client->connect(host, httpsPort);
  //*************************************************
  if (retval == 1){
  flag = true;
  String msg = "Connected. OK";
  Serial.println(msg);
  lcd.clear();
  lcd.setCursor(0,0); //col=0 row=0
  lcd.print(msg);
  delay(2000);
  break;
  }
  //*************************************************
  else
  Serial.println("Connection failed. Retrying...");
  //*************************************************
  }
  //----------------------------------------------------------
  if (!flag){
  //____________________________________________
  lcd.clear();
  lcd.setCursor(0,0); //col=0 row=0
  lcd.print("Connection fail");
  //____________________________________________
  Serial.print("Could not connect to server: ");
  Serial.println(host);
  delay(5000);
  return;
  //____________________________________________
  }
  //----------------------------------------------------------
  delete client;// delete HTTPSRedirect object
  client = nullptr; // delete HTTPSRedirect object
  //----------------------------------------------------------
  }
   
  /****************************************************************************************************
  * loop Function
  ****************************************************************************************************/
  void loop() {
  //----------------------------------------------------------------
  static bool flag = false;
  if (!flag){
  client = new HTTPSRedirect(httpsPort);
  client->setInsecure();
  flag = true;
  client->setPrintResponseBody(true);
  client->setContentTypeHeader("application/json");
  }
  if (client != nullptr){
  if (!client->connected())
  {client->connect(host, httpsPort);}
  }
  else{Serial.println("Error creating client object!");}
  //----------------------------------------------------------------
  lcd.clear();
  lcd.setCursor(0,0); //col=0 row=0
  lcd.print("Scan your Tag");
   
  /* Initialize MFRC522 Module */
  mfrc522.PCD_Init();
  /* Look for new cards */
  /* Reset the loop if no new card is present on RC522 Reader */
  if ( ! mfrc522.PICC_IsNewCardPresent()) {return;}
  /* Select one of the cards */
  if ( ! mfrc522.PICC_ReadCardSerial()) {return;}
  /* Read data from the same block */
  Serial.println();
  Serial.println(F("Reading last data from RFID..."));
  //----------------------------------------------------------------
  String values = "", data;
  /*
  //creating payload - method 1
  //----------------------------------------------------------------
  ReadDataFromBlock(blocks[0], readBlockData); //student id
  data = String((char*)readBlockData); data.trim();
  student_id = data;
  //----------------------------------------------------------------
  ReadDataFromBlock(blocks[1], readBlockData); //first name
  data = String((char*)readBlockData); data.trim();
  first_name = data;
  //----------------------------------------------------------------
  ReadDataFromBlock(blocks[2], readBlockData); //last name
  data = String((char*)readBlockData); data.trim();
  last_name = data;
  //----------------------------------------------------------------
  ReadDataFromBlock(blocks[3], readBlockData); //phone number
  data = String((char*)readBlockData); data.trim();
  phone_number = data;
  //----------------------------------------------------------------
  ReadDataFromBlock(blocks[4], readBlockData); //address
  data = String((char*)readBlockData); data.trim();
  address = data; data = "";
  //----------------------------------------------------------------
  values = "\"" + student_id + ",";
  values += first_name + ",";
  values += last_name + ",";
  values += phone_number + ",";
  values += address + "\"}";
  //----------------------------------------------------------------*/
  //creating payload - method 2 - More efficient
  for (byte i = 0; i < total_blocks; i++) {
  ReadDataFromBlock(blocks[i], readBlockData);
  //*************************************************
  if(i == 0){
  data = String((char*)readBlockData);
  data.trim();
  student_id = data;
  values = "\"" + data + ",";
  }
  //*************************************************
  else if(i == total_blocks-1){
  data = String((char*)readBlockData);
  data.trim();
  values += data + "\"}";
  }
  //*************************************************
  else{
  data = String((char*)readBlockData);
  data.trim();
  values += data + ",";
  }
  }
  //----------------------------------------------------------------
  // Create json object string to send to Google Sheets
  // values = "\"" + value0 + "," + value1 + "," + value2 + "\"}"
  payload = payload_base + values;
  //----------------------------------------------------------------
  lcd.clear();
  lcd.setCursor(0,0); //col=0 row=0
  lcd.print("Publishing Data");
  lcd.setCursor(0,1); //col=0 row=0
  lcd.print("Please Wait...");
  //----------------------------------------------------------------
  // Publish data to Google Sheets
  Serial.println("Publishing data...");
  Serial.println(payload);
  if(client->POST(url, host, payload)){
  // do stuff here if publish was successful
  lcd.clear();
  lcd.setCursor(0,0); //col=0 row=0
  lcd.print("Student ID: "+student_id);
  lcd.setCursor(0,1); //col=0 row=0
  lcd.print("Present");
  }
  //----------------------------------------------------------------
  else{
  // do stuff here if publish was not successful
  Serial.println("Error while connecting");
  lcd.clear();
  lcd.setCursor(0,0); //col=0 row=0
  lcd.print("Failed.");
  lcd.setCursor(0,1); //col=0 row=0
  lcd.print("Try Again");
  }
  //----------------------------------------------------------------
  // a delay of several seconds is required before publishing again
  delay(5000);
  tone(BUZZER, 1000, 1000);
  }
   
   
  /****************************************************************************************************
  *
  ****************************************************************************************************/
  /****************************************************************************************************
  * ReadDataFromBlock() function
  ****************************************************************************************************/
  void ReadDataFromBlock(int blockNum, byte readBlockData[])
  {
  //----------------------------------------------------------------------------
  /* Prepare the ksy for authentication */
  /* All keys are set to FFFFFFFFFFFFh at chip delivery from the factory */
  for (byte i = 0; i < 6; i++) {
  key.keyByte[i] = 0xFF;
  }
  //----------------------------------------------------------------------------
  /* Authenticating the desired data block for Read access using Key A */
  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, blockNum, &key, &(mfrc522.uid));
  //----------------------------------------------------------------------------s
  if (status != MFRC522::STATUS_OK){
  Serial.print("Authentication failed for Read: ");
  Serial.println(mfrc522.GetStatusCodeName(status));
  return;
  }
  //----------------------------------------------------------------------------
  else {
  Serial.println("Authentication success");
  }
  //----------------------------------------------------------------------------
  /* Reading data from the Block */
  status = mfrc522.MIFARE_Read(blockNum, readBlockData, &bufferLen);
  if (status != MFRC522::STATUS_OK) {
  Serial.print("Reading failed: ");
  Serial.println(mfrc522.GetStatusCodeName(status));
  return;
  }
  //----------------------------------------------------------------------------
  else {
  readBlockData[16] = ' ';
  readBlockData[17] = ' ';
  Serial.println("Block was read successfully");
  }
  //----------------------------------------------------------------------------
  }

pYYBAGPV_EeATsQ0AAC-dcdD7NQ567.png

 

poYBAGPV_EmAcifmAABqLBsfaks839.png

 

 

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !