CHƯƠNG 2 : THIẾT KẾ HỆ THỐNG
2.3 Thiết kế chi tiết từng khối
2.3.7 Khối xử lý trung tâm
Sau khi lựa chọn các linh kiện của các khối trên, tính tốn số chân kết nối của tất cả các linh kiện và các chuẩn giao tiếp sử dụng cho nó, nhóm thực hiện đề tài đề xuất sử dụng kit phát triển ESP8266 NodeMCU 1.0 để thực hiện đề tài với các lí do: module được tích hợp sẵn chip ESP8266, xuất sẵn các chân giúp dễ dàng lập trình, dễ dàng kết nối wifi, các module khác nhau và giao tiếp với server mà không cần module rời, có đầy đủ các chuẩn giao tiếp mà đề tài cần sử dụng.
Khối xử lý trung tâm được cấp nguồn 5V để điều khiển các module rời thực hiện các chức năng của hệ thống. Khối này thực hiện việc giao tiếp với module đọc thẻ từ RFID hoặc bàn phím keypad, điều khiển động cơ servo đóng mở cửa, đồng thời thu thập
40 dữ liệu từ các cảm biến chuyển động, cảm biến cháy, thực hiện việc báo động bằng còi buzzer, thực hiện gửi tin nhắn hoặc cuộc gọi khẩn cấp đến người dùng. Các chân của ESP8266 được kết nối giao tiếp với các khối ngoại vi như sau:
Bảng 2.2: Sơ đồ kết nối chân ESP8266 với các linh kiện ngoại vi
ESP8266 Module I2C LCD
D1 SDA D2 SCL Vin VCC GND GND RFID D3 SDA D5 SCK D6 MISO D7 MOSI 3V3 VCC GND GND Keypad 4x4
A0 Chân đọc giá trị analog
Cảm biến PIR D0 SIG 3V3 VCC GND GND Cảm biến lửa D4 D0 3V3 VCC GND GND Servo D8 PWM 3V3 VCC
41 GND GND Sim 800L TX RX RX TX Buzzer SD2 VCC GND GND 2.3.8 Khối nguồn
Để hệ thống hoạt động ổn định liên tục nhóm sử dụng module chuyển nguồn M350 được kích hoạt bởi nguồn 12VDC.
Khối sẽ sử dụng hai nguồn vào đều là 12VDC:
Nguồn 1: điện áp xoay chiều 220V qua Adapter xuống 12VDC 2A nối vào ngõ vào in 1 module chuyển nguồn M350.
Nguồn 2: pin dự phòng 12VDC 2A nối vào ngõ vào in 2 module chuyển nguồn M350.
Vì các linh kiện sử dụng cao nhât mức điện áp là 5VDC nên nguồn ngõ ra của module chuyển nguồn cần gắn vào module hạ áp. Trong để tài cần sử dụng đến hai module hạ áp:
Module hạ áp 1: hạ áp xuống 5V cấp trực tiếp cho ESP8266.
Module hạ áp 2: hạ áp xuống 4.2V cấp trực tiếp cho module Sim800L.
Bảng 2.3: Sơ đồ chân kết nối nguồn
Nguồn ra từ module hạ áp 1 ESP8266
Vout+ Vin
Vout- GND
Nguồn ra từ module hạ áp 2 Sim 800L
Vout+ VCC
42
2.3.9 Sơ đồ mạch nguyên lý
43
2.4 Thiết kế phần mềm
2.4.1 Giải thuật phần mềm cho phần cứng
Khối xử lý trung tâm là nơi xử lý chính của tồn bộ hệ thống, nhóm đã chọn sử dụng module ESP8266 để dễ dàng lập trình và tối ưu nhất có thể. Hình dưới đây là giải thuật cho phần lập trình hệ thống hoạt động đúng yêu cầu đặt ra:
44
45
Hình 2.5: Lưu đồ giải thuật phần mềm (2/2) 2.4.2 Giao diện website và firebase
Sử dụng Realtime Database của Google Firebase để lưu trữ được danh sách thẻ RFID trong trường hợp cần phải thêm, bớt thẻ, lưu trữ các trạng thái cảm biến, buzzer, hoạt động của hệ thống theo thời gian thực để có thể hiển thị lên website và cho phép người dùng giao tiếp với hệ thống.
46
Hình 2.6: Realtime Database của hệ thống trên Google Firebase
Trang web được viết đơn giản theo các ngơn ngữ thuần HTML, CSS, Javascript, có thể kết nối đến google firebase để lấy dữ liệu của hệ thống, qua đó hiển thị những thơng tin cần thiết đến người dùng và cho phép người dùng điều khiển được chức năng của hệ thống.
47
CHƯƠNG 3: KẾT QUẢ NGHIÊN CỨU VÀ ĐÁNH GIÁ 3.1 Kết quả thực hiện 3.1 Kết quả thực hiện
Sau quá trình nghiên cứu và thực hiện mơ hình, nhóm thực hiện đã đưa ra mơ hình hệ thống hồn chỉnh cùng kết quả phần cứng và phần mềm thực hiện được trong đề tài này.
3.1.1 Phần cứng
Hình 3.1: Mơ hình bên ngồi hệ thống
48
3.1.2 Phần mềm
Hình 3.3: Hệ thống thực hiện cuộc gọi khi khẩn cấp
Hình 3.4: Hệ thống thực hiện gửi sms khi khẩn cấp
Người dùng sẽ nhận được các thông báo từ hệ thống qua điện thoại khi có trường hợp khẩn cấp xảy ra.
49
Hình 3.5: Trang web của hệ thống
Tương tự như điện thoại hệ thống cũng đồng thời thông báo qua trang web, trang web giúp hỗ trợ người dùng điều khiển được loa báo động, tắt mở chế độ báo trộm và có thể thay đổi mật khẩu cửa nhà.
3.2 Đánh giá hệ thống 3.2.1 Nhận xét
Đánh giá
Hệ thống cơ bản đạt được các chức năng, đặc tính đã đề ra.
Đã tiến hành thử nghiệm hệ thống khi hoạt động liên tục trong khoảng 6 giờ và hệ thống vẫn có thể hoạt động bình thường.
Đã tiến hành thử nghiệm ngắt nguồn điện chính, hệ thống vẫn có thể hoạt động với nguồn dự phòng.
Các cảm biến chuyển động, cảm biến lửa thu thập được dữ liệu và trả về giá trị chính xác.
Việc đóng/mở cửa khá an tồn nhờ hệ thống bảo mật bằng mật khẩu và thẻ từ RFID.
Firebase lưu trữ được trạng thái hoạt động của các thiết bị và được cập nhật thường xuyên.
50
Website điều khiển được hệ thống, hiển thị thông tin nhanh, rõ ràng. Ưu điểm
Hệ thống dễ dàng sử dụng, thao tác và sữa chữa.
Giá thành rẻ.
Có thể dễ dàng cải tiến thêm chức năng trong tương lai.
Hệ thống có thể hoạt động khi bị mất nguồn điện chính.
Cơ chế cấp báo khi có trường hợp cháy nổ, đột nhập trái phép tương đối tốt. Nhược điểm
Module sim có thể xảy ra tình trạng mất sóng nếu đặt hệ thống ở những nơi khuất, kín.
Hệ thống vẫn cần sự can thiệp của con người để bật tắt chế độ báo chống trộm mà chưa thể tự động bật chế độ này lên sau một khoảng thời gian không phát hiện người.
Cơ chế servo để đóng mở cửa chỉ phù hợp với mơ hình demo.
3.2.2 Hướng phát triển
Để hệ thống được hồn thiện tốt hơn, nhóm đưa ra những dự định có thể phát triển thêm trong tương lai:
Phát triển hệ thống để có thể hoạt động tự động với ít sự can thiệp của con người nhất.
Thiết kế lại khối module sim để có thể hoạt động ở những vùng khuất sóng.
51
PHẦN KẾT LUẬN 1. Kết luận
Nhận thấy một vấn nạn về an ninh nhà ở hiện nay đang ngày càng rơi vào tình trạng đáng báo động, nhóm đã chọn đề tài "Thiết kế hệ thống an ninh nhà ở" thực hiện nghiên cứu khoa học lần này để đưa ra hướng giải quyết các vấn đề đó. Thơng qua khảo sát các đề tài nghiên cứu có liên quan trước đây và tình hình thực tế, nhóm đưa ra được các vấn đề có thể xảy ra trong ngơi nhà đối với người chủ, từ đó chuyển các vấn đề đó thành những yêu cầu kỹ thuật cho hệ thống. Qua đó nhóm thực hiện đưa ra thiết kế đầy đủ các chức năng hệ thống cho những yêu cầu đó và lựa chọn các thiết bị phù hợp nhất cho hệ thống mang lại hiệu suất cao ổn định, tối ưu và chi phí thấp nhất. Nhóm đã thực hiện mơ hình cho thấy hệ thống hoạt động được các mục tiêu đề tài đặt ra. Vì nhận định khảo sát ban đầu cịn hạn chế và việc thử nghiệm mơ hình hệ thống nên khơng tránh khỏi những thiếu sót trong đề tài, nhóm đã đưa ra các hướng phát triển và có thể thực hiện trong tương lai giúp hệ thống ngày càng hoàn thiện hơn.
2. Kiến nghị
Với các lý do và mục tiêu của đề tài đã đặt ra, hệ thống mà nhóm thực hiện đưa ra trong nghiên cứu có thể sử dụng trong một số nơi phù hợp với hộ gia đình như nhà ở, các khu phịng trọ hoặc có thể lớn hơn trong một số văn phịng, nhà kho trong cơng ty.
TÀI LIỆU THAM KHẢO
[1] "Internet of things là gì," [Online]. Available: https://iot.dtt.vn/InternetofThings.html.
[2] Hải Đăng PPK, "Aruino và giao tiếp SPI," 1 8 2016. [Online]. Available: http://arduino.vn/bai-viet/1081-arduino-va-giao-tiep-spi.
[3] Hàn Mạc Tử, "Kiến thức cơ bản về giao tiếp UART trong Arduino," 14 5 2020. [Online]. Available: https://espace.edu.vn/tu-hoc-arduino/kien-thuc- co-ban-ve-giao-tiep-uart-serial-trong-arduino/.
[4] Hải Đăng PPK, "Giao tiếp I2C với nhiều module," 27 7 2016. [Online]. Available: http://arduino.vn/bai-viet/1053-giao-tiep-i2c-voi-nhieu-module. [5] "Tìm hiểu thơng số kĩ thuật của LCD," 11 1 2018. [Online]. Available:
https://suachualaptop24h.com/linh-kien-laptop/tim-hieu-thong-so-ki-thuat- cua-lcd-1602-n5212.html.
[6] 11 7 2018. [Online]. Available: https://laptrinhdieukhien.com/ta%CC%A3p- le%CC%A3nh-at-danh-cho-module-sim-900a-800a-800l-va-cac-module- sim-khac/.
[7] Bá Điền, "Tổng hợp các lệnh Arduino IDE," 15 7 2019. [Online]. Available: https://quantrimang.com/tong-hop-cac-lenh-arduino-ide-165078.
[8] N.X.P, "Giới thiệu Firebase," 30 6 2017. [Online]. Available:
PHỤ LỤC Chương trình lập trình hệ thống trên esp8266.
#include <Arduino.h> #include <SPI.h> #include <MFRC522.h> #include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #include <FirebaseArduino.h> #include <Servo.h> #include <pins_arduino.h> #include <LiquidCrystal_I2C.h> #include <ESP8266WiFiMulti.h> #define SS_PIN D3 #define RST_PIN 10
#define FIREBASE_HOST "testmyled-aa8f7.firebaseio.com"
#define FIREBASE_AUTH "gn0qcrclXBS7gVjNSNpOaULUn17H4cssN2kRxhie" #define buzzer 9
#define PIR D0 #define FIRE D4 String pass = "1401";
const String ID_default = "4b91a90d"; LiquidCrystal_I2C lcd(0x27, 20, 4);
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance. Servo sg90;
int statuss = 0; int out = 0;
bool the = false, chuyenDong = false, coChay = false; int modeBaoTrom = 1;
String CardIDs[10]; char *inpt_pass; char *inpt_display;
unsigned int soLuongThe; int8_t j = 0;
char key[]={'1','2','3','A','4','5','6','B','7','8','9','C','*','0','#','D'};
int adc_value = 0, i=0, threshold = 3, outputValue = 0; // value read from the pot int val_key_adc[] = {990, 900, 830, 773, 935, 860, 799, 749, 910, 840, 783, 730, 875, 812, 762, 713 };
char k ='n'; int baoChay; int baoTrom;
// ngat phat hien chay
ICACHE_RAM_ATTR void ngatBaoChay() { coChay = true;
// kiem tra the vua quet co trong danh sach id hay ko bool soSanhThe(String id, String* ArrayID);
// kiem tra danh sach id va cap nhat void capNhatThe();
void call();
void send_sms(char *text); void capNhatPass();
void setup() {
Serial.begin(9600);
pinMode(buzzer, OUTPUT);
// cau hinh chan ngat phat hien chay pinMode(FIRE, INPUT);
attachInterrupt(digitalPinToInterrupt(FIRE), ngatBaoChay, FALLING); // cau hinh chan ngat phat hien chuyen dong
pinMode(PIR, INPUT); sg90.attach(D8); sg90.write(0); SPI.begin(); mfrc522.PCD_Init(); inpt_pass = (char*)malloc(5); inpt_pass = "____"; inpt_display = (char*)malloc(5); inpt_display = "____";
// dat bien thoi gian de ngung cho ket noi wifi khi qua lau unsigned long past = millis();
// ket noi voi mang wifi thu 2
if (WiFi.status() != WL_CONNECTED) { past = millis();
WiFi.begin("Ngoc Giang", "14091998"); while (WiFi.status() != WL_CONNECTED) { // cho 30s de ket noi neu khong thi bo qua if (millis() - past > 30000) break; delay(500); } } Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH); delay(300);
// kiem tra va lay toan bo id tren firebase vao the
soLuongThe = Firebase.getString("tkHTN/soLuong").toInt(); delay(100);
for (int i = 0; i < soLuongThe; i++) { String url = "tkHTN/the" + String(i + 1);
CardIDs[i] = Firebase.getString(url); delay(100); } // handshake Serial.println("AT"); delay(500);
// cau hinh text mode sim
Serial.println("AT+CMGF=1"); delay(500); call(); lcd.begin(); lcd.begin(); lcd.backlight();
lcd.print(" Nhap ma de mo cua"); lcd.setCursor(1,1); lcd.print(inpt_pass); } void loop() { capNhatPass();
// thay doi mode bao dong
modeBaoTrom = Firebase.getString("tkHTN_baoDong/modeBaoTrom").toInt(); // cap nhat trang thai da bao dong hay chua
baoChay = Firebase.getString("tkHTN_baoDong/chay").toInt();
baoTrom = Firebase.getString("tkHTN_baoDong/chuyenDong").toInt(); adc_value = analogRead(A0);
if(adc_value > 600){ for (i = 0; i < 16; i++){
if ((adc_value < (val_key_adc[i]+ threshold)) && (adc_value >(val_key_adc[i]- th reshold))){ k = key[i]; inpt_pass[j] = k; j++; lcd.setCursor(1,1); lcd.print(inpt_pass); if (j == 4) { j = 0; if (strcmp(inpt_pass, pass.c_str()) == 0) { Firebase.setString("tkHTN_baoDong/buzzer", "0"); digitalWrite(buzzer, 0); baoChay = 0; baoTrom = 0; coChay = false; chuyenDong = false;
sg90.write(90); delay(3000); sg90.write(0); delay(300); } else if (strcmp(inpt_pass, "####") == 0) { Firebase.setString("tkHTN_baoDong/modeBaoTrom", "1"); modeBaoTrom = 1; } lcd.setCursor(1,1);
//reset inpt_pass va inpt_display for (int i = 0; i < 4; i++) { inpt_pass[i] = '_'; inpt_display[i] = '_'; } lcd.print(inpt_pass); } } } delay(100); k = 'z'; }
// neu co chay va chua bao dong if (coChay && baoChay == 0) {
Firebase.setString("tkHTN_baoDong/chay", "1"); Firebase.setString("tkHTN_baoDong/buzzer", "1"); baoChay = 1;
digitalWrite(buzzer, 1); call();
send_sms("phat hien chay"); }
// neu co chuyen dong va chua bao dong if (modeBaoTrom && digitalRead(PIR)) chuyenDong = true;
if (chuyenDong && baoTrom == 0) {
Firebase.setString("tkHTN_baoDong/chuyenDong", "1"); Firebase.setString("tkHTN_baoDong/buzzer", "1"); baoTrom = 1;
digitalWrite(buzzer, 1); call();
send_sms("phat hien chuyen dong"); }
// dieu kien de tat buzzer
digitalWrite(buzzer, 0); Firebase.setString("tkHTN_baoDong/chay", "0"); Firebase.setString("tkHTN_baoDong/chuyenDong", "0"); baoChay = 0; baoTrom = 0; coChay = false; chuyenDong = false; }
// kiem tra co the quet qua
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return; }
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial()) {
return; }
//neu co the quet qua chay lay id va kiem tra id String content= "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? "0" : "")); content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
capNhatThe();
bool a = soSanhThe(content, CardIDs); }
bool soSanhThe(String id, String *ArrayID) { // so sanh vs id mac dinh
if (ID_default.compareTo(id) == 0) { Firebase.setString("tkHTN_baoDong/buzzer", "0"); digitalWrite(buzzer, 0); baoChay = 0; baoTrom = 0; coChay = false; chuyenDong = false; sg90.write(90); delay(3000); sg90.write(0); delay(300); return true; }
if (ArrayID[i].compareTo(id) == 0) { // neu dung thi mo cua va tat bao dong
Firebase.setString("tkHTN_baoDong/buzzer", "0"); digitalWrite(buzzer, 0); baoChay = 0; baoTrom = 0; coChay = false; chuyenDong = false; sg90.write(90); delay(3000); sg90.write(0); delay(300); return true; } } return false; } void capNhatThe() {
unsigned int soLuongThe = Firebase.getString("tkHTN/soLuong").toInt(); delay(100);
for (int i = 0; i < soLuongThe; i++) { String url = "tkHTN/the" + String(i + 1); CardIDs[i] = Firebase.getString(url); delay(10); } } void call() { Serial.println("ATD+ +84346126117;"); delay(500); }
void send_sms(char *text) {
Serial.println("AT+CMGS=\"+84346126117\"");//change ZZ with country code and xxxxxxxxxxx with phone number to sms
delay(200);
Serial.println(text); //text content delay(200); Serial.write(26); delay(100); } void capNhatPass() { pass = Firebase.getString("tkHTN_baoDong/pass"); }
File index.html
<!DOCTYPE html> <html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>NCKH</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/css/b ootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></scri pt> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min .js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"> </script> <script src="https://www.gstatic.com/firebasejs/7.2.1/firebase-app.js"></script> <script src="https://www.gstatic.com/firebasejs/7.2.1/firebase- database.js"></script> <script src="https://www.gstatic.com/firebasejs/7.2.1/firebase- firestore.js"></script>
<link rel="stylesheet" href="style.css"> </head> <body> <div id="bg"> <div class="container"> <div class="row"> <div class="col-2">
<img src="./image/school.png" style="height: 200px; width: 150px;"> </div>
<div class="col-7">
<h1 style="padding-top: 50px; text-align:center;">HỆ THỐNG AN NINH NHÀ Ở</h1>
</div>
<div class="col-3">
<img src="./image/slams.png" style="height: 200px; width: 200px;"> </div> </div> <hr> <div class="row"> <div class="col-xl-3"> <h3>Buzzer Báo Động</h3> </div> <div class="col-xl-9"> <label class="switch">
<input type="checkbox" id="buzzer"> <span class="slider round"></span> </label> </div> </div> <br> <div class="row"> <div class="col-xl-3"> <h3>Mode Báo Trộm</h3> </div> <div class="col-xl-9"> <label class="switch">
<input type="checkbox" id="modeBaoTrom"> <span class="slider round"></span>
</label> </div> </div> <br> <div class="row"> <div class="col-xl-3"> <h3>Phát hiện người lạ</h3> </div>
<div class="col-xl-9" id="chuyenDong"
style="color: red; width: 100%; height: 40px; font-size: 25px; border: 2px solid black; border-radius: 20px;">
</div> </div> <br> <div class="row"> <div class="col-xl-3"> <h3>Phát hiện cháy</h3> </div>
<div class="col-xl-9" id="chay"
style="color: red; width: 100%; height: 40px; font-size: 25px; border: 2px solid black; border-radius: 20px;">
</div> </div> <br> <div class="row"> <div class="col-xl-3"> <h3>Mật khẩu</h3> </div>
<div class="col-xl-9" id="pass" style="color: red; width:100%; height: 40px; font-size: 25px; border: 2px solid black; border-radius: 20px;">
</div> </div> <br>
<div class="row">
<div class="col-xl-3">
<button class="btn btn-primary" data-toggle="modal" data-target= "#myModal">Thay đổi mật khẩu</button>
<div class="modal fade" id="myModal" role="dialog"> <div class="modal-dialog">
<div class="modal-content"> <div class="modal-header">
<h4 class="modal-title">Thay đổi mật khẩu</h4>
<button type="button" class="close" data-dismiss="modal"> ×</button>
</div>
<div class="modal-body"> <form>
<div class="form-group row"> <div class="col-4">
<label for="text" class="col-form-label">Mật khẩu cũ </label>
</div>
<div class="col-8">
<input type="text" class="form-control" id="oldpassword"/>
</div> </div>
<div class="form-group row"> <div class="col-4">
<label for="text" class="col-form-label">Mật khẩu mới </label>
</div>
<div class="col-8">
<input type="text" class="form-control" id="newpassword"/> </div> </div> </form> </div> <div class="modal-footer">
<button class="btn btn-primary" onclick="changePassWord()" data-dismiss="modal">Thay đổi</button>
<button class="btn btn-link" data-dismiss="modal">Thoát </button>
</div> </div> </div> </div> </div> </div> </div> </div> <script src="./style.js"></script> </body> </html> File style.css