BASIC4MCU | 질문게시판 | 아두이노 안드로이드 통신질문드립니다.
페이지 정보
작성자 dongeun9 작성일2020-08-06 20:24 조회16,538회 댓글3건본문
#include <SoftwareSerial.h>
#include <Servo.h>
#include <Keypad.h>
#include <Adafruit_Fingerprint.h>
#define SERVO_PIN A1
#define BUZZER A0
#define OPEN 1
#define CLOSE 0
#define CLOSE_DOOR 150
#define OPEN_DOOR 10
SoftwareSerial mySerial(10, 11);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
int open_flg; //문 개방상태 플래그
Servo tServo;
char secretCode[4] = {'1', '2', '3', '4'};
int position = 0;
int wrong = 0;
int err_cnt=0;
int a=0;
int b=0;
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPin[ROWS] = {9, 8, 7, 6};
byte colPin[COLS] = {5, 4, 3, 2};
Keypad keypad = Keypad(makeKeymap(keys), rowPin, colPin, ROWS, COLS);
void password();
void fingerprint();
//지문센서 초기화
void init_finger()
{
finger.begin(57600);
while(1)
{
if (finger.verifyPassword()) {
Serial.println("Found fingerprint sensor!");
err_cnt=0;
break;
} else {
Serial.println("Did not find fingerprint sensor :(");
err_cnt++;
}
//지문센서 초기 연결에 실패시 문을 개방
if(err_cnt > 10)
{
act_siren();
handle_servo(OPEN_DOOR);
open_flg=OPEN;
err_cnt=0;
}
delay(100);
}
}
void setup() {
Serial.begin(9600);
Serial1.begin(9600);
pinMode(BUZZER,OUTPUT);
finger.begin(57600);
init_finger();
digitalWrite(BUZZER,0);
handle_servo(CLOSE_DOOR); //초기에는 금고문을 잠금상태로 설정
open_flg=OPEN;
}
//서보모터 각도를 조절하여 문을 열고 닫는 함수
void handle_servo(int angle)
{
tServo.attach(SERVO_PIN);
tServo.write(angle);
delay(200);
tServo.detach();
}
//등록되지 않은 지문이 들어왔을때 사이렌을 울리는 함수
void act_siren()
{
for(int freq = 150; freq <=1800; freq = freq + 2) {
tone(BUZZER, freq, 10);
delay(5);
}
for(int freq = 1800; freq <=150; freq = freq - 2) {
tone(BUZZER, freq, 10);
delay(5);
}
digitalWrite(BUZZER,0);
}
void password(){
char key = keypad.getKey();
if(key){
Serial.println(key);
}
if((key >= '0' && key <= '9') || (key >= 'A' && key <='D')
|| (key == '*' || key == '#')){
// 키패드에서 입력된 값을 조사하여 맞게 입력된 값일 경우(키패드에 있는 버튼이 맞을경우) 비교
if(key == secretCode[position]){ // 해당 자리에 맞는 비밀번호가 입력됬을 경우
position++; // 다음 자리로 넘어 감
wrong = 0; // 비밀번호 오류 값을 0으로 만듬
lcd.setCursor(0,0); // 첫 번째 column열 , 첫 번째 row 행부터 시작
lcd.print("*");
}
else if(key != secretCode[position]){ // 해당 자리에 맞지 않는 비밀번호가 입력됬을 경우
position = 0; // 비밀번호를 맞았을 경우를 0으로 만듬
wrong++; // 비밀번호 오류 값을 늘려준다
lcd.setCursor(0,0); // 첫 번째 column열 , 첫 번째 row 행부터 시작
lcd.print("*");
}
if(position == 4){ // 4자리 비밀번호가 모두 맞았을 경우
a=1;
lcd.setCursor(0,0); // 첫 번째 column열 , 첫 번째 row 행부터 시작
lcd.print("Correct!");
}
if(wrong == 4)
{ // 비밀번호 오류를 4번 했을 경우
wrong = 0; // 비밀번호 오류 값을 0으로 만들어 준다
lcd.setCursor(0,0); // 첫 번째 column열 , 첫 번째 row 행부터 시작
lcd.print("Wrong!");
}
delay(100);
}
}
void fingerprint() {
//지문인식센서에 지문감지 체크 및 등록지문 여부 확인
uint8_t ret=getFingerprintIDez();
if(ret==FINGERPRINT_NOTFOUND)
{
Serial.print("Not Exist ");
act_siren();
lcd.setCursor(0,0); // 첫 번째 column열 , 첫 번째 row 행부터 시작
lcd.print("Thief!");
}
else if(ret==FINGERPRINT_OK)
{
b=1;
open_flg=OPEN;
err_cnt=0;
}
else if(ret!= FINGERPRINT_NOFINGER)
{
err_cnt++;
}
//통신이 10회 이상 지속적으로 안되면 문을 개방
if(err_cnt > 10)
{
act_siren();
handle_servo(OPEN_DOOR);
open_flg=OPEN;
err_cnt=0;
}
delay(50);
}
void loop() {
char key = keypad.getKey();
while (a == 0){
password();
}
while (b == 0){
fingerprint();
}
int sum = a+b;
if(sum == 2){
handle_servo(OPEN_DOOR);
delay(2000);
while(key!='*'){
key=keypad.getKey();
}
a=0; b=0;
handle_servo(CLOSE_DOOR);
}
}
//지문센서에 지문이 인식되면 등록된 지문인지를 체크하는 함수
int getFingerprintIDez() {
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");
err_cnt++;
return p;
case FINGERPRINT_IMAGEFAIL:
Serial.println("Imaging error");
return p;
default:
Serial.println("Unknown error");
return p;
}
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");
err_cnt++;
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;
}
p = finger.fingerFastSearch();
if (p == FINGERPRINT_OK) {
Serial.println("Found a print match!");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println("Communication error");
err_cnt++;
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);
return FINGERPRINT_OK;
// return finger.fingerID;
}
현재 안드로이드는 어느정도 구성을 해 놓은상태고 아두이노의 소스를 먼저 변경하고 하려하는데 감이 잘안와서 질문드립니다..
지금 추가하려는 기능이, 지문인식센서에 통과가 되어 문이 열릴 시 hc-06을 통해 그냥 데이터값 아무거나 설정해서 보내서 확인하는 것과 안드로이드에서 문을 여는 기능을 구현하려는데 어떻게 해야하는지 좀 알려주시면 감사드립니다..
if (Serial1.available())
{
Serial.write(Serial1.read());
}
이 거를 현재 loop문에 어떤식으로 적용을 해야할지가 제일 막막합니당 ㅠ
댓글 3
조회수 16,538master님의 댓글
master 작성일
"지문인식센서에 통과가 되어 문이 열릴 시 hc-06을 통해 그냥 데이터값 아무거나 설정해서 보내서 확인하는 것"
위 내용은 아두이노에서 송신하는 것으로서 필요할 때마다 하면 됩니다.
//
if (Serial1.available()){
char r=Serial1.read();
if(r=='O' || r=='o'){ } //open
if(r=='C' || r=='c'){ } //close
}
모터 구동은 위처럼 처리하면 됩니다.
dongeun9님의 댓글
dongeun9
그 모터구동 이 코드는 loop문 어느 부분에 적용을 해야하는 것인가요?? 그부분이 헷갈리네용..
void loop() {
if (Serial1.available()){
char r=Serial1.read();
if(r=='O' || r=='o'){ } //open
if(r=='C' || r=='c'){ } //close
}
char key = keypad.getKey();
while (a == 0){
password();
}
while (b == 0){
fingerprint();
}
int sum = a+b;
if(sum == 2){
handle_servo(OPEN_DOOR);
delay(2000);
while(key!='*'){
key=keypad.getKey();
}
a=0; b=0;
handle_servo(CLOSE_DOOR);
}
이렇게 그냥 사용하면 됩니까??
master님의 댓글
master
while 루프에 갖혀서 시리얼 수신을 받지 못할 수도 있습니다.
잘 체크해서 코드를 작성하세요