안녕하세요
우노를 이용하여 지문인식을 하고 지문인식이 된 이후부터 센서값을 받아 블루투스로 전송을 해주려고 합니다.
지문인식 센서와 블루투스 모듈 모두 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;
}
|