基於arduino+as608+360舵機的宿舍指紋鎖

zhudachang發表於2024-05-06

需要的製作材料

  1. Arduino nano開發板
  2. AS608指紋模組
  3. MG995 360舵機(360舵機的控制與180舵機控制不相同,360舵機只可以控制旋轉的速度,180舵機可以控制旋轉的角度)
  4. 麵包板,電線若干

準備部分

參考了大佬的程式碼http://t.csdnimg.cn/GB29Q

  1. arduino模組可以看b站影片,,零基礎(c語言零基礎也可以看)
    【【太極創客】零基礎入門學用Arduino 第一部分 合輯】https://www.bilibili.com/video/BV164411J7GE?vd_source=7183d94355e25d7a846a2242f0eb9c7d
  2. AS608指紋模組
  • 可以使用一個上位機軟體進行操作的。

  • 使用usb轉ttl,把AS608連線上電腦

  • 透過上位機錄入指紋。

  1. 舵機
  • 宿舍門是金屬材質,熱熔膠可能粘不上去,這裡建議可以使用ab膠水

程式碼部分

該程式碼功能是

  1. 檢測到手指,wak變為高電平,然後觸發中斷,離開睡眠模式
  2. 判斷wak是否為高電平,如果是那麼就開始判斷是否為正確的指紋
  3. 如果為正確的指紋,就驅動舵機開鎖
  4. 結束後關閉as608燈,並且重新進入睡眠模式
引腳接線
arduino  AS608
3.3V     vi
4        tx
3        rx
gnd      GND
3.3V     vt
2       wak

舵機接線使用9號引腳
//需要在arduino庫管理中新增庫Adafruit_Fingerprint

```cpp
#include <Servo.h>
#include <avr/sleep.h>
#include <Adafruit_Fingerprint.h>

Servo myservo;
SoftwareSerial mySerial(4,3);
int pos=0;
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
int as608read=2;
void wakeUp() {
  // 這個函式將在外部中斷觸發時呼叫,但可以保持空白
  sleep_disable();
 
}

void setup() {
  
  myservo.attach(9);
  
  Serial.begin(9600);
  
  finger.begin(57600);
  if (finger.verifyPassword()) {
    Serial.println("Found fingerprint sensor!");
  } else {
    Serial.println("Did not find fingerprint sensor :(");
    while (1) { delay(1); }
  }

  pinMode(as608read,INPUT);
  finger.LEDcontrol(false);
  attachInterrupt(digitalPinToInterrupt(as608read), wakeUp, CHANGE);
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);  // 設定最深的睡眠模式
  sleep_enable();  // 啟用睡眠模式
}

void loop() {

 sleep_mode();  // 進入睡眠模式,等待中斷喚醒

   if(digitalRead(as608read)==HIGH){
 
    finger.LEDcontrol(true);
    getFingerprintIDez();
    delay(500);
    finger.LEDcontrol(false);
  }  
 
  
  delay(100); 
 
}

int getFingerprintIDez() {
   
  uint8_t p = finger.getImage();
  if (p != FINGERPRINT_OK){
    finger.LEDcontrol(0x02,0,0x01,0);
    return -1;
  }

  p = finger.image2Tz();
  if (p != FINGERPRINT_OK){
    finger.LEDcontrol(0x02,0,0x01,0);
    return -1;
  }
  p = finger.fingerFastSearch();
  if (p != FINGERPRINT_OK){
    finger.LEDcontrol(0x02,0,0x01,0);
    return -1;
  }
  
  finger.LEDcontrol(0x02,0,0x02,0);
  opendoor();
  Serial.print("Found ID #"); Serial.print(finger.fingerID); 
  Serial.print(" with confidence of "); Serial.println(finger.confidence);
  return finger.fingerID;
}

void opendoor(){
    pos=0;
    myservo.write(pos);
    delay(2000);
    pos=112;
    myservo.write(pos);
    delay(600);
    pos=90;
    myservo.write(pos);
    delay(400);
}

相關文章