This document provides a detailed overview of a circuit designed to interface an Arduino UNO with an RFID reader, an LCD display, an RTC module, and a piezo buzzer. The circuit is intended to log and display login and logout times, and it includes a button to trigger the logout process. The Arduino UNO serves as the central microcontroller, coordinating the operations of the connected components.
Arduino UNO
RFID-RC522
LCD Display 16x4 I2C
rtc MODULE
Piezo Buzzer
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
// Initialize the LCD display with I2C address 0x27 and size 16x2
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Initialize the RTC module
RTC_DS3231 rtc;
// Variables to store login and logout times
DateTime loggedIn;
DateTime loggedOut;
// Variable to store the period (AM/PM)
String period = "AM";
// Pin definitions
const byte BUZZER_PIN = 5; // You can use any available digital pin
const byte BUTTON_PIN = 3; // Ensure this pin is available on the Uno
// Variables to track button state
byte lastState = LOW; // Previous state of the button
int currentState; // Current state of the button
void setup() {
// Start the I2C communication
Wire.begin();
// Set pin modes
pinMode(BUZZER_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
// Initialize serial communication at 9600 bits per second
Serial.begin(9600);
// Initialize the LCD display
lcd.init();
lcd.backlight();
// Initialize the RTC module
if (!rtc.begin()) {
Serial.print("Couldn't find RTC");
Serial.flush();
while (1);
}
// Check if the RTC lost power and set the time if necessary
if (rtc.lostPower()) {
Serial.println("RTC lost power, let's set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// Display the login time on the LCD
lcd.clear();
lcd.print("Logged In:");
loggedIn = rtc.now();
displayTime(loggedIn);
}
void loop() {
// Read the state of the button
currentState = digitalRead(BUTTON_PIN);
// Check for button press (transition from HIGH to LOW)
if (lastState == HIGH && currentState == LOW) {
// Sound the buzzer
tone(BUZZER_PIN, 2000); // Send a 2kHz sound signal
delay(500); // for 0.5 seconds
noTone(BUZZER_PIN); // Stop the tone
// Display the logout time on the LCD
lcd.clear();
lcd.print("Logged Out:");
loggedOut = rtc.now();
displayTime(loggedOut);
delay(3000);
lcd.clear();
// Calculate and display the elapsed time
long elapsedSeconds = loggedOut.unixtime() - loggedIn.unixtime();
int elapsedHours = elapsedSeconds / 3600;
int elapsedMinutes = (elapsedSeconds % 3600) / 60;
int elapsedSecondsRemaining = elapsedSeconds % 60;
lcd.print("Elapsed time:");
lcd.setCursor(0, 1);
lcd.print(elapsedHours);
lcd.print("h ");
lcd.print(elapsedMinutes);
lcd.print("m ");
lcd.print(elapsedSecondsRemaining);
lcd.print("s");
delay(5000);
lcd.clear();
}
// Update the last state of the button
lastState = currentState;
}
// Function to display time on the LCD
void displayTime(DateTime time) {
lcd.setCursor(0, 1);
int hour = time.hour();
if (hour >= 12) {
period = "PM";
if (hour > 12) {
hour -= 12;
}
} else if (hour == 0) {
hour = 12;
}
lcd.print(hour);
lcd.print(':');
if (time.minute() < 10) lcd.print('0'); // Leading zero for minutes
lcd.print(time.minute());
lcd.print(':');
if (time.second() < 10) lcd.print('0'); // Leading zero for seconds
lcd.print(time.second());
lcd.print(' ');
lcd.print(period);
}
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
// Initialize the LCD display with I2C address 0x27 and size 16x2
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Initialize the RTC module
RTC_DS3231 rtc;
// Variables to store login and logout times
DateTime loggedIn;
DateTime loggedOut;
// Variable to store the period (AM/PM)
String period = "AM";
// Pin definitions
const byte BUZZER_PIN = 5; // You can use any available digital pin
const byte BUTTON_PIN = 3; // Ensure this pin