#include <HTTPClient.h>
#include <Arduino_JSON.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Adafruit_Fingerprint.h>
#include <HardwareSerial.h>
int rele = 23;
int buzzer = 15;
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);
/*#if (defined(AVR) || defined(ESP8266)) && !defined(AVR_ATmega2560)
SoftwareSerial mySerial(18, 19);
#else
#define mySerial Serial1
#endif*/
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial2);
uint8_t id = 0;
//const char* ssid = "iPhone 11 Pro Max";
//const char* password = "kevin123";
const char* ssid = "15cba67fd17c";
const char* password = "879f6f292c59";
//int relay_pin = 2;
// Keypad Configurations
const byte KEYPAD_ROWS = 4;
const byte KEYPAD_COLS = 5;
// define the cymbols on the buttons of the keypads
char keys[KEYPAD_ROWS][KEYPAD_COLS] = {
{'1', '2', '3', 'A', 'A'},
{'4', '5', '6', 'B', 'B'},
{'7', '8', '9', 'C', 'C'},
{'*', '0', '#', 'D', 'D'}
};
byte rowPins[KEYPAD_ROWS] = {13, 12, 14, 27}; // connect to the row pinouts of the keypad
byte colPins[KEYPAD_COLS] = {26, 25, 33, 32}; // connect to the column pinouts of the keypad
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, KEYPAD_ROWS, KEYPAD_COLS);
//Your Domain name with URL path or IP address with path
const String serverName = "http://apiunicordoba.herokuapp.com/api/usuarios/user/";
const String serverNameRegisterHuella = "http://apiunicordoba.herokuapp.com/api/usuarios/huella/";
const String serverNameLoginHuella = "http://apiunicordoba.herokuapp.com/api/usuarios/gethuella/";
unsigned long lastTime = 0;
unsigned long timerDelay = 5000;
String userCode = "";
String userName = "";
String userId = "";
String menuValue = "";
boolean menuActive = true;
int idHuellaUser = 0;
int dato;
char key2;
String sensorReadings;
float sensorReadingsArr[3];
void setup() {
Serial.begin(115200);
Serial2.begin(115200);
// Serial.begin(115200);
//pinMode (relay_pin, OUTPUT);
LCD.init();
LCD.backlight();
LCD.setCursor(2, 0);
LCD.print("conectando al ");
LCD.setCursor(6, 1);
LCD.print("wifi ");
pinMode(rele, OUTPUT);
pinMode(buzzer, LOW);
digitalWrite(rele, HIGH); // CERRADURA
//WiFi.begin(ssid, password);
Serial.println("Connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
LCD.clear();
LCD.setCursor(4, 0);
LCD.println("Conectado");
delay(1000);
LCD.clear();
LCD.setCursor(0, 0);
LCD.println("r- = registrar");
LCD.setCursor(0, 1);
LCD.println("i- = ingresar");
delay(2000);
LCD.clear();
while (!Serial); // For Yun/Leo/Micro/Zero/...
delay(100);
Serial.println("\n\nAdafruit finger detect test");
// set the data rate for the sensor serial port
finger.begin(57600);
delay(5);
if (finger.verifyPassword()) {
Serial.println("Found fingerprint sensor!");
} else {
Serial.println("Did not find fingerprint sensor :(");
while (1) {
delay(1);
}
}
/*while (!Serial); // For Yun/Leo/Micro/Zero/...
delay(100);
Serial.println("\n\nAdafruit Fingerprint sensor enrollment");
// set the data rate for the sensor serial port
finger.begin(115200);
if (finger.verifyPassword()) {
Serial.println("Found fingerprint sensor!");
}
/* else {
Serial.println("Did not find fingerprint sensor :(");
while (1) {
delay(1);
}
}
Serial.println(F("Reading sensor parameters"));
finger.getParameters();*/
LCD.clear();
LCD.setCursor(0, 0);
LCD.println("Espere ");
LCD.setCursor(0, 1);
LCD.println("por favor");
delay(1000);
LCD.clear();
Serial.println("Timer set to 5 seconds (timerDelay variable), it will take 5 seconds before publishing the first reading.");
}
void loop()
{
digitalWrite(rele, HIGH); // CERRADURA
digitalWrite(buzzer, LOW);
LCD.setCursor(0, 0);
LCD.print("1 i-code 2 r-huella");
LCD.setCursor(0, 1);
LCD.print("3 i-huella");
key2 = keypad.getKey();
if (key2) {
Serial.println(key2);
}
if (key2) {
if (key2 >= '1' && key2 <= '3') {
if (key2 == '1') {
LCD.clear();
LCD.setCursor(2, 0);
LCD.print("Enter code:");
userCode = inputSecretCode();
if (userCode == "0000") {
digitalWrite(rele, LOW); // CERRADURA
digitalWrite(buzzer, HIGH); // CERRADURA
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Acceso concedido");
LCD.setCursor(4, 1);
LCD.print("Hola!!!!");
delay(5000);
digitalWrite(buzzer, LOW); //apagamos el led verde
digitalWrite(rele, HIGH); // CERRADURA
Serial.println("Puerta cerrada");
key2 = 0;
userCode = "";
LCD.clear();
while (true) {
loop();
}
} else {
delay(1000);
if (userCode.length() == 4)
{
if (WiFi.status() == WL_CONNECTED)
{
sensorReadings = httpGETRequest(serverName);
JSONVar myObject = JSON.parse(sensorReadings);
if (JSON.typeof(myObject) == "undefined")
{
Serial.println("Parsing input failed!");
return;
}
JSONVar keys = myObject.keys();
for (int i = 0; i < keys.length(); i++)
{
JSONVar value = myObject[keys[i]];
sensorReadingsArr[i] = double(value);
}
JSONVar uwu = myObject[keys[2]];
userName = uwu;
Serial.println(userName);
key2 = 0;
}
else
{
Serial.println("WiFi Disconnected");
}
lastTime = millis();
}
}
}
if (key2 == '2') {
// if (userId.length() == 0) {
LCD.clear();
LCD.setCursor(1, 0);
LCD.print("Enter you uid:");
userId = inputId();
id = userId.toInt();
Serial.println(id);
delay(1000);
if (id > 0 && id <= 127) {
getFingerprintEnroll();
} else {
LCD.clear();
LCD.setCursor(3, 0);
LCD.print("codigo no");
LCD.setCursor(3, 1);
LCD.print("valido");
delay(1000);
key2 = 0;
userId = "";
}
//}
}
if (key2 == '3') {
LCD.clear();
LCD.setCursor(3, 0);
LCD.print("ingrese la");
LCD.setCursor(5, 1);
LCD.print("huella");
getFingerprintIDez();
}
}
}
}
String httpGETRequest(const String serverName)
{
WiFiClient client;
HTTPClient http;
// Your Domain name with URL path or IP address with path
String url = serverName + userCode;
Serial.print(url);
http.begin(client, url);
// Send HTTP POST request
int httpResponseCode = http.GET();
String payload = "{}";
if (httpResponseCode == 200)
{
digitalWrite(rele, LOW); // CERRADURA
digitalWrite(buzzer, HIGH); // CERRADURA
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
payload = http.getString();
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Acceso concedido");
LCD.setCursor(4, 1);
LCD.print("Hola!!!!");
delay(5000);
digitalWrite(buzzer, LOW); //apagamos el led verde
digitalWrite(rele, HIGH); // CERRADURA
Serial.println("Puerta cerrada");
key2 = 0;
userCode = "";
LCD.clear();
while (true) {
loop();
}
}
else
{
Serial.print("Error code: ");
Serial.println(httpResponseCode);
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Acceso denegado!");
LCD.setCursor(4, 1);
LCD.print(":((");
delay(1000);
key2 = 0;
userCode = "";
LCD.clear();
while (true) {
loop();
}
}
// Free resources
http.end();
return payload;
}
String httpGETRequestHuella(const String serverNameRegisterHuella)
{
WiFiClient client;
HTTPClient http;
// Your Domain name with URL path or IP address with path
String url = serverNameRegisterHuella + id;
Serial.print(url);
http.begin(client, url);
// Send HTTP POST request
int httpResponseCode = http.GET();
String payload = "{}";
if (httpResponseCode == 200)
{
digitalWrite(rele, LOW); // CERRADURA
digitalWrite(buzzer, HIGH); // CERRADURA
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
payload = http.getString();
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Acceso concedido");
LCD.setCursor(4, 1);
LCD.print("Hola!!!!");
delay(5000);
digitalWrite(buzzer, LOW); //apagamos el led verde
digitalWrite(rele, HIGH); // CERRADURA
Serial.println("Puerta cerrada");
key2 = 0;
userCode = "";
LCD.clear();
while (true) {
loop();
}
}
else
{
Serial.print("Error code: ");
Serial.println(httpResponseCode);
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Acceso denegado!");
LCD.setCursor(4, 1);
LCD.print(":((");
delay(1000);
key2 = 0;
LCD.clear();
while (true) {
loop();
}
}
// Free resources
http.end();
return payload;
}
String httpGETRequestLoginHuella(const String serverNameLoginHuella)
{
WiFiClient client;
HTTPClient http;
// Your Domain name with URL path or IP address with path
String url = serverNameLoginHuella + idHuellaUser;
Serial.print(url);
http.begin(client, url);
// Send HTTP POST request
int httpResponseCode = http.GET();
String payload = "{}";
if (httpResponseCode == 200)
{
digitalWrite(rele, LOW); // CERRADURA
digitalWrite(buzzer, HIGH); // CERRADURA
Serial.println("Puerta abierta");
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
payload = http.getString();
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Acceso concedido");
LCD.setCursor(4, 1);
LCD.print("Hola!!!!");
delay(5000);
digitalWrite(buzzer, LOW); //apagamos el led verde
digitalWrite(rele, HIGH); // CERRADURA
Serial.println("Puerta cerrada");
key2 = 0;
userCode = "";
LCD.clear();
while (true) {
loop();
}
}
else
{
Serial.print("Error code: ");
Serial.println(httpResponseCode);
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Acceso denegado!");
LCD.setCursor(4, 1);
LCD.print(":((");
delay(1000);
key2 = 0;
LCD.clear();
while (true) {
loop();
}
}
// Free resources
http.end();
return payload;
}
String inputSecretCode() {
LCD.setCursor(5, 1);
LCD.print("[__]");
LCD.setCursor(6, 1);
String result = "";
while (result.length() < 4) {
char key = keypad.getKey();
if (key >= '0' && key <= '9') {
LCD.print('*');
result += key;
}
}
return result;
}
String inputId() {
LCD.setCursor(5, 1);
LCD.print("[_]");
LCD.setCursor(6, 1);
String result = "";
while (result.length() < 3) {
char key = keypad.getKey();
if (key >= '0' && key <= '9') {
LCD.print('*');
result += key;
}
}
return result;
}
uint8_t getFingerprintEnroll() {
int p = -1;
Serial.print("Waiting for valid finger to enroll as #"); Serial.println(id);
while (p != FINGERPRINT_OK && userId.length() > 0) {
p = finger.getImage();
switch (p) {
case FINGERPRINT_OK:
LCD.clear();
LCD.setCursor(4, 0);
LCD.print("huella");
LCD.setCursor(0, 1);
LCD.print("capturada1");
break;
case FINGERPRINT_NOFINGER:
LCD.clear();
LCD.setCursor(3, 0);
LCD.print("ingrese su");
LCD.setCursor(4, 1);
LCD.print("huella1");
delay(10000);
userId = "";
break;
case FINGERPRINT_PACKETRECIEVEERR:
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Communication");
LCD.setCursor(5, 1);
LCD.print("Error1");
delay(2000);
key2 = 0;
userId = "";
break;
case FINGERPRINT_IMAGEFAIL:
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Imaging error1");
delay(2000);
userId = "";
key2 = 0;
LCD.clear();
break;
default:
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Unknown error1");
delay(2000);
userId = "";
key2 = 0;
LCD.clear();
break;
}
}
// OK success!
p = finger.image2Tz(1);
switch (p) {
case FINGERPRINT_OK:
LCD.clear();
LCD.setCursor(4, 0);
LCD.print("Image");
LCD.setCursor(0, 1);
LCD.print("uwu");
break;
case FINGERPRINT_IMAGEMESS:
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Image too");
LCD.setCursor(3, 1);
LCD.print("messy1");
delay(1000);
userId = "";
key2 = 0;
LCD.clear();
return p;
case FINGERPRINT_PACKETRECIEVEERR:
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Communication");
LCD.setCursor(5, 1);
LCD.print("Error2");
delay(1000);
userId = "";
key2 = 0;
LCD.clear();
return p;
case FINGERPRINT_FEATUREFAIL:
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Could not find");
LCD.setCursor(0, 1);
LCD.print("fingerprint features");
delay(1000);
key2 = 0;
LCD.clear();
while (true) {
return p;
case FINGERPRINT_INVALIDIMAGE:
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Could not find");
LCD.setCursor(0, 1);
LCD.print("fingerprint features");
delay(1000);
key2 = 0;
LCD.clear();
return p;
default:
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Unknown error2");
delay(1000);
key2 = 0;
LCD.clear();
return p;
}
LCD.clear();
LCD.setCursor(4, 0);
LCD.print("quita la");
LCD.setCursor(3, 1);
LCD.print("huella");
Serial.println("Remove finger");
delay(1000);
p = 0;
while (p != FINGERPRINT_NOFINGER) {
p = finger.getImage();
}
Serial.print("ID "); Serial.println(id);
p = -1;
LCD.clear();
LCD.setCursor(3, 0);
LCD.print("ingrese su");
LCD.setCursor(4, 1);
LCD.print("huella");
Serial.println("Place same finger again");
while (p != FINGERPRINT_OK && userId.length() > 0) {
p = finger.getImage();
switch (p) {
case FINGERPRINT_OK:
LCD.setCursor(4, 0);
LCD.print("huella");
LCD.setCursor(0, 1);
LCD.print("capturada2");
break;
case FINGERPRINT_NOFINGER:
LCD.clear();
LCD.setCursor(3, 0);
LCD.print("ingrese su");
LCD.setCursor(4, 1);
LCD.print("huella2");
break;
case FINGERPRINT_PACKETRECIEVEERR:
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Communication");
LCD.setCursor(5, 1);
LCD.print("Error3");
delay(1000);
key2 = 0;
LCD.clear();
break;
case FINGERPRINT_IMAGEFAIL:
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Imaging error3");
delay(1000);
key2 = 0;
LCD.clear();
break;
default:
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Unknown error3");
delay(1000);
key2 = 0;
LCD.clear();
break;
}
}
// OK success!
p = finger.image2Tz(2);
switch (p) {
case FINGERPRINT_OK:
LCD.clear();
LCD.setCursor(4, 0);
LCD.print("Image");
LCD.setCursor(0, 1);
LCD.print("converted2");
break;
case FINGERPRINT_IMAGEMESS:
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Image too");
LCD.setCursor(3, 1);
LCD.print("messy2");
delay(1000);
key2 = 0;
LCD.clear();
return p;
case FINGERPRINT_PACKETRECIEVEERR:
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Communication");
LCD.setCursor(5, 1);
LCD.print("Error4");
delay(1000);
key2 = 0;
LCD.clear();
return p;
case FINGERPRINT_FEATUREFAIL:
Serial.println(" ");
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Could not find");
LCD.setCursor(0, 1);
LCD.print("fingerprint features");
delay(1000);
key2 = 0;
LCD.clear();
return p;
case FINGERPRINT_INVALIDIMAGE:
Serial.println(" ");
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Could not find");
LCD.setCursor(0, 1);
LCD.print("fingerprint features");
delay(1000);
key2 = 0;
LCD.clear();
return p;
default:
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Unknown error4");
delay(1000);
key2 = 0;
LCD.clear();
return p;
}
// OK converted!
Serial.print("Creating model for #"); Serial.println(id);
LCD.clear();
LCD.setCursor(4, 0);
LCD.print("Creating");
LCD.setCursor(0, 1);
LCD.print("model");
delay(1000);
p = finger.createModel();
if (p == FINGERPRINT_OK) {
Serial.println("Prints matched!");
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("las huellas");
LCD.setCursor(0, 1);
LCD.print("coinciden");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Communication");
LCD.setCursor(5, 1);
LCD.print("Error6");
delay(1000);
key2 = 0;
LCD.clear();
return p;
} else if (p == FINGERPRINT_ENROLLMISMATCH) {
Serial.println("Fingerprints did not match");
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("las hellas no");
LCD.setCursor(0, 1);
LCD.print("coinciden");
delay(1000);
key2 = 0;
LCD.clear();
return p;
} else {
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Unknown error5");
delay(1000);
key2 = 0;
LCD.clear();
return p;
}
Serial.print("ID "); Serial.println(id);
p = finger.storeModel(id);
if (p == FINGERPRINT_OK) {
Serial.println("Stored!");
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("huella");
LCD.setCursor(0, 1);
LCD.print("guardada");
if (WiFi.status() == WL_CONNECTED)
{
sensorReadings = httpGETRequestHuella(serverNameRegisterHuella);
Serial.println(sensorReadings);
JSONVar myObject = JSON.parse(sensorReadings);
if (JSON.typeof(myObject) == "undefined")
{
Serial.println("Parsing input failed!");
}
Serial.print("JSON object = ");
Serial.println(myObject);
JSONVar keys = myObject.keys();
for (int i = 0; i < keys.length(); i++)
{
JSONVar value = myObject[keys[i]];
sensorReadingsArr[i] = double(value);
}
JSONVar uwu = myObject[keys[1]];
userName = uwu;
key2 = 0;
}
else
{
Serial.println("WiFi Disconnected");
}
lastTime = millis();
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Communication5");
LCD.setCursor(5, 1);
LCD.print("Error");
delay(1000);
key2 = 0;
LCD.clear();
return p;
} else if (p == FINGERPRINT_BADLOCATION) {
LCD.setCursor(0, 0);
LCD.print("Could not store");
LCD.setCursor(0, 1);
LCD.print("in that location");
delay(1000);
key2 = 0;
LCD.clear();
return p;
} else if (p == FINGERPRINT_FLASHERR) {
LCD.setCursor(0, 0);
LCD.print("Error writing");
LCD.setCursor(0, 1);
LCD.print(" to flash");
delay(1000);
key2 = 0;
LCD.clear();
return p;
} else {
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Unknown error6");
delay(1000);
key2 = 0;
LCD.clear();
return p;
}
key2 = 0;
return true;
}
}
// returns -1 if failed, otherwise returns ID #
void getFingerprintIDez() {
uint8_t p = finger.getImage();
if (p != FINGERPRINT_OK) {
LCD.clear();
while (true) {
loop();
}
}
p = finger.image2Tz();
if (p != FINGERPRINT_OK) {
LCD.clear();
while (true) {
loop();
}
}
p = finger.fingerFastSearch();
if (p != FINGERPRINT_OK) {
LCD.clear();
while (true) {
loop();
}
}
// found a match!
Serial.print("Found ID #"); Serial.print(finger.fingerID);
Serial.print(" with confidence of "); Serial.println(finger.confidence);
while (finger.confidence != 0)
{
idHuellaUser = finger.fingerID;
if (WiFi.status() == WL_CONNECTED)
{
sensorReadings = httpGETRequestLoginHuella(serverNameLoginHuella);
Serial.println(sensorReadings);
JSONVar myObject = JSON.parse(sensorReadings);
if (JSON.typeof(myObject) == "undefined")
{
Serial.println("Parsing input failed!");
}
Serial.print("JSON object = ");
Serial.println(myObject);
JSONVar keys = myObject.keys();
for (int i = 0; i < keys.length(); i++)
{
JSONVar value = myObject[keys[i]];
sensorReadingsArr[i] = double(value);
}
JSONVar uwu = myObject[keys[1]];
userName = uwu;
key2 = 0;
}
else
{
Serial.println("WiFi Disconnected");
}
lastTime = millis();
}
}