Rfid с отпечатком пальца Adafruit не работает вместе с Arduino Uno

Я отредактировал свой код, и теперь проблема в том, что оба работают, но не вместе

#include <Key.h>
#include <Keypad.h>
#include <Adafruit_Fingerprint.h>
#include <SD.h>
#include <SPI.h>
#include<SoftwareSerial.h>

SoftwareSerial mySerial(0, 1);
SoftwareSerial mySerials(2, 3);

int read_count = 0, tag_count = 0;
int j = 0, k = 0; // Variabvles to iterate in for loops
char data_temp, RFID_data[12], data_store[12];
boolean disp_control;
char filename[4], fileText[30], names[10];
int atm[5];
uint8_t n, num, p;
char key;
int p1, p2, p3, p4, z;
char fid;

File myFile;
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerials);


const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

byte rowPins[ROWS] = {5, 4, 3, 2}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {9, 8, 7, 6}; //connect to the column pinouts of the keypad

Keypad keypads = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup() {
  finger.begin(57600);
  mySerial.begin(9600);
  Serial.begin(9600);

  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  Serial.print("Initializing SD card...");

  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");


  Serial.println("Please Place Your Card");

}

void RecieveData()
{

  if (mySerial.available() > 0)
  {
    data_temp = mySerial.read();
    RFID_data[read_count] = data_temp;
    read_count++;
  }
}
void ReadData()
{
  if (read_count == 12) {
    disp_control = true;
    for (j = 0; j < 12; j++) {
      data_store[j] = RFID_data[j];
    }

    int x = 0;
    for (int i = 9; i < 12; i++) {
      filename[x] = data_store[i];
      x++;
    }
    filename[3] = '.';
    filename[4] = 't';
    filename[5] = 'x';
    filename[6] = 't';
    filename[7] = '\0';

    myFile = SD.open(filename, FILE_READ);
    if (myFile) {

      // read from the file until there's nothing else in it:
      while (myFile.available()) {

        for (int i = 0; i < 20; i++) {
          fileText[i] = myFile.read();
        }

        int a, n = 0;
        for (int i = 0; i < 4; i++) {
          atm[a] = fileText[i];
          a++;
        }
        for (int i = 5; fileText[i] != '\0'; i++) {
          names[n] = fileText[i];
          n++;
        }
        fid = fileText[4];

        validate();


        myFile.close();
      }
    } else {
      // if the file didn't open, print an error:
      Serial.println("error opening test.txt");
    }
    read_count = 0;
    tag_count++;

  }
}
void validate() {

  Serial.print("Hello ");
  Serial.print(names);
  Serial.println();
  Serial.println();
  Serial.println();

  pin();

}

void pin() {
  Serial.println("Please Enter Your ATM PIN");


  p1 = keypads.getKey();
  while (p1 == NO_KEY) {
    p1 = keypads.getKey(); //UPDATE VALUE

  }
  Serial.print(p1 - 48);

  p2 = keypads.getKey();
  while (p2 == NO_KEY) {
    p2 = keypads.getKey(); //UPDATE VALUE
  }
  Serial.print(p2 - 48);

  p3 = keypads.getKey(); //UPDATE VALUE
  while (p3 == NO_KEY) {
    p3 = keypads.getKey(); //UPDATE VALUE
  }
  Serial.print(p3 - 48);

  p4 = keypads.getKey(); //UPDATE VALUE
  while (p4 == NO_KEY) {
    p4 = keypads.getKey(); //UPDATE VALUE
  }
  Serial.print(p4 - 48);

  Serial.println();



  if ((p1 == fileText[0]) && (p2 == fileText[1]) && (p3 == fileText[2]) && (p4 == fileText[3])) {
    Serial.println("Please verify Fingerprint");
  }
  else {
    Serial.println("Invalid. Buzzer!!!!");
  }

}
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.fingerFastSearch();
  if (p == FINGERPRINT_OK) {
    Serial.println("Found a print match!");
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    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 finger.fingerID;
}


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;


  Serial.print("Found ID #"); Serial.print(finger.fingerID);
  Serial.print(" with confidence of "); Serial.println(finger.confidence);
  return finger.fingerID;

  // found a match!

  /*z = finger.fingerID;
    if ((fid - 48) == z) {
    Serial.println("Success");
    }
    else {
    Serial.println("Fail");
    }*/

}


void loop() {

  RecieveData();
  ReadData();
  getFingerprintIDez();
  delay(50);
}

Если я инициализирую в этом формате, то отпечаток пальца работает:

mySerial.begin(9600);
  finger.begin(57600);
  Serial.begin(9600);

И если я сделаю это таким образом, то RFID сработает:

finger.begin(57600);
  mySerial.begin(9600);
  Serial.begin(9600);

Я хочу, чтобы они оба работали, т. Е. Я сначала сканирую карту, затем проверяю вывод, а затем он проверяет действительность отпечатка пальца. Но проблема в том, что только один из них работает одновременно. Если RFID работает, то отпечаток пальца даже не мигает, а если отпечаток пальца работает, RFID не считывается.

, 👍0

Обсуждение

Также [спросили об этом](https://stackoverflow.com/q/49517894), @gre_gor

Почему вы используете программный последовательный на аппаратных последовательных выводах?, @gre_gor


1 ответ


1

В этом нет ничего удивительного. Ваша функция гласит:

uint8_t p = finger.getImage();
if (p == FINGERPRINT_OK)
  z = finger.fingerID;

Так что же произойдет, если p не является FINGERPRINT_OK? Это выполняется:

  if ((fid - 48) == z) {
    Serial.println("Success");
  }
  else {
    Serial.println("Fail");
  }

Таким образом, z неинициализирован и, вероятно, 0, fid было присвоено некоторое значение по пути (и, похоже, это не 48). Таким образом, вы получаете выражение в условии IF, значение которого равно false, выводится "Сбой", и функция возвращается.

Пренебрегая плохой структурой вашего кода, магическими числами и всем прочим, вы не учли случай, когда на модуле нет пальца. Кроме того, вы даже не выполняете поиск отпечатков пальцев (как я предполагаю, вы намереваетесь); даже когда кто-то помещает свой палец, все, что вы делаете, - это захват изображения, а затем считывание значения по умолчанию fingerID, которое, как я полагаю, равно 0xffff-без преобразования шаблона или поиска в базе данных. В итоге вам нужно вернуться и изучить исходный пример, который хорошо прокомментирован с понятными названиями методов, прежде чем вносить какие-либо изменения и писать свои собственные материалы.

,