ESP32 - RFID - Solenoid Lock
In this tutorial, we are going to learn how to make RFID-based door lock system by using ESP32, RC522 RFID reader and solenoid lock.
Or you can buy the following sensor kits:
Disclosure: some of these links are affiliate links. We may earn a commission on your purchase at no extra cost to you. We appreciate it.
Unfamiliar with RFID/NFC RC522 Module and solenoid lock, including their pinouts, functionality, and programming? Explore comprehensive tutorials on these topics below:
This image is created using Fritzing. Click to enlarge image
※ NOTE THAT:
The order of pins can vary according to manufacturers. ALWAYS use the labels printed on the module. The above image shows the pinout of the modules from DIYables manufacturer.
If you're unfamiliar with how to supply power to the ESP32 and other components, you can find guidance in the following tutorial: How to Power ESP32.
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 5
#define RST_PIN 27
#define RELAY_PIN 32
MFRC522 rfid(SS_PIN, RST_PIN);
byte authorizedUID[4] = {0xFF, 0xFF, 0xFF, 0xFF};
void setup() {
Serial.begin(9600);
SPI.begin();
rfid.PCD_Init();
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
Serial.println("Tap RFID Tag on reader");
}
void loop() {
if (rfid.PICC_IsNewCardPresent()) {
if (rfid.PICC_ReadCardSerial()) {
MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
if (rfid.uid.uidByte[0] == authorizedUID[0] &&
rfid.uid.uidByte[1] == authorizedUID[1] &&
rfid.uid.uidByte[2] == authorizedUID[2] &&
rfid.uid.uidByte[3] == authorizedUID[3] ) {
Serial.println("Authorized Tag");
digitalWrite(RELAY_PIN, LOW);
delay(2000);
digitalWrite(RELAY_PIN, HIGH);
}
else
{
Serial.print("Unauthorized Tag:");
for (int i = 0; i < rfid.uid.size; i++) {
Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(rfid.uid.uidByte[i], HEX);
}
Serial.println();
}
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
}
}
}
Do the wiring as above image.
Connect the ESP32 board to your PC via a micro USB cable
Open Arduino IDE on your PC.
Select the right ESP32 board (e.g. ESP32 Dev Module) and COM port.
Because UID is usually not printed on RFID Tag, The first step we need to do is to find out the tag's UID. This can be done by:
Copy the above code and open with Arduino IDE
Click Upload button on Arduino IDE to upload code to ESP32
Open Serial Monitor
Tap an RFID Tag on RFID-RC522 module
Get UID on Serial Monitor
Tap RFID Tag on reader
Unauthorized Tag: 51 3D C1 AC
After having UID:
Update UID in the line 18 of the above code. For example, change byte authorizedUID[4] = {0xFF, 0xFF, 0xFF, 0xFF}; TO byte authorizedUID[4] = {0x51, 0x3D, 0xC1, 0xAC};
Upload the code to ESP32 again
Tap an RFID Tag on RFID-RC522 module
See output on Serial Monitor
Tap RFID Tag on reader
Authorized Tag
Tap RFID Tag on reader
Authorized Tag
Unauthorized Tag: 5D 11 1A D3
We can allow multiple RFID/NFC tags to activate the solenoid lock. The below code uses two tags as an example.
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 5
#define RST_PIN 27
#define RELAY_PIN 32
MFRC522 rfid(SS_PIN, RST_PIN);
byte authorizedUID1[4] = {0x51, 0x3D, 0xC1, 0xAC};
byte authorizedUID2[4] = {0x30, 0x01, 0x8B, 0x15};
void setup() {
Serial.begin(9600);
SPI.begin();
rfid.PCD_Init();
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
Serial.println("Tap RFID Tag on reader");
}
void loop() {
if (rfid.PICC_IsNewCardPresent()) {
if (rfid.PICC_ReadCardSerial()) {
MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
if (rfid.uid.uidByte[0] == authorizedUID1[0] &&
rfid.uid.uidByte[1] == authorizedUID1[1] &&
rfid.uid.uidByte[2] == authorizedUID1[2] &&
rfid.uid.uidByte[3] == authorizedUID1[3] ) {
Serial.println("Authorized Tag 1");
digitalWrite(RELAY_PIN, LOW);
delay(2000);
digitalWrite(RELAY_PIN, HIGH);
}
else
if (rfid.uid.uidByte[0] == authorizedUID2[0] &&
rfid.uid.uidByte[1] == authorizedUID2[1] &&
rfid.uid.uidByte[2] == authorizedUID2[2] &&
rfid.uid.uidByte[3] == authorizedUID2[3] ) {
Serial.println("Authorized Tag 2");
digitalWrite(RELAY_PIN, LOW);
delay(2000);
digitalWrite(RELAY_PIN, HIGH);
}
else
{
Serial.print("Unauthorized Tag:");
for (int i = 0; i < rfid.uid.size; i++) {
Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(rfid.uid.uidByte[i], HEX);
}
Serial.println();
}
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
}
}
}
Do the similar steps as the above, and then tap one by one tag on RFID-RC522 module. The result on Serial Monitor looks like below:
Tap RFID Tag on reader
Authorized Tag 2
Authorized Tag 1
Making video is a time-consuming work. If the video tutorial is necessary for your learning, please let us know by subscribing to our YouTube channel , If the demand for video is high, we will make the video tutorial.