ESP32 и сканер отпечатков пальцев — последовательный монитор ничего не показывает

Я пытаюсь подключить сканер отпечатков пальцев (типа Adafruit) к моему ESP32 (DOIT ESP32 Devkit V1), но последовательный монитор остается совершенно пустым, хотя я использую Serial.begin(9600) и печатаю отладочные сообщения типа «Запуск настройки...».

Вот что у меня есть:

Плата: DOIT ESP32 Devkit V1

Порт: COM6 (отображается как «Silicon Labs CP210x USB to UART Bridge»)

Проводка:

  • 3,3 В → VCC

  • ЗЕМЛЯ → ЗЕМЛЯ

  • GPIO16 (RX2) → TX датчика

  • GPIO17 (TX2) → RX датчика

Код:

#include <Adafruit_Fingerprint.h>
#include <HardwareSerial.h>



#if (defined(__AVR__) || defined(ESP8266)) && !defined(__AVR_ATmega2560__)
// Для UNO и других устройств без аппаратного последовательного порта необходимо использовать программный последовательный порт...
// контакт № 2 подключен к датчику (ЗЕЛЕНЫЙ провод)
// контакт № 3 — ВЫХОД из Arduino (БЕЛЫЙ провод)
// Настраиваем последовательный порт для использования softwareserial..
HardwareSerial mySerial(2);

#else
// На Leonardo/M0/etc и других компьютерах с аппаратным последовательным портом используйте аппаратный последовательный порт!
// #0 — зеленый провод, #1 — белый
#define mySerial Serial1

#endif


Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

void setup()
{
  Serial.begin(9600);
  Serial.println("התחלתי את setup");

  delay(100);
  Serial.println("\n\nAdafruit finger detect test");
  mySerial.begin(57600, SERIAL_8N1, 16, 17);
  // установить скорость передачи данных для последовательного порта датчика
  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); }
  }

  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()                     // запускать снова и снова
{
  getFingerprintID();
  delay(50);            //не обязательно запускать это на полной скорости.
}

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;
  }

  // ОК, успех!

  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;
  }

  // ОК, преобразовано!
  p = finger.fingerSearch();
  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;
  }

  // найдено совпадение!
  Serial.print("Found ID #"); Serial.print(finger.fingerID);
  Serial.print(" with confidence of "); Serial.println(finger.confidence);

  return finger.fingerID;
}

// возвращает -1 в случае неудачи, в противном случае возвращает 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;

  // найдено совпадение!
  Serial.print("Found ID #"); Serial.print(finger.fingerID);
  Serial.print(" with confidence of "); Serial.println(finger.confidence);
  return finger.fingerID;
}

Я проверил, что порт указан правильно, и плата правильно выбрана в Arduino IDE. Но Serial Monitor остаётся пустым. Я даже добавил ранние вызовы Serial.println(), но ничего не появляется.

Что может быть причиной этой проблемы?

, 👍2

Обсуждение

отключите все ... затем запустите простой скетч, который выводит сообщение на последовательный монитор, @jsotola

1) Ваша логика #ifdef ... #else ... #endif неверна. 2) Для ESP32 выводы 16 и 17 — это не Serial1, а Serial2. Поэтому удалите весь #ifdef ... #endif и просто используйте HardwareSerial mySerial(2); // use UART2., @hcheung


1 ответ


1

На режим загрузки ESP32 влияют определённые состояния GPIO при включении питания. GPIO 0, 2 и 15 особенно чувствительны. В вашем случае:

Вы используете:

GPIO16 (RX2) → TX of sensor  
GPIO17 (TX2) → RX of sensor

После загрузки все нормально, но некоторые сканеры отпечатков пальцев устанавливают низкий уровень RX, что может привести к зависанию загрузки, если затронуты определенные GPIO. Попробуйте этот тест: отсоедините сканер отпечатков пальцев от ESP32. Затем нажмите кнопку сброса (EN) на ESP32. Проверьте, появляется ли теперь вывод Serial Monitor. Если текст появляется после отключения датчика, то модуль отпечатков пальцев удерживает ESP32 в неправильном режиме загрузки.

Поскольку вы работаете с ESP32 и сканером отпечатков пальцев, вы также можете ознакомиться с этим проектом таймера с модулем IoT на основе отпечатков пальцев.

,