Facebook
From congvan62227, 1 Month ago, written in C++.
Embed
Download Paste or View Raw
Hits: 143
  1. //----------THU VIEN-Drive ------------------------------
  2. #include <Keypad.h>
  3. #include <SoftwareSerial.h>
  4. #include <LiquidCrystal_I2C.h>
  5. #include <Adafruit_Fingerprint.h>
  6. #include <Wire.h>
  7.  
  8. //---------KEYPAD---------------------------------
  9. const byte ROWS = 4; // four rows
  10. const byte COLS = 4; // three columns
  11. char keys[ROWS][COLS] = {
  12.     {'1', '2', '3', 'A'},
  13.     {'4', '5', '6', 'B'},
  14.     {'7', '8', '9', 'C'},
  15.     {'*', '0', '#', 'D'}};
  16. byte rowPins[ROWS] = {45, 43, 41, 39}; // connect to the row pinouts of the keypad
  17. byte colPins[COLS] = {37, 35, 33, 31}; // connect to the column pinouts of the keypad
  18. Keypad mykeypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
  19.  
  20. //--------LCD-------------------------------------
  21. LiquidCrystal_I2C lcd(0x3F, 20, 4);
  22.  
  23. //--------PASSWORD--------------------------------
  24. char matkhau[10] = {};
  25. String password = "";
  26. char password_buff[10] = {};
  27. boolean check = false;
  28. char class_x = '0';
  29. char class_y = '3';
  30. byte index = 0;
  31. byte index_buff = 0;
  32. String password_admin = "1111";
  33. int dem_mk_sai = 0;
  34.  
  35. //---------SERIAL---------------------------------
  36. // SoftwareSerial mySerial(16, 17);
  37. //---------FINGER---------------------------------
  38. Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial1;);
  39. // uint8_t id;
  40. int id = 0;
  41. char id_buff[] = {};
  42. byte index_id = 0;
  43. uint8_t getFingerprintEnroll();
  44. boolean check_enroll = false;
  45. boolean check_delete = false;
  46. boolean out_fingerprint = false;
  47.  
  48. //--------ETHERNET SHIELD-------------------------
  49. long tam_gioopen = 0; // bien tam dem so lan de open
  50. int times_open;       // so lan cua timer de open
  51. int times_close;
  52. String pin_open = "";
  53. String pin_close = "";
  54. char statu[4] = {'0', '0', '0', '0'};
  55.  
  56. void hienthi_lcd(int hang, int cot, char *content) {
  57.   lcd.setCursor(cot, hang);
  58.   lcd.print(content);
  59. }
  60.  
  61. void hienthi_lcd_clear(int hang, int cot, char *content) {
  62.   lcd.clear();
  63.   lcd.setCursor(cot, hang);
  64.   lcd.print(content);
  65. }
  66.  
  67. //-----------FINDGER----------------------------------------
  68. //-----------Enroll-----------------------------------------
  69. uint8_t getFingerprintEnroll(){
  70.   int p = -1;
  71.   Serial.print("Waiting for valid finger to enroll as #");
  72.   Serial.println(id);
  73.   hienthi_lcd_clear(0, 0, "Waiting for finger");
  74.   hienthi_lcd(1, 0, "as ID:");
  75.   lcd.print(id);
  76.  
  77.   while (p != FINGERPRINT_OK){
  78.     p = finger.getImage();
  79.     switch (p) {
  80.       case FINGERPRINT_OK:
  81.         Serial.println("Image taken");
  82.         break;
  83.       case FINGERPRINT_NOFINGER:
  84.         Serial.println(".");
  85.         break;
  86.       case FINGERPRINT_PACKETRECIEVEERR:
  87.         Serial.println("Communication error");
  88.         break;
  89.       case FINGERPRINT_IMAGEFAIL:
  90.         Serial.println("Imaging error");
  91.         break;
  92.       default:
  93.         Serial.println("Unknown error");
  94.         break;
  95.     }
  96.   }
  97.  
  98.   // OK success!
  99.   p = finger.image2Tz(1);
  100.   switch (p) {
  101.     case FINGERPRINT_OK:
  102.       Serial.println("Image converted");
  103.       break;
  104.     case FINGERPRINT_IMAGEMESS:
  105.       Serial.println("Image too messy");
  106.       return p;
  107.     case FINGERPRINT_PACKETRECIEVEERR:
  108.       Serial.println("Communication error");
  109.       return p;
  110.     case FINGERPRINT_FEATUREFAIL:
  111.       Serial.println("Could not find fingerprint features");
  112.       return p;
  113.     case FINGERPRINT_INVALIDIMAGE:
  114.       Serial.println("Could not find fingerprint features");
  115.       return p;
  116.     default:
  117.       Serial.println("Unknown error");
  118.       return p;
  119.   }
  120.  
  121.   Serial.println("Remove finger");
  122.   hienthi_lcd_clear(0, 4, "Remove finger");
  123.   delay(2000);
  124.   p = 0;
  125.  
  126.   while (p != FINGERPRINT_NOFINGER){
  127.     p = finger.getImage();
  128.   }
  129.  
  130.   Serial.print("ID ");
  131.   Serial.println(id);
  132.   p = -1;
  133.   Serial.println("Place same finger again");
  134.   hienthi_lcd_clear(0, 0, "Place same finger");
  135.   while (p != FINGERPRINT_OK){
  136.     p = finger.getImage();
  137.     switch (p)
  138.     {
  139.       case FINGERPRINT_OK:
  140.         Serial.println("Image taken");
  141.         break;
  142.       case FINGERPRINT_NOFINGER:
  143.         Serial.print(".");
  144.         break;
  145.       case FINGERPRINT_PACKETRECIEVEERR:
  146.         Serial.println("Communication error");
  147.         break;
  148.       case FINGERPRINT_IMAGEFAIL:
  149.         Serial.println("Imaging error");
  150.         break;
  151.       default:
  152.         Serial.println("Unknown error");
  153.         break;
  154.     }
  155.   }
  156.  
  157.   // OK success!
  158.   p = finger.image2Tz(2);
  159.   switch (p) {
  160.     case FINGERPRINT_OK:
  161.       Serial.println("Image converted");
  162.       break;
  163.     case FINGERPRINT_IMAGEMESS:
  164.       Serial.println("Image too messy");
  165.       return p;
  166.     case FINGERPRINT_PACKETRECIEVEERR:
  167.       Serial.println("Communication error");
  168.       return p;
  169.     case FINGERPRINT_FEATUREFAIL:
  170.       Serial.println("Could not find fingerprint features");
  171.       return p;
  172.     case FINGERPRINT_INVALIDIMAGE:
  173.       Serial.println("Could not find fingerprint features");
  174.       return p;
  175.     default:
  176.       Serial.println("Unknown error");
  177.       return p;
  178.   }
  179.  
  180.   // OK converted!
  181.   Serial.print("Creating model for #");
  182.   Serial.println(id);
  183.   p = finger.createModel();
  184.   if (p == FINGERPRINT_OK) {
  185.     Serial.println("Prints matched!");
  186.   }
  187.  
  188.   else if (p == FINGERPRINT_PACKETRECIEVEERR) {
  189.     Serial.println("Communication error");
  190.     return p;
  191.   }
  192.  
  193.   else if (p == FINGERPRINT_ENROLLMISMATCH){
  194.     Serial.println("Fingerprints did not match");
  195.     return p;
  196.   }
  197.  
  198.   else{
  199.     Serial.println("Unknown error");
  200.     return p;
  201.   }
  202.  
  203.   Serial.print("ID ");
  204.   Serial.println(id);
  205.   p = finger.storeModel(id);
  206.   if (p == FINGERPRINT_OK){
  207.     Serial.println("Stored!");
  208.     hienthi_lcd_clear(0, 6, "Stored!");
  209.   }
  210.  
  211.   else if (p == FINGERPRINT_PACKETRECIEVEERR){
  212.     Serial.println("Communication error");
  213.     return p;
  214.   }
  215.  
  216.   else if (p == FINGERPRINT_BADLOCATION){
  217.     Serial.println("Could not store in that location");
  218.     return p;
  219.   }
  220.  
  221.   else if (p == FINGERPRINT_FLASHERR){
  222.     Serial.println("Error writing to flash");
  223.     return p;
  224.   }
  225.  
  226.   else{
  227.     Serial.println("Unknown error");
  228.     return p;
  229.   }
  230. }
  231.  
  232. //--------SIM800--------------------------------------------
  233. void toSerial() {
  234.   while (Serial2.available() != 0){
  235.     Serial.write(Serial2.read());
  236.   }
  237. }
  238.  
  239. void sim800_send(int id) {
  240.   Serial.println("AT+IPR=19200");
  241.   Serial2.println("AT+IPR=115200"); // Dat c do truyen nhan du lieu 9600 bps
  242.   delay(1000);
  243.   toSerial();
  244.   Serial2.println("ATE0"); // Tat che do phan hoi (Echo mode)
  245.   Serial.println("ATE0");
  246.   delay(500);
  247.   toSerial();
  248.  
  249.   Serial2.println("AT+SAPBR=3,1,\"Contype\",\"GPRS\"");
  250.   Serial.println("AT+SAPBR=3,1,\"Contype\",\"GPRS\"");
  251.   delay(1000);
  252.   toSerial();
  253.   Serial2.println("AT+SAPBR=1,1");
  254.   Serial.println("AT+SAPBR=1,1");
  255.   delay(1000);
  256.   toSerial();
  257.   Serial2.println("AT+HTTPINIT");
  258.   Serial.println("AT+HTTPINIT");
  259.   delay(1000);
  260.   toSerial();
  261.  
  262.   // Serial3.println("AT+SAPBR=2,1");
  263.   // Serial.println("AT+SAPBR=2,1");
  264.   // delay(2000);
  265.   // toSerial();
  266.  
  267.   Serial2.print("AT+HTTPPARA=\"URL\",\"http://www.doantotnghiepk13.tk/monitor.php?id=");
  268.   Serial2.print(id);
  269.   Serial2.println("\"");
  270.   Serial.println("AT+HTTPPARA=\"URL\",\"http://www.doantotnghiepk13.tk/monitor.php?id=3\"");
  271.   delay(1000);
  272.   toSerial();
  273.   Serial2.println("AT+HTTPACTION=0");
  274.   Serial.println("AT+HTTPACTION=0");
  275.   delay(4000); // It nhat 6s
  276.   toSerial();
  277.   // Serial3.println("AT+HTTPREAD");
  278.   // Serial.println("AT+HTTPREAD");
  279.   // delay(1000);
  280.   // toSerial();
  281.   Serial2.println("AT+HTTPTERM");
  282.   Serial.println("AT+HTTPTERM");
  283.   delay(300);
  284.   toSerial();
  285.   // Serial2.println("AT+SAPBR=0,1");
  286.   // Serial.println("AT+SAPBR=0,1");
  287.   // delay(500);
  288.   // toSerial();
  289. }
  290.  
  291. //-----------FINGER- PRINT----------------------------------
  292. uint8_t getFingerprintID(){
  293.   uint8_t p = finger.getImage();
  294.   switch (p){
  295.     case FINGERPRINT_OK:
  296.       Serial.println("Image taken");
  297.       break;
  298.     case FINGERPRINT_NOFINGER:
  299.       Serial.println("No finger detected");
  300.       return p;
  301.     case FINGERPRINT_PACKETRECIEVEERR:
  302.       Serial.println("Communication error");
  303.       return p;
  304.     case FINGERPRINT_IMAGEFAIL:
  305.       Serial.println("Imaging error");
  306.       return p;
  307.     default:
  308.       Serial.println("Unknown error");
  309.       return p;
  310.   }
  311.  
  312.   // OK success!
  313.   p = finger.image2Tz();
  314.   switch (p){
  315.     case FINGERPRINT_OK:
  316.       Serial.println("Image converted");
  317.       break;
  318.     case FINGERPRINT_IMAGEMESS:
  319.       Serial.println("Image too messy");
  320.       return p;
  321.     case FINGERPRINT_PACKETRECIEVEERR:
  322.       Serial.println("Communication error");
  323.       return p;
  324.     case FINGERPRINT_FEATUREFAIL:
  325.       Serial.println("Could not find fingerprint features");
  326.       return p;
  327.     case FINGERPRINT_INVALIDIMAGE:
  328.       Serial.println("Could not find fingerprint features");
  329.       return p;
  330.     default:
  331.       Serial.println("Unknown error");
  332.       return p;
  333.   }
  334.  
  335.   // OK converted!
  336.   p = finger.fingerFastSearch();
  337.   if (p == FINGERPRINT_OK){
  338.     Serial.println("Found a print match!");
  339.   }
  340.  
  341.   else if (p == FINGERPRINT_PACKETRECIEVEERR){
  342.     Serial.println("Communication error");
  343.     return p;
  344.   }
  345.  
  346.   else if (p == FINGERPRINT_NOTFOUND){
  347.     Serial.println("Did not find a match");
  348.     return p;
  349.   }
  350.  
  351.   else{
  352.     Serial.println("Unknown error");
  353.     return p;
  354.   }
  355.  
  356.   // found a match!
  357.   Serial.print("Found ID #");
  358.   Serial.print(finger.fingerID);
  359.   Serial.print(" with confidence of ");
  360.   Serial.println(finger.confidence);
  361. }
  362.  
  363. // returns -1 if failed, otherwise returns ID #
  364. int getFingerprintIDez() {
  365.   uint8_t p = finger.getImage();
  366.   if (p != FINGERPRINT_OK) return -1;
  367.   p = finger.image2Tz();
  368.   if (p != FINGERPRINT_OK) return -1;
  369.   p = finger.fingerFastSearch();
  370.   if (p != FINGERPRINT_OK) return -1;
  371.  
  372.   // found a match!
  373.   Serial.print("Found ID #");
  374.   Serial.print(finger.fingerID);
  375.   Serial.print(" with confidence of ");
  376.   Serial.println(finger.confidence);
  377.   hienthi_lcd_clear(0, 0, "Found ID: ");
  378.   lcd.print(finger.fingerID);
  379.   hienthi_lcd(2, 2, "DA QUET VAN TAY!");
  380.   delay(500);
  381.   // gServo.write(70);
  382.   // hienthi_lcd(1, 0, "Do Tin Cay: ");
  383.   // lcd.print(finger.confidence);
  384.   //+++++++++++++++++++++++
  385.   hienthi_lcd_clear(0, 0, "Dang tai du lieu...");
  386.   sim800_send(int(finger.fingerID));
  387.   //++++++++++++++++++++++
  388.   delay(1);
  389.   // gServo.write(10);
  390.   // delay(50);
  391.   class_x = '0';          // Quay lai menu
  392.   out_fingerprint = true; // check de out
  393.   delay(1);               // KO DELAY LÀ BỊ LỖI
  394.   // class_x = '0';
  395.   return finger.fingerID;
  396. }
  397.  
  398. //-----------DeleteFinger-----------------------------------
  399. uint8_t deleteFingerprint(uint8_t id){
  400.   uint8_t p = -1;
  401.   p = finger.deleteModel(id);
  402.   if (p == FINGERPRINT_OK){
  403.     Serial.println("Deleted!");
  404.     hienthi_lcd(2, 7, "Deleted!");
  405.     delay(1000);
  406.   }
  407.  
  408.   else if (p == FINGERPRINT_PACKETRECIEVEERR){
  409.     Serial.println("Communication error");
  410.     return p;
  411.   }
  412.  
  413.   else if (p == FINGERPRINT_BADLOCATION){
  414.     Serial.println("Could not delete in that location");
  415.     return p;
  416.   }
  417.  
  418.   else if (p == FINGERPRINT_FLASHERR){
  419.     Serial.println("Error writing to flash");
  420.     return p;
  421.   }
  422.  
  423.   else{
  424.     Serial.print("Unknown error: 0x");
  425.     Serial.println(p, HEX);
  426.     return p;
  427.   }
  428. }
  429.  
  430. void setup() {
  431.   //----lcd---------
  432.   lcd.init();
  433.   lcd.backlight();
  434.   lcd.display();
  435.   //----sim800------
  436.   Serial2.begin(115200);
  437.   Serial2.println("AT+CNMI=2,2"); // Nhận tn ngay khi có
  438.   Serial2.println("AT+CMGF=1");   // Chuyển về dạng text mới so sánh chuỗi được
  439.   Serial.println("AT+CMGF=1");
  440.   delay(100);
  441.   //----Ethernet shield---
  442.   /*
  443.  
  444. */
  445.   //---finger------------
  446.   finger.begin(57600); // Khoi tao van tay
  447.   if (finger.verifyPassword()){
  448.     Serial.println("Found fingerprint sensor!");
  449.   }
  450.  
  451.   else{
  452.     Serial.println("Did not find fingerprint sensor :(");
  453.     // while (1);
  454.   }
  455. }
  456.  
  457. //------------CHUONG TRINH CHINH------------------------------
  458. void loop(){
  459.   char key = mykeypad.getKey();
  460.   switch (class_x){
  461.     case '0':{
  462.       Serial.println("1. QUET VAN TAY");
  463.       Serial.println("2. QUAN TRI ADMIN");
  464.       //+++++++++++++
  465.       hienthi_lcd_clear(0, 0, "1.QUET VAN TAY");
  466.       hienthi_lcd(2, 0, "2.QUAN TRI ADMIN");
  467.       delay(500);
  468.       while (class_x == '0'){
  469.         char key = mykeypad.getKey();
  470.         if (key == '1'){
  471.           class_x = '1';
  472.           break;
  473.         }
  474.  
  475.         if (key == '2'){
  476.           class_x = '2';
  477.           class_y = '3';
  478.           hienthi_lcd_clear(0, 0, "Nhap MK Admin:");
  479.           lcd.setCursor(0, 1);
  480.           break;
  481.         }
  482.       }
  483.       break;
  484.     }
  485.  
  486.     case '1':{
  487.       Serial.println("Waiting for valid finger...");
  488.       hienthi_lcd_clear(0, 0, "Waiting finger...");
  489.       while (!out_fingerprint){
  490.         getFingerprintIDez();
  491.         delay(50);
  492.       }
  493.       out_fingerprint = false;
  494.       break;
  495.     }
  496.  
  497.     case '2':{
  498.       switch (class_y){
  499.         case '3':{
  500.           if (key){
  501.             if (key == '#'){
  502.               matkhau[index] = '\0';
  503.               Serial.print("ban vua nhap: ");
  504.               Serial.println(matkhau);
  505.               if (String(matkhau) == password_admin){
  506.                 Serial.println("Xin Chao Admin!");
  507.                 hienthi_lcd_clear(0, 0, "Xin Chao Admin!");
  508.                 // StrClear(matkhau, index); //Xoa chuoi mat khau da luu
  509.                 index = 0;
  510.                 delay(1000);
  511.                 class_y = '0'; // Ve lai menu
  512.               }
  513.  
  514.               else {
  515.                 Serial.println("Nhap lai mat khau!");
  516.                 hienthi_lcd_clear(0, 0, "Nhap lai mat khau:");
  517.                 lcd.setCursor(0, 1);
  518.                 // StrClear(matkhau, index);
  519.                 index = 0;
  520.               }
  521.             }
  522.  
  523.             // Back
  524.             else if (key == 'D'){
  525.               class_x = '0';
  526.               // StrClear(matkhau, index);
  527.               index = 0;
  528.             }
  529.  
  530.             else if (index < 4){
  531.               matkhau[index] = key;
  532.               index++;
  533.               Serial.print(key); // Bo o duoi, để khi ấn back ko bị in ra D
  534.               lcd.print(key);
  535.             }
  536.           }
  537.           break;
  538.         }
  539.  
  540.         case '0':{
  541.           Serial.println("1. THEM VAN TAY");
  542.           Serial.println("2. XOA VAN TAY");
  543.           Serial.println("D. BACK");
  544.           hienthi_lcd_clear(0, 0, "1.THEM VAN TAY");
  545.           hienthi_lcd(1, 0, "2.XOA VAN TAY");
  546.           hienthi_lcd(2, 0, "D.BACK");
  547.           delay(500);
  548.           while (class_y == '0'){
  549.             char key = mykeypad.getKey();
  550.             if (key == '1'){
  551.               class_y = '1';
  552.               hienthi_lcd_clear(0, 0, "Nhap ID Can Them:");
  553.               lcd.setCursor(0, 1);
  554.             }
  555.  
  556.             if (key == '2'){
  557.               class_y = '2';
  558.               hienthi_lcd_clear(0, 0, "Nhap ID Can Xoa:");
  559.               lcd.setCursor(0, 1);
  560.             }
  561.  
  562.             /* if (key == '3')
  563.               {
  564.                 class_y = '3';
  565.                 hienthi_lcd_clear(0, 0, "Nhap Lai MK cu:");
  566.                 lcd.setCursor(0, 1);
  567.               }*/
  568.  
  569.             if (key == 'D'){
  570.               class_y = 'D';
  571.             }
  572.  
  573.             if (key == '5'){
  574.               class_y = '5';
  575.             }
  576.           }
  577.           break;
  578.         }
  579.  
  580.         case '1':{
  581.           Serial.println("Chuong trinh them van tay");
  582.           delay(1000);
  583.           id = 0; // reset id truoc
  584.           // StrClear(id_buff, index_id);
  585.           index_id = 0;
  586.  
  587.           while (!check_enroll){
  588.             char key = mykeypad.getKey();
  589.             if (key){
  590.               if (key == '#'){
  591.                 String str_id = String(id_buff);
  592.                 Serial.println(str_id);
  593.                 id = str_id.toInt();
  594.                 check_enroll = true; // Co thể chạy chương trình enroll
  595.               }
  596.  
  597.               else if (key == 'D'){
  598.                 class_y = '0';
  599.                 check_enroll = true;
  600.                 id = 0; // De khong chay getFingerprintEnroll();
  601.               }
  602.  
  603.               else{
  604.                 id_buff[index_id] = key;
  605.                 index_id++;
  606.                 Serial.print(key);
  607.                 lcd.print(key);
  608.               }
  609.             }
  610.           }
  611.  
  612.           if (id != 0)  getFingerprintEnroll();
  613.           delay(1000);
  614.           // id = 0;
  615.           check_enroll = false;
  616.           class_y = '0';
  617.           class_x = '2';
  618.           break;
  619.         }
  620.  
  621.         case '2':{
  622.           Serial.println("Chuong trinh XOa van tay");
  623.           id = 0; // reset id truoc
  624.           // StrClear(id_buff, index_id);
  625.           index_id = 0;
  626.           while (!check_delete){
  627.             char key = mykeypad.getKey();
  628.             if (key){
  629.               if (key == '#'){
  630.                 String str_id = String(id_buff);
  631.                 id = str_id.toInt();
  632.                 Serial.print("ID XOA: ");
  633.                 Serial.println(id);
  634.                 check_delete = true; // Co thể chạy chương trình delete
  635.               }
  636.  
  637.               else if (key == 'D'){
  638.                 class_y = '0';
  639.                 check_delete = true;
  640.                 id = 0;
  641.               }
  642.  
  643.               else{
  644.                 id_buff[index_id] = key;
  645.                 index_id++;
  646.                 Serial.print(key);
  647.                 lcd.print(key);
  648.               }
  649.             }
  650.           }
  651.  
  652.           if (id != 0) deleteFingerprint(id);
  653.           id = 0;
  654.           check_delete = false;
  655.           class_y = '0';
  656.           break;
  657.         }
  658.  
  659.         case 'D':{
  660.           class_y = '0';
  661.           class_x = '0';
  662.           break;
  663.         }  
  664.       }
  665.       break;
  666.     }
  667.   }
  668. }
  669.