Bidirectional Visitor Counter using Arduino and SD Card Module

Posted by


In today’s world, where data collection and analysis play a crucial role in decision-making, having an efficient system to track visitor flow is essential for various applications. Whether it’s monitoring foot traffic in retail stores, managing crowd control at events, or analyzing visitor patterns in public spaces, a bidirectional visitor counter can provide valuable insights.

This article will guide you through the process of building a bidirectional visitor counter using an Arduino microcontroller and an SD card module. We’ll explore the hardware components required, the software implementation, and the step-by-step instructions to create this powerful project.

Table of Contents

  1. Overview
  2. Hardware Requirements
  3. Software Requirements
  4. Circuit Diagram
  5. Connections
  6. Code Explanation
  7. Testing and Deployment
  8. Frequently Asked Questions (FAQs)
  9. Conclusion


The bidirectional visitor counter is designed to track the number of people entering and leaving a specific area. It utilizes two infrared (IR) sensors, one for detecting visitors entering and another for detecting visitors exiting. The Arduino board serves as the central processing unit, managing the sensor inputs and storing the data on an SD card for later analysis.

By implementing this project, you’ll gain valuable experience in working with Arduino, IR sensors, and SD card modules. Additionally, you’ll learn how to handle interrupts, write data to files, and create a user-friendly interface for monitoring visitor counts.

Hardware Requirements

To build the bidirectional visitor counter, you’ll need the following hardware components:

  • Arduino board (e.g., Arduino Uno, Arduino Nano, or Arduino Mega)
  • 2 x IR sensor modules (e.g., FC-51 or similar)
  • SD card module (e.g., Ethernet shield with SD card slot or dedicated SD card module)
  • Breadboard
  • Jumper wires
  • SD card (formatted with FAT32 file system)
  • Power supply (e.g., USB cable or external power source)

Software Requirements

The software requirements for this project include:

  • Arduino IDE (Integrated Development Environment) installed on your computer
  • SD library (included in the Arduino IDE installation)

Circuit Diagram

Before proceeding with the connections, let’s take a look at the circuit diagram:Copy code

+------+ | Arduino | | | | +-+ | | | | +-+ | | | +-+ | | | | +-+ | | +------+ | +-----------------|----------------+ | | | | | | | +---+ +---+ +-----+ | | IR| | IR| |SD | | |Sensor| |Sensor| |Card | | | IN | |OUT | |Module| | +---+ +---+ +-----+

In this diagram, the Arduino board is connected to two IR sensor modules (one for entry and one for exit) and an SD card module. The connections between these components will be detailed in the next section.


Follow these steps to connect the hardware components:

  1. IR Sensor Connections:
    • Connect the VCC pin of the IR sensor modules to the 5V pin on the Arduino board.
    • Connect the GND pin of the IR sensor modules to one of the GND pins on the Arduino board.
    • Connect the OUT pin of the entry IR sensor module to a digital pin on the Arduino board (e.g., pin 2).
    • Connect the OUT pin of the exit IR sensor module to another digital pin on the Arduino board (e.g., pin 3).
  2. SD Card Module Connections:
    • Connect the VCC pin of the SD card module to the 5V pin on the Arduino board.
    • Connect the GND pin of the SD card module to one of the GND pins on the Arduino board.
    • Connect the MOSI pin of the SD card module to the MOSI pin on the Arduino board.
    • Connect the MISO pin of the SD card module to the MISO pin on the Arduino board.
    • Connect the SCK pin of the SD card module to the SCK pin on the Arduino board.
    • Connect the CS (Chip Select) pin of the SD card module to a digital pin on the Arduino board (e.g., pin 4).
  3. Power Supply:
    • Connect the Arduino board to a power source, either via a USB cable or an external power supply.

Make sure to follow the pin assignments and connections carefully to ensure proper functioning of the project.

Code Explanation

The Arduino code for the bidirectional visitor counter consists of several parts, including libraries, global variables, setup, loop, interrupt service routines, and helper functions. Let’s go through each section:


arduinoCopy code

#include <SD.h>

The SD.h library is included to enable communication with the SD card module and perform file operations.

Global Variables

arduinoCopy code

const int entryPin = 2; // Pin for entry IR sensor const int exitPin = 3; // Pin for exit IR sensor const int csPin = 4; // Pin for SD card chip select volatile int entryCount = 0; // Counter for entry visitors volatile int exitCount = 0; // Counter for exit visitors File dataFile; // File object for data storage

In this section, we define the pin assignments for the entry and exit IR sensors, as well as the chip select pin for the SD card module. We also declare global variables to keep track of the entry and exit visitor counts, and a File object for data storage on the SD card.


arduinoCopy code

void setup() { Serial.begin(9600); pinMode(entryPin, INPUT_PULLUP); pinMode(exitPin, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(entryPin), incrementEntryCount, FALLING); attachInterrupt(digitalPinToInterrupt(exitPin), incrementExitCount, FALLING); if (!SD.begin(csPin)) { Serial.println("SD card initialization failed."); return; } dataFile ="visitor_data.txt", FILE_WRITE); if (!dataFile) { Serial.println("Failed to open data file."); return; } dataFile.println("Date,Time,Entry Count,Exit Count"); dataFile.close(); Serial.println("Bidirectional Visitor Counter started."); }

In the setup() function, we perform the following tasks:

  1. Initialize the Serial communication for debugging purposes.
  2. Set the entry and exit IR sensor pins as inputs with pull-up resistors enabled.
  3. Attach interrupt service routines to the entry and exit IR sensor pins using the attachInterrupt() function. These routines will be called whenever the sensors detect a visitor.
  4. Initialize the SD card module using SD.begin(csPin).
  5. Open a file named “visitor_data.txt” on the SD card for writing visitor data.
  6. Write a header row to the data file with column names.
  7. Close the data file.
  8. Print a message to the Serial monitor indicating that the visitor counter is started.


arduinoCopy code

void loop() { static unsigned long prevMillis = 0; unsigned long currentMillis = millis(); if (currentMillis - prevMillis >= 60000) { // Update data every minute prevMillis = currentMillis; logVisitorData(); } }

The loop() function is the main program loop that runs continuously. In this implementation, we use a simple timer to log the visitor data to the SD card every minute. The logVisitorData() function is called every 60,000 milliseconds (1 minute) to record the current entry and exit visitor counts.

Interrupt Service Routines

arduinoCopy code

void incrementEntryCount() { entryCount++; } void incrementExitCount() { exitCount++; }

These two functions, incrementEntryCount() and incrementExitCount(), are the interrupt service routines (ISRs) that are called whenever the entry or exit IR sensor detects a visitor, respectively. They simply increment the corresponding visitor count variable.

Helper Functions

arduinoCopy code

void logVisitorData() { dataFile ="visitor_data.txt", FILE_WRITE); if (dataFile) { String dataString = String(getCurrentDate()) + "," + String(getCurrentTime()) + "," + String(entryCount) + "," + String(exitCount); dataFile.println(dataString); dataFile.close(); Serial.println(dataString); } else { Serial.println("Failed to open data file."); } } String getCurrentDate() { // Implement a function to get the current date in the desired format // Example: return "2023-05-23"; } String getCurrentTime() { // Implement a function to get the current time in the desired format // Example: return "14:32:15"; }

The logVisitorData() function is responsible for writing the visitor count data to the SD card. It opens the “visitor_data.txt” file in write mode, constructs a data string with the current date, time, entry count, and exit count, and appends it to the file. Additionally, it prints the data string to the Serial monitor for debugging purposes.

The getCurrentDate() and getCurrentTime() functions are placeholders that you need to implement based on your specific requirements. These functions should return the current date and time in the desired format, respectively.

Testing and Deployment

Once you have completed the hardware connections and uploaded the code to your Arduino board, you can test the bidirectional visitor counter by following these steps:

  1. Insert an SD card into the SD card module.
  2. Power on the Arduino board.
  3. Observe the Serial monitor for any initialization or error messages.
  4. Simulate visitor entry and exit by obstructing and clearing the IR sensors.
  5. After a minute, the visitor data should be logged to the “visitor_data.txt” file on the SD card.
  6. Open the data file on a computer to verify that the visitor counts are being recorded correctly.

For deployment, you can enclose the circuit in a suitable enclosure, ensuring that the IR sensors are positioned correctly to detect visitors entering and leaving the area. Additionally, you may want to incorporate a user interface, such as an LCD display, to show the current visitor counts in real-time.

Frequently Asked Questions (FAQs)

  1. Q: Can I use a different type of sensor instead of IR sensors? A: Yes, you can use other types of sensors like ultrasonic or PIR (Passive Infrared) sensors for detecting visitors. However, you may need to modify the code and connections accordingly.
  2. Q: How can I display the visitor counts on an LCD screen? A: You can add an LCD module to the circuit and modify the code to display the entry and exit visitor counts on the LCD screen. This will require additional libraries and code changes.
  3. Q: Can I log the visitor data to a different file format? A: Yes, you can modify the code to log the visitor data in a different file format, such as CSV or JSON. You’ll need to adjust the data string construction and the file writing process accordingly.
  4. Q: How can I reset the visitor counts? A: You can add a reset button or a specific sequence of actions (e.g., pressing a button or obstructing a sensor for a certain duration) to reset the entry and exit visitor counts to zero.
  5. Q: Can I add timestamps to the logged visitor data? A: Yes, you can modify the logVisitorData() function to include timestamps for each visitor entry or exit event. This will require additional code to capture the time when an event occurs and append it to the data string.


In this article, we have covered the development of a bidirectional visitor counter using an Arduino board, IR sensors, and an SD card module. By following the instructions and code explanations provided, you can build a functional project that tracks visitor flow and stores the data on an SD card for later analysis.

This project serves as an excellent learning opportunity for anyone interested in embedded systems, sensor integration, and data logging. It combines hardware and software components, allowing you to gain hands-on experience with Arduino programming, interrupt handling, and file operations.

Additionally, the bidirectional visitor counter has practical applications in various domains, such as retail analytics, event management, and public space monitoring. By analyzing the collected data, you can gain insights into visitor patterns, optimize resource allocation, and make informed decisions based on real-world data.

Feel free to explore further enhancements and customizations to this project, such as adding a user interface, implementing wireless data transmission, or integrating with cloud services for remote data storage and analysis.

Happy coding and happy counting!