정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

지문인식+블루투스 의문점.
갓터쟁이 | 2019-07-22

안녕하세요

우노를 이용하여 지문인식을 하고 지문인식이 된 이후부터 센서값을 받아 블루투스로 전송을 해주려고 합니다.

지문인식 센서와 블루투스 모듈 모두 SoftwareSerial을 사용합니다.

 

여기서 의문점이 하나 발생했습니다.

아두이노 multiple software serial 은 listen 함수를 이용하여 선택적으로 다중 시리얼 통신을 사용할 수 있게 해주는데요.

코드상에 listen 함수를 사용하지 않아도 블루투스 통신과 지문센서 인식이 가능합니다.

해당 코드는 완성된 코드가 아니라 그냥 테스트 용으로 작업해보다가 소프트웨어 시리얼이

리슨 함수를 쓰지않고도 가능하길래 왜 이런 현상이 가능한 것인지 의문이 들어 질문을 올립니다.

 

해당 코드는 지문센서의 fingerprint 예제를 이용하였습니다.

 

감사합니다.

 

코드 : 

#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>

int state = 0;
int blueTx = 9; //Tx (보내는핀 설정)at
int blueRx = 10; //Rx (받는핀 설정)

SoftwareSerial BTSerial(blueTx, blueRx);  //시리얼 통신을 위한 객체선언
SoftwareSerial mySerial(2, 3);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

int LED = 6;
int LED2 = 5;
int A_state=0;
void setup()
{
  Serial.begin(9600);
  BTSerial.begin(9600); //블루투스 시리얼
  pinMode(LED2, OUTPUT);

  while (!Serial);  // For Yun/Leo/Micro/Zero/...
  delay(100);
  Serial.println("\n\nAdafruit finger detect test");

  // 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) {
      delay(1);
    }
  }

  finger.getTemplateCount();
  Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" templates");
  Serial.println("Waiting for valid finger...");
}

void loop()                     // run over and over again
{
  //아날로그 0번 핀에 압력센서를 연결합니다.
  int id = getFingerprintIDez();
  delay(50);
  if (id == 1) {
    state = 1;
  }
  if (state == 1) {

    int sensorval = analogRead(A0);
    if(sensorval >= 100){
      A_state=1;
    }
    else{
      A_state=0;
    }
    int B_state=0;
    int total = A_state*10 + B_state;
    BTSerial.print(total);
    
    
    //시리얼 모니터를 통해 센서값과 LED의 밝기를 표기합니다.
    Serial.println("Sensorvalue : " + String(sensorval));
    delay(2000);

  }
  //100ms동안 대기합니다.

 

  //getFingerprintIDez();
  //delay(100);            //don't ned to run this at full speed.

}

uint8_t getFingerprintID() {
  uint8_t p = finger.getImage();
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.println("No finger detected");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return p;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Imaging error");
      return p;
    default:
      Serial.println("Unknown error");
      return p;
  }

  // OK success!

  p = finger.image2Tz();
  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!
  p = finger.fingerFastSearch();
  if (p == FINGERPRINT_OK) {
    Serial.println("Found a print match!");
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    return p;
  } else if (p == FINGERPRINT_NOTFOUND) {
    Serial.println("Did not find a match");
    return p;
  } else {
    Serial.println("Unknown error");
    return p;
  }

  // found a match!
  Serial.print("Found ID #"); Serial.print(finger.fingerID);
  Serial.print(" with confidence of "); Serial.println(finger.confidence);
  //BTSerial.println(finger.fingerID);
  BTSerial.print("Found ID #"); BTSerial.println(finger.fingerID);

  return finger.fingerID;
}

// returns -1 if failed, otherwise returns ID #
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 #"); Serial.print(finger.fingerID);
  Serial.print(" with confidence of "); Serial.println(finger.confidence);
  BTSerial.print("Found ID #"); BTSerial.println(finger.fingerID);
  return finger.fingerID;
}

이전글   |    안녕하세요! UART 통신 관련하여 질문드립니다.... 2019-07-21
다음글   |    SPI통신에 대해서 궁금합니다! 제발 도와주세요 ㅠㅠ... 2019-07-24