Biometric Access Control: ESP32-C3 OLED & AS608 Fingerprint Scanner

Using the little ESP32-C3 board and its integrated 0.42-inch OLED display, create an intelligent biometric authentication system. When paired with an AS608 optical fingerprint scanner, this project updates real-time progress messages on the screen and either signals unauthorized access using a Yellow LED or authorizes access via a Green LED when a matched print is scanned.

led-status-control-esp32-supermini-oled-as608-fingerprint-scanner-experiment-a-a

Components Used

  • ESP32-C3 Development Board with built-in 0.42″ (72×40) SSD1306 OLED
  • Biometric Sensor: AS608 Optical Fingerprint Module
  • Green LED (Access Granted)
  • Yellow LED (Access Denied)
  • 220Ω Resistor
esp32-c3-mini-oled-as608-fingerprint-scanner-yellow-led-green-200ohm-resistor

Circuit Wiring & Schematic Description

led-status-control-esp32-supermini-oled-as608-fingerprint-scanner-circuit-diagram

Required Libraries

Using the Arduino IDE Library Manager (Ctrl+Shift+I or Cmd+Shift+I), install these libraries:

Adafruit Fingerprint Sensor Librar

Handles UART communication and image searching for AS608 modules

adafruit-fingerprint-sensor-library-arduino-ide

U8g2 library

Renders images and text on monochrome OLED screens (SSD1306 72×40).

Ucglib-arduino-ide-library

Arduino Code

#include <Adafruit_Fingerprint.h>
#include <HardwareSerial.h>
#include <Wire.h>
#include <U8g2lib.h>

// Built-in 0.42" (72x40) SSD1306 OLED setup for ESP32-C3
// SCL = GPIO 6, SDA = GPIO 5
U8G2_SSD1306_72X40_ER_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 6, /* data=*/ 5);

// Indicator LED Pins
#define Green_LED  4    // Authorized access
#define Yellow_LED 3    // Unauthorized access

// Hardware Serial for Fingerprint Sensor (UART 1)
// Sensor TX -> ESP32 RX (GPIO 8)
// Sensor RX -> ESP32 TX (GPIO 10)
#define FINGERPRINT_RX 8
#define FINGERPRINT_TX 10

HardwareSerial mySerial(1);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

// Forward declaration
uint8_t getFingerprintID(void);

void setup() {
  Serial.begin(115200);
  delay(100);

  // Initialize LEDs
  pinMode(Green_LED, OUTPUT);
  pinMode(Yellow_LED, OUTPUT);
  digitalWrite(Green_LED, LOW);
  digitalWrite(Yellow_LED, LOW);

  // Initialize U8g2 OLED
  u8g2.begin();
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_micro_tr);
  u8g2.setCursor(0, 12);
  u8g2.print("Fingerprint Init...");
  u8g2.sendBuffer();

  // Initialize Serial and Fingerprint sensor
  mySerial.begin(57600, SERIAL_8N1, FINGERPRINT_RX, FINGERPRINT_TX);
  finger.begin(57600);

  u8g2.clearBuffer();
  if (finger.verifyPassword()) {
    Serial.println("Found fingerprint sensor!");
    u8g2.setCursor(0, 12);
    u8g2.print("Sensor Found!");
    u8g2.setCursor(0, 26);
    u8g2.print("Ready to scan");
  } else {
    Serial.println("Did not find fingerprint sensor :(");
    u8g2.setCursor(0, 12);
    u8g2.print("Sensor Error!");
    u8g2.sendBuffer();
    while (1) delay(1);
  }
  u8g2.sendBuffer();

  delay(2000);
}

void loop() {
  // Idle status on OLED
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_micro_tr);
  u8g2.setCursor(0, 12);
  u8g2.print("Place Finger...");
  u8g2.sendBuffer();

  getFingerprintID();
  delay(1000);
}

uint8_t getFingerprintID() {
  uint8_t p = finger.getImage();
  if (p != FINGERPRINT_OK) return p;

  p = finger.image2Tz();
  if (p != FINGERPRINT_OK) return p;

  p = finger.fingerFastSearch();
  if (p == FINGERPRINT_OK) {
    // Authorized fingerprint
    Serial.print("Found ID #"); Serial.println(finger.fingerID);

    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_micro_tr);
    u8g2.setCursor(0, 12);
    u8g2.print("ACCESS GRANTED");
    u8g2.setCursor(0, 26);
    u8g2.print("ID: #");
    u8g2.print(finger.fingerID);
    u8g2.sendBuffer();

    digitalWrite(Green_LED, HIGH);
    delay(2000);
    digitalWrite(Green_LED, LOW);
  } else {
    // Unauthorized fingerprint
    Serial.println("This finger wasn't stored");

    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_micro_tr);
    u8g2.setCursor(0, 12);
    u8g2.print("ACCESS DENIED!");
    u8g2.setCursor(0, 26);
    u8g2.print("Unknown Finger");
    u8g2.sendBuffer();

    digitalWrite(Yellow_LED, HIGH);
    delay(2000);
    digitalWrite(Yellow_LED, LOW);
  }

  return p;
}

How it works

The AS608 sensor uses its integrated optical prism to continually search for a finger location. Once identified, it creates a distinct mathematical template and transforms the physical ridge pattern into a digital image.

led-status-control-esp32-supermini-oled-as608-fingerprint-scanner-experiment

In order to compare this image data with pre-stored templates in the module’s flash memory, the ESP32-C3 transmits it via hardware serial pins GPIO 8 and GPIO 10. The system turns on the green LED on GPIO 4 and shows the matching ID number on the OLED when a rapid search match is verified.

led-status-control-esp32-supermini-oled-as608-fingerprint-scanner-green-led

The module returns an error flag if the scanned print fails image conversion or does not match any stored data. After processing this response, the ESP32-C3 flashes an access denied alert on the screen and turns on the yellow LED on GPIO 3 for two seconds.

led-status-control-esp32-supermini-oled-as608-fingerprint-scanner

Leave a Reply

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