//----------THU VIEN-Drive ------------------------------ #include #include #include #include #include //---------KEYPAD--------------------------------- const byte ROWS = 4; // four rows const byte COLS = 4; // three columns char keys[ROWS][COLS] = { {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'}}; byte rowPins[ROWS] = {45, 43, 41, 39}; // connect to the row pinouts of the keypad byte colPins[COLS] = {37, 35, 33, 31}; // connect to the column pinouts of the keypad Keypad mykeypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); //--------LCD------------------------------------- LiquidCrystal_I2C lcd(0x3F, 20, 4); //--------PASSWORD-------------------------------- char matkhau[10] = {}; String password = ""; char password_buff[10] = {}; boolean check = false; char class_x = '0'; char class_y = '3'; byte index = 0; byte index_buff = 0; String password_admin = "1111"; int dem_mk_sai = 0; //---------SERIAL--------------------------------- // SoftwareSerial mySerial(16, 17); //---------FINGER--------------------------------- Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial1;); // uint8_t id; int id = 0; char id_buff[] = {}; byte index_id = 0; uint8_t getFingerprintEnroll(); boolean check_enroll = false; boolean check_delete = false; boolean out_fingerprint = false; //--------ETHERNET SHIELD------------------------- long tam_gioopen = 0; // bien tam dem so lan de open int times_open; // so lan cua timer de open int times_close; String pin_open = ""; String pin_close = ""; char statu[4] = {'0', '0', '0', '0'}; void hienthi_lcd(int hang, int cot, char *content) { lcd.setCursor(cot, hang); lcd.print(content); } void hienthi_lcd_clear(int hang, int cot, char *content) { lcd.clear(); lcd.setCursor(cot, hang); lcd.print(content); } //-----------FINDGER---------------------------------------- //-----------Enroll----------------------------------------- uint8_t getFingerprintEnroll(){ int p = -1; Serial.print("Waiting for valid finger to enroll as #"); Serial.println(id); hienthi_lcd_clear(0, 0, "Waiting for finger"); hienthi_lcd(1, 0, "as ID:"); lcd.print(id); while (p != FINGERPRINT_OK){ p = finger.getImage(); switch (p) { case FINGERPRINT_OK: Serial.println("Image taken"); break; case FINGERPRINT_NOFINGER: Serial.println("."); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); break; case FINGERPRINT_IMAGEFAIL: Serial.println("Imaging error"); break; default: Serial.println("Unknown error"); break; } } // OK success! p = finger.image2Tz(1); switch (p) { case FINGERPRINT_OK: Serial.println("Image converted"); break; case FINGERPRINT_IMAGEMESS: Serial.println("Image too messy"); return p; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); return p; case FINGERPRINT_FEATUREFAIL: Serial.println("Could not find fingerprint features"); return p; case FINGERPRINT_INVALIDIMAGE: Serial.println("Could not find fingerprint features"); return p; default: Serial.println("Unknown error"); return p; } Serial.println("Remove finger"); hienthi_lcd_clear(0, 4, "Remove finger"); delay(2000); p = 0; while (p != FINGERPRINT_NOFINGER){ p = finger.getImage(); } Serial.print("ID "); Serial.println(id); p = -1; Serial.println("Place same finger again"); hienthi_lcd_clear(0, 0, "Place same finger"); while (p != FINGERPRINT_OK){ p = finger.getImage(); switch (p) { case FINGERPRINT_OK: Serial.println("Image taken"); break; case FINGERPRINT_NOFINGER: Serial.print("."); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); break; case FINGERPRINT_IMAGEFAIL: Serial.println("Imaging error"); break; default: Serial.println("Unknown error"); break; } } // OK success! p = finger.image2Tz(2); switch (p) { case FINGERPRINT_OK: Serial.println("Image converted"); break; case FINGERPRINT_IMAGEMESS: Serial.println("Image too messy"); return p; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); return p; case FINGERPRINT_FEATUREFAIL: Serial.println("Could not find fingerprint features"); return p; case FINGERPRINT_INVALIDIMAGE: Serial.println("Could not find fingerprint features"); return p; default: Serial.println("Unknown error"); return p; } // OK converted! Serial.print("Creating model for #"); Serial.println(id); p = finger.createModel(); if (p == FINGERPRINT_OK) { Serial.println("Prints matched!"); } else if (p == FINGERPRINT_PACKETRECIEVEERR) { Serial.println("Communication error"); return p; } else if (p == FINGERPRINT_ENROLLMISMATCH){ Serial.println("Fingerprints did not match"); return p; } else{ Serial.println("Unknown error"); return p; } Serial.print("ID "); Serial.println(id); p = finger.storeModel(id); if (p == FINGERPRINT_OK){ Serial.println("Stored!"); hienthi_lcd_clear(0, 6, "Stored!"); } else if (p == FINGERPRINT_PACKETRECIEVEERR){ Serial.println("Communication error"); return p; } else if (p == FINGERPRINT_BADLOCATION){ Serial.println("Could not store in that location"); return p; } else if (p == FINGERPRINT_FLASHERR){ Serial.println("Error writing to flash"); return p; } else{ Serial.println("Unknown error"); return p; } } //--------SIM800-------------------------------------------- void toSerial() { while (Serial2.available() != 0){ Serial.write(Serial2.read()); } } void sim800_send(int id) { Serial.println("AT+IPR=19200"); Serial2.println("AT+IPR=115200"); // Dat c do truyen nhan du lieu 9600 bps delay(1000); toSerial(); Serial2.println("ATE0"); // Tat che do phan hoi (Echo mode) Serial.println("ATE0"); delay(500); toSerial(); Serial2.println("AT+SAPBR=3,1,\"Contype\",\"GPRS\""); Serial.println("AT+SAPBR=3,1,\"Contype\",\"GPRS\""); delay(1000); toSerial(); Serial2.println("AT+SAPBR=1,1"); Serial.println("AT+SAPBR=1,1"); delay(1000); toSerial(); Serial2.println("AT+HTTPINIT"); Serial.println("AT+HTTPINIT"); delay(1000); toSerial(); // Serial3.println("AT+SAPBR=2,1"); // Serial.println("AT+SAPBR=2,1"); // delay(2000); // toSerial(); Serial2.print("AT+HTTPPARA=\"URL\",\"http://www.doantotnghiepk13.tk/monitor.php?id="); Serial2.print(id); Serial2.println("\""); Serial.println("AT+HTTPPARA=\"URL\",\"http://www.doantotnghiepk13.tk/monitor.php?id=3\""); delay(1000); toSerial(); Serial2.println("AT+HTTPACTION=0"); Serial.println("AT+HTTPACTION=0"); delay(4000); // It nhat 6s toSerial(); // Serial3.println("AT+HTTPREAD"); // Serial.println("AT+HTTPREAD"); // delay(1000); // toSerial(); Serial2.println("AT+HTTPTERM"); Serial.println("AT+HTTPTERM"); delay(300); toSerial(); // Serial2.println("AT+SAPBR=0,1"); // Serial.println("AT+SAPBR=0,1"); // delay(500); // toSerial(); } //-----------FINGER- PRINT---------------------------------- uint8_t getFingerprintID(){ uint8_t p = finger.getImage(); switch (p){ case FINGERPRINT_OK: Serial.println("Image taken"); break; case FINGERPRINT_NOFINGER: Serial.println("No finger detected"); return p; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); return p; case FINGERPRINT_IMAGEFAIL: Serial.println("Imaging error"); return p; default: Serial.println("Unknown error"); return p; } // OK success! p = finger.image2Tz(); switch (p){ case FINGERPRINT_OK: Serial.println("Image converted"); break; case FINGERPRINT_IMAGEMESS: Serial.println("Image too messy"); return p; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); return p; case FINGERPRINT_FEATUREFAIL: Serial.println("Could not find fingerprint features"); return p; case FINGERPRINT_INVALIDIMAGE: Serial.println("Could not find fingerprint features"); return p; default: Serial.println("Unknown error"); return p; } // OK converted! p = finger.fingerFastSearch(); if (p == FINGERPRINT_OK){ Serial.println("Found a print match!"); } else if (p == FINGERPRINT_PACKETRECIEVEERR){ Serial.println("Communication error"); return p; } else if (p == FINGERPRINT_NOTFOUND){ Serial.println("Did not find a match"); return p; } else{ Serial.println("Unknown error"); return p; } // found a match! Serial.print("Found ID #"); Serial.print(finger.fingerID); Serial.print(" with confidence of "); Serial.println(finger.confidence); } // 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! Serial.print("Found ID #"); Serial.print(finger.fingerID); Serial.print(" with confidence of "); Serial.println(finger.confidence); hienthi_lcd_clear(0, 0, "Found ID: "); lcd.print(finger.fingerID); hienthi_lcd(2, 2, "DA QUET VAN TAY!"); delay(500); // gServo.write(70); // hienthi_lcd(1, 0, "Do Tin Cay: "); // lcd.print(finger.confidence); //+++++++++++++++++++++++ hienthi_lcd_clear(0, 0, "Dang tai du lieu..."); sim800_send(int(finger.fingerID)); //++++++++++++++++++++++ delay(1); // gServo.write(10); // delay(50); class_x = '0'; // Quay lai menu out_fingerprint = true; // check de out delay(1); // KO DELAY LÀ BỊ LỖI // class_x = '0'; return finger.fingerID; } //-----------DeleteFinger----------------------------------- uint8_t deleteFingerprint(uint8_t id){ uint8_t p = -1; p = finger.deleteModel(id); if (p == FINGERPRINT_OK){ Serial.println("Deleted!"); hienthi_lcd(2, 7, "Deleted!"); delay(1000); } else if (p == FINGERPRINT_PACKETRECIEVEERR){ Serial.println("Communication error"); return p; } else if (p == FINGERPRINT_BADLOCATION){ Serial.println("Could not delete in that location"); return p; } else if (p == FINGERPRINT_FLASHERR){ Serial.println("Error writing to flash"); return p; } else{ Serial.print("Unknown error: 0x"); Serial.println(p, HEX); return p; } } void setup() { //----lcd--------- lcd.init(); lcd.backlight(); lcd.display(); //----sim800------ Serial2.begin(115200); Serial2.println("AT+CNMI=2,2"); // Nhận tn ngay khi có Serial2.println("AT+CMGF=1"); // Chuyển về dạng text mới so sánh chuỗi được Serial.println("AT+CMGF=1"); delay(100); //----Ethernet shield--- /* */ //---finger------------ finger.begin(57600); // Khoi tao van tay if (finger.verifyPassword()){ Serial.println("Found fingerprint sensor!"); } else{ Serial.println("Did not find fingerprint sensor :("); // while (1); } } //------------CHUONG TRINH CHINH------------------------------ void loop(){ char key = mykeypad.getKey(); switch (class_x){ case '0':{ Serial.println("1. QUET VAN TAY"); Serial.println("2. QUAN TRI ADMIN"); //+++++++++++++ hienthi_lcd_clear(0, 0, "1.QUET VAN TAY"); hienthi_lcd(2, 0, "2.QUAN TRI ADMIN"); delay(500); while (class_x == '0'){ char key = mykeypad.getKey(); if (key == '1'){ class_x = '1'; break; } if (key == '2'){ class_x = '2'; class_y = '3'; hienthi_lcd_clear(0, 0, "Nhap MK Admin:"); lcd.setCursor(0, 1); break; } } break; } case '1':{ Serial.println("Waiting for valid finger..."); hienthi_lcd_clear(0, 0, "Waiting finger..."); while (!out_fingerprint){ getFingerprintIDez(); delay(50); } out_fingerprint = false; break; } case '2':{ switch (class_y){ case '3':{ if (key){ if (key == '#'){ matkhau[index] = '\0'; Serial.print("ban vua nhap: "); Serial.println(matkhau); if (String(matkhau) == password_admin){ Serial.println("Xin Chao Admin!"); hienthi_lcd_clear(0, 0, "Xin Chao Admin!"); // StrClear(matkhau, index); //Xoa chuoi mat khau da luu index = 0; delay(1000); class_y = '0'; // Ve lai menu } else { Serial.println("Nhap lai mat khau!"); hienthi_lcd_clear(0, 0, "Nhap lai mat khau:"); lcd.setCursor(0, 1); // StrClear(matkhau, index); index = 0; } } // Back else if (key == 'D'){ class_x = '0'; // StrClear(matkhau, index); index = 0; } else if (index < 4){ matkhau[index] = key; index++; Serial.print(key); // Bo o duoi, để khi ấn back ko bị in ra D lcd.print(key); } } break; } case '0':{ Serial.println("1. THEM VAN TAY"); Serial.println("2. XOA VAN TAY"); Serial.println("D. BACK"); hienthi_lcd_clear(0, 0, "1.THEM VAN TAY"); hienthi_lcd(1, 0, "2.XOA VAN TAY"); hienthi_lcd(2, 0, "D.BACK"); delay(500); while (class_y == '0'){ char key = mykeypad.getKey(); if (key == '1'){ class_y = '1'; hienthi_lcd_clear(0, 0, "Nhap ID Can Them:"); lcd.setCursor(0, 1); } if (key == '2'){ class_y = '2'; hienthi_lcd_clear(0, 0, "Nhap ID Can Xoa:"); lcd.setCursor(0, 1); } /* if (key == '3') { class_y = '3'; hienthi_lcd_clear(0, 0, "Nhap Lai MK cu:"); lcd.setCursor(0, 1); }*/ if (key == 'D'){ class_y = 'D'; } if (key == '5'){ class_y = '5'; } } break; } case '1':{ Serial.println("Chuong trinh them van tay"); delay(1000); id = 0; // reset id truoc // StrClear(id_buff, index_id); index_id = 0; while (!check_enroll){ char key = mykeypad.getKey(); if (key){ if (key == '#'){ String str_id = String(id_buff); Serial.println(str_id); id = str_id.toInt(); check_enroll = true; // Co thể chạy chương trình enroll } else if (key == 'D'){ class_y = '0'; check_enroll = true; id = 0; // De khong chay getFingerprintEnroll(); } else{ id_buff[index_id] = key; index_id++; Serial.print(key); lcd.print(key); } } } if (id != 0) getFingerprintEnroll(); delay(1000); // id = 0; check_enroll = false; class_y = '0'; class_x = '2'; break; } case '2':{ Serial.println("Chuong trinh XOa van tay"); id = 0; // reset id truoc // StrClear(id_buff, index_id); index_id = 0; while (!check_delete){ char key = mykeypad.getKey(); if (key){ if (key == '#'){ String str_id = String(id_buff); id = str_id.toInt(); Serial.print("ID XOA: "); Serial.println(id); check_delete = true; // Co thể chạy chương trình delete } else if (key == 'D'){ class_y = '0'; check_delete = true; id = 0; } else{ id_buff[index_id] = key; index_id++; Serial.print(key); lcd.print(key); } } } if (id != 0) deleteFingerprint(id); id = 0; check_delete = false; class_y = '0'; break; } case 'D':{ class_y = '0'; class_x = '0'; break; } } break; } } }