#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define BUTTON_DISTANCE 2 // Distance Button
#define BUTTON_FINGERPRINT 3 // Fingerprint Button
#define LED_GREEN 5 // OK Indicator
#define LED_RED 6 // XX Indicator
Adafruit_SSD1306 display(128, 64, &Wire, -1);
unsigned long startTime;
int distancePressCount = 0;
int fingerprintPressCount = 0;
bool phase1_done = false;
bool phase2_done = false;
void setup() {
pinMode(BUTTON_DISTANCE, INPUT_PULLUP);
pinMode(BUTTON_FINGERPRINT, INPUT_PULLUP);
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_RED, OUTPUT);
Wire.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 10);
display.print("Simulation Start");
display.display();
delay(2000);
display.clearDisplay();
startTime = millis();
}
void loop() {
unsigned long elapsed = (millis() - startTime) / 1000; // Convert to seconds
display.clearDisplay();
display.setCursor(0, 10);
display.print("Time: ");
display.print(elapsed);
if (elapsed < 20) { // First 20 seconds: Count Distance Button presses
if (digitalRead(BUTTON_DISTANCE) == LOW) {
distancePressCount++;
delay(200); // Debounce delay
}
display.setCursor(0, 30);
display.print("Press: ");
display.print(distancePressCount);
} else if (elapsed < 30 && !phase1_done) { // 20-30s: Display Result
phase1_done = true;
if (distancePressCount >= 10) {
display.setCursor(0, 30);
display.print("OK");
digitalWrite(LED_GREEN, HIGH);
} else {
display.setCursor(0, 30);
display.print("XX");
digitalWrite(LED_RED, HIGH);
}
} else if (elapsed < 60) { // 30-60s: Count Fingerprint Button presses
if (elapsed >= 30 && elapsed < 60) {
if (digitalRead(BUTTON_FINGERPRINT) == LOW) {
fingerprintPressCount++;
delay(200); // Debounce delay
}
display.setCursor(0, 30);
display.print("FP Press: ");
display.print(fingerprintPressCount);
}
} else if (!phase2_done) { // 60s: Display Fingerprint Result
phase2_done = true;
if (fingerprintPressCount >= 3) {
display.setCursor(0, 30);
display.print("OK");
digitalWrite(LED_GREEN, HIGH);
} else {
display.setCursor(0, 30);
display.print("XX");
digitalWrite(LED_RED, HIGH);
}
delay(5000);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_RED, LOW);
display.clearDisplay();
}
display.display();
delay(100);
}