#include <SoftwareSerial.h>
#define BT_RXD 8
#define BT_TXD 7
SoftwareSerial bluetooth(BT_RXD, BT_TXD);
int buzzerPin = 4;
bool isDetection = false;
void setup()
{
Serial.begin(9600);
bluetooth.begin(9600);
pinMode(buzzerPin, OUTPUT);
}
void loop()
{
byte data;
while (bluetooth.available() > 0)
{
data = bluetooth.read();
Serial.write(data);
if (isDetection && data == 75)
{
Buzzer();
}
isDetection = false;
if (data == 79)
{
isDetection = true;
}
}
}
void Buzzer()
{
Serial.write("disconnected");
tone(buzzerPin, 131);
delay(5000);
noTone(buzzerPin);
delay(1000);
tone(buzzerPin, 262);
delay(5000);
noTone(buzzerPin);
delay(1000);
}
==========================================================
#include <Adafruit_Fingerprint.h>
#if (defined(__AVR__) || defined(ESP8266)) && !defined(__AVR_ATmega2560__)
// For UNO and others without hardware serial, we must use software serial...
// pin #2 is IN from sensor (GREEN wire)
// pin #3 is OUT from arduino (WHITE wire)
// Set up the serial port to use softwareserial..
SoftwareSerial mySerial(2, 3);
#else
// On Leonardo/M0/etc, others with hardware serial, use hardware serial!
// #0 is green wire, #1 is white
#define mySerial Serial1
#endif
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
int Relay = 13;
void setup()
{
pinMode(Relay, OUTPUT);
//digitalWrite(Relay,HIGH);
Serial.begin(9600);
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);
delay(5);
if (finger.verifyPassword()) {
Serial.println("Found fingerprint sensor!");
} else {
Serial.println("Did not find fingerprint sensor :(");
while (1) {
delay(1);
}
}
Serial.println(F("Reading sensor parameters"));
finger.getParameters();
Serial.print(F("Status: 0x")); Serial.println(finger.status_reg, HEX);
Serial.print(F("Sys ID: 0x")); Serial.println(finger.system_id, HEX);
Serial.print(F("Capacity: ")); Serial.println(finger.capacity);
Serial.print(F("Security level: ")); Serial.println(finger.security_level);
Serial.print(F("Device address: ")); Serial.println(finger.device_addr, HEX);
Serial.print(F("Packet len: ")); Serial.println(finger.packet_len);
Serial.print(F("Baud rate: ")); Serial.println(finger.baud_rate);
finger.getTemplateCount();
if (finger.templateCount == 0) {
Serial.print("Sensor doesn't contain any fingerprint data. Please run the 'enroll' example.");
}
else {
Serial.println("Waiting for valid finger...");
Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" templates");
}
//digitalWrite(Relay,LOW);
}
void loop() // run over and over again
{
//digitalWrite(Relay,LOW);
getFingerprintID();
delay(50); //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.fingerSearch();
if (p == FINGERPRINT_OK) {
Serial.println("Found a print match!");
digitalWrite(Relay, HIGH);
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println("Communication error");
return p;
} else if (p == FINGERPRINT_NOTFOUND) {
Serial.println("Did not find a match");
digitalWrite(Relay, LOW);
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);
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);
return finger.fingerID;
}
========================================================
#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>
#define BT_RXD 8
#define BT_TXD 7
SoftwareSerial bluetooth(BT_RXD, BT_TXD);
int buzzerPin = 4;
int Relay = 13;
bool isDetection = false;
#if (defined(__AVR__) || defined(ESP8266)) && !defined(__AVR_ATmega2560__)
// For UNO and others without hardware serial, we must use software serial...
// pin #2 is IN from sensor (GREEN wire)
// pin #3 is OUT from arduino (WHITE wire)
// Set up the serial port to use softwareserial..
SoftwareSerial mySerial(2, 3);
#else
// On Leonardo/M0/etc, others with hardware serial, use hardware serial!
// #0 is green wire, #1 is white
#define mySerial Serial1
#endif
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
void setup()
{
pinMode(Relay, OUTPUT);
pinMode(buzzerPin, OUTPUT);
Serial.begin(57600);
bluetooth.begin(57600);
while (!Serial); // For Yun/Leo/Micro/Zero/...
delay(100);
Serial.println("\n\nAdafruit finger detect test");
finger.begin(57600);
delay(5);
if (finger.verifyPassword()) {
Serial.println("Found fingerprint sensor!");
} else {
Serial.println("Did not find fingerprint sensor :(");
while (1) {
delay(1);
}
}
Serial.println(F("Reading sensor parameters"));
finger.getParameters();
Serial.print(F("Status: 0x")); Serial.println(finger.status_reg, HEX);
Serial.print(F("Sys ID: 0x")); Serial.println(finger.system_id, HEX);
Serial.print(F("Capacity: ")); Serial.println(finger.capacity);
Serial.print(F("Security level: ")); Serial.println(finger.security_level);
Serial.print(F("Device address: ")); Serial.println(finger.device_addr, HEX);
Serial.print(F("Packet len: ")); Serial.println(finger.packet_len);
Serial.print(F("Baud rate: ")); Serial.println(finger.baud_rate);
finger.getTemplateCount();
if (finger.templateCount == 0) {
Serial.print("Sensor doesn't contain any fingerprint data. Please run the 'enroll' example.");
}
else {
Serial.println("Waiting for valid finger...");
Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" templates");
}
}
void loop() // run over and over again
{
byte data;
while (bluetooth.available() > 0)
{
data = bluetooth.read();
Serial.write(data);
if (isDetection && data == 75)
{
Buzzer();
}
isDetection = false;
if (data == 79)
{
isDetection = true;
}
}
getFingerprintID();
delay(50); //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.fingerSearch();
if (p == FINGERPRINT_OK) {
Serial.println("Found a print match!");
digitalWrite(Relay, HIGH);
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println("Communication error");
return p;
} else if (p == FINGERPRINT_NOTFOUND) {
Serial.println("Did not find a match");
digitalWrite(Relay, LOW);
return p;
} else {
Serial.println("Unknown error");
return p;
}
Serial.print("Found ID #"); Serial.print(finger.fingerID);
Serial.print(" with confidence of "); Serial.println(finger.confidence);
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);
return finger.fingerID;
}
void Buzzer()
{
Serial.write("disconnected");
tone(buzzerPin, 131);
delay(5000);
noTone(buzzerPin);
delay(1000);
tone(buzzerPin, 262);
delay(5000);
noTone(buzzerPin);
delay(1000);
}
========================================
코드가 길어 죄송합니다.
첫번째 코드는 블루투스 연결 후 블루투스가 끊어지면 부저를 울리려고 만들었습니다.
두번째 코드는 릴레이에 솔레노이드와 지문인식장치로 잠금장치를 만들어 보고자 하였습니다.
세번째 코드는 위의 두 기능을 하나의 아두이노에 집어넣고 싶어 합쳐봤습니다.
다만 두 코드 합치지 않고 각자 썼을땐 문제가 없었는데 세번째 코드에서 부저 부분이 작동이 안됩니다.
블루투스 연결, 지문이 일치하면 잠금 off 모두 작동하는데 블루투스가 끊어질 때 부저를 울리도록 하는 기능이 작동하질 않습니다.
두 코드를 합치면서 제가 실수한 부분이 있는지 가르쳐주시면 정말 도움 많이 될 것 같습니다.
{
byte data;
while (bluetooth.available() > 0)
{
data = bluetooth.read();
Serial.write(data);
if (isDetection && data == 75)
{
Buzzer();
}
isDetection = false;
if (data == 79)
{
isDetection = true;
}
}
getFingerprintID();
delay(50); //don't ned to run this at full speed.
}
BT가 available 할때만 loop가 유지되고 unavailable 하면 while()에서 튕겨 나가면서
get FingerpirntID(); delay(50)만 실행되고
BT가 우연히 available 해지지 않는 이상 다시 저 안의 루프로 들어가지 못하게 됩니다.
아두이노의 경우 loop() 함수에서 또 loop를 돌리는게 옳은 프로그래밍 방향이 아닐겁니다.
loop() 함수 자체를 상위 (보이지 않는) 코드에서 while()에 의해서 돌리고 있기 때문이죠.
아무튼 굳이 수정을 해야 한다면
if(bt.available() > 0)
{ // BT 정상
}
else
{
Buzzer(); // BT not available
Serial.println("BT failed.");
// bluetooth.reinit()..
}
식으로 구현하시면 될 것 같습니다.
해당함수는 BT의 생존을 확인하는게 아니라 소프트웨어 시리얼 포트를 통해 데이터가 읽히는게 있냐? 라는 기능을 가진 함수 같습니다.
BT 와 통신을 시도하고 timeout 이후 죽었다고 판단되면 else 부분을 구동하도록 변경할 필요가 있을 것 같습니다.