Khởi động vi xử lý trung tâm, module sim 800l, cảm biến vân tay,màn hình LCD,
Module RFUD,tốc độ truyền thơng. Tốc độ tru KHĨA CỬA MỞ TRONG 10S VÀ ĐÓNG LẠI Đúng UID QUÉT VÂN TAY TỪ AS608 NHẬP MẬT KHẨU TỪ BÀN PHÍM NHẬN CUỘC GỌI TỪ SỐ ĐIỆ NHẬP MẬT QUÉT THẺ QUA MODULE RFID Đúng số chủ nhà khơng CHỦ NHÀ KHƠNG Mật khẩu đúng Nhập vân tay đúng BẮT ĐẦU
4.2 Giới thiệu phần mềm lập trình ARDUINO IDE
Arduino IDE là phần mềm giúp ta lập trình cho các dịng sản phẩm của Arduino như Arduino Uno, Arduino Mega, nano,.. Lập trình trên Arduino IDE là cách tiếp cận đơn giản cho những người đam mê điện tử và muốn tạo ra những sản phẩm nhúng ấn tượng mà không cần quá nhiều kiến thức chuyên sâu về điện tử. Môi trường phát triển tích hợp Arduino IDE là một ứng dụng đa nền tảng được viết bằng Java.
Hình 4.1 Giao diện phần mềm lập Arduino IDE
Giao diện của phần mềm Arduino IDE (như hình 4.2) có nhiều phần, tuy nhiên chúng ta chú ý đến những phần quan trọng như được nêu ra trong hình trên. Chức năng của từng phần như sau:
+ Nút kiểm tra chương trình
Dùng để kiểm tra xem chương trình được viết có lỗi khơng. Nếu chương trình bị lỗi thì phần mềm Arduino IDE sẽ hiển thị thông tin lỗi ở vùng thông báo thông tin.
+ Nút nạp chương trình xuống bo Arduino
Dùng để nạp chương trình được viết xuống mạch Arduino. Trong quá trình nạp, chương trình sẽ được kiểm tra lỗi trước sau đó mới thực hiện nạp xuống mạch Arduino.
+ Hiển thị màn hình giao tiếp với máy tính
Khi nhấp vào biểu tượng cái kính lúp thì phần giao tiếp với máy tính sẽ được mở ra. Phần này sẽ hiển thị các thông số mà người dùng muốn đưa lên màn hình. Muốn đưa
lên màn hình phải có lệnh Serial.print() mới có thể đưa thơng số cần hiển thị lên màn hình
+ Vùng lập trình
Vùng này để người lập trình thực hiện việc lập trình cho chương trình của mình. + Vùng thơng báo thơng tin:
Có chức năng thơng báo các thơng tin lỗi của chương trình hoặc các vấn đề liên quan đến chương trình được lập.
+ Sử dụng một số menu thông dụng trên phần mềm Arduino IDE
Có vài menu trong phần mềm IDE, tuy nhiên thông dụng nhất vẫn là menu File, ngồi những tính năng như mở một file mới hay lưu một file, phần menu này có một mục đáng chú ý là Example. Phần Example (ví dụ) đưa ra các ví dụ sẵn để người lập trình có thể tham khảo, giảm bớt thời gian lập trình.
4.3 Lập trình code và nạp cho vi điều khiển 4.3.1 Đăng ký dấu vân tay cho cảm biến AS608 4.3.1 Đăng ký dấu vân tay cho cảm biến AS608
Để đăng ký dấu vân tay và lưu vào bộ nhớ của cảm biến vân tay ta cần tài thư viện #include <Adafruit_Fingerprint.h> về để lập trình.
Kết nối cảm biến với vi xử lý và bật màn hình giao tiếp Serial để biết thông tin. Tiến hành nạp code. (Nội dung code và chú thích em có đính kèm ở phần phụ lục cuối cùng của đồ án)
4.3.2 Xóa dấu vân tay trong bộ nhớ của AS608
Code:
#include <Adafruit_Fingerprint.h>
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial2);
void setup() {
Serial.begin(57600);
while (!Serial); // For Yun/Leo/Micro/Zero/... delay(100);
Serial.println("\n\nDelete Finger");
// set the data rate for the sensor serial port finger.begin(57600);
if (finger.verifyPassword()) {
Serial.println("Found fingerprint sensor!"); } else {
Serial.println("Did not find fingerprint sensor :("); while (1); } } uint8_t readnumber(void) { uint8_t num = 0; while (num == 0) { while (! Serial.available()); num = Serial.parseInt(); }
}
void loop() // run over and over again {
Serial.println("Please type in the ID # (from 1 to 127) you want to delete..."); uint8_t id = readnumber();
if (id == 0) {// ID #0 not allowed, try again! return; } Serial.print("Deleting ID #"); Serial.println(id); deleteFingerprint(id); }
uint8_t deleteFingerprint(uint8_t id) { uint8_t p = -1; p = finger.deleteModel(id); if (p == FINGERPRINT_OK) { Serial.println("Deleted!"); } 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;
} }
4.3.3 Nạp code cho Ardiuno Mega 2560
Tiến hành kết nối:cảm biến vân tay, module RFID, ma trận phím , relay với ardiuno mega 2560.
(Phần code là chú thích em có đính kèm ở dưới)
Sau khi nạp code ta tiến hành nhập mật khẩu từ 1>8, ấn vân tay và quẹt thẻ RFID. Bật màn hình Serial lên và xem kết quả.
Hình 4.4 Chạy thử 3 chức năng mở cửa
Màn hình đọc được mật khẩu là: 12345678 UID của thẻ là : 61 FE B4 63
4.4 Mô hình sau khi đã hồn thành
Sau khi tiến hành thiết kế và lắp đặt em đã hồn thành sản phẩm như trong Hình 4.5 dưới đây.
KẾT LUẬN
Trên đây là báo cáo đồ án tốt nghiệp của em về đề tài “Thiết kế khóa cửa thơng
minh đa năng dựa trên Arduino”. Với đồ án này em đã nghiên cứu và thiết kế ra được
một loại khóa tích hợp nhiều chức năng khóa và mở khóa áp dụng các cơng nghệ phù hợp với thời đại cơng nghệ hiện nay như mở khóa bằng vân tay qua, mở khóa qua mật khẩu nhập từ bàn phím, mở khóa bằng thẻ từ, mở khóa qua tin nhắn, mở bằng khóa cơ truyền thống. Tất cả được tích hợp trên board mạch vi xử lý Arduino MEGA 2560.
Cửa thơng minh đa năng này có nhiều ưu điểm so với các thiết kế khác cùng loại. đầu tiên phải kể đến nó mang nhiều ưu điểm tương tự như các loại của thơng minh như: tính an tồn cao, tiện lợi, có khả năng điều khiển từ xa, tiết kiệm thời gian... Hơn nữa so với các thiết kế khác trước đó thì nó có khá nhiều tính năng, có thế có nhiều cách để mở khóa nếu có 1 vài tính năng gặp trục trặc. Tiếp theo, ưu điểm mà em có thể kể đến đó là chi phí của sản phẩm thì khá thấp. Có khả năng cạnh tranh nếu thực sự được đưa ra thị trường.
Với xu thế ngày càng nhiều người dùng sử dụng các loại cửa thông minh để đáp ứng nhu cầu bảo mật và bảo vệ tài sản riêng của họ trong thời đại hiện nay, em tin rằng thiết kế cửa thơng minh của mình của mình của thế đáp ứng được nhu cầu đó.
TÀI LIỆU THAM KHẢO Các trang web: 1. https://www.arduino.cc/ 2. https://arduinokit.vn/ 3. https://nshopvn.com/product/cam-bien-nhan-dang-van-tay/ 4. https://hshop.vn/products/module-sim800l 5. https://lionlock.vn/danh-muc/khoa-cua-thong-minh/ 6. https://mlab.vn/index.php?_route_=10609-hoc-arduino-bai-2-nhung- dieu-co-ban-ve- arduino.html&fbclid=IwAR2T6AEaY7TWGOKhRoUlQXaYGoVCqAl 6ni2TsWZfaCuHH1VGS0bp8Qn3YmI 7. https://www.elprocus.com/fingerprint-sensor-working-and-applications/
CODE NẠP VÀ CHÚ THÍCH ĐÍNH KÈM 1. Code đăng ký dấu vân tay cho cảm biến AS608
#include <Adafruit_Fingerprint.h>
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial2); // hiện thông tin lên cổng truyền thông
uint8_t id; // độ dài id void setup() // khởi tạo {
Serial.begin(57600); // khởi tạo màn hình với tốc độ truyền thơng là 57600 while (!Serial); // For Yun/Leo/Micro/Zero/...
delay(100);
Serial.println("\n\nAdafruit Fingerprint sensor enrollment"); // đăng ký cảm biến vân tay
finger.begin(57600);
if (finger.verifyPassword()) {
Serial.println("Found fingerprint sensor!"); // đã tìm thấy cảm biến } else {
Serial.println("Did not find fingerprint sensor :("); // khơng tìm thấy cảm biến while (1) { delay(1); }
} }
uint8_t readnumber(void) // đọc id vân tay { uint8_t num = 0; while (num == 0) { while (! Serial.available()); num = Serial.parseInt(); } return num; } void loop() // vòng lặp
{
Serial.println("Ready to enroll a fingerprint!"); // vui lòng đặt vân tay vào cảm biến
Serial.println("Please type in the ID # (from 1 to 127) you want to save this finger as...");// ấn ID từ 1 đến 127
id = readnumber();
if (id == 0) {// ID #0 not allowed, try again! // nếu ID=0, hãy ấn lại số khác 0 return; } Serial.print("Enrolling ID #"); // đăng ký ID số Serial.println(id); while (! getFingerprintEnroll() ); } uint8_t getFingerprintEnroll() { int p = -1;
Serial.print("Waiting for valid finger to enroll as #"); Serial.println(id); // đang đợi ngón tay hợp lệ
while (p != FINGERPRINT_OK) { p = finger.getImage();
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image taken"); // hình ảnh đã được chụp break;
case FINGERPRINT_NOFINGER: Serial.println(".");
break;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");// giao tiếp lỗi break;
Serial.println("Imaging error"); // hình ảnh lỗi break;
default:
Serial.println("Unknown error"); // không hợp lệ break; } } // OK success! p = finger.image2Tz(1); switch (p) { case FINGERPRINT_OK:
Serial.println("Image converted"); // hình ảnh được chuyển đổi break;
case FINGERPRINT_IMAGEMESS:
Serial.println("Image too messy");// hình ảnh quá lộn xộn return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");// lỗi giao tiếp return p;
case FINGERPRINT_FEATUREFAIL:
Serial.println("Could not find fingerprint features");// khơng tìm thấy cảm biến
return p;
case FINGERPRINT_INVALIDIMAGE:
Serial.println("Could not find fingerprint features");// khơng tìm thấy cảm biến
return p; default:
Serial.println("Unknown error"); //lỗi không rõ return p;
}
Serial.println("Remove finger");//loại bỏ ngón tay 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");// đặt lại ngón tay while (p != FINGERPRINT_OK) {
p = finger.getImage(); switch (p) {
case FINGERPRINT_OK:
Serial.println("Image taken");// ảnh đã được chụp break;
case FINGERPRINT_NOFINGER: Serial.print(".");
break;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");// lỗi giao tiếp 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(" THÀNH CÔNG ");// đã lưu trữ
} 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; } }
2. Code xóa dấu vân tay trong bộ nhớ của AS608
#include <Adafruit_Fingerprint.h>
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial2);
void setup() {
while (!Serial); // For Yun/Leo/Micro/Zero/... delay(100);
Serial.println("\n\nDelete Finger");
// set the data rate for the sensor serial port finger.begin(57600);
if (finger.verifyPassword()) {
Serial.println("Found fingerprint sensor!"); } else {
Serial.println("Did not find fingerprint sensor :("); while (1); } } uint8_t readnumber(void) { uint8_t num = 0; while (num == 0) { while (! Serial.available()); num = Serial.parseInt(); } return num; }
void loop() // run over and over again {
Serial.println("Please type in the ID # (from 1 to 127) you want to delete..."); uint8_t id = readnumber();
if (id == 0) {// ID #0 not allowed, try again! return; } Serial.print("Deleting ID #"); Serial.println(id); deleteFingerprint(id); }
uint8_t deleteFingerprint(uint8_t id) { uint8_t p = -1; p = finger.deleteModel(id); if (p == FINGERPRINT_OK) { Serial.println("Deleted!"); } 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;
} }
3. Code nạp cho ARDIUNO MEGA 2560
#include <Wire.h> // giao tiếp với hình LCD
#include <LiquidCrystal_I2C.h> // thư viện I2C LCD #include <Keypad.h> // thư viện bàn phím
#include <SPI.h> // thư viện giao tiếp SPI
#include <MFRC522.h> // thư viện module RFID
#include <Adafruit_Fingerprint.h> // thư viện cảm biến vân tay int relay=6; // khóa cửa
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial2); // nhận tín hiệu từ cảm biến vân tay đến màn hình Serial
#define SS_PIN 53 // khai báo chân SS của RFID #define RST_PIN 49 // khai báo chân Reset của RFID
MFRC522 mfrc522(SS_PIN, RST_PIN); // khai báo tên module RFID // bàn phím // độ dài mật khẩu #define Password_Length 9 // mảng lưu mật khẩu char Data[Password_Length]; // mật khẩu char Master[Password_Length] = "12345678"; // đếm ký tự byte data_count = 0; // ký tự nhập từ bàn phím char customKey; // số lượng dòng và cột const byte ROWS = 4; const byte COLS = 4;
// mảng đại diện cho bàn phím char hexaKeys[ROWS][COLS] = { {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'} };
// kết nối bàn phím với ardiuno
byte rowPins[ROWS] = {29, 27, 28, 26}; byte colPins[COLS] = {25, 24, 23, 22}; //tạo đối tượng bàn phím
Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); // khởi tạo màn lCD LiquidCrystal_I2C lcd(0x27, 16, 2); // sim 800l
char inchar; // chữ số trong số điện thoại gọi đến int onoff=0; // trạng thái cuộc gọi, on=1, off=0 void setup() // hàm khởi tạo chương trình {
lcd.backlight(); // bật đèn nền LCD lcd.init();
Serial.begin(9600); // bật màn hình Serial trên máy tính
Serial2.begin(9600); //khởi tạo tốc độ giao tiếp Mega với cảm biến vân tay Serial3.begin(9600); //khởi tạo tốc độ giao tiếp Mega với sim 800l
pinMode(6, OUTPUT); // khai báo khóa cửa điện là đầu ra
// tiến hành cho phép module sim nhận cuộc gọi delay(200); // thời gian nhận cuộc gọi
Serial3.print("AT+CLIP=1\r"); // lệnh nhận cuộc gọi delay(100);
//RFID
SPI.begin(); // bắt đầu giao tiếp SPI
mfrc522.PCD_Init(); // xóa dữ liệu MFRC522
Serial.println(" ĐỒ ÁN TỐT NGHIỆP - CỬA THÔNG MINH "); // đnag đợi thẻ Serial.println(" đang tiến hành đợi thẻ RFID "); // đnag đợi thẻ
Serial.println(); // VAN TAY while (!Serial); delay(100);
// cài đặt tốc độ nhận diện vân tay finger.begin(57600);
if (finger.verifyPassword())// nếu có dấu vân tay {
Serial.println("Found fingerprint sensor"); // đang tìm kiếm cảm biến } else
{
Serial.println("Did not find fingerprint sensor"); // khơng tìm thấy cảm biến while (1) { delay(1); }
}
finger.getTemplateCount();
Serial.print("Sensor contains "); // cảm biến đang nhận diện Serial.print(finger.templateCount);
Serial.println(" template(s)"); // vân tay số s
Serial.println("Waiting for valid finger...");// đợi vân tay }
void loop() //vịng lặp chương trình chính { banphim(); cuocgoi(); rfid(); vantay(); }
void clearData() // xóa dữ liệu trên bàn phím {
// đi qua mảng và xóa dữ liệu while (data_count != 0) { Data[data_count--] = 0; } return; }
{ lcd.setCursor(0, 0); // dòng 1 lcd.print("Enter Password:"); // in ra dòng 1 LCD customKey = customKeypad.getKey(); // nhấn nút if (customKey) { // nhập phím đếm vào mảng và đếm tăng dần Data[data_count] = customKey; lcd.setCursor(data_count, 1); lcd.print(Data[data_count]); Serial.println(Data[data_count]);
data_count++; // độ dài tăng lên 1 sau mỗi lần nhấn số }
//kiểm tra đã đạt độ dài mật khẩu chưa if (data_count == Password_Length - 1) {
lcd.clear(); //xóa dữ liệu LCD if (!strcmp(Data, Master)) {
// mật khẩu đúng
lcd.print(" MAT KHAU DUNG "); Serial.println("mật khẩu đúng"); lcd.setCursor(0, 1);
lcd.print(" CUA DANG MO "); // bật relay 5s
digitalWrite(relay, HIGH); // mở cửa delay(5000);
digitalWrite(relay,LOW); // khóa cửa }
else {
// mật khẩu sai
lcd.print(" MAT KHAU SAI "); Serial.println("mật khẩu sai");
delay(1000); } // xóa dữ liệu LCD lcd.clear(); clearData(); }}
void rfid() // chương trình đọc UID thẻ RFID {
if ( ! mfrc522.PICC_IsNewCardPresent()) // nếu có thẻ mới {
return; // quay lại }
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial()) // nếu đọc được UID của thẻ {
return; }
//Show UID on serial monitor Serial.print("UID tag :"); String content= "";
byte letter;
for (byte i = 0; i < mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(mfrc522.uid.uidByte[i], HEX); content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ")); content.concat(String(mfrc522.uid.uidByte[i], HEX)); } Serial.println(); Serial.print("Message : "); content.toUpperCase();
if (content.substring(1) == "61 FE B4 63" ) //mã UID của thẻ đúng { lcd.setCursor(0, 0);
lcd.print(" RFID - MO CUA "); Serial.println("Authorized access"); Serial.println(); digitalWrite(relay,HIGH); delay(5000); digitalWrite(relay,LOW); }
else // nếu không đúng thẻ {
lcd.setCursor(0, 0);
lcd.print(" THE RFID - SAI "); Serial.println(" Access denied"); delay(1000);
}}
void vantay() // chương trình đọc dấu vân tay {
getFingerprintIDez();
delay(5); // không cần đọc vân tay ở tốc độ tối đa } 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 #"); // hiển thị ID số đã được lưu trong cảm biến vân tay Serial.print(finger.fingerID);
Serial.print(" with confidence of "); Serial.println(finger.confidence); lcd.setCursor(0, 0);
lcd.print(" VAN TAY-MO CUA"); digitalWrite(relay, HIGH); // mở cửa delay(5000);
digitalWrite(relay, LOW); // đóng cửa Serial.println("Unlocked");
return finger.fingerID; }
void doSomething() // hàm nhận cuộc gọi {
if (onoff==0)// nếu có cuộc gọi đến từ số chủ nhà