- //----------THU VIEN-Drive ------------------------------
- #include <Keypad.h>
- #include <SoftwareSerial.h>
- #include <LiquidCrystal_I2C.h>
- #include <Adafruit_Fingerprint.h>
- #include <Wire.h>
- //---------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;
- }
- }
- }