Как подключить 2 датчика отпечатков пальцев к Arduino Mega? Пожалуйста помоги

Мой проект заключался в том, чтобы открыть дверь изнутри и снаружи комнаты с помощью датчиков отпечатков пальцев, в настоящее время я использовал отдельные Arduino на 2 разных датчиках отпечатков пальцев. Пожалуйста, помогите, мой arduino обнаружил только 1 датчик отпечатков пальцев, когда я пытаюсь подключить их оба к 1 arduino. PS: я подключил датчик отпечатков пальцев к цифровым контактам (2,3) и (10,11) arduino mega. Заранее спасибо...

//Вот мой код

//для реле

int in1 = 8; //пин для открывания двери

int in2 = 9; //контакт для зуммера

 #include (<)Adafruit_Fingerprint.h> 

//это (<) я использую только для публикации кода

//Ардуино Мега

SoftwareSerial mySerial1(2, 3); //для датчика отпечатков снаружи

SoftwareSerial mySerial2(10, 11);//для датчика отпечатков пальцев внутри

Adafruit_Fingerprint finger1 = Adafruit_Fingerprint(&mySerial1);

Adafruit_Fingerprint finger2 = Adafruit_Fingerprint(&mySerial2);

void setup()  
{

Serial.begin(115200);

pinMode(in1, OUTPUT);

 pinMode(in2, OUTPUT);

 digitalWrite(in1, HIGH);

 digitalWrite(in2, HIGH);

  while (!Serial); 

delay(100);

  finger1.begin(57600);

finger2.begin(57600);

  if (finger1.verifyPassword() and finger2.verifyPassword()) { //Чтобы проверить, если 2

fingerprint sensor is working

 Serial.println("Found fingerprint sensors!");

} else {

 Serial.println("Did not find any fingerprint sensor!");

while (1) { delay(1); }

 }

  finger1.getTemplateCount(); //Чтобы показать количество зарегистрированных отпечатков пальцев в датчике

 finger2.getTemplateCount(); 

  Serial.print("Fingerprint Sensor1 contains "); 

Serial.print(finger1.templateCount); Serial.println(" templates");

 Serial.print("Fingerprint Sensor2 contains "); 

Serial.print(finger2.templateCount); Serial.println(" templates");

Serial.println("Waiting for valid finger...");

}

void loop()                    
{

 //для датчика отпечатков пальцев снаружи двери
  getFingerprintID1();
  delay(50);           

//для датчика отпечатков пальцев внутри двери
  getFingerprintID2();
  delay(50);   
}

uint8_t getFingerprintID1() {

uint8_t p = finger1.getImage();

switch (p) {

 case FINGERPRINT_OK:

//Serial.println("Изображение сделано");

 break;

case FINGERPRINT_NOFINGER:

// Serial.println("Отпечаток пальца не обнаружен");

  return p;

 case FINGERPRINT_PACKETRECIEVEERR:

 // Serial.println("Ошибка связи");

  return p;

 case FINGERPRINT_IMAGEFAIL:

 //Serial.println("Ошибка изображения");

return p;

 default:

 //Serial.println("Неизвестная ошибка");

  return p;

 }


// ОК, успех!

  p = finger1.image2Tz();

switch (p) {

case FINGERPRINT_OK:

 //Serial.println("Изображение преобразовано");

  break;

case FINGERPRINT_IMAGEMESS:

 //Serial.println("Изображение слишком грязное");

 return p;

case FINGERPRINT_PACKETRECIEVEERR:

 // Serial.println("Ошибка связи");

 return p;

case FINGERPRINT_FEATUREFAIL:

// Serial.println("Не удалось найти функции отпечатков пальцев");

 return p;

case FINGERPRINT_INVALIDIMAGE:

 // Serial.println("Не удалось найти функции отпечатков пальцев");

  return p;

default:

 //Serial.println("Неизвестная ошибка");

  return p;

}

  // ОК сконвертировано!
  p = finger1.fingerFastSearch();

if (p == FINGERPRINT_OK) {

 Serial.println("Found a print match!");

digitalWrite(in1, LOW);  //Дверь откроется на 5 секунд

 delay(5000);

 digitalWrite(in1, HIGH);

 delay(1000);

 Serial.print(finger1.fingerID); 

 } else if (p == FINGERPRINT_PACKETRECIEVEERR) {

  //Serial.println("Ошибка связи");

  return p;

} else if (p == FINGERPRINT_NOTFOUND) {

 Serial.println("Did not find a match");

 digitalWrite(in2,LOW); //если отпечаток пальца не распознан, зуммер будет включен

delay(1000);

 digitalWrite(in2,HIGH);

return p;

 } else {

//Serial.println("Неизвестная ошибка");

 return p;

 }   

return finger1.fingerID;

}

uint8_t getFingerprintID2() {

uint8_t p = finger2.getImage();

switch (p) {

case FINGERPRINT_OK:

 //Serial.println("Изображение сделано");

  break;

 case FINGERPRINT_NOFINGER:

// Serial.println("Отпечаток пальца не обнаружен");

   return p;

case FINGERPRINT_PACKETRECIEVEERR:

// Serial.println("Ошибка связи");

  return p;

 case FINGERPRINT_IMAGEFAIL:

 //Serial.println("Ошибка изображения");

  return p;

 default:

 //Serial.println("Неизвестная ошибка");

   return p;

 }

  // ОК, успех!
  p = finger2.image2Tz();

 switch (p) {

 case FINGERPRINT_OK:

  //Serial.println("Изображение преобразовано");

  break;

case FINGERPRINT_IMAGEMESS:

 //Serial.println("Изображение слишком грязное");

  return p;

 case FINGERPRINT_PACKETRECIEVEERR:

// Serial.println("Ошибка связи");

  return p;

case FINGERPRINT_FEATUREFAIL:

 // Serial.println("Не удалось найти функции отпечатков пальцев");

 return p;

case FINGERPRINT_INVALIDIMAGE:

 // Serial.println("Не удалось найти функции отпечатков пальцев");

  return p;

default:

  //Serial.println("Неизвестная ошибка");

 return p;

}

  // ОК сконвертировано!

 p = finger2.fingerFastSearch();

if (p == FINGERPRINT_OK) {

 Serial.println("Found a print match!");

digitalWrite(in1, LOW); 

 delay(3000);

digitalWrite(in1, HIGH);

 delay(1000);

 Serial.print(finger2.fingerID); 

} else if (p == FINGERPRINT_PACKETRECIEVEERR) {

 //Serial.println("Ошибка связи");

  return p;

  } else if (p == FINGERPRINT_NOTFOUND) {

 Serial.println("Did not find a match");

 digitalWrite(in2,LOW);

 delay(1000);

 digitalWrite(in2,HIGH);

 return p;

 } else {

 //Serial.println("Неизвестная ошибка");

  return p;

 }   

 return finger2.fingerID;

}

, 👍0

Обсуждение

Не задавай больше свой вопрос. Вы можете отредактировать свой первый вопрос. Также отформатируйте код правильно, выбрав его в редакторе вопросов и нажав кнопку {} или нажав Control+K., @chrisl

Почему вы используете software serial, когда у Mega есть 4 аппаратных последовательных интерфейса?, @chrisl

извините, сэр, я новичок, спасибо за беспокойство, @Time Gold

@chrisl я использую библиотеку adafruit, поэтому я использую 2 программных серийных номера, как я могу правильно использовать аппаратный серийный номер? пожалуйста помоги, @Time Gold


1 ответ


Лучший ответ:

0

Я думаю, ваша проблема в том, что вы используете SoftwareSerial. Выполнение Serial в программном обеспечении означает, что вы можете одновременно прослушивать только один интерфейс, поэтому одновременно работает только один из датчиков отпечатков пальцев.

Но вы используете Arduino Mega, которая имеет 4 аппаратных последовательных интерфейса. Они называются Serial и SerialX (где X равно 1, 2 или 3). Вы можете дать ссылку на эти последовательные интерфейсы библиотеке Adafruit точно так же, как вы делаете это с интерфейсами SoftwareSerial. Вы делаете:

Adafruit_Fingerprint finger1 = Adafruit_Fingerprint(&mySerial1);

Вместо этого вы могли бы сделать следующее:

Adafruit_Fingerprint finger1 = Adafruit_Fingerprint(&Serial1);

Это даст ссылку на второй аппаратный последовательный интерфейс (первый должен быть Serial) на библиотеку Adafruit, которая затем будет использовать его для связи с датчиком. Последовательные аппаратные и программные средства реализуют один и тот же интерфейс, просто они работают по-разному внутри, поэтому вы можете легко обмениваться ими на этом уровне.

,

Для аппаратного серийного номера вы не можете определить свои собственные контакты. Вы должны использовать контакты, соответствующие используемому интерфейсу. Для Serial1 это контакт 19 (RX) и контакт 18 (TX)., @chrisl

Спасибо!!! теперь я знаю, как использовать аппаратный серийный номер на arduino mega :))), @Time Gold

Я использую эту [ссылку] (https://www.arduino.cc/reference/en/language/functions/communication/serial/) в качестве ссылки, спасибо., @Time Gold