#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#include <Adafruit_SSD1306.h> // OLED display library
const char *ssid = "Wokwi-GUEST";
const char *password = "";
AsyncWebServer server(80);
const int redLedPin = 15; // System is active indicator
const int greenLedPin = 2; // Face recognized indicator
const int buzzerPin = 12; // Buzzer pin for unrecognized faces
const int sensorPwrPin = 23; // Sensor power pin
Adafruit_SSD1306 display(128, 64, &Wire, -1); // Initialize OLED display
void setup()
{
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.print("Connected to WiFi. Local IP address: ");
Serial.println(WiFi.localIP());
// Set pin modes
pinMode(sensorPwrPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(greenLedPin, OUTPUT);
pinMode(redLedPin, OUTPUT);
// Turn off all indicators initially
digitalWrite(buzzerPin, LOW);
digitalWrite(greenLedPin, LOW);
digitalWrite(redLedPin, LOW);
// Initialize OLED display
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C))
{
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.display();
delay(2000);
display.clearDisplay();
// Define endpoint for handling attendance
server.on("/markAttendance", HTTP_POST, handleAttendanceRequest);
server.begin();
Serial.println("Server started");
// Turn on system active indicator
digitalWrite(redLedPin, HIGH);
}
void loop()
{
// Main loop can be used for other tasks if needed
}
// Function to handle attendance request
void handleAttendanceRequest(AsyncWebServerRequest *request)
{
String message;
bool faceRecognized = recognizeFace(); // Placeholder for face recognition logic
if (faceRecognized)
{
markAttendance();
digitalWrite(greenLedPin, HIGH); // Turn on green LED
digitalWrite(buzzerPin, LOW); // Turn off buzzer
displayAttendanceStatus("Attendance marked");
message = "{\"message\":\"Attendance marked successfully\"}";
}
else
{
digitalWrite(greenLedPin, LOW); // Turn off green LED
digitalWrite(buzzerPin, HIGH); // Turn on buzzer
displayAttendanceStatus("Face not recognized");
message = "{\"message\":\"Face not recognized\"}";
}
request->send(200, "application/json", message);
}
// Placeholder function for face recognition
bool recognizeFace()
{
// Simulate face recognition with a random result
return random(0, 2) == 1;
}
// Function to mark attendance
void markAttendance()
{
// Simulate attendance marking
Serial.println("Attendance marked");
}
// Function to display attendance status on OLED
void displayAttendanceStatus(String status)
{
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print(status);
display.display();
}