HKL+ESP32+R503 ohne Funktion

Hallo zusammen,

ich bin mittlerweile am Verzweifeln und komme leider nicht weiter. Deswegen hoffe ich, dass jemand von euch darauf kommt was ich falsch mache :smiley:

Vorab meine Komponenten:
ESP32-Wroom-32 von AZDelivery
https://amzn.eu/d/f5EaBFu
R503 Fingerprint Sensor:
https://amzn.eu/d/78W3bnY
Druckschalter:
https://www.ebay.de/itm/405409211060?var=675641699449
HLK-PM01
https://amzn.eu/d/b37KbSC

Das Problem ist nach dem Verbinden der ganzen Komponenten funktioniert alles soweit ganz gut, das einzige Problem das ich habe, ist sobald ich den Fingerprint in den Prüfmodus setzte, leuchtet zwar das blaue LED, aber er erkennt keinen Finger. Also nicht nur "Kein Match" sondern generell erhält er kein Signal sobald man einen Finger darauf legt. Keinerlei Regung. Weder nicht erkannt oder erkannt.

Die Debugausgabe zeigt jedoch Fingerprint Sensor gefunden.

hier noch meine Verkabelung:

HLK-PM01:
+Vo zusammen verkabelt mit: Taster 5V, R503 - 5V (rot), ESP32 5v (PIN)
-Vo zusammen verkabelt mit: Taster GND (Schwarz), R503 - Gnd (Schwarz), Esp32 - GnD (Pin)

Taster:
Blau - G23, Grün - G22, Gelb - G4

R503:
Gelb - G16, Braun/Violett - G17, Blau - G27, Weiss - 3.3V PIN vom ESP32 (Alternativ versucht an den 5V vom HLK

Der Taster funktioniert soweit da konnte ich keine Differenzen feststellen. Es geht eigentlich nur um den R503.

Ich hoffe ihr könnt mir bei dem Projekt helfen, habe schon einige Stunden damit "verbracht" :slight_smile:

Vielen Dank.

Hier noch mein derzeitiger Code und Anschlussplan:

#include <Adafruit_Fingerprint.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include "secrets.h"
#include <ArduinoJson.h>
#include <ArduinoOTA.h>
#include <WebServer.h>

#define RX_PIN 16
#define TX_PIN 17
#define RESET_PIN 14
#define BUTTON_PIN 4
#define BELL_PIN_1 25
#define BELL_PIN_2 26
#define LED_GREEN_PIN 22
#define LED_BLUE_PIN 23
#define WAKEUP_PIN 27

int debug_aktiv = 1;
String webLog = "";

HardwareSerial mySerial(1);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
WiFiClient espClient;
PubSubClient client(espClient);
WiFiServer telnetServer(23);
WiFiClient telnetClient;
WebServer server(80);

uint8_t id;
String command = "";
String g_UniqueId;
bool resetCode = false;
String status = "";
const char* deviceIdentifier = "tuerklingel_fingersensor_ESP32";
bool lastButtonState = HIGH;
unsigned long lastBellPress = 0;
bool ledOverride = false;
unsigned long ledChangeTime = 0;

void debugPrint(String text, bool newline = true) {
  if (debug_aktiv) {
    if (newline) {
      Serial.println(text);
      if (telnetClient && telnetClient.connected()) telnetClient.println(text);
      webLog += text + "\n";
    } else {
      Serial.print(text);
      if (telnetClient && telnetClient.connected()) telnetClient.print(text);
      webLog += text;
    }
    if (webLog.length() > 4000) webLog = webLog.substring(webLog.length() - 4000);
  }
}

void setLED(int onOff, int colorIndex, int color) {
  finger.LEDcontrol(onOff, colorIndex, color);
}

void triggerBell() {
  unsigned long now = millis();
  if (now - lastBellPress < 2000) return;
  debugPrint("Klingel ausgelöst!");

  pinMode(BELL_PIN_1, OUTPUT);
  pinMode(BELL_PIN_2, OUTPUT);
  digitalWrite(BELL_PIN_1, LOW);
  digitalWrite(BELL_PIN_2, LOW);
  delay(100);
  pinMode(BELL_PIN_1, INPUT);
  pinMode(BELL_PIN_2, INPUT);

  client.publish("homeassistant/sensor/tuerklingel_klingelstatus/state", "Klingel ausgelöst!");
  delay(1000);
  client.publish("homeassistant/sensor/tuerklingel_klingelstatus/state", "Warten");

  lastBellPress = now;
}

void checkBellButton() {
  bool currentState = digitalRead(BUTTON_PIN);
  unsigned long now = millis();
  if (lastButtonState == HIGH && currentState == LOW && now - lastBellPress > 2000) {
    triggerBell();
  }
  lastButtonState = currentState;
}

uint8_t readnumber(void) {
  unsigned long startMillis = millis();
  while (Serial.available() == 0 && millis() - startMillis < 2000) {
    client.loop();
    checkBellButton();
  }
  String input = Serial.readStringUntil('\n');
  input.trim();
  return input.toInt();
}

uint8_t getFingerprintSearch() {
  int p = -1;
  debugPrint("Warte auf Finger...");
  setLED(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_BLUE);

  while (p != FINGERPRINT_OK) {
    p = finger.getImage();
    checkBellButton();
    client.loop();
    server.handleClient();

    switch (p) {
      case FINGERPRINT_OK:
        debugPrint("Bild aufgenommen");
        break;
      case FINGERPRINT_NOFINGER:
        debugPrint(".", false);
        break;
      case FINGERPRINT_PACKETRECIEVEERR:
        debugPrint("Kommunikationsfehler");
        break;
      case FINGERPRINT_IMAGEFAIL:
        debugPrint("Bildfehler");
        break;
      default:
        debugPrint("Unbekannter Fehler");
        break;
    }
  }

  p = finger.image2Tz(1);
  if (p != FINGERPRINT_OK) return -1;

  p = finger.fingerSearch();
  if (p == FINGERPRINT_OK) {
    debugPrint("Finger erkannt! ID: " + String(finger.fingerID));
    client.publish("homeassistant/sensor/tuerklingel_id/state", String(finger.fingerID).c_str());
    setLED(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_GREEN);
    delay(1000);
    setLED(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_BLUE);
    return FINGERPRINT_OK;
  } else {
    debugPrint("Kein Finger erkannt oder kein Match gefunden.");
    for (int i = 0; i < 5; i++) {
      setLED(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_RED);
      unsigned long start = millis();
      while (millis() - start < 300) {
        checkBellButton();
        client.loop();
        server.handleClient();
      }
      setLED(FINGERPRINT_LED_OFF, 0, FINGERPRINT_LED_RED);
      start = millis();
      while (millis() - start < 300) {
        checkBellButton();
        client.loop();
        server.handleClient();
      }
    }
    setLED(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_BLUE);
    return -1;
  }
}

uint8_t getFingerprintEnroll() {
  int p = -1;
  debugPrint("Warte auf Finger für ID #" + String(id));
  setLED(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_PURPLE);

  while (p != FINGERPRINT_OK) {
    p = finger.getImage();
    checkBellButton();
    client.loop();
    server.handleClient();
  }
  if (finger.image2Tz(1) != FINGERPRINT_OK) return -1;

  debugPrint("Finger entfernen");
  delay(2000);
  while (finger.getImage() != FINGERPRINT_NOFINGER) {
    checkBellButton();
    client.loop();
    server.handleClient();
  }

  debugPrint("Gleichen Finger wieder auflegen");
  while ((p = finger.getImage()) != FINGERPRINT_OK) {
    checkBellButton();
    client.loop();
    server.handleClient();
  }
  if (finger.image2Tz(2) != FINGERPRINT_OK) return -1;
  if (finger.createModel() != FINGERPRINT_OK) return -1;
  if (finger.storeModel(id) != FINGERPRINT_OK) return -1;

  setLED(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_GREEN);
  delay(1000);
  setLED(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_BLUE);
  return true;
}

void callback(char* topic, byte* payload, unsigned int length) {
  String message = "";
  for (unsigned int i = 0; i < length; i++) message += (char)payload[i];
  debugPrint("MQTT empfangen: [" + String(topic) + "]: " + message);

  if (String(topic) == "homeassistant/button/tuerklingel_pruefung/command" && message == "PRESS") command = "pruefen";
  else if (String(topic) == "homeassistant/button/tuerklingel_enroll/command" && message == "PRESS") command = "enroll";
  else if (String(topic) == "homeassistant/button/tuerklingel_reset/command" && message == "PRESS") ESP.restart();
}

void reconnectMQTT() {
  client.setCallback(callback);
  while (!client.connected()) {
    debugPrint("Versuche, MQTT zu verbinden...");
    if (client.connect("Türklingel", MQTT_USER, MQTT_PASSWORD)) {
      debugPrint("MQTT verbunden!");
      client.subscribe("homeassistant/button/tuerklingel_pruefung/command");
      client.subscribe("homeassistant/button/tuerklingel_enroll/command");
      client.subscribe("homeassistant/button/tuerklingel_reset/command");
    } else {
      debugPrint("Fehler beim MQTT: " + String(client.state()));
      delay(5000);
    }
  }
}

void setup() {
  pinMode(LED_GREEN_PIN, OUTPUT);
  pinMode(LED_BLUE_PIN, OUTPUT);
  pinMode(WAKEUP_PIN, OUTPUT);
  digitalWrite(WAKEUP_PIN, HIGH);

  Serial.begin(9600);
  delay(100);

  pinMode(BUTTON_PIN, INPUT_PULLUP);
  pinMode(BELL_PIN_1, INPUT);
  pinMode(BELL_PIN_2, INPUT);

  digitalWrite(LED_GREEN_PIN, HIGH);
  digitalWrite(LED_BLUE_PIN, LOW);

  IPAddress local_IP(192, 168, 1, 161);
  IPAddress gateway(192, 168, 1, 1);
  IPAddress subnet(255, 255, 255, 0);
  if (!WiFi.config(local_IP, gateway, subnet)) debugPrint("Fehler beim Setzen der statischen IP!");

  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    debugPrint(".", false);
  }
  debugPrint("WiFi verbunden! IP: " + WiFi.localIP().toString());

  mySerial.begin(57600, SERIAL_8N1, RX_PIN, TX_PIN);
  if (finger.verifyPassword()) debugPrint("Fingerprint Sensor gefunden!");
  else {
    debugPrint("Fingerprint Sensor NICHT gefunden!");
    while (1) delay(1);
  }

  client.setServer(MQTT_SERVER, MQTT_PORT);
  reconnectMQTT();

  ArduinoOTA.setHostname("Türklingel_OTA");
  ArduinoOTA.begin();

  server.on("/", []() {
    server.send(200, "text/plain", webLog);
  });
  server.begin();

  telnetServer.begin();
  telnetServer.setNoDelay(true);
}

void loop() {
  ArduinoOTA.handle();
  server.handleClient();

  if (telnetServer.hasClient()) {
    if (telnetClient && telnetClient.connected()) telnetClient.stop();
    telnetClient = telnetServer.available();
  }

  if (!client.connected()) reconnectMQTT();
  client.loop();
  checkBellButton();

  if (command == "pruefen") {
    debugPrint("Starte Prüfung...");
    int result = getFingerprintSearch();
    if (result == -1) debugPrint("Kein Finger erkannt oder kein Match gefunden.");
    command = "";
  }
  else if (command == "enroll") {
    debugPrint("Gib die ID ein...");
    id = readnumber();
    if (id != 0) while (!getFingerprintEnroll());
    command = "";
  }

  status = (command == "pruefen") ? "Prüfung" : (command == "enroll") ? "Enroll" : "Warten";
  client.publish("homeassistant/sensor/tuerklingel_status/state", status.c_str());
  client.publish("homeassistant/sensor/tuerklingel_id/state", String(id).c_str());

  delay(50);
}

Hallo, ein gezeichnetes Schaltbild wäre da deutlicher und besser zu verstehen, was ich von deiner Beschreibung leider nicht sagen kann.
Hast du dein verwendetes Netzteil mal mit einem Oszilloskop gemessen, wie sauber die Spannung da ist ?
Bei diesen billigen Teilen habe ich schon oft schreckliches gesehen. Da war die Spannung dermaßen schlecht und mit Störungen behaftet, das die ohne weitere Maßnahmen nicht an einem Controller verwendet werden konnte.

@alex_280191
es gibt hier bisher keine Antworten weil du zu wenig Informationen zur Verfügung stellst.
Hast du ausser dieser Produktbeschreibung

Produktbeschreibungen

  1. Eingebauter Algorithmus-Chip, kreisförmiger Erfassungs-Chip, mit einem 192x192-Pixel-Sensor, kann 200 Fingerabdrücke speichern.
  2. Integrierte Bilderfassung und Algorithmus-Chip zusammen, professionelle Leistung.
  3. Hohe Erkennungsrate, flexibel in der Anwendung, passt sich an trockene Finger, nasse Finger, Fingerabdrücke mit leichter Textur und alte Finger an.
  4. Breite Anwendungsbereiche, kann in eine Vielzahl von Endprodukten eingebettet werden, wie z. B.: Zugangskontrolle, Assistenz, Sicherheitsbox.
  5. Einfache Installation, keine komplizierten Werkzeuge erforderlich, bequem zu bedienen.

Spezifikation:
Artikeltyp: Fingerabdruck-Identifikationsmodul
Material: Metall
Farbe: wie abgebildet
Netzspannung: DC 3,3 V
Betriebsstrom: 30mA (typischer Wert)
Spitzenstrom: 40mA
Eingabezeit Fingerabdruckbild: <0,3 Sekunden Bereich des Erfassungsfensters: Bildpixel: 192 x 192 Pixel
Bildauflösung: 508 dpi
Abgleichsmodus:
Vergleichsmethode: 1: 1
Suchmodus: 1:N
Speicherkapazität: 200 Stück
Sicherheitslevel: Level 5 (von Low bis High: 1, 2, 3, 4, 5)
FAR: <0,0001 %
FRR: <1,0 %
Suchzeit: <0,3 s (während 1:1000, Mittelwert)
Obere Schnittstelle: RS232 (TTL-Logikpegel, 3,3 V)
Kommunikationsbaudrate: (9600 × N) bps, N=1-12 (Standardwert N=6, 57600bps)

Noch weitere Infos die du zur Verfügung stellen kannst?
Hast du dir den Fingeradrucksensor nach irgendeiner Projektbeschreibung ausgesucht?
Hast du mal recherchiert ob es Youtube-Videos zu genau diesem Sensor gibt?
Hast du recherchiert ob es Anleitungen auf der Herstellerseite gibt?

Wenn man die Probleme analysieren will dann werden weitere Infos benötigt.
Wenn du die nicht zur Verfügung stellst macht sich jemand anderes nicht diese extra-Mühe das auch noch zu recherchieren.

Hallo zusammen, ich habe nun oben noch einen Schaltplan eingestellt.

Hi, der HLK arbeitet tatsächlich ohne jegliche Schwankungen. Genau 5 Volt Ausgang.
Es macht auch keinen Unterschied ob ich den HLK verwende oder ob ich den ESP mit USB anstecke, der Fingerprintsensor, leuchtet zwar immer, liest aber keine Finger aus.

Sorry, aber im Schaltbild ist kaum etwas zu erkennen.
da gehören auch an die Module Pin-Bezeichnungen sowie genaue Bezeichnungen der Module.
Und beachte alle weiteren Fragen.

Irgendwie passt das nicht zu dem Kabel-Farbschema, das auf Amazon verlinkt ist:


Falls die Farben bei dir anders sind als auf dem Bild, sollte doch zumindest die Belegung der Nummerierung (1-5) entsprechend sein.

Also selbst ich hab da gesehen, dass das Schaltbild passen sollte.

Die Kabellfarben vom Sensor sogar verwendet.
Und wo die am ESP dran sind ist zu sehen.
Gibt ja blos 2x V+, 1x GND, RX, TX

@alex_280191 sage mal...

Den sehe ich im Bild nicht.

@derGeppi
Was passt nicht?
Rot ist V+
Schwarz GND.
Gelb GPIO 16
Lila GPIO 17
Weiß 3,3V

braun/violett? lila? .. sehe ich auf dem Foto nicht, aber vielleicht sind die Augen schon schlecht :wink: Aber stimmt, auf den anderen Fotos gibt es die Farben, dann scheint es ja zu stimmen...

Ja schön, dann darfst du gern weiter machen.
Ich versteh nicht, warum Fragesteller hier keine genauen Angaben machen wollen. Zum raten habe ich jetzt keine Lust.

Hallo,

ich bin hier wirklickh laie. Habe weder bisher Schaltpläne gezeichnet noch viele ESP Projekte umgesetzt. Ich sehe auch nicht auf Welche Fragen ich nicht eingegangen bin.

Da ich an dem Projekt nun Mittlerweile schon paar Momate sitze, und immer wieder rumprobiere habe ich divere Foren und Youtube Videos dazu angesehen.

Der R503 hat tatsächlich 1 anderes kabel als auf dem Bild in Amazon.
Das RXD Kabel ist bei meinem nicht grün, sondern braun/violette/lila, was auch immer. Für mich ist es braun, aber meine Frau meine ob ich etwas am den augen habe, das ist lila :stuck_out_tongue:

Mit dem WakeUp Pin habe ich viel "rumgespielt" also mit angeschlossen oder auch nicht. Nach diveren Chats mit der doch nicht so klugen KI, wurde mir dann gesagt, dass ich den nicht benötige, weil mein code dauerhaft die abfrage laufen lässt ob ein Finger aufgelegt wird. Den WakeUp Pin würde ich nur benötigen, wenn der ESP in den ruhemodus geht und dann aufgeweckt werden muss.

Wenn ich noch weitere Daten angeben soll, bitte gerne her damit, versuche mein möglichstes :wink:

Echt jetzt ?
Wie wäre es denn, erst die gestellten Fragen zu beantworten.

Hallo Hotsystems,

ich habe alle Fragen beantwortet und versucht, so viele Infos wie möglich zu liefern. Dieses Forum ist, soweit ich weiß, dafür da, um sich gegenseitig zu helfen – auch (und gerade) wenn jemand noch nicht alles weiß.

Deine Beiträge bringen mich inhaltlich kein Stück weiter, wirken eher wie ständiges Rumgemecker. Wenn du nichts Konstruktives beitragen kannst oder willst, dann überlass den Thread bitte Leuten, die wirklich helfen wollen.

So macht ein Austausch hier jedenfalls keinen Sinn/Spaß.

Gruß Alex

Genau....du hast völlig Recht.
Da du immer noch keine fehlenden Angaben im Schaltbild gemacht hast, macht es mir keinen Spaß, dir zu Helfen. Fakt ist, zu einem ordentlichen und nützlichen Schaltbild gehören nun mal auch die Pinangaben, zu den verwendeten Modulen. Die hast du bisher nicht geliefert. Nebenbei, auch die Fragen zu Post #3 hast du nicht beantwortet.

Auch das ist richtig, nur du tust nichts dazu.

Ich sehe da kein "meckern" nur Fragen, die deinerseits nicht beantwortet werden.
Also was soll da meckern sein ? Und Fragen werden gestellt, damit man auch weiter helfen kann. Das solltest du übrigens wissen, oder ?
Aber egal...mach gern weiter so.

Hallo @HotSystems,

es wäre hilfreich, wenn du dir den gesamten Thread aufmerksam durchlesen würdest, bevor du erneut kommentierst.

Die Pinbelegung wurde bereits von Geppi als Foto gepostet. Ich habe die Verdrahtung entsprechend der Farben beschrieben, und die Pins am ESP32 sind klar gekennzeichnet.
Auch die Angaben in Post #3 wurden bereits beantwortet. Es handelt sich dort eher um eine Auflistung technischer Daten, mit denen ich als Nicht-Elektriker zwar nicht alles anfangen kann – dennoch bin ich auf alles Relevante eingegangen.

Ich habe zahlreiche Anleitungen gelesen, Videos geschaut und versucht, das Problem selbst zu lösen – ansonsten würde ich mich nicht extra im Forum melden und Schaltpläne erstellen. Leider blieb der gewünschte Erfolg aus, deshalb habe ich hier um Hilfe gebeten.

Gerade bei Hardware-Projekten kommt es oft auf mehr an als nur auf die Basics – was auch du als erfahrener Nutzer wissen solltest. Viele Anleitungen bleiben sehr allgemein, der Code muss aber häufig individuell angepasst werden, gerade wenn man damit weitere Prozesse steuern möchte.

Wenn du keine konstruktive Hilfe leisten möchtest, bitte ich dich höflich, den Thread freizugeben, damit sich andere mit echtem Interesse am Thema beteiligen können.

Vielen Dank

Sorry, aber wie soll das gehen.
Jeder kann hier antworten und ich blockiere nichts.
...

Schreib doch mal, was er beantworten soll.

Dein ständiges "würdest Du Fragen beantworten, könnte ich Dir helfen" ist mittlerweile öfter zu lesen.

Schreib doch, was nicht geklärt ist!
Dieses ständige um den heißen Brei rumreden ist ein typisches deutsches Ding.
(Und macht soviele Threads kaputt)

Nein, ich werde mich nicht wiederholen.
Zumindest nicht in diesem Thread.

Das passiert immer, wenn auf gestellte Fragen keine Antworten kommen, oder von dir z.B. "Das wird nicht gebraucht, o.ä."

Was willst Du erkennen, wenn der TO mit einem (vermutich eher nicht vorhandenem) Oszi sein Netzteil anschaut?

Alles andere hat er geliefert.
Das Du es nicht sehen wolltest, ist nicht sein Problem.
In #10 soll ich weitermachen und Du hast nichts weiter zu tun als ab #12 rumzustänkern.

Denk mal drüber nach.

Fass dich mal an die eigene Nase....