Как подключить 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;
}
@Time Gold, 👍0
Обсуждение1 ответ
Лучший ответ:
Я думаю, ваша проблема в том, что вы используете 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
- Не нашел датчик отпечатков пальцев :( Arduino Mega 2560 Adafruit Fingerprint Sensor
- Кнопка двойного состояния Nextion
- Arduino Uno: avrdude: stk500_recv(): программатор не отвечает
- как отправить данные в Adafruit Bluefruit Feather (32u4) через Bluetooth?
- Запуск двух шаговых двигателей с двумя поворотными энкодерами
- Arduino и 2 модуля Adafruit Fingerprint работающие вместе
- Мой код Arduino компилируется, когда я не вижу в нем ничего плохого
- Запись загрузчика на Adafruit Feather 32u4
Не задавай больше свой вопрос. Вы можете отредактировать свой первый вопрос. Также отформатируйте код правильно, выбрав его в редакторе вопросов и нажав кнопку
{}
или нажав Control+K., @chrislПочему вы используете software serial, когда у Mega есть 4 аппаратных последовательных интерфейса?, @chrisl
извините, сэр, я новичок, спасибо за беспокойство, @Time Gold
@chrisl я использую библиотеку adafruit, поэтому я использую 2 программных серийных номера, как я могу правильно использовать аппаратный серийный номер? пожалуйста помоги, @Time Gold