Có bạn gái hậu đậu, trí nhớ "cá vàng"? Tặng họ món này làm quà Valentine thì không có gì phải nuối tiếc!

    Nguyễn Sơn,  

    Bạn gái bạn là chúa hay quên chìa khóa nhà? Thiết bị mở khóa cửa bằng thần chú sẽ là món quà Valentine không thể ý nghĩa hơn cho những người trí nhớ cá vàng.

    Bạn đã từng ra khỏi nhà mà quên không mang theo chìa khóa rồi phải nhờ đến sự trợ giúp từ người thân hay thợ sửa khóa chưa? Nếu câu trả lời là rồi thì bạn không nên bỏ qua bài hướng dẫn này. Trong bài ngày hôm nay chúng tôi sẽ hướng dẫn các bạn chế tạo thiết bị khóa cửa mở bằng Knock code thông minh với chi phí siêu rẻ.

    Clip giới thiệu hoạt động

    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 (Giá khoảng 50.000 đồng)

    Một Phip đồng PCB 5x7 cm (giá khoảng 5.000 đồng)

    Loa gốm ( giá khoảng 2000 đồng)

    Điện trở 1/4w 1 triệu ôm ( giá 4.000 đồng / 100 cái)

    Điện trở 1/4w 560 ôm ( giá 4.000 đồng / 100 cái)

    Điện trở 1/4w 10 nghìn ôm ( giá 4.000 đồng / 100 cái)

    Một transistor 2N2222A ( giá 1.000 đồng)

    Hai bóng LED xanh đỏ 5mm ( giá 700 đồng)

    Một nút nhấn 2 chân ( giá 500 đồng)

    Một Jump cái ( Giá 3.000 đồng)

    Một hộp nhựa (giá 10.000 đồng)

    Đế pin 9v loại dây ( giá 3.000 đồng)

    Dây điện lõi đơn ( giá 300 đồng/dây)

    Bước 1:

    Các bạn cắt 2 thanh (Jump cái) mỗi thanh 12 lỗ để làm bộ phận cắm broad Arduino Pro Mini lên phíp đồng.

    Sau đó cắm Jump vào phíp đồng như thế này.

    Bước 2:

    Các bạn hàn jack lấy nguồn 9v vào 2 chân Raw và GND. (Raw hàn với dây đỏ GND hàn với dây đen) Lưu ý là nếu các bạn sử dụng nguồn điện lớn hơn 5V thì chỉ được cấp điện qua 2 chân Raw và GND. Nếu bạn cấp nhầm điện lớn hơn 5V qua chân Vcc sẽ gây cháy chip ATmega.

    Sau đó các bạn hàn dây vào các chân Digital 2 3 4 5 và chân Analog A0.

    Bước 3:

    Giờ các bạn sẽ kết nối các linh kiện theo sơ đồ trên.

    Hàn 2 đèn LED và điện trở cho đèn.

    Hàn nút nhấn đổi code và điện trở của nút nhấn. Khi muốn thay đổi code gõ cửa khác thì các bạn nhấn giữ nút này và gõ code muốn thay đổi.

    Bước 4:

    Hàn loa gốm và điện trở cho loa. Các bạn dùng 1 chiếc nắp chai cồn 90 độ để làm bộ phận cộng hưởng âm thanh cho loa.

    Cho loa vào trong chiếc nắp này và cắt 1 lỗ ở đầu nắp chai.

    Bước 5:

    Giờ chúng ta sẽ hàn linh kiện điều khiển động cơ lên mạch. Linh kiện này gồm 1 Transistor 2N2222A và 1 đi ốt 1N4004.

    Vậy là chúng ta đã kết nối xong các linh kiện lên mạch. Các bạn có thể cắt ngắn dây kết nối cho gọn. Ở đây mình không cắt ngắn dây mà để nguyên vậy cho dễ hàn.

    Sau đó các bạn cho bảng mạch vào hộp nhựa cho gọn và đẹp mắt

    Bước 6:

    Để nạp code cho Arduino Pro mini thì các bạn cần sử dụng một chiếc USB to COM PL 2303.

    Các bạn kết nối dây 2 thiết bị này với nhau theo sơ đồ dưới đây.

    Sau đó kết nối PL2303 vào máy tính.

    Các bạn mở arduino lên và copy đoạn code dưới đây vào.

    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

    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

    if (knockReadings[i] > 0){

    currentKnockCount ;

    }

    if (secretCode[i] > 0){

    secretKnockCount ;

    }

    if (knockReadings[i] > maxKnockInterval){

    maxKnockInterval = knockReadings[i];

    }

    }

    if (programButtonPressed==true){

    for (i=0;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

    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;

    }

    Sau đó ấn đồng thời nút reset trên Arduino Pro mini và nút nạp code trên phần mềm để nạp code lên Arduino pro mini

    Khi thấy dòng chữ uploading xuất hiện các bạn thả tay ra khỏi nút reset. Chờ một lúc quá trình upload code sẽ hoàn thành. Nếu bạn gặp lỗi trong quá trình Upload thì có thể tham khảo thêm bài viết tại đây.

    Bước 7:

    Các bạn chế một bộ phận hình chữ U để làm bộ phận vặn khóa.

    Sau đó lắp vào núm xoay mở khóa nhanh không cần chìa khóa ở phía bên trong cánh cửa như thế này. Và cố định thiết bị lên cánh cửa.

    Với bộ phận loa gốm đặt trong nắp chai cồn 90 độ thì các bạn áp phần lỗ đã cắt ở đầu nắp chai lên cửa để thu tiếng gõ từ cửa rõ hơn.

    Bước 8:

    Bây giờ để nạp knock code cho khóa cửa các bạn ấn giữ nút nhấn ở trên bo mạch. Lúc hai đèn màu xanh đỏ sẽ sáng lên các bạn sẽ gõ Knock code của mình vào. Knock code tối thiếu là 3 lần gõ và tối đa là 20 lần gõ. Knock code có thể nhận diện gần như chính xác hoàn toàn tiếng gõ và thời gian nghỉ sau mỗi tiếng gõ của bạn. Vì vậy để mở cửa bạn cần phải gõ đúng với nhịp điệu như lúc nạp thì mới có thể mở được cửa. Rất an toàn!

    Xin cảm ơn cửa hàng Linh Kiện Hà Nội đã hỗ trợ chúng tôi thực hiện bài viết này.

    Bạn đọc có thắc mắc trong quá trình thực hành có thể tham gia nhóm Facebook tại đây để đặt câu hỏi và thảo luận.

    Tin cùng chuyên mục
    Xem theo ngày

    NỔI BẬT TRANG CHỦ