BASIC4MCU | 질문게시판 | 지문인식센서 서보모터 질문
페이지 정보
작성자 얌얌 작성일2020-11-09 21:14 조회9,341회 댓글3건본문
서보모터, 지문인식센서, led, 조도센서가 들어간 아래와 같은 코드를 이용하였습니다.
if문에서 조도센서에 가해지는 값이 400이하일때 led꺼지면서 서보모터 (잠금장치)가 잠겨지고
지문인식센서에 등록된 지문이 일치할 때 led 켜지면서 서보모터(잠금장치)가 열리는 코드를 생각하고 구현해보았습니다.
그런데 if문에서 지문을 일치할 때 열리고 다시 지문을 갖다 대었을 때 닫히거나
어쩔 때는 지문이 일치할 때 열리더니 그 이후부터는 서보모터가 0과 90값을 계속 반복하는 여러가지 현상들이 있습니다..
if문 여러가지로 다 바꿔본 것같은데 어떻게 바꿔야
지문인식센서가 일치할 때 잠금장치가 열리고
문을 닫았을 때(조도센서 값이 몇 이하일 때 ) 잠금장치가 닫히는 코드가 될까요??
이 코드는 제가 현재 궁금한 코드의 일부분 입니다.
if (cds1 < 400 ) {
digitalWrite(LED, LOW);
servo.write(90);
if (finger.fingerID == 1){
digitalWrite(LED, HIGH);
servo.write(angle);
while (cds1 > 400){
digitalWrite(LED, HIGH);
servo.write(angle);
continue;
}
}
}
}
아래는 전체 코드입니다..
if문 내에서 문제가 된게 아니라 다른 부분이 문제인건가요??
#include <Adafruit_Fingerprint.h>
#include <Servo.h>
#include <OneWire.h>
#include <DallasTemperature.h>
Servo servo;
int moter = 6;
int angle = 0;
#define LED 7
#define cds1 analogRead(A3)
#define ONE_WIRE_BUS A0
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
#if (defined(__AVR__) || defined(ESP8266)) && !defined(__AVR_ATmega2560__)
SoftwareSerial mySerial(2, 3); // 지문인식
#else
#define mySerial Serial1
#endif
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
void setup()
{
//시리얼 통신 시작
Serial.begin(9600); // 시리얼 통신속도를 9600(bps)로 설정
servo.attach(moter);
pinMode(LED, OUTPUT);
Serial.println("현재 온도는");
sensors.begin();
while (!Serial); // 지문
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); } // 무한반복
}
pinMode(13, OUTPUT) ; // 13핀 출력으로 설정
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
{
Serial.print("밝기 ");
Serial.print(cds1);
Serial.print(" 현재 온도 ");
sensors.requestTemperatures();
float temperature = sensors.getTempCByIndex(0);
Serial.println(temperature);
getFingerprintID();
delay(50); //don't ned to run this at full speed.
if (cds1 < 400 ) {
digitalWrite(LED, LOW);
servo.write(90);
if (finger.fingerID == 1){
digitalWrite(LED, HIGH);
servo.write(angle);
while (cds1 > 400){
digitalWrite(LED, HIGH);
servo.write(angle);
continue;
}
}
}
}
uint8_t getFingerprintID()
{
uint8_t p = finger.getImage(); // uint8_t p는 손가락 이미지를 얻다
switch (p) // p를 입력했을 때
{
case FINGERPRINT_OK: // FINGERPRINT_OK일 경우
Serial.println("Image taken"); // 이미지 얻음
break; // 종료
case FINGERPRINT_NOFINGER: // FINGERPRINT_NOFINGER일 경우
Serial.println("No finger detected"); // 손가락이 탐지 안됨
return p; // p로 돌아감
case FINGERPRINT_PACKETRECIEVEERR: // FINGERPRINT_PACKETRECIEVEERR 일 경우
Serial.println("Communication error"); // 의사소통 오류
return p; // p로 돌아감
case FINGERPRINT_IMAGEFAIL: // FINGERPRINT_IMAGEFAIL일 경우
Serial.println("Imaging error"); // 이미지화 오류
return p; // p로 돌아감
default: // 위의 경우가 아니면
Serial.println("Unknown error"); // 알수 없는 오류
return p; // p로 돌아감
}
// OK success!
p = finger.image2Tz();
switch (p) // p를 입력 했을 떄
{
case FINGERPRINT_OK: // FINGERPRINT_OK일 경우
Serial.println("Image converted"); // 이미지가 변환됨
break; // 종료
case FINGERPRINT_IMAGEMESS: // FINGERPRINT_IMAGEMESS일 경우
Serial.println("Image too messy"); // 이미지가 너무 지저분함
return p; // p로 돌아감
case FINGERPRINT_PACKETRECIEVEERR: // INGERPRINT_PACKETRECIEVEERR일 경우
Serial.println("Communication error"); // 의사소통 오류
return p; // p로 돌아감
case FINGERPRINT_FEATUREFAIL: // FINGERPRINT_FEATUREFAIL일 경우
Serial.println("Could not find fingerprint features"); // 지문 기능을 찾을수 없음
return p; // p로 돌아감
case FINGERPRINT_INVALIDIMAGE: // FINGERPRINT_INVALIDIMAGE일 경우
Serial.println("Could not find fingerprint features"); // 지문 기능을 찾을수 없음
return p; // p로 돌아감
default: // 위의 경우가 아니면
Serial.println("Unknown error"); // 알수없는 오류
return p; // p로 돌아감
}
// OK converted!
p = finger.fingerSearch();
if (p == FINGERPRINT_OK) // p가 FINGERPRINT_OK 일 경우
{
Serial.println("발견된 지문 일치"); // 발견된 지문 일치
}
else if (p == FINGERPRINT_PACKETRECIEVEERR) // p가 FINGERPRINT_PACKETRECIEVEERR일 경우
{
Serial.println("Communication error"); // 의사소통 오류
return p; //p로 돌아감
}
else if (p == FINGERPRINT_NOTFOUND) // p가 FINGERPRINT_NOTFOUND일 경우
{
Serial.println("지문 발견 실패"); // 지문 발견 실패
return p; //p로 돌아감
} else // 위의 경우가 아닐 경우
{
Serial.println("알수없는 오류"); // 알수없는 오류
return p; //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;
// 지문인식함수, 지문인식에 실패했다면 -1 리턴됨
// found a match!
Serial.print("Found ID #"); Serial.print(finger.fingerID);
Serial.print(" with confidence of "); Serial.println(finger.confidence);
return finger.fingerID;
}
댓글 3
조회수 9,341master님의 댓글
master 작성일
현재 코드는 물건을 가지고 있는 사람만 동작시켜가면서 디버깅이 가능합니다.
다른 사람은 도와주지 못한다는 뜻입니다.
잘 체크해서 완성시켜보세요
얌얌님의 댓글
얌얌
#include <Adafruit_Fingerprint.h>
#include <Servo.h>
#include <OneWire.h>
#include <DallasTemperature.h>
Servo servo;
int moter = 6;
int angle = 0;
#define LED 7
#define cds1 analogRead(A3)
#define ONE_WIRE_BUS A0
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
#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()
{
Serial.begin(9600); // 시리얼 통신속도를 9600(bps)로 설정
servo.attach(moter);
pinMode(LED, OUTPUT);
Serial.println("현재 온도는");
sensors.begin();
while (!Serial); // 지문
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); } // 무한반복
}
pinMode(7, OUTPUT) ; // 13핀 출력으로 설정
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();
Serial.print("밝기 ");
Serial.print(cds1);
Serial.print(" 현재 온도 ");
sensors.requestTemperatures();
float temperature = sensors.getTempCByIndex(0);
Serial.println(temperature);
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()
{
getFingerprintID();
delay(50);
if(finger.fingerID == 1) {
digitalWrite(LED, HIGH) ;
servo.write(90);
continue;
}
else if (cds1<400){
digitalWrite(LED, LOW) ;
servo.write(0);
}
}
uint8_t getFingerprintID()
{
uint8_t p = finger.getImage(); // uint8_t p는 손가락 이미지를 얻다
switch (p) // p를 입력했을 때
{
case FINGERPRINT_OK: // FINGERPRINT_OK일 경우
Serial.println("Image taken"); // 이미지 얻음
break; // 종료
case FINGERPRINT_NOFINGER: // FINGERPRINT_NOFINGER일 경우
Serial.println("No finger detected"); // 손가락이 탐지 안됨
return p; // p로 돌아감
case FINGERPRINT_PACKETRECIEVEERR: // FINGERPRINT_PACKETRECIEVEERR 일 경우
Serial.println("Communication error"); // 의사소통 오류
return p; // p로 돌아감
case FINGERPRINT_IMAGEFAIL: // FINGERPRINT_IMAGEFAIL일 경우
Serial.println("Imaging error"); // 이미지화 오류
return p; // p로 돌아감
default: // 위의 경우가 아니면
Serial.println("Unknown error"); // 알수 없는 오류
return p; // p로 돌아감
}
// OK success!
p = finger.image2Tz();
switch (p) // p를 입력 했을 떄
{
case FINGERPRINT_OK: // FINGERPRINT_OK일 경우
Serial.println("Image converted"); // 이미지가 변환됨
break; // 종료
case FINGERPRINT_IMAGEMESS: // FINGERPRINT_IMAGEMESS일 경우
Serial.println("Image too messy"); // 이미지가 너무 지저분함
return p; // p로 돌아감
case FINGERPRINT_PACKETRECIEVEERR: // INGERPRINT_PACKETRECIEVEERR일 경우
Serial.println("Communication error"); // 의사소통 오류
return p; // p로 돌아감
case FINGERPRINT_FEATUREFAIL: // FINGERPRINT_FEATUREFAIL일 경우
Serial.println("Could not find fingerprint features"); // 지문 기능을 찾을수 없음
return p; // p로 돌아감
case FINGERPRINT_INVALIDIMAGE: // FINGERPRINT_INVALIDIMAGE일 경우
Serial.println("Could not find fingerprint features"); // 지문 기능을 찾을수 없음
return p; // p로 돌아감
default: // 위의 경우가 아니면
Serial.println("Unknown error"); // 알수없는 오류
return p; // p로 돌아감
}
// OK converted!
p = finger.fingerSearch();
if (p == FINGERPRINT_OK) // p가 FINGERPRINT_OK 일 경우
{
Serial.println("Found a print match!"); // 발견된 지문 일치
}
else if (p == FINGERPRINT_PACKETRECIEVEERR) // p가 FINGERPRINT_PACKETRECIEVEERR일 경우
{
Serial.println("Communication error"); // 의사소통 오류
return p; //p로 돌아감
}
else if (p == FINGERPRINT_NOTFOUND) // p가 FINGERPRINT_NOTFOUND일 경우
{
Serial.println("Did not find a match"); // 지문 발견 실패
return p; //p로 돌아감
} else // 위의 경우가 아닐 경우
{
Serial.println("Unknown error"); // 알수없는 오류
return p; //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;
// 지문인식함수, 지문인식에 실패했다면 -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 loop 부분을
void loop()
{
getFingerprintID();
delay(50);
if(finger.fingerID == 1) {
digitalWrite(LED, HIGH) ;
servo.write(90);
continue;
}
else if (cds1<400){
digitalWrite(LED, LOW) ;
servo.write(0);
}
}
이렇게 바꿨어요!
master님의 댓글
master
지문인식 센서가 손바닥으로 열리는데 이건 어떠한 경우인가요..?? <-- 지문센서가 오동작하는 것 같으니 제조사에 문의 해보세요