Arduino Nano-Based Time Tracking System with LCD Display and IR Receiver
View and Edit Project In Cirkit Designer
Circuit Documentation
Summary
This circuit involves an Arduino Nano microcontroller interfacing with an RS485 module, an IR receiver, and an LCD display. The Arduino Nano is used to control the RS485 communication, receive IR signals, and display information on the LCD. The circuit also includes terminal blocks for power connections.
Component List
Arduino Nano
- Description: A small, complete, and breadboard-friendly board based on the ATmega328P.
- Pins: D1/TX, D0/RX, RESET, GND, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11/MOSI, D12/MISO, VIN, 5V, A7, A6, A5, A4, A3, A2, A1, A0, AREF, 3V3, D13/SCK
RS485
- Description: A module used for RS485 communication.
- Pins: VCC, RO, RE, GND, B, A, DE, DI
Terminal PCB 2 Pin
- Description: A terminal block for connecting power.
- Pins: Pin A, Pin B
VS1838B IR Receiver
- Description: An IR receiver module.
- Pins: OUT, GND, VCC
Lcd 20x4 i2c
- Description: A 20x4 character LCD display with I2C interface.
- Pins: GND, 5V, SCA, SCL
Wiring Details
Arduino Nano
- D6: Connected to RS485 RE
- D7: Connected to RS485 DE
- D8: Connected to VS1838B IR Receiver OUT
- D10: Connected to RS485 DI
- D11/MOSI: Connected to RS485 RO
- VIN: Connected to Terminal PCB 2 Pin Pin A, VS1838B IR Receiver VCC, RS485 VCC, Lcd 20x4 i2c 5V
- GND: Connected to Terminal PCB 2 Pin Pin B, VS1838B IR Receiver GND, RS485 GND, Lcd 20x4 i2c GND
- A5: Connected to Lcd 20x4 i2c SCA
- A4: Connected to Lcd 20x4 i2c SCL
RS485
- RE: Connected to Arduino Nano D6
- DE: Connected to Arduino Nano D7
- DI: Connected to Arduino Nano D10
- RO: Connected to Arduino Nano D11/MOSI
- VCC: Connected to Arduino Nano VIN, Terminal PCB 2 Pin Pin A, VS1838B IR Receiver VCC, Lcd 20x4 i2c 5V
- GND: Connected to Arduino Nano GND, Terminal PCB 2 Pin Pin B, VS1838B IR Receiver GND, Lcd 20x4 i2c GND
- B: Connected to Terminal PCB 2 Pin Pin A
- A: Connected to Terminal PCB 2 Pin Pin B
Terminal PCB 2 Pin
- Pin A: Connected to Arduino Nano VIN, RS485 VCC, VS1838B IR Receiver VCC, Lcd 20x4 i2c 5V
- Pin B: Connected to Arduino Nano GND, RS485 GND, VS1838B IR Receiver GND, Lcd 20x4 i2c GND
VS1838B IR Receiver
- OUT: Connected to Arduino Nano D8
- GND: Connected to Arduino Nano GND, Terminal PCB 2 Pin Pin B, RS485 GND, Lcd 20x4 i2c GND
- VCC: Connected to Arduino Nano VIN, Terminal PCB 2 Pin Pin A, RS485 VCC, Lcd 20x4 i2c 5V
Lcd 20x4 i2c
- GND: Connected to Arduino Nano GND, Terminal PCB 2 Pin Pin B, RS485 GND, VS1838B IR Receiver GND
- 5V: Connected to Arduino Nano VIN, Terminal PCB 2 Pin Pin A, RS485 VCC, VS1838B IR Receiver VCC
- SCA: Connected to Arduino Nano A5
- SCL: Connected to Arduino Nano A4
Code Documentation
#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;
const byte BUTTON_PIN = 3;
// 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);
}
This code initializes the LCD display and RTC module, sets up pin modes, and handles button presses to log in and log out times, displaying them on the LCD. The buzzer sounds when the button is pressed, and the elapsed time between log in and log out is calculated and displayed.