Сканер отпечатков пальцев Arduino останавливает цикл после регистрации или удаления

Как остановить цикл при регистрации отпечатка пальца в модуле?

Цикл зависает при регистрации отпечатка пальца, хотя это уже было сделано. Результат, который я хочу, был после регистрации отпечатка пальца, он выйдет из цикла регистрации и запустит команду переключения по умолчанию. Заранее спасибо.

Вот мой код петли.

    void loop() {
//
    if (Serial.available() > 0) {
      // прочитать входящий байт:
      command = Serial.read();
  
      // скажите, что у вас есть:
      Serial.print("I received: ");
      Serial.println(command);
    }
    switch (command) {
    case 'A':
    {
      Serial.println("Ready to enroll a fingerprint!");
      Serial.println("Please type in the ID # (from 1 to 127) you want to save this finger as...");
      id = readnumber();
      if (id == 0) {// ID #0 не разрешен, попробуйте еще раз!
         return;
      }
      Serial.print("Enrolling ID #");
      Serial.println(id);
    
      while (!  getFingerprintEnroll() );
    }
      break;
    case 'B':
    {
      Serial.println("Case 2");
    }
      break;
    default:
    {
        getFingerprintDoorLoob();
        delay(50);   
    }
      break;
  }
}

Вот регистрационный код отпечатка пальца:

 uint8_t getFingerprintEnroll() {

  int p = -1;
  Serial.print("Waiting for valid finger to enroll as #"); Serial.println(id);
  while (p != FINGERPRINT_OK) {
    p = finger1.getImage();
    switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.println(".");
      break;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      break;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Imaging error");
      break;
    default:
      Serial.println("Unknown error");
      break;
    }
  }

  // ОК, успех!

  p = finger1.image2Tz(1);
  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;
  }
  
  Serial.println("Remove finger");
  delay(2000);
  p = 0;
  while (p != FINGERPRINT_NOFINGER) {
    p = finger1.getImage();
  }
  Serial.print("ID "); Serial.println(id);
  p = -1;
  Serial.println("Place same finger again");
  while (p != FINGERPRINT_OK) {
    p = finger1.getImage();
    switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.print(".");
      break;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      break;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Imaging error");
      break;
    default:
      Serial.println("Unknown error");
      break;
    }
  }

  // ОК, успех!

  p = finger1.image2Tz(2);
  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;
  }
  
  // ОК сконвертировано!
  Serial.print("Creating model for #");  Serial.println(id);
  
  p = finger1.createModel();
  if (p == FINGERPRINT_OK) {
    Serial.println("Prints matched!");
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    return p;
  } else if (p == FINGERPRINT_ENROLLMISMATCH) {
    Serial.println("Fingerprints did not match");
    return p;
  } else {
    Serial.println("Unknown error");
    return p;
  }   
  
  Serial.print("ID "); Serial.println(id);
  p = finger1.storeModel(id);
  if (p == FINGERPRINT_OK) {
    Serial.println("Stored!");

  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    return p;
  } else if (p == FINGERPRINT_BADLOCATION) {
    Serial.println("Could not store in that location");
    return p;
  } else if (p == FINGERPRINT_FLASHERR) {
    Serial.println("Error writing to flash");
    return p;
  } else {
    Serial.println("Unknown error");
    return p;
  }   
}

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

, 👍2

Обсуждение

вы должны дать циклу while статус выхода, @jsotola


1 ответ


1

Я вижу здесь проблему. Теперь обратите внимание

если(Serial.available>0)

{

//Блок операторов

Закрывающая скобка для этого оператора if должна стоять после оператора switch().

Для каждой итерации (void loop()) ваша переменная command запускает переключатель и вызывает функцию регистрации.

Так и должно быть:

если (Serial.available>0){

//Блок операторов

Переключить(команда){

//Блок операторов

Надеюсь, это помогло

,

этот результат был тем же самым, что я хочу, было после цикла регистрации, тогда он сломается, но результат был после регистрации отпечатка пальца, цикл снова начнется в цикле регистрации., @Time Gold