#include <Adafruit_GFX.h> // For drawing on OLED
#include <Adafruit_SSD1306.h> // For OLED control
#define SCREEN_WIDTH 128 // OLED width in pixels
#define SCREEN_HEIGHT 64 // OLED height in pixels
#define OLED_RESET -1 // No reset pin needed
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // Create OLED object
// Mock time variables (simulating 9:00 AM, Sept 4, 2025)
unsigned long currentTime = 1725490800; // Epoch for 9:00 AM IST, Sept 4, 2025
int currentHour = 9; // Starting hour (12-hour format)
int currentMinute = 0; // Starting minute
bool isPM = false; // AM/PM flag
// Structure to hold user data (like a simple database)
struct User {
String name; // User's name
int planDays; // Membership days (5, 10, 30, or flexible)
int daysUsed; // Days used so far
unsigned long lastVisit; // Last visit timestamp (in seconds)
};
// Example users (hardcoded for simulation – in real life, store in cloud)
User users[3] = {
{"Alice", 5, 0, 0}, // 5-day plan
{"Bob", 30, 2, 0}, // 30-day plan, already used 2 days
{"Charlie", 15, 0, 0} // Flexible 15-day plan
};
void setup() {
Serial.begin(115200); // Start serial monitor for debugging and mock input
Serial.println("Project starting...");
// Start OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 0x3C is common I2C address
Serial.println("OLED failed to start!");
while (true); // Stop if OLED fails
}
display.clearDisplay();
display.setTextSize(1); // Text size
display.setTextColor(SSD1306_WHITE); // White text
display.setCursor(0, 0); // Start at top-left
display.println("Ready to scan");
display.display(); // Show on OLED
}
void loop() {
// Mock time increment (simulate time passing, e.g., 1 second per loop)
currentTime += 1; // Add 1 second per loop (for testing, simulates time)
currentMinute = (currentTime / 60) % 60; // Update minutes
currentHour = ((currentTime / 3600) % 24) % 12; // Update hours (12-hour format)
if (currentHour == 0) currentHour = 12; // Fix 0 to 12 for AM/PM
isPM = ((currentTime / 3600) % 24) >= 12; // AM/PM flag
// Mock fingerprint scan: Type "scan:0" for Alice, "scan:1" for Bob, etc. in serial monitor
if (Serial.available() > 0) {
String input = Serial.readStringUntil('\n');
input.trim(); // Remove extra spaces
if (input.startsWith("scan:")) {
int userId = input.substring(5).toInt(); // Get number after "scan:"
if (userId >= 0 && userId < 3) { // Check valid user
User &user = users[userId]; // Get user
// Check if it's a new day (more than 24 hours since last visit)
if (currentTime - user.lastVisit >= 86400) { // 86400 seconds = 1 day
user.daysUsed++;
user.lastVisit = currentTime;
}
// Check if membership is still valid
if (user.daysUsed > user.planDays) {
display.clearDisplay();
display.setCursor(0, 0);
display.println("Membership expired!");
display.display();
Serial.println("Expired for " + user.name);
return; // Don't proceed
}
// Show on OLED: "Thank you 3/30" (example for Bob)
display.clearDisplay();
display.setCursor(0, 0);
display.print("Thank you ");
display.print(user.daysUsed);
display.print("/");
display.println(user.planDays);
display.display();
// Get formatted time (like "9:00 AM")
String hourStr = String(currentHour);
String minuteStr = String(currentMinute < 10 ? "0" : "") + String(currentMinute);
String amPm = isPM ? " PM" : " AM";
String entryTime = hourStr + ":" + minuteStr + amPm;
// Simulate sending to app (print to serial as if it's the owner's app)
Serial.print("App receives (Owner's account): ");
Serial.print("Time: ");
Serial.print(entryTime);
Serial.print(", Name: ");
Serial.print(user.name);
Serial.print(", Days: ");
Serial.print(user.daysUsed);
Serial.print("/");
Serial.println(user.planDays);
} else {
Serial.println("Invalid user ID!");
}
}
}
delay(100); // Small delay to not overload
}