//----------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;
}
}
}