电路板如下图:
组件
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"); | |
} | |
//---------------------------------------------------------------------------- | |
} |
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !