Cirkit Designer LogoCirkit DesignerYour all-in-one circuit design IDE Launch Cirkit Designer App

ESP8266 Wi-Fi Controlled Biometric Attendance System with OLED Display

View and Edit Project In Cirkit DesignerImage of ESP8266 Wi-Fi Controlled Biometric Attendance System with OLED Display

Circuit Documentation

Summary

This document provides a detailed overview of a circuit designed using an ESP8266 NodeMCU microcontroller, an AS608 fingerprint sensor, a 0.96" OLED display, a 18650 battery in a holder, a rocker switch, and a 2.1mm barrel jack with a terminal block. The circuit is designed to capture and process fingerprint data, display information on an OLED screen, and communicate over WiFi.

Component List

  1. ESP8266 NodeMCU

    • Description: A low-cost WiFi microcontroller with GPIO, ADC, and PWM capabilities.
    • Pins: D0, D1, D2, D3, D4, 3V3, GND, D5, D6, D7, D8, RX, TX, A0, RSV, SD3, SD2, SD1, CMD, SD0, CLK, EN, RST, VIN
  2. AS608 Fingerprint Sensor

    • Description: A fingerprint sensor module used for capturing and processing fingerprint data.
    • Pins: VCC, TX, GND, RX
  3. 0.96" OLED Display

    • Description: A small OLED display module used for displaying information.
    • Pins: GND, VDD, SCK, SDA
  4. 18650 Battery in Holder

    • Description: A battery holder for a 18650 lithium-ion battery.
    • Pins: GND, VCC
  5. Rocker Switch

    • Description: A simple on/off switch.
    • Pins: 1, 2
  6. 2.1mm Barrel Jack with Terminal Block

    • Description: A barrel jack connector for power input.
    • Pins: POS, NEG

Wiring Details

ESP8266 NodeMCU

AS608 Fingerprint Sensor

0.96" OLED Display

18650 Battery in Holder

Rocker Switch

2.1mm Barrel Jack with Terminal Block

Code Documentation

Overview

The provided code is written for the ESP8266 NodeMCU microcontroller. It includes libraries for handling WiFi, HTTP requests, OLED display, and fingerprint sensor functionalities. The code initializes the components, connects to a WiFi network, and processes fingerprint data to display information on the OLED screen and send data to a server.

Code Breakdown

Libraries

#include <SPI.h>
#include <Wire.h>
#include <WiFiClient.h>
#include <ESP8266WiFi.h>
#include <SoftwareSerial.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPClient.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Fingerprint.h>

Definitions and Initializations

#define Finger_Rx 0 //D3
#define Finger_Tx 2 //D4
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET 0

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
SoftwareSerial mySerial(Finger_Rx, Finger_Tx);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

const char *ssid = "JustDoElectronics";
const char *password = "prateek";
String postData;
String link = "http://192.168.0.108/biometricattendance/getdata.php";
int FingerID = 0;
uint8_t id;

WiFi Connection

void connectToWiFi() {
    WiFi.mode(WIFI_OFF);
    delay(1000);
    WiFi.mode(WIFI_STA);
    Serial.print("Connecting to ");
    Serial.println(ssid);
    WiFi.begin(ssid, password);

    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    display.print(F("Connecting to \n"));
    display.setCursor(0, 50);
    display.setTextSize(2);
    display.print(ssid);
    display.drawBitmap(73, 10, Wifi_start_bits, Wifi_start_width, Wifi_start_height, WHITE);
    display.display();

    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.println("");
    Serial.println("Connected");

    display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(8, 0);
    display.print(F("Connected \n"));
    display.drawBitmap(33, 15, Wifi_connected_bits, Wifi_connected_width, Wifi_connected_height, WHITE);
    display.display();

    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
}

Setup Function

void setup() {
    Serial.begin(115200);
    if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
        Serial.println(F("SSD1306 allocation failed"));
        for (;;);
    }

    display.display();
    delay(2000);
    display.clearDisplay();
    connectToWiFi();
    finger.begin(57600);
    Serial.println("\n\nAdafruit finger detect test");

    if (finger.verifyPassword()) {
        Serial.println("Found fingerprint sensor!");
        display.clearDisplay();
        display.drawBitmap(34, 0, FinPr_valid_bits, FinPr_valid_width, FinPr_valid_height, WHITE);
        display.display();
    } else {
        Serial.println("Did not find fingerprint sensor :(");
        display.clearDisplay();
        display.drawBitmap(32, 0, FinPr_failed_bits, FinPr_failed_width, FinPr_failed_height, WHITE);
        display.display();
        while (1) { delay(1); }
    }

    finger.getTemplateCount();
    Serial.print("Sensor contains ");
    Serial.print(finger.templateCount);
    Serial.println(" templates");
    Serial.println("Waiting for valid finger...");
}

Main Loop

void loop() {
    if (WiFi.status() != WL_CONNECTED) {
        connectToWiFi();
    }
    FingerID = getFingerprintID();
    delay(50);
    DisplayFingerprintID();
    ChecktoAddID();
    ChecktoDeleteID();
}

Display Fingerprint ID

void DisplayFingerprintID() {
    if (FingerID > 0) {
        display.clearDisplay();
        display.drawBitmap(34, 0, FinPr_valid_bits, FinPr_valid_width, FinPr_valid_height, WHITE);
        display.display();
        SendFingerprintID(FingerID);
    } else if (FingerID == 0) {
        display.clearDisplay();
        display.drawBitmap(32, 0, FinPr_start_bits, FinPr_start_width, FinPr_start_height, WHITE);
        display.display();
    } else if (FingerID == -1) {
        display.clearDisplay();
        display.drawBitmap(34, 0, FinPr_invalid_bits, FinPr_invalid_width, FinPr_invalid_height, WHITE);
        display.display();
    } else if (FingerID == -2) {
        display.clearDisplay();
        display.drawBitmap(32, 0, FinPr_failed_bits, FinPr_failed_width, FinPr_failed_height, WHITE);
        display.display();