// ESTE PROYECTO USA DOS BOTONES : UNO ENCENDERA EL SENSOR DE HUELLA POR UNOS SEGUNDOS DETERMINADOS TRANSCURRIDO // ESE TIEMPO SE APAGA HASTA QUE SE PULSE NUEVO EL BOTON PARA ESCANEAR LA HUELLA REGISTRADA Y ENCENDERA UN LED Y // DOS AL APRETAR EL BOTON DE AGREGAR NUEVO USUARIO PEDIRA QUE SE INGRESE LA HUELLA PRINCIPAL EN ESTE CASO EL ID 8 // UNA VEZ VERIFICADO NOS DARA LA OPCION DE SELECCIONAR UN ID NUEVO EN LA QUE SE AGREGARA EL NUEVO USUARIO Y TENDRA LA CAPACIDAD // DE ENCENDER EL LED // EL PROBLEMA AQUI ES AL AGREGAR EL USUARIO NUEVO CUANDO LO AGREGO getFingerprintEnroll ME DISTORSIONA TODO Y CUANDO APRETO ALGUNO DE LOS BOTONES // ME ENVIA AL INICIO Y DOS ES QUE NO ME ENCIENDE NI APAGA DE INMEDIATO EL SENSOR DE HUELLA #include #include LiquidCrystal_I2C lcd(0x27,16,2); #include #include int getFingerprintIDez(); SoftwareSerial mySerial(10, 11); Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); int LED=7;//aņadido pin 7 ID 8 int LED2=4; // pin 4 int scan_pin = 13; //boton de escaneo int add_id_pin = 12; //boton agregar nuevo usuario int main_user_ID =8; //USUARIO PRINCIPAL REGISTRADO CON ID 8 bool scanning = false;// ENCIENDE SI ESTA EN TRUE O APAGA EL SENSOR SI ESTA EN FALSE int counter = 0;// CONTADOR int id_ad_counter = 0;// bool id_ad = false; uint8_t num = 1; bool id_selected = false;// SELECCIONA EL ID uint8_t id; bool first_read = false; bool main_user = false;//USUARIO PRINCIPAL bool add_new_id = false;//AGREGA NUEVO ID bool ENCENDER = true; void setup() { Serial.begin(57600); lcd.init(); //Init the LCD with i2c communication and print text lcd.backlight(); lcd.setCursor(0,0); lcd.print("Presionar SCANEO"); lcd.setCursor(0,1); lcd.print(" -encender- "); pinMode(scan_pin,INPUT); pinMode(add_id_pin,INPUT); pinMode(LED,OUTPUT); pinMode(LED2,OUTPUT); digitalWrite(LED,HIGH); finger.begin(57600); } void loop() { if(digitalRead(scan_pin) && !id_ad)// si apretamos boton de escaneo se ejecutara { scanning = true; //deberia encender inmediatamente el sensor de huella lcd.setCursor(0,0); lcd.print(" COLOCAR DEDO "); lcd.setCursor(0,1); lcd.print("SCANNING--------"); } while(scanning && counter <= 60)//mientras se escanea iniacia el contador para que se apague el sensor de huella { //evitando que se mantenga encendido el sensor getFingerprintID(); delay(100); counter = counter + 1; if(counter == 10) { lcd.setCursor(0,0); lcd.print(" COLOCAR DEDO "); lcd.setCursor(0,1); lcd.print("SCANNING ------"); } if(counter == 20) { lcd.setCursor(0,0); lcd.print(" COLOCAR DEDO "); lcd.setCursor(0,1); lcd.print("SCANNING ----"); } if(counter == 40) { lcd.setCursor(0,0); lcd.print(" COLOCAR DEDO "); lcd.setCursor(0,1); lcd.print("SCANNING --"); } if(counter == 50) { lcd.setCursor(0,0); lcd.print(" COLOCAR DEDO "); lcd.setCursor(0,1); lcd.print("SCANNING "); } if(counter == 59) { lcd.setCursor(0,0); lcd.print(" Timeout! "); lcd.setCursor(0,1); lcd.print(" Try again! "); delay(2000); if(ENCENDER) { lcd.setCursor(0,0); lcd.print(" Presionar SCANEO "); lcd.setCursor(0,1); lcd.print(" -ENCENDER- "); } else { lcd.setCursor(0,0); lcd.print(" Presionar SCANEO "); lcd.setCursor(0,1); lcd.print(" - APAGAR - "); } } } scanning = false; // deberia apagar el sensor pero no lo hace counter = 0; ///////////////////////////////FIN DE LA PARTE DE ESCANEO///////////////////////////////////// ///////////////////////////////INICIO DE BOTON DE AGREGAR NUEVO USUARIO ///////////////////////// if(digitalRead(add_id_pin) && !id_ad) { add_new_id = true; lcd.setCursor(0,0); lcd.print(" Scan main user ");// ESCANEAR USUARIO PRINCIPAL ID 8 lcd.setCursor(0,1); lcd.print(" finger first! "); //COLOCAR DEDO while (id_ad_counter < 40 && !main_user) { getFingerprintID(); delay(100); id_ad_counter = id_ad_counter+1; if(!add_new_id) { id_ad_counter = 40; } } id_ad_counter = 0; add_new_id = false; if(main_user) { lcd.setCursor(0,0); lcd.print(" Add new ID# to ");//AGREGA NUEVO ID lcd.setCursor(0,1); lcd.print(" the database "); // A LA BASE DE DATOS delay(1500); print_num(num); id_ad = true; } else { lcd.setCursor(0,0); lcd.print("ERROR! Only main"); lcd.setCursor(0,1); lcd.print("user can add IDs"); delay(1500); if(ENCENDER) { lcd.setCursor(0,0); lcd.print(" Presionar SCANEO "); lcd.setCursor(0,1); lcd.print(" - ENCENDER - "); } else { lcd.setCursor(0,0); lcd.print(" Press SCAN "); lcd.setCursor(0,1); lcd.print(" - APAGAR - "); } id_ad = false; } } //**************** AQUI ESTA EL PROBLEMA ************* if(digitalRead(scan_pin) && id_ad) { id=num; while (! getFingerprintEnroll() );// CADA BOTON QUE SE APRETA SE REINICIA TODO id_ad = false; lcd.clear(); // TODO FUNCIONA BIEN MENOS ESTA PARTE QUE ES LA PRINCIPAL PARA GUARDAR NUEVO USUARIO lcd.setCursor(0,0); lcd.print(" New ID saved "); lcd.setCursor(4,1); lcd.print("as ID #"); lcd.setCursor(11,1); lcd.print(id); delay(3000); if(ENCENDER) { lcd.setCursor(0,0); lcd.print(" Presionar SCANEO "); lcd.setCursor(0,1); lcd.print(" - ENCENDER - "); } else { lcd.setCursor(0,0); lcd.print(" Presionar SCANEO "); lcd.setCursor(0,1); lcd.print(" - APAGAR- "); } add_new_id = false; main_user = false; id_ad = false; //****************************************************************** if(digitalRead(add_id_pin) && id_ad)// ENVIA LA SELECCION DEL # ID EN LA QUE GUARDARA NUEVO USUARIO { num = num + 1; if(num > 16) { num=1; } print_num(num); } } } /////////////////////////FIN BOTON NUEVO USUARIO //////////////////////////////////////////////// void print_num(uint8_t) // SELECCION DE ID { if (num == 1) { lcd.setCursor(0,0); lcd.print("Select ID number"); lcd.setCursor(0,1); lcd.print(">1 2 3 4 "); delay(500); } if (num == 2) { lcd.setCursor(0,0); lcd.print("Select ID number"); lcd.setCursor(0,1); lcd.print(" 1 >2 3 4 "); delay(500); } if (num == 3) { lcd.setCursor(0,0); lcd.print("Select ID number"); lcd.setCursor(0,1); lcd.print(" 1 2 >3 4 "); delay(500); } if (num == 4) { lcd.setCursor(0,0); lcd.print("Select ID number"); lcd.setCursor(0,1); lcd.print(" 1 2 3 >4 "); delay(500); } if (num == 5) { lcd.setCursor(0,0); lcd.print("Select ID number"); lcd.setCursor(0,1); lcd.print(">5 6 7 8 "); delay(500); } if (num == 6) { lcd.setCursor(0,0); lcd.print("Select ID number"); lcd.setCursor(0,1); lcd.print(" 5 >6 7 8 "); delay(500); } if (num == 7) { lcd.setCursor(0,0); lcd.print("Select ID number"); lcd.setCursor(0,1); lcd.print(" 5 6 >7 8 "); delay(500); } if (num == 8) { lcd.setCursor(0,0); lcd.print("Select ID number"); lcd.setCursor(0,1); lcd.print(" 5 6 7 >8 "); delay(500); } if (num == 9) { lcd.setCursor(0,0); lcd.print("Select ID number"); lcd.setCursor(0,1); lcd.print(">9 10 11 12 "); delay(500); } if (num == 10) { lcd.setCursor(0,0); lcd.print("Select ID number"); lcd.setCursor(0,1); lcd.print(" 9 >10 11 12 "); delay(500); } if (num == 11) { lcd.setCursor(0,0); lcd.print("Select ID number"); lcd.setCursor(0,1); lcd.print(" 9 10 >11 12 "); delay(500); } if (num == 12) { lcd.setCursor(0,0); lcd.print("Select ID number"); lcd.setCursor(0,1); lcd.print(" 9 10 11 >12 "); delay(500); } if (num == 13) { lcd.setCursor(0,0); lcd.print("Select ID number"); lcd.setCursor(0,1); lcd.print(">13 14 15 16 "); delay(500); } if (num == 14) { lcd.setCursor(0,0); lcd.print("Select ID number"); lcd.setCursor(0,1); lcd.print(" 13 >14 15 16 "); delay(500); } if (num == 15) { lcd.setCursor(0,0); lcd.print("Select ID number"); lcd.setCursor(0,1); lcd.print(" 13 14 >15 16 "); delay(500); } if (num == 16) { lcd.setCursor(0,0); lcd.print("Select ID number"); lcd.setCursor(0,1); lcd.print(" 13 14 15 >16 "); delay(500); } } uint8_t getFingerprintID() { uint8_t p = finger.getImage(); switch (p) { case FINGERPRINT_OK: break; case FINGERPRINT_NOFINGER: return p; case FINGERPRINT_PACKETRECIEVEERR: return p; case FINGERPRINT_IMAGEFAIL: return p; default: return p; } // OK success! p = finger.image2Tz(); switch (p) { case FINGERPRINT_OK: break; case FINGERPRINT_IMAGEMESS: return p; case FINGERPRINT_PACKETRECIEVEERR: return p; case FINGERPRINT_FEATUREFAIL: return p; case FINGERPRINT_INVALIDIMAGE: return p; default: return p; } // OK converted! p = finger.fingerFastSearch(); if (p == FINGERPRINT_OK) { scanning = false; counter = 0; if(add_new_id) { if(finger.fingerID == main_user_ID) { main_user = true; id_ad = false; } else { add_new_id = false; main_user = false; id_ad = false; } } else { digitalWrite(LED,LOW); lcd.clear(); lcd.setCursor(0,0); lcd.print(" User match "); lcd.setCursor(0,1); lcd.print(" ID: #"); lcd.setCursor(6,1); lcd.print(finger.fingerID); lcd.setCursor(9,1); lcd.print("%: "); lcd.setCursor(12,1); lcd.print(finger.confidence); ENCENDER = false; delay(4000); lcd.setCursor(0,0); lcd.print(" Presionar SCANEO "); lcd.setCursor(0,1); lcd.print(" ENCENDER "); delay(50); }//end finger OK } else if(p == FINGERPRINT_NOTFOUND) { scanning = false; id_ad = false; counter = 0; lcd.setCursor(0,0); lcd.print(" NO AUTORIZADO ");//NO MATCH lcd.setCursor(0,1); lcd.print(" REINTENTAR ");//TRY AGAIN add_new_id = false; main_user = false; delay(2); return p; }//end finger error }// returns -1 if failed, otherwise returns ID # int getFingerprintIDez() { uint8_t p = finger.getImage(); if (p != FINGERPRINT_OK) return -1; p = finger.image2Tz(); if (p != FINGERPRINT_OK) return -1; p = finger.fingerFastSearch(); if (p != FINGERPRINT_OK) return -1; // found a match! return finger.fingerID; } uint8_t getFingerprintEnroll() { int p = -1; if(!first_read) { lcd.setCursor(0,0); lcd.print("Add new as ID# "); lcd.setCursor(14,0); lcd.print(id); lcd.setCursor(0,1); lcd.print(" Place finger "); } while (p != FINGERPRINT_OK) { p = finger.getImage(); switch (p) { case FINGERPRINT_OK: lcd.setCursor(0,0); lcd.print(" Image taken! "); lcd.setCursor(0,1); lcd.print(" "); delay(100); first_read = true; break; case FINGERPRINT_NOFINGER: lcd.setCursor(0,0); lcd.print("Add new as ID# "); lcd.setCursor(14,0); lcd.print(id); lcd.setCursor(0,1); lcd.print(" Place finger "); break; case FINGERPRINT_PACKETRECIEVEERR: lcd.setCursor(0,0); lcd.print(" Comunication "); lcd.setCursor(0,1); lcd.print(" ERROR! "); delay(1000); break; case FINGERPRINT_IMAGEFAIL: lcd.setCursor(0,0); lcd.print(" -Image "); lcd.setCursor(0,1); lcd.print(" ERROR! "); delay(1000); break; default: lcd.setCursor(0,0); lcd.print(" -Unknown "); lcd.setCursor(0,1); lcd.print(" ERROR! "); delay(1000); break; } } // OK success! p = finger.image2Tz(1); switch (p) { case FINGERPRINT_OK: lcd.setCursor(0,0); lcd.print("Image converted!"); lcd.setCursor(0,1); lcd.print(" "); break; case FINGERPRINT_IMAGEMESS: lcd.setCursor(0,0); lcd.print("Image too messy!"); lcd.setCursor(0,1); lcd.print(" "); delay(1000); return p; case FINGERPRINT_PACKETRECIEVEERR: lcd.setCursor(0,0); lcd.print(" Comunication "); lcd.setCursor(0,1); lcd.print(" ERROR! "); delay(1000); return p; case FINGERPRINT_FEATUREFAIL: lcd.setCursor(0,0); lcd.print(" No fingerprint "); lcd.setCursor(0,1); lcd.print("features found "); delay(1000); return p; case FINGERPRINT_INVALIDIMAGE: lcd.setCursor(0,0); lcd.print(" No fingerprint "); lcd.setCursor(0,1); lcd.print("features found "); delay(1000); return p; default: lcd.setCursor(0,0); lcd.print(" -Unknown "); lcd.setCursor(0,1); lcd.print(" ERROR! "); delay(1000); return p; } lcd.setCursor(0,0); lcd.print(" Remove finger! "); lcd.setCursor(0,1); lcd.print(" "); delay(2000); p = 0; while (p != FINGERPRINT_NOFINGER) { p = finger.getImage(); } lcd.setCursor(0,1); lcd.print("ID# "); lcd.setCursor(4,1); lcd.print(id); p = -1; lcd.setCursor(0,0); lcd.print("Place again the "); lcd.setCursor(0,1); lcd.print("same finger "); while (p != FINGERPRINT_OK) { p = finger.getImage(); switch (p) { case FINGERPRINT_OK: lcd.setCursor(0,0); lcd.print(" Image taken! "); lcd.setCursor(0,1); lcd.print(" "); break; case FINGERPRINT_NOFINGER: lcd.setCursor(0,0); lcd.print("Place again the "); lcd.setCursor(0,1); lcd.print("same finger "); break; case FINGERPRINT_PACKETRECIEVEERR: lcd.setCursor(0,0); lcd.print(" Comunication "); lcd.setCursor(0,1); lcd.print(" ERROR! "); delay(1000); break; case FINGERPRINT_IMAGEFAIL: lcd.setCursor(0,0); lcd.print(" -Image "); lcd.setCursor(0,1); lcd.print(" ERROR! "); delay(1000); break; default: lcd.setCursor(0,0); lcd.print(" -Unknown "); lcd.setCursor(0,1); lcd.print(" ERROR! "); delay(1000); break; } } // OK success! p = finger.image2Tz(2); switch (p) { case FINGERPRINT_OK: lcd.setCursor(0,0); lcd.print("Image converted!"); lcd.setCursor(0,1); lcd.print(" "); break; case FINGERPRINT_IMAGEMESS: lcd.setCursor(0,0); lcd.print("Image too messy!"); lcd.setCursor(0,1); lcd.print(" "); delay(1000); return p; case FINGERPRINT_PACKETRECIEVEERR: lcd.setCursor(0,0); lcd.print(" Comunication "); lcd.setCursor(0,1); lcd.print(" ERROR! "); delay(1000); return p; case FINGERPRINT_FEATUREFAIL: lcd.setCursor(0,0); lcd.print(" No fingerprint "); lcd.setCursor(0,1); lcd.print("features found "); delay(1000); return p; case FINGERPRINT_INVALIDIMAGE: lcd.setCursor(0,0); lcd.print(" Comunication "); lcd.setCursor(0,1); lcd.print(" ERROR! "); delay(1000); return p; default: lcd.setCursor(0,0); lcd.print(" -Unknown "); lcd.setCursor(0,1); lcd.print(" ERROR! "); delay(1000); return p; } // OK converted! lcd.setCursor(0,0); lcd.print(" Creating model "); lcd.setCursor(0,1); lcd.print("for ID# "); lcd.setCursor(8,1); lcd.print(id); p = finger.createModel(); if (p == FINGERPRINT_OK) { lcd.setCursor(0,0); lcd.print(" Print matched! "); lcd.setCursor(0,1); lcd.print(" "); delay(1000); } else if (p == FINGERPRINT_PACKETRECIEVEERR) { lcd.setCursor(0,0); lcd.print(" Comunication "); lcd.setCursor(0,1); lcd.print(" ERROR! "); delay(1000); return p; } else if (p == FINGERPRINT_ENROLLMISMATCH) { lcd.setCursor(0,0); lcd.print("Fingerprint did "); lcd.setCursor(0,1); lcd.print("not match "); delay(1000); return p; } else { lcd.setCursor(0,0); lcd.print(" -Unknown "); lcd.setCursor(0,1); lcd.print(" ERROR! "); delay(1000); return p; } lcd.setCursor(0,1); lcd.print("ID# "); lcd.setCursor(4,1); lcd.print(id); p = finger.storeModel(id); if (p == FINGERPRINT_OK) { lcd.setCursor(0,0); lcd.print(" Stored "); lcd.setCursor(0,1); lcd.print(" "); delay(1000); first_read = false; id_ad = false; } else if (p == FINGERPRINT_PACKETRECIEVEERR) { lcd.setCursor(0,0); lcd.print(" Comunication "); lcd.setCursor(0,1); lcd.print(" ERROR! "); delay(1000); 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); return p; } else if (p == FINGERPRINT_FLASHERR) { lcd.setCursor(0,0); lcd.print("Error writing to"); lcd.setCursor(0,1); lcd.print("flash "); delay(1000); return p; } else { lcd.setCursor(0,0); lcd.print(" -Unknown "); lcd.setCursor(0,1); lcd.print(" ERROR! "); delay(1000); return p; } }