#include #include #include #include #include #include #define SDA_LCD 48 #define SCL_LCD 47 #define LCD_ADDRESS 0x27 LiquidCrystal_I2C lcd(LCD_ADDRESS, 16, 2); #define BUZZER_PIN 2 #define RX_PIN 16 #define TX_PIN 15 HardwareSerial fingerSerial(1); Adafruit_Fingerprint finger = Adafruit_Fingerprint(&fingerSerial); const char* ssid = "4 8 15 16 23 42"; const char* password = "12345678"; WebServer server(80); const char* htmlPage = R"rawliteral( Fabsafe Admin

Registrar nueva huella

Eliminar huella

IDs Registradas





)rawliteral";

void setup() {
  Serial.begin(115200);
  pinMode(BUZZER_PIN, OUTPUT);
  Wire.begin(SDA_LCD, SCL_LCD);
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0); lcd.print("Fabsafe Admin");
  lcd.setCursor(0, 1); lcd.print("Iniciando...");

  fingerSerial.begin(57600, SERIAL_8N1, RX_PIN, TX_PIN);
  finger.begin(57600);
  bool sensorOK = false;
  for (int i = 0; i < 10; i++) {
    if (finger.verifyPassword()) {
      sensorOK = true;
      break;
    }
    delay(500);
  }

  if (!sensorOK) {
    lcd.clear();
    lcd.setCursor(0, 0); lcd.print("Sensor ERROR");
    lcd.setCursor(0, 1); lcd.print("Revise conexión");
    while (true);
  }

  finger.LEDcontrol(false);

  WiFi.softAP(ssid, password);
  delay(100);
  IPAddress IP = WiFi.softAPIP();
  lcd.clear();
  lcd.setCursor(0, 0); lcd.print("AP: ");
  lcd.setCursor(0, 1); lcd.print(IP);

  server.on("/", HTTP_GET, []() {
    server.send(200, "text/html", htmlPage);
  });

  server.on("/list", HTTP_GET, []() {
    String lista = "Huellas registradas:\n";
    for (int i = 0; i < 128; i++) {
      if (finger.loadModel(i) == FINGERPRINT_OK) {
        lista += "ID: " + String(i) + "\n";
      }
    }
    server.send(200, "text/plain", lista);
  });

  server.on("/enroll", HTTP_POST, []() {
    if (!server.hasArg("id")) {
      server.send(400, "text/plain", "Falta ID");
      return;
    }
    uint8_t id = server.arg("id").toInt();
    lcd.clear();
    lcd.setCursor(0, 0); lcd.print("Registrar ID:");
    lcd.setCursor(0, 1); lcd.print(id);
    if (enrollFingerprint(id)) {
      tone(BUZZER_PIN, 1000, 300);
    } else {
      tone(BUZZER_PIN, 300, 500);
    }
    server.sendHeader("Location", "/", true);
    server.send(302, "text/plain", "Redirigiendo");
  });

  server.on("/delete", HTTP_POST, []() {
    if (!server.hasArg("id")) {
      server.send(400, "text/plain", "Falta ID");
      return;
    }
    uint8_t id = server.arg("id").toInt();
    lcd.clear();
    lcd.setCursor(0, 0); lcd.print("Eliminar ID:");
    lcd.setCursor(0, 1); lcd.print(id);
    if (finger.deleteModel(id) == FINGERPRINT_OK) {
      tone(BUZZER_PIN, 800, 300);
    } else {
      tone(BUZZER_PIN, 200, 500);
    }
    server.sendHeader("Location", "/", true);
    server.send(302, "text/plain", "Redirigiendo");
  });

  server.begin();
}

void loop() {
  server.handleClient();
}

bool enrollFingerprint(uint8_t id) {
  int p = -1;
  lcd.clear(); 
  lcd.setCursor(0, 0); 
  lcd.print("Coloca dedo...");

  while ((p = finger.getImage()) != FINGERPRINT_OK) {
    if (p == FINGERPRINT_NOFINGER) delay(100);
    else return false;
  }

  if (finger.image2Tz(1) != FINGERPRINT_OK) return false;

  lcd.setCursor(0, 1); 
  lcd.print("Retira dedo...");
  while (finger.getImage() != FINGERPRINT_NOFINGER) delay(100);

  lcd.clear(); 
  lcd.setCursor(0, 0); 
  lcd.print("Mismo dedo...");
  while ((p = finger.getImage()) != FINGERPRINT_OK) {
    if (p == FINGERPRINT_NOFINGER) delay(100);
    else return false;
  }

  if (finger.image2Tz(2) != FINGERPRINT_OK) return false;
  if (finger.createModel() != FINGERPRINT_OK) return false;
  if (finger.storeModel(id) != FINGERPRINT_OK) return false;

  // Confirmación visual y apagado de sensor
  lcd.clear();
  lcd.setCursor(0, 0); 
  lcd.print("Huella guardada");
  lcd.setCursor(0, 1); 
  lcd.print("ID: "); 
  lcd.print(id);
  finger.LEDcontrol(false); // Apagar luz del sensor después de registrar
  delay(3000);

  return true;
}