ESP8266

Google Sheet Attendance Tracker using ESP8266 & Biometric Sensor R557

Google Sheet for Employee time tracker or Student Time Tracker

Google Sheet Attendance Tracker:

 

Google Sheet Attendance Tracker using ESP8266 & Biometric Sensor R557- In today’s article, you will learn how to make an IoT based In/Out Student Time Tracker or Employee Time Tracker System using the Nodemcu ESP8266 WiFi Module, the R557 Biometric Sensor, an I2C-supported SSD1306 Oled Display Module, and Google Spreadsheet or Google Sheet. So, without any further delay let’s get started!!!




Related article:

Arduino and R557 Fingerprint-based Door Lock Control System

Amazon Links:

Nodemcu ESP8266

R557 Biometric Sensor or Fingerprint Sensor

SSD1306 Oled Display Module

Other Tools and Components:

Top Arduino Sensors:

Super Starter kit for Beginners

Digital Oscilloscopes

Variable Supply

Digital Multimeter

Soldering iron kits

PCB small portable drill machines

*Please Note: These are affiliate links. I may make a commission if you buy the components through these links. I would appreciate your support in this way!


R557 Capacitive Biometric Sensor:

The reason behind selecting this particular Biometric Sensor or Fingerprint module is that it’s low-cost, smaller in size, and it’s insanely fast. It operates on a low voltage of 3.3V, making it ideal for battery-powered systems. It can be used with 5v and 3.3V compatible controller boards like Arduino, ESP32, STM32, ESP8266, Raspberry Pi Pico, and so on. With this Capacitive Fingerprint sensor, you can easily integrate biometric authentication into your projects.

R557 biometric sensor module esp8266

Technical specifications:

Technical parameter:
Supply voltage: DC 3.3V
Supply current:
Working current: 30mA (typ.)
Peak current: 40mA
Fingerprint image entry time: <0.3 seconds
Collection window area: 12.8mm in diameter
Image pixel: 160*160 pixel
Image Resolution: 508dpi
Match method:
Comparison method (1:1)
Search method (1:N)
Storage capacity: 120 pieces
Security level: five (from low to high: 1, 2, 3, 4, 5)
False Recognition Rate (FAR): <0.0001%
Authentic rejection rate (FRR): <1.0%
Search time: <0.3 seconds (1:1000, average)
Host computer interface: RS232 (TTL logic level, 3.3V)
Communication baud rate: (9600?N)bps where N=1~12 (default value N=6, ie 57600bps)

Working environment:

Temperature: -20 to +45?
Relative humidity: 10%RH-85%RH (non-condensing)

There is an RGB Led inside this module. So, when the fingerprint sensor is ON it shows Blue light. When the Fingerprint scanning operation is successful it shows Green Light, and when the operation is failed, it shows Red light.

It includes a storage capacity of up to 120 fingerprints, a fast recognition speed of under 1 second, and a high resolution image sensor that captures clear and accurate fingerprints.



R557 Capacitive Fingerprint Sensor Pinout:

Wiring

1 VT Finger detection

2 Out IRQ

3 VCC 3.3

4 TX 3.3 Logic level

5 RX 3.3 Logic level

6 GND

R557 biometric sensor wiring details

1st wire is the VT. This is the Finger Detection power and this wire is connected with the 3.3V.

2nd wire is the IRQ. This is the Finger detection signal wire. When there is a finger, it outputs a high signal.

3rd wire is the VCC and it should be connected with 3.3V.

4th and 5th wires are TXD and RXD, both are 3.3V TTL logical level. And

6th wire is the GND and it should be connected with the ground.

Now, let’s go ahead and take a look at the circuit diagram.



R557 Capacitive Biometric Sensor with ESP8266:

esp8266 connection of r557 biometric sensor with Google Sheet Attendance Tracker

The VT and VCC wires of the R557 Capacitive Fingerprint sensor are connected with the Nodemcu ESP8266 3.3V Pin. The IRQ wire is left unconnected. The TXD and RXD wires are connected with pins D3 and D4. And the ground wire is connected with the ground pin of the Nodemcu ESP8266 WiFi module.

The GND and VDD pins of the SSD1306 Oled display module are connected with the 3.3V and GND pins of the Nodemcu ESP8266 WiFi module. Whereas the SCK or SCL and SDA pins of the Oled display module are connected with the D1 and D2 pins of the Nodemcu Module. D1 is the SCL and D2 is the SDA.

On the Left side is the regulated 5V power supply based on the 7805 voltage regulator. This is optional. If you want to power up your project using your laptop or PC then there is no need for this 5V regulated power supply. But if you want to externally power up your project using a 12v battery or Adaptor then you will need this regulated 5 volts power supply.

esp8266 and r557 biometric sensor with Google Sheet Attendance Tracker

As usual, I am using the same ESP8266 development board. It doesn’t matter if you don’t have this development board you can do all the connections on a breadboard. Anyway, I have connected everything as per the circuit diagram.




Fingerprint Library Installation:

Now, the next step is to install the Arduino Library for the R557 Capacitive Fingerprint Sensor.

For this, open the Arduino IDE. Click on the sketch Menu, go to Include Library, and then click on manage libraries.

r557 biometric library for Arduino ide

Search for the Adafruit Fingerprint.

arduino library for r557 biometric sensor Google Sheet Attendance Tracker

Click on the install button.

arduino library for r557 capacitive biometric sensor Google Sheet Attendance Tracker

You can see my Adafruit Fingerprint Sensor Library is now installed.

Next, for the Fingerprint enrollment connect your Nodemcu ESP8266 WiFi module with the Laptop/PC and Upload the following sketch.



Fingerprint Enrollment Code:

#include <Adafruit_Fingerprint.h>
 
#if (defined(__AVR__) || defined(ESP8266)) && !defined(__AVR_ATmega2560__)

SoftwareSerial mySerial(D3, D4);
 
#else
// On Leonardo/M0/etc, others with hardware serial, use hardware serial!
// #0 is green wire, #1 is white
#define mySerial Serial1
 
#endif
 
 
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
 
uint8_t id;
 
void setup()
{
  Serial.begin(9600);
  while (!Serial);  // For Yun/Leo/Micro/Zero/...
  delay(100);
  Serial.println("\n\nAdafruit Fingerprint sensor enrollment");
 
  // set the data rate for the sensor serial port
  finger.begin(57600);
 
  if (finger.verifyPassword()) {
    Serial.println("Found fingerprint sensor!");
  } else {
    Serial.println("Did not find fingerprint sensor :(");
    while (1) { delay(1); }
  }
 
  Serial.println(F("Reading sensor parameters"));
  finger.getParameters();
  Serial.print(F("Status: 0x")); Serial.println(finger.status_reg, HEX);
  Serial.print(F("Sys ID: 0x")); Serial.println(finger.system_id, HEX);
  Serial.print(F("Capacity: ")); Serial.println(finger.capacity);
  Serial.print(F("Security level: ")); Serial.println(finger.security_level);
  Serial.print(F("Device address: ")); Serial.println(finger.device_addr, HEX);
  Serial.print(F("Packet len: ")); Serial.println(finger.packet_len);
  Serial.print(F("Baud rate: ")); Serial.println(finger.baud_rate);
}
 
uint8_t readnumber(void) {
  uint8_t num = 0;
 
  while (num == 0) {
    while (! Serial.available());
    num = Serial.parseInt();
  }
  return num;
}
 
void loop()                     // run over and over again
{
  Serial.println("Ready to enroll a fingerprint!");
  Serial.println("Please type in the ID # (from 1 to 127) you want to save this finger as...");
  id = readnumber();
  if (id == 0) {// ID #0 not allowed, try again!
     return;
  }
  Serial.print("Enrolling ID #");
  Serial.println(id);
 
  while (!  getFingerprintEnroll() );
}
 
uint8_t getFingerprintEnroll() {
 
  int p = -1;
  Serial.print("Waiting for valid finger to enroll as #"); Serial.println(id);
  while (p != FINGERPRINT_OK) {
    p = finger.getImage();
    switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.println(".");
      break;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      break;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Imaging error");
      break;
    default:
      Serial.println("Unknown error");
      break;
    }
  }
 
  // OK success!
 
  p = finger.image2Tz(1);
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image converted");
      break;
    case FINGERPRINT_IMAGEMESS:
      Serial.println("Image too messy");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return p;
    case FINGERPRINT_FEATUREFAIL:
      Serial.println("Could not find fingerprint features");
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      Serial.println("Could not find fingerprint features");
      return p;
    default:
      Serial.println("Unknown error");
      return p;
  }
 
  Serial.println("Remove finger");
  delay(2000);
  p = 0;
  while (p != FINGERPRINT_NOFINGER) {
    p = finger.getImage();
  }
  Serial.print("ID "); Serial.println(id);
  p = -1;
  Serial.println("Place same finger again");
  while (p != FINGERPRINT_OK) {
    p = finger.getImage();
    switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.print(".");
      break;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      break;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Imaging error");
      break;
    default:
      Serial.println("Unknown error");
      break;
    }
  }
 
  // OK success!
 
  p = finger.image2Tz(2);
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image converted");
      break;
    case FINGERPRINT_IMAGEMESS:
      Serial.println("Image too messy");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return p;
    case FINGERPRINT_FEATUREFAIL:
      Serial.println("Could not find fingerprint features");
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      Serial.println("Could not find fingerprint features");
      return p;
    default:
      Serial.println("Unknown error");
      return p;
  }
 
  // OK converted!
  Serial.print("Creating model for #");  Serial.println(id);
 
  p = finger.createModel();
  if (p == FINGERPRINT_OK) {
    Serial.println("Prints matched!");
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    return p;
  } else if (p == FINGERPRINT_ENROLLMISMATCH) {
    Serial.println("Fingerprints did not match");
    return p;
  } else {
    Serial.println("Unknown error");
    return p;
  }
 
  Serial.print("ID "); Serial.println(id);
  p = finger.storeModel(id);
  if (p == FINGERPRINT_OK) {
    Serial.println("Stored!");
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    return p;
  } else if (p == FINGERPRINT_BADLOCATION) {
    Serial.println("Could not store in that location");
    return p;
  } else if (p == FINGERPRINT_FLASHERR) {
    Serial.println("Error writing to flash");
    return p;
  } else {
    Serial.println("Unknown error");
    return p;
  }
 
  return true;
}

After uploading this code; next open the serial monitor and follow the instructions. If you find it difficult to enroll your fingers then you can follow my video tutorial given at the end of this article. Anyway, I enrolled two fingers “the forefinger and the middle finger” I assigned 3 as an ID to the forefinger and 4 as an ID to my Middle finger. One finger is going to represent Fahad and another finger is going to represent Fawad. Now, let’s go ahead and start with Google Sheet for time tracking.



Altium Designer + Altium 365 + Octopart:

Arduino LoRa Free SMS

Altium 365 lets you hold the fastest design reviews ever. Share your designs from anywhere and with anyone with a single click. it’s easy, leave a comment tagging your teammate and they’ll instantly receive an email with a link to the design. Anyone you invite can open the design using a web browser. Using the browser interface, you’re able to comment, markup, cross probe, inspect, and more. Comments are attached directly to the project, making them viewable within Altium designer as well as through the browser interface. Design, share, and manufacture, all in the same space with nothing extra to install or configure. Connect to the platform directly from Altium Designer without changing how you already design electronics. Altium 365 requires no additional licenses and comes included with your subscription plan.

Get real-time component insights as you design with Octopart built into Altium 365. Octopart is the fastest search engine for electronic parts and gives you the most up-to-date part data like specs, datasheets, cad models, and how much the part costs at different amounts etc. Right in the design environment so you can focus on your designs. Start with Altium Designer and Activate Altium 365. Search for electronic parts on Octopart.



Google Sheet Setup:

Google sheet attendance time tracker using biometric sensor and esp8266

You will need to carefully setup your Google Spreadsheet or Google sheet for logging the required data. If you miss anything, you won’t be able to get it connected to your Nodemcu ESP8266 WiFi Module. This is the same Google sheet I setup for my ESP8266 and PN532 NFC RFID module-based student or employee time tracking. I only changed the name of the Google Sheet while everything else remains exactly the same. So, for the step-by-step explanation read my article on Google spreadsheet and PN532 RFID module. The only difference is that that time I was using an RFID module while this time I am using a Biometric sensor or Fingerprint sensor.

Google Sheet Attendance Tracker Code:

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Fingerprint.h>
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include "HTTPSRedirect.h"
#include <Wire.h>

int u=0;
int v=0;

#if (defined(__AVR__) || defined(ESP8266)) && !defined(__AVR_ATmega2560__)
SoftwareSerial mySerial(D3, D4);

#else
// On Leonardo/M0/etc, others with hardware serial, use hardware serial!
// #0 is green wire, #1 is white
#define mySerial Serial1
 
#endif

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

// Enter network credentials:
const char* ssid     = "AndroidAP3DEC";
const char* password = "electroniclinic";

// Enter Google Script Deployment ID:
const char *GScriptId = "AKfycbwmOKtVpFvW84U-A_-TeNyA3a-eyfXbO6kNg-WuErOYuNA0WW9XKKXlAddlF6iDnjmWQQ";

// Enter command (insert_row or append_row) and your Google Sheets sheet name (default is Sheet1):
String payload_base =  "{\"command\": \"insert_row\", \"sheet_name\": \"Sheet1\", \"values\": ";
String payload = "";

// Google Sheets setup (do not edit)
const char* host = "script.google.com";
const int httpsPort = 443;
const char* fingerprint = "";
String url = String("/macros/s/") + GScriptId + "/exec";
HTTPSRedirect* client = nullptr;

// Declare variables that will be published to Google Sheets
String user = "";
String id = "";
String enter ="";

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {

  Serial.begin(9600);        
  Serial.println('\n');
  Serial.println("System initialized");

  // Connect to WiFi
  WiFi.begin(ssid, password);             
  Serial.print("Connecting to ");
  Serial.print(ssid); Serial.println(" ...");

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println('\n');
  Serial.println("Connection established!");  
  Serial.print("IP address:\t");
  Serial.println(WiFi.localIP());

  // Use HTTPSRedirect class to create a new TLS connection
  client = new HTTPSRedirect(httpsPort);
  client->setInsecure();
  client->setPrintResponseBody(true);
  client->setContentTypeHeader("application/json");
  
  Serial.print("Connecting to ");
  Serial.println(host);

  // Try to connect for a maximum of 5 times
  bool flag = false;
  for (int i=0; i<5; i++){ 
    int retval = client->connect(host, httpsPort);
    if (retval == 1){
       flag = true;
       Serial.println("Connected");
       break;
    }
    else
      Serial.println("Connection failed. Retrying...");
  }
  if (!flag){
    Serial.print("Could not connect to server: ");
    Serial.println(host);
    return;
  }
  delete client;    // delete HTTPSRedirect object
  client = nullptr; // delete HTTPSRedirect object

display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  delay(2000);
  display.clearDisplay();
  display.setTextColor(WHITE);
  delay(10);

while (!Serial);  // For Yun/Leo/Micro/Zero/...
  delay(100);
  Serial.println("\n\nAdafruit finger detect test");
 
  // set the data rate for the sensor serial port
  finger.begin(57600);
  delay(5);
  if (finger.verifyPassword()) {
    Serial.println("Found fingerprint sensor!");
  } else {
    Serial.println("Did not find fingerprint sensor :(");
    while (1) { delay(1); }
  }
 
  Serial.println(F("Reading sensor parameters"));
  finger.getParameters();
  Serial.print(F("Status: 0x")); Serial.println(finger.status_reg, HEX);
  Serial.print(F("Sys ID: 0x")); Serial.println(finger.system_id, HEX);
  Serial.print(F("Capacity: ")); Serial.println(finger.capacity);
  Serial.print(F("Security level: ")); Serial.println(finger.security_level);
  Serial.print(F("Device address: ")); Serial.println(finger.device_addr, HEX);
  Serial.print(F("Packet len: ")); Serial.println(finger.packet_len);
  Serial.print(F("Baud rate: ")); Serial.println(finger.baud_rate);
 
  finger.getTemplateCount();
 
  if (finger.templateCount == 0) {
    Serial.print("Sensor doesn't contain any fingerprint data. Please run the 'enroll' example.");
  }
  else {
    Serial.println("Waiting for valid finger...");
      Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" templates");
  }
  
}

void loop() {

  // create some fake data to publish
  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(0, 10);
  display.print("Waiting..."); 
  display.display();

getFingerprintID();

  
  }

void updatesheet(String user, String id, String enter)

{

  static bool flag = false;
  if (!flag){
    client = new HTTPSRedirect(httpsPort);
    client->setInsecure();
    flag = true;
    client->setPrintResponseBody(true);
    client->setContentTypeHeader("application/json");
  }
  if (client != nullptr){
    if (!client->connected()){
      client->connect(host, httpsPort);
    }
  }
  else{
    Serial.println("Error creating client object!");
  }
  
  // Create json object string to send to Google Sheets
  payload = payload_base + "\"" + user + "," + id + "," + enter + "\"}";
  
  // Publish data to Google Sheets
  Serial.println("Publishing data...");
  Serial.println(payload);
  if(client->POST(url, host, payload)){ 
    // do stuff here if publish was successful
  }
  else{
    // do stuff here if publish was not successful
    Serial.println("Error while connecting");
  }

  // a delay of several seconds is required before publishing again    
  delay(5000);
  }

uint8_t getFingerprintID() {
  uint8_t p = finger.getImage();
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.println("No finger detected");
      finger.LEDcontrol(FINGERPRINT_LED_OFF, 0, FINGERPRINT_LED_BLUE);
      finger.LEDcontrol(FINGERPRINT_LED_OFF, 0, FINGERPRINT_LED_RED);
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return p;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Imaging error");
      return p;
    default:
      Serial.println("Unknown error");
      return p;
  }
 
  // OK success!
 
  p = finger.image2Tz();
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image converted");
      break;
    case FINGERPRINT_IMAGEMESS:
      Serial.println("Image too messy");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return p;
    case FINGERPRINT_FEATUREFAIL:
      Serial.println("Could not find fingerprint features");
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      Serial.println("Could not find fingerprint features");
      return p;
    default:
      Serial.println("Unknown error");
      return p;
  }
 
  // OK converted!
  p = finger.fingerSearch();
  Serial.println("finger print id");
  Serial.println(p);
  if (p == FINGERPRINT_OK) {
    Serial.println("Found a print match!");
    finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 25, FINGERPRINT_LED_PURPLE, 10);
    delay(1000);
    if(finger.fingerID==3)
    {
  if(u==0)
    {
  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(0, 10);
  display.print("Success"); 
  display.display();
       user="Fahad";
      id="123";
      enter="in";
       updatesheet(user,id, enter);
      
      u=1;
    }
    else if(u==1)
    {
  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(0, 10);
  display.print("Success"); 
  display.display();
      enter="";
      user="Fahad";
      id="123";
      enter="out";
             updatesheet(user,id, enter);
      u=0;
    }
}
   if(finger.fingerID==4) 
   {
    if(v==0)
    {
   display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(0, 10);
  display.print("Success"); 
  display.display();
      enter="";
      user="Fawad";
      id="123";
      enter="in";
             updatesheet(user,id, enter);
      
      v=1;
    }
    
     else if(v==1)
    {
  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(0, 10);
  display.print("Success"); 
  display.display();
      enter="";
      user="Fawad";
      id="123";
      enter="out";
             updatesheet(user,id, enter);
      
      v=0;
    }
  }
  }
  
  else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    return p;
  } else if (p == FINGERPRINT_NOTFOUND) {
    finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 25, FINGERPRINT_LED_RED, 10);
  delay(1000);
  Serial.println("Did not find a match");
    return p;
  } else {
    Serial.println("Unknown error");
    return p;
  }
 
  // found a match!
  Serial.print("Found ID #"); Serial.print(finger.fingerID);
  Serial.print(" with confidence of "); Serial.println(finger.confidence);
 
  return finger.fingerID;
}
 
// returns -1 if failed, otherwise returns ID #
int getFingerprintIDez() {
  uint8_t p = finger.getImage();
  if (p != FINGERPRINT_OK)  return -1;
 
  p = finger.image2Tz();
  if (p != FINGERPRINT_OK)  return -1;
 
  p = finger.fingerFastSearch();
  if (p != FINGERPRINT_OK)  return -1;
 
  // found a match!
  Serial.print("Found ID #"); Serial.print(finger.fingerID);
  Serial.print(" with confidence of "); Serial.println(finger.confidence);
  return finger.fingerID;
}

This is the final code and these are the same libraries I previously used. If you compare this code with the RFID and Google spreadsheet based project code; then you will better understand how and why I made certain changes. And one more thing, keep the main code file, DebugMaros.h, HTTPSRedirect.cpp, and HTTPSRedirect.h files all in the same folder.

arduino code for r557 biometric sensor with Google Sheet Attendance Tracker

Download Project Folder:




Anyway, let me show you how I used the Finger IDs and what values I am sending to Google Sheet.

if(finger.fingerID==3)
    {
  if(u==0)
    {
      user="Fahad";
      id="123";
      enter="in";
      updatesheet(user,id, enter);
      
      u=1;
    }
    else if(u==1)
    {
      enter="";
      user="Fahad";
      id="123";
      enter="out";
      updatesheet(user,id, enter);
      u=0;
    }
}

If the finger ID == 3 and if u == 0 means if the person is scanning his finger for the first time then send these values to the Google sheet.

      user="Fahad";
      id="123";
      enter="in";
      updatesheet(user,id, enter);

So, using the same technique we can do it for other students or employees.

I have already uploaded this program and now let’s watch the Google Sheet Attendance Tracker in action.

Note:

If you are doing all this for the first time and you don’t know how to use SSD1306 Oled display module. How to install the Nodemcu ESP8266 WiFi board in the Arduino IDE. Then I highly recommend read my articles on

  1. Nodemcu ESP8266 Board installation
  2. SSD1306 Oled display Module



Practical Demonstration:

r557 biometric sensor Google Sheet Attendance Tracker

Right now, my Nodemcu ESP8266 WiFi Module and Laptop are connected to the WiFi. Let me also tell you, it’s not necessary to use the same WiFi network, you can use different WiFi networks. It’s an IoT project, you can monitor the employees or students in/out time from any part of the world. You can see there is no physical connection between the Nodemcu ESP8266 and my Laptop.

The Oled display module is optional, if you remove this it won’t have any effect on the project. But it’s good to use a display, because without the display you will be confused and you won’t be sure if the finger is successfully scanned. Right now, on the Oled display module, you can see the message waiting… this means you can scan your finger. When it successfully scan a finger, the message Success is printed on the display.

iot based attendance system using esp8266 and fingerprint sensor with google sheet

Anyway, on the Google spreadsheet I can monitor the Date, Time, Name of the employee or a student, the ID, and the in/out status.

arduino library for r557 biometric sensor Google Sheet Attendance Tracker

For the practical demonstration, watch the video tutorial given below.



Watch Video Tutorial:

https://youtu.be/WU5uoXS-HwU

Engr Fahad

My name is Shahzada Fahad and I am an Electrical Engineer. I have been doing Job in UAE as a site engineer in an Electrical Construction Company. Currently, I am running my own YouTube channel "Electronic Clinic", and managing this Website. My Hobbies are * Watching Movies * Music * Martial Arts * Photography * Travelling * Make Sketches and so on...

One Comment

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button