Bạn gái bạn thường xuyên mất chìa khóa nhà? Thiết bị mở khóa cửa theo thần chú sẽ là món quà Valentine ý nghĩa không thể chê vào đâu cho những người trí nhớ không ổn định.
Bạn đã từng bước ra khỏi nhà và quên chìa khóa chưa? Nếu có, đừng bỏ qua hướng dẫn này. Trong bài viết hôm nay, chúng tôi sẽ chỉ bạn cách làm một thiết bị khóa cửa thông minh mở bằng Knock code với chi phí cực kỳ tiết kiệm.
Danh sách cần chuẩn bị:
Một Broad Arduino Pro mini (Giá khoảng 60.000 đồng)
Một mô tơ giảm tốc (Giá khoảng 50.000 đồng)
Một tấm PCB kích thước 5x7 cm (Giá khoảng 5.000 đồng)
Loa gốm (Giá chỉ 2.000 đồng)
Điện trở 1/4w 1 triệu ohm (Giá 4.000 đồng/100 chiếc)
Điện trở 1/4w 560 ohm (Giá 4.000 đồng/100 chiếc)
Điện trở 1/4w 10 nghìn ohm (Giá 4.000 đồng/100 chiếc)
Một transistor 2N2222A (Giá chỉ 1.000 đồng)
Hai đèn LED màu xanh và đỏ 5mm (Giá chỉ 700 đồng)
Một nút nhấn hai chân (Giá chỉ 500 đồng)
Một Jump cái (Giá chỉ 3.000 đồng)
Một hộp nhựa (Giá 10.000 đồng)
Đế pin 9V có dây (Giá chỉ 3.000 đồng)
Dây điện đơn lõi (Giá 300 đồng/mét)
Bước 1:
Bạn hãy cắt 2 thanh (Jump cái) với mỗi thanh có 12 lỗ để lắp broad Arduino Pro Mini lên PCB.
Tiếp theo, gắn Jump vào PCB như hướng dẫn.
Bước 2:
Hàn jack nguồn 9V vào hai chân Raw và GND. (Raw kết nối với dây đỏ và GND kết nối với dây đen) Lưu ý, nếu bạn dùng nguồn điện cao hơn 5V, chỉ nên cấp điện qua hai chân Raw và GND. Nếu bạn cấp điện cao hơn 5V qua chân Vcc, có thể làm hỏng chip ATmega.
Tiếp theo, hàn dây vào các chân Digital 2, 3, 4, 5 và chân Analog A0.
Bước 3:
Bây giờ, bạn hãy kết nối các linh kiện theo sơ đồ đã được cung cấp.
Hàn 2 đèn LED và điện trở cho đèn LED.
Hàn nút nhấn để thay đổi code và điện trở của nút. Để đổi mã mở cửa, bạn chỉ cần giữ nút này và nhập mã mới.
Bước 4:
Hàn loa gốm và điện trở cho loa. Sử dụng 1 nắp chai xoay 90 độ để tăng cường âm thanh cho loa.
Đặt loa vào nắp và tạo một lỗ ở đầu nắp chai.
Bước 5:
Bây giờ, chúng ta hãy hàn các linh kiện điều khiển động cơ lên mạch. Bao gồm 1 transistor 2N2222A và 1 diode 1N4004.
Sau khi đã kết nối linh kiện lên mạch, bạn có thể cắt ngắn dây để gọn gàng. Tuy nhiên, ở đây tôi không cắt dây để dễ dàng trong việc hàn.
Sắp xếp bảng mạch vào hộp nhựa để trông gọn gàng và hấp dẫn hơn
Bước 6:
Để nạp chương trình vào Arduino Pro mini, bạn cần dùng một cáp USB to COM PL 2303.
Kết nối hai thiết bị này với nhau theo hướng dẫn sơ đồ.
Tiếp theo, cắm PL2303 vào máy tính.
Khởi động Arduino và sao chép đoạn mã sau đây.
const int knockSensor = 0;
const int programSwitch = 2;
const int lockMotor = 3;
const int redLED = 4;
const int greenLED = 5;
const int threshold = 3;
const int rejectValue = 25;
const int averageRejectValue = 15;
const int knockFadeTime = 150;
const int lockTurnTime = 650;
const int maximumKnocks = 20;
const int knockComplete = 1200;
int secretCode[maximumKnocks] = {50, 25, 25, 50, 100, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int knockReadings[maximumKnocks];
int knockSensorValue = 0;
int programButtonPressed = false;
void setup() {
pinMode(lockMotor, OUTPUT);
pinMode(redLED, OUTPUT);
pinMode(greenLED, OUTPUT);
pinMode(programSwitch, INPUT);
pinMode(knockSensor, INPUT);
Serial.begin(9600);
Serial.println('Program start.');
digitalWrite(greenLED, HIGH);
}
void loop() {
knockSensorValue = analogRead(knockSensor);
if (digitalRead(programSwitch)==HIGH){
programButtonPressed = true;
digitalWrite(redLED, HIGH);
} else {
programButtonPressed = false;
digitalWrite(redLED, LOW);
}
if (knockSensorValue >=threshold){
listenToSecretKnock();
}
}
void listenToSecretKnock(){
Serial.println('knock starting');
int i = 0;
for (i=0;i<maximumKnocks;i ){
knockReadings[i]=0;
}
int currentKnockNumber=0;
int startTime=millis();
int now=millis();
digitalWrite(greenLED, LOW);
if (programButtonPressed==true){
digitalWrite(redLED, LOW);
}
delay(knockFadeTime);
digitalWrite(greenLED, HIGH);
if (programButtonPressed==true){
digitalWrite(redLED, HIGH);
}
do {
knockSensorValue = analogRead(knockSensor);
if (knockSensorValue >=threshold){
Serial.println('knock.');
now=millis();
knockReadings[currentKnockNumber] = now-startTime;
currentKnockNumber ;
startTime=now;
digitalWrite(greenLED, LOW);
if (programButtonPressed==true){
digitalWrite(redLED, LOW);
}
delay(knockFadeTime);
digitalWrite(greenLED, HIGH);
if (programButtonPressed==true){
digitalWrite(redLED, HIGH);
}
}
now=millis();
} while ((now-startTime < knockComplete) && (currentKnockNumber < maximumKnocks));
if (programButtonPressed==false){
if (validateKnock() == true){
triggerDoorUnlock();
} else {
Serial.println('Secret knock failed.');
digitalWrite(greenLED, LOW);
for (i=0;i<4;i ){
digitalWrite(redLED, HIGH);
delay(100);
digitalWrite(redLED, LOW);
delay(100);
}
digitalWrite(greenLED, HIGH);
}
} else {
validateKnock();
Serial.println('New lock stored.');
digitalWrite(redLED, LOW);
digitalWrite(greenLED, HIGH);
for (i=0;i<3;i ){
delay(100);
digitalWrite(redLED, HIGH);
digitalWrite(greenLED, LOW);
delay(100);
digitalWrite(redLED, LOW);
digitalWrite(greenLED, HIGH);
}
}
}
void triggerDoorUnlock(){
Serial.println('Door unlocked!');
int i=0;
digitalWrite(lockMotor, HIGH);
digitalWrite(greenLED, HIGH);
delay (lockTurnTime);
digitalWrite(lockMotor, LOW);
for (i=0; i < 5; i ){
digitalWrite(greenLED, LOW);
delay(100);
digitalWrite(greenLED, HIGH);
delay(100);
}
}
boolean validateKnock(){
int i=0;
int currentKnockCount = 0;
int secretKnockCount = 0;
int maxKnockInterval = 0;
for (i=0;i<maximumKnocks;i ){
if (knockReadings[i] > 0){
currentKnockCount ;
}
if (secretCode[i] > 0){
secretKnockCount ;
}
if (knockReadings[i] > maxKnockInterval){
maxKnockInterval = knockReadings[i];
}
}
if (programButtonPressed==true){
for (i=0;i<maximumKnocks;i ){
secretCode[i]= map(knockReadings[i],0, maxKnockInterval, 0, 100);
}
}
digitalWrite(greenLED, LOW);
digitalWrite(redLED, LOW);
delay(1000);
digitalWrite(greenLED, HIGH);
digitalWrite(redLED, HIGH);
delay(50);
for (i = 0; i < maximumKnocks ; i ){
digitalWrite(greenLED, LOW);
digitalWrite(redLED, LOW);
if (secretCode[i] > 0){
delay( map(secretCode[i],0, 100, 0, maxKnockInterval));
digitalWrite(greenLED, HIGH);
digitalWrite(redLED, HIGH);
}
delay(50);
}
return false;
}
if (currentKnockCount != secretKnockCount){
return false;
}
int totaltimeDifferences=0;
int timeDiff=0;
for (i=0;i<maximumKnocks;i ){
knockReadings[i]= map(knockReadings[i],0, maxKnockInterval, 0, 100);
timeDiff = abs(knockReadings[i]-secretCode[i]);
if (timeDiff > rejectValue){
return false;
}
totaltimeDifferences = timeDiff;
}
if (totaltimeDifferences/secretKnockCount>averageRejectValue){
return false;
}
return true;
}
Tiếp tục, nhấn đồng thời nút reset trên Arduino Pro mini và nút upload code trên phần mềm để chép chương trình lên Arduino pro mini
Khi hiển thị từ 'uploading', bạn hãy nhả tay ra khỏi nút reset. Đợi một chút, quá trình nạp code sẽ kết thúc. Nếu gặp vấn đề trong lúc nạp code, hãy xem thêm thông tin tại đây.
Bước 7:
Tạo một chiếc chìa khóa hình chữ U để dùng làm dụng cụ xoay khóa.
Đặt nút xoay khóa nhanh không cần chìa khóa vào bên trong cánh cửa như hướng dẫn. Sau đó gắn thiết bị lên cánh cửa.
Với loa gắn trong nắp chai cồn ở góc 90 độ, đặt phần lỗ đã cắt trên nắp chai lên cửa để nhận biết âm thanh khi gõ cửa tốt hơn.
Bước 8:
Để thiết lập knock code cho khóa cửa, bạn giữ nút trên bo mạch. Khi hai đèn màu xanh đỏ sáng, bạn sẽ gõ mã Knock của mình. Knock code yêu cầu từ 3 đến 20 lần gõ. Hệ thống có khả năng nhận biết hoàn toàn âm thanh và thời gian giữa các lần gõ. Điều này đảm bảo rằng bạn chỉ có thể mở cửa khi gõ theo nhịp đã thiết lập. Rất an toàn!
Cảm ơn Linh Kiện Hà Nội đã hỗ trợ chúng tôi thực hiện bài viết này.
Nếu bạn có bất kỳ câu hỏi nào trong quá trình thực hiện, hãy tham gia nhóm Facebook ở đây để được hỗ trợ và thảo luận.