पार्ट्स लिस्ट
| पार्ट | संख्या | लगभग | खरीदें |
|---|---|---|---|
| ESP32 DevKit V1 (30-pin) | 1 | ₹380 | खरीदें ESP32 DevKit V1 (30-pin) |
| RC522 RFID reader kit (card + key tag) | 1 | ₹120 | खरीदें RC522 RFID reader kit (card + key tag) |
| Extra 13.56 MHz MIFARE cards (pack of 10) | 1 | ₹150 | खरीदें Extra 13.56 MHz MIFARE cards (pack of 10) |
| 0.96" SSD1306 I2C OLED (4-pin) | 1 | ₹220 | खरीदें 0.96" SSD1306 I2C OLED (4-pin) |
| Active buzzer module | 1 | ₹25 | खरीदें Active buzzer module |
| Breadboard + jumper wires | 1 | ₹140 | खरीदें Breadboard + jumper wires |
| कुल | ₹1,035 |
एफ़िलिएट सूचना: “खरीदें” लिंक से FlashReady को बिना अतिरिक्त लागत के छोटा कमीशन मिल सकता है। कीमतें अनुमानित हैं।
वायरिंग
| ESP32 DevKit V1 | Part · pin | Wire | Notes |
|---|---|---|---|
| D4 | RC522 RFID reader (MFRC522, 13.56 MHz) · SDA | purple | SPI chip select (SS) |
| D18 | RC522 RFID reader (MFRC522, 13.56 MHz) · SCK | yellow | |
| D23 | RC522 RFID reader (MFRC522, 13.56 MHz) · MOSI | blue | |
| D19 | RC522 RFID reader (MFRC522, 13.56 MHz) · MISO | green | |
| D27 | RC522 RFID reader (MFRC522, 13.56 MHz) · RST | white | |
| 3V3 | RC522 RFID reader (MFRC522, 13.56 MHz) · 3.3V | red | सिर्फ़ 3.3 V — 5 V कभी नहीं |
| GND | RC522 RFID reader (MFRC522, 13.56 MHz) · GND | black | |
| D22 | SSD1306 OLED 0.96″ (128×64, I2C) · SCL | yellow | |
| D21 | SSD1306 OLED 0.96″ (128×64, I2C) · SDA | blue | |
| 3V3 | SSD1306 OLED 0.96″ (128×64, I2C) · VCC | red | |
| GND | SSD1306 OLED 0.96″ (128×64, I2C) · GND | black | |
| D25 | Active buzzer module (high-level trigger) · I/O | orange | |
| 3V3 | Active buzzer module (high-level trigger) · VCC | red | |
| GND | Active buzzer module (high-level trigger) · GND | black |
बोर्ड की ख़ास बातें: RC522 3.3 V का पार्ट है — इसे 3V3 से पावर दें। ESP32 पर इसके SPI पिन सीधे जुड़ जाते हैं। SS को आम D5 की जगह D4 पर रखा है, क्योंकि GPIO5 एक स्ट्रैपिंग पिन है; RST D27 पर है। हर कार्ड को पहली बार टैप करने पर उसका UID प्रिंट होता है ("unknown")। उसे व्यक्ति के नाम के साथ <code>people</code> लिस्ट में कॉपी कर दें। रीडर तक के तार छोटे रखें (15 cm से कम)। लंबे SPI तारों से कार्ड कभी-कभी पढ़ा नहीं जाता।
कोड
// RFID attendance — ESP32 DevKit V1 + RC522 + SSD1306 OLED + buzzer module
// RC522 on VSPI (SCK D18, MISO D19, MOSI D23), SS on D4, RST on D27. OLED on I2C D21/D22.
// Every tap prints a CSV line (uid,name,in/out,seconds since start) to Serial.
#include <SPI.h>
#include <Wire.h>
#include <MFRC522.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
constexpr uint8_t RFID_SS = 4;
constexpr uint8_t RFID_RST = 27;
constexpr uint8_t BUZZER_PIN = 25; // buzzer module I/O (high = on)
struct Person {
const char* uid; // as printed by the sketch, e.g. "A1B2C3D4"
const char* name;
bool in;
};
Person people[] = {
{"A1B2C3D4", "Asha", false},
{"0B1C2D3E", "Ravi", false},
};
MFRC522 rfid(RFID_SS, RFID_RST);
Adafruit_SSD1306 oled(128, 64, &Wire, -1);
void beep(int times, int ms) {
for (int i = 0; i < times; i++) {
digitalWrite(BUZZER_PIN, HIGH);
delay(ms);
digitalWrite(BUZZER_PIN, LOW);
delay(80);
}
}
void show(const String& top, const String& bottom) {
oled.clearDisplay();
oled.setTextColor(SSD1306_WHITE);
oled.setTextSize(2);
oled.setCursor(0, 8);
oled.println(top);
oled.setTextSize(1);
oled.setCursor(0, 44);
oled.println(bottom);
oled.display();
}
void setup() {
Serial.begin(115200);
pinMode(BUZZER_PIN, OUTPUT);
SPI.begin();
rfid.PCD_Init();
Wire.begin(21, 22);
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) Serial.println("OLED not found at 0x3C");
show("Ready", "Tap your card");
Serial.println("uid,name,status,seconds");
}
void loop() {
if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) return;
char uid[21] = "";
for (byte i = 0; i < rfid.uid.size && i < 10; i++) sprintf(uid + i * 2, "%02X", rfid.uid.uidByte[i]);
Person* p = nullptr;
for (auto& person : people)
if (strcmp(person.uid, uid) == 0) p = &person;
if (p) {
p->in = !p->in;
Serial.printf("%s,%s,%s,%lu\n", uid, p->name, p->in ? "IN" : "OUT", millis() / 1000);
show(p->name, p->in ? "Checked IN" : "Checked OUT");
beep(1, 120);
} else {
Serial.printf("%s,unknown,-,%lu\n", uid, millis() / 1000);
show("Unknown", String("UID ") + uid);
beep(3, 60);
}
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
delay(1500);
show("Ready", "Tap your card");
}// RFID attendance — ESP32 DevKit V1 + RC522 + SSD1306 OLED + buzzer module
// RC522 on VSPI (SCK D18, MISO D19, MOSI D23), SS on D4, RST on D27. OLED on I2C D21/D22.
// Every tap prints a CSV line (uid,name,in/out,seconds since start) to Serial.
#include <SPI.h>
#include <Wire.h>
#include <MFRC522.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
constexpr uint8_t RFID_SS = 4;
constexpr uint8_t RFID_RST = 27;
constexpr uint8_t BUZZER_PIN = 25; // buzzer module I/O (high = on)
struct Person {
const char* uid; // as printed by the sketch, e.g. "A1B2C3D4"
const char* name;
bool in;
};
Person people[] = {
{"A1B2C3D4", "Asha", false},
{"0B1C2D3E", "Ravi", false},
};
MFRC522 rfid(RFID_SS, RFID_RST);
Adafruit_SSD1306 oled(128, 64, &Wire, -1);
void beep(int times, int ms) {
for (int i = 0; i < times; i++) {
digitalWrite(BUZZER_PIN, HIGH);
delay(ms);
digitalWrite(BUZZER_PIN, LOW);
delay(80);
}
}
void show(const String& top, const String& bottom) {
oled.clearDisplay();
oled.setTextColor(SSD1306_WHITE);
oled.setTextSize(2);
oled.setCursor(0, 8);
oled.println(top);
oled.setTextSize(1);
oled.setCursor(0, 44);
oled.println(bottom);
oled.display();
}
void setup() {
Serial.begin(115200);
pinMode(BUZZER_PIN, OUTPUT);
SPI.begin();
rfid.PCD_Init();
Wire.begin(21, 22);
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) Serial.println("OLED not found at 0x3C");
show("Ready", "Tap your card");
Serial.println("uid,name,status,seconds");
}
void loop() {
if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) return;
char uid[21] = "";
for (byte i = 0; i < rfid.uid.size && i < 10; i++) sprintf(uid + i * 2, "%02X", rfid.uid.uidByte[i]);
Person* p = nullptr;
for (auto& person : people)
if (strcmp(person.uid, uid) == 0) p = &person;
if (p) {
p->in = !p->in;
Serial.printf("%s,%s,%s,%lu\n", uid, p->name, p->in ? "IN" : "OUT", millis() / 1000);
show(p->name, p->in ? "Checked IN" : "Checked OUT");
beep(1, 120);
} else {
Serial.printf("%s,unknown,-,%lu\n", uid, millis() / 1000);
show("Unknown", String("UID ") + uid);
beep(3, 60);
}
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
delay(1500);
show("Ready", "Tap your card");
}Compiled for esp32 on esp32 3.3.12 with MFRC522 1.4.12 · 3 Nov 2026
यह कैसे काम करता है
कार्ड टैप वाला अटेंडेंस रजिस्टर final-year का पसंदीदा प्रोजेक्ट है, क्योंकि यह काम का है और दिखाने में आसान है। इस वर्ज़न में ESP32, RC522 रीडर, जवाब दिखाने के लिए छोटा OLED और एक buzzer है, और हर टैप एक CSV लाइन के रूप में लॉग होता है जिसे आप सीधे spreadsheet में पेस्ट कर सकते हैं।
RC522, ESP32 के default VSPI पिन (SCK D18, MISO D19, MOSI D23) पर SPI से बात करता है; chip-select D4 पर और reset D27 पर है। कार्ड पास आते ही स्केच उसका UID पढ़ता है — कार्ड में पहले से लिखा एक अनोखा नंबर — और उसे A1B2C3D4 जैसी hex string में बदल देता है।
यह string लोगों की एक छोटी लिस्ट में ढूँढी जाती है। जाना-पहचाना कार्ड उस व्यक्ति को IN और OUT के बीच बदलता है, OLED पर नाम दिखाता है और एक छोटी बीप देता है। अनजान कार्ड पर तीन जल्दी-जल्दी बीप होती हैं और स्क्रीन पर उसका UID आता है — नए कार्ड इसी तरह जोड़े जाते हैं। हर टैप Serial पर uid,name,status,seconds के रूप में भी प्रिंट होता है।
Real-time clock के बिना लॉग में “शुरू होने के बाद से सेकंड” आते हैं। आगे के अपग्रेड में असली समय के लिए DS3231 और Google Sheets पर Wi-Fi अपलोड जोड़ा गया है।
समस्या समाधान
कार्ड टैप करने पर कुछ नहीं होता
देखें कि RC522 को 3.3 V मिल रहा है और उसका SDA (SS) तार D4 पर है। लाइब्रेरी का DumpInfo example चलाएँ — अगर वह firmware version नहीं पढ़ पाता, तो SPI वायरिंग गलत है।
OLED काला ही रहता है
कुछ OLED 0x3C की जगह 0x3D पर जवाब देते हैं। I2C scanner (English) चलाएँ और oled.begin में address बदल दें।
कार्ड बहुत पास लाने पर ही पढ़ा जाता है
फ़ोन कवर, धातु की मेज़ और बैज होल्डर field को कमज़ोर करते हैं। रीडर को प्लास्टिक या लकड़ी पर लगाएँ और होल्डर के बिना टेस्ट करें।
आगे क्या करें
- Apps Script वेब ऐप के ज़रिए हर टैप Wi-Fi से Google Sheets में भेजें।
- DS3231 RTC जोड़ें ताकि हर एंट्री में असली तारीख़ और समय हो।
- कार्ड लिस्ट SPIFFS/LittleFS में रखें ताकि उसे बिना दोबारा अपलोड किए बदल सकें।



